diff -r 000000000000 -r 72b543305e3a messagingappbase/mcesettings/src/MceSettingsDialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/mcesettings/src/MceSettingsDialog.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,630 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* Message centre's settings dialog. +* +*/ + + + +// INCLUDE FILES + +#include +#include //MsvUiServiceUtilities +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include "MceSettingsDialog.h" +#include "MceSettingsGeneralSettingsDialog.h" +#include "MceSettingsArrays.h" +#include "MceSettingsSessionObserver.h" +#include "MceSettingsIds.hrh" +#include "MceSettingsMultipleServicesDialog.h" + +#include +#include // For HlpLauncher +#include +#include + +#include +#include + +#include "MceSettingsUtils.h" +#include +// CONSTANTS + +_LIT( KMceDirAndFile,"MceSettings.rsc" ); + +#define KMceApplicationUidValue 0x100058C5 +const TUid KMceApplicationUid = {KMceApplicationUidValue}; + +const TUid KCBSApplicationId = {0x101F4CD3}; +const TUid KCBSApplicationSettingsViewId = {6}; +const TInt KMceSettingsExtraItems = 2; +const TInt KMceSettingsCBS = 2; +const TInt KMceSettingsCBSUid = 42; + + + +// ================= MEMBER FUNCTIONS ======================= + + +// C++ default constructor can NOT contain any code that +// might leave. +// +CMceSettingsDialog::CMceSettingsDialog() +: CMceSettingsTitlePaneHandlerDialog(), + iResources( *CCoeEnv::Static() ), + iLaunchedFromMce( EFalse ), + iDialogOpen(EFalse) + { + } + +// ---------------------------------------------------- +// CMceSettingsDialog::Constructor +// ---------------------------------------------------- +CMceSettingsDialog::CMceSettingsDialog( + CMceUidNameArray& aSettingsItemsArray, + MMceSettingsAccountManager* aManager, + CMsvSession* aSession ) +: CMceSettingsTitlePaneHandlerDialog(), + iResources( *CCoeEnv::Static() ), + iMsgTypesSettings( &aSettingsItemsArray ), + iAccountManager( aManager ), + iSession( aSession ), + iLaunchedFromMce( ETrue ), + iDialogOpen(EFalse) + { + } + + +// ---------------------------------------------------- +// CMceSettingsDialog::Destructor +// ---------------------------------------------------- +EXPORT_C CMceSettingsDialog::~CMceSettingsDialog() + { + iResources.Close(); + if ( !iLaunchedFromMce ) + { + // if launched from mce then mce owns this array! + delete iMsgTypesSettings; + } + delete iSessionObserver; + // dont delete iSession, it is not owed by this class + // dont delete iAccountManager, it is not owed by this class + } + +// ---------------------------------------------------- +// CMceSettingsDialog::ConstructL +// ---------------------------------------------------- +void CMceSettingsDialog::ConstructL() + { + TParse fp; + fp.Set( KMceDirAndFile, &KDC_RESOURCE_FILES_DIR , NULL ); + TFileName fileName = fp.FullName(); + + iResources.OpenL( fileName ); + CAknDialog::ConstructL( R_MCE_SETTINGS_DIALOG_MENUBAR ); + + iSessionObserver = CMceSettingsSessionObserver::NewL( iSession ); + if ( !iAccountManager ) + { + iAccountManager = iSessionObserver; + } + if ( !iSession ) + { + iSession = &iSessionObserver->Session(); + } + if ( !iMsgTypesSettings ) + { + iMsgTypesSettings = CMceUidNameArray::NewL(); + } + FeatureManager::InitializeLibL(); + if ( FeatureManager::FeatureSupported( KFeatureIdSelectableEmail ) ) + { + iProductIncludesSelectableEmail = ETrue; + } + else + { + iProductIncludesSelectableEmail = EFalse; + } + FeatureManager::UnInitializeLib(); + } + +// ---------------------------------------------------- +// CMceSettingsDialog::ConstructL +// ---------------------------------------------------- +EXPORT_C CMceSettingsDialog* CMceSettingsDialog::NewL() + { + CMceSettingsDialog* dialog = new (ELeave) CMceSettingsDialog(); + CleanupStack::PushL( dialog ); + dialog->ConstructL(); + CleanupStack::Pop( dialog ); + return dialog; + } + +// ---------------------------------------------------- +// CMceSettingsDialog::ConstructL +// ---------------------------------------------------- +EXPORT_C CMceSettingsDialog* + CMceSettingsDialog::NewL( CMceUidNameArray& aSettingsItemsArray, + MMceSettingsAccountManager* aManager, CMsvSession* aSession ) + { + CMceSettingsDialog* dialog = new (ELeave) CMceSettingsDialog( + aSettingsItemsArray, aManager, aSession ); + CleanupStack::PushL( dialog ); + dialog->ConstructL(); + CleanupStack::Pop( dialog ); + return dialog; + } + +// ---------------------------------------------------- +// CMceSettingsDialog::OkToExitL +// ---------------------------------------------------- +EXPORT_C TInt CMceSettingsDialog::OkToExitL( TInt aButtonId ) + { + TBool okToExit = CAknDialog::OkToExitL( aButtonId ); + if ( aButtonId == EMceSettingsCmdSettingsDialogOpen ) + { + // Middle soft key pressed + ProcessCommandL( aButtonId ); + okToExit = EFalse; // Cannot exit, since MSK was pressed + } + else if ( aButtonId != EEikBidCancel && okToExit ) + { + RestoreTitleTextL(); + } + return okToExit; + } + +// ---------------------------------------------------- +// CMceSettingsDialog::ProcessCommandL +// ---------------------------------------------------- +EXPORT_C void CMceSettingsDialog::ProcessCommandL( TInt aCommandId ) + { + CAknDialog::ProcessCommandL( aCommandId ); // hides menu + if ( aCommandId == EMceSettingsCmdSettingsDialogExit ) + { + if (iAvkonViewAppUi->ExitHidesInBackground()) + { + iAvkonViewAppUi->ProcessCommandL( EAknCmdHideInBackground ); + } + else + { + iAvkonViewAppUi->ProcessCommandL( EAknCmdExit ); + } + + return; + } + + + switch ( aCommandId ) + { + case EMceSettingsCmdSettingsDialogOpen: + OpenSubSettingsL(); + break; + + case EMceSettingsCmdSettingsDialogHelp: + { + LaunchHelpL(); + } + break; + + default : + break; + } + } + +// ---------------------------------------------------- +// CMceSettingsDialog::DynInitMenuPaneL +// ---------------------------------------------------- +EXPORT_C void CMceSettingsDialog::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane ) + { + if ( aResourceId == R_MCE_SETTINGS_DIALOG_MENUPANE ) + { + aMenuPane->SetItemDimmed( EMceSettingsCmdSettingsDialogHelp, + !FeatureManager::FeatureSupported( KFeatureIdHelp ) ); + + } + } + +// ---------------------------------------------------- +// CMceSettingsDialog::PreLayoutDynInitL +// ---------------------------------------------------- +EXPORT_C void CMceSettingsDialog::PreLayoutDynInitL( ) + { + TBool csp = MceSettingsUtils::CspBitsL(); + iCbs = EFalse; + if ( FeatureManager::FeatureSupported( KFeatureIdCellBroadcast ) ) + { + iCbs = ETrue; + if ( csp ) + { + iCbs = CheckCspBitL(); + } + } + StoreTitleTextAndSetNewL( R_MCE_SETTINGS_TITLE ); + + if ( !iLaunchedFromMce ) + { + LoadAllMtmsL(); + } + + CEikTextListBox* list=STATIC_CAST( CEikTextListBox*, + Control( EMceSettingsDialogChoiceList ) ); + // Scrollbar + list->CreateScrollBarFrameL(ETrue); + list->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto ); + + CTextListBoxModel* model=list->Model(); + model->SetItemTextArray( iMsgTypesSettings ); + model->SetOwnershipType( ELbmDoesNotOwnItemArray ); + list->SetListBoxObserver( this ); + } + + +// ---------------------------------------------------- +// CMceSettingsDialog::ExecuteLD +// ---------------------------------------------------- +EXPORT_C TInt CMceSettingsDialog::ExecuteLD( ) + { + + TInt returnValue = CAknDialog::ExecuteLD( R_MCE_SETTINGS_DIALOG ); + + + return returnValue; + } + +// ---------------------------------------------------- +// CMceSettingsDialog::LoadAllMtmsL +// ---------------------------------------------------- +void CMceSettingsDialog::LoadAllMtmsL() + { + iMsgTypesSettings->Reset(); + CMtmUiDataRegistry* uiRegistry = iSessionObserver->UiRegistry(); // owed by iSessionObserver + CMtmStore* mtmStore = iSessionObserver->MtmStore(); // owed by iSessionObserver + const TInt count = uiRegistry->NumRegisteredMtmDlls(); + TInt loop = 0; + for ( loop = 0; loop < count; loop++ ) + { + LoadMtmL( uiRegistry->MtmTypeUid( loop ), *mtmStore, *uiRegistry ); + } + + CMsvEntry* rootEntry = iSession->GetEntryL( KMsvRootIndexEntryIdValue ); + CleanupStack::PushL( rootEntry ); + + // Then add MTMs which have service but cannot create messages (wap push in practice) + CMsvEntrySelection* sel = + MsvUiServiceUtilities::GetListOfAccountsL( *iSession ); + CleanupStack::PushL( sel ); + TMsvId id; + const TInt numAccounts=sel->Count(); + for ( loop = 0; loopAt(loop); + TMsvEntry tentry; + TMsvId serviceId; + TInt err = iSession->GetEntry( id, serviceId, tentry ); + + if ( err == KErrNone && uiRegistry->IsPresent( tentry.iMtm ) ) + { + TUid techType = uiRegistry->TechnologyTypeUid( tentry.iMtm ); + TBool found = EFalse; + + for ( TInt loop2 = iMsgTypesSettings->Count()-1 ;loop2 >= 0; loop2-- ) + { + TUid uidAlreadyAdded = (*iMsgTypesSettings)[loop2].iUid; + if ( uiRegistry->TechnologyTypeUid( uidAlreadyAdded ) == techType ) + { + found = ETrue; + break; + } + } + + if ( !found ) + { + iMsgTypesSettings->AppendL( TUidNameInfo( + tentry.iMtm, + uiRegistry->RegisteredMtmDllInfo( tentry.iMtm ).HumanReadableName() + )); + } + } + } + CleanupStack::PopAndDestroy( sel ); + CleanupStack::PopAndDestroy( rootEntry ); + + // this is not used anywhere, two last items in the list are + // ALWAYS cbs settings and mce general settings + + SortAndChangeSmsMmsEmailFirstL(); + + TUid uid; + uid.iUid = KMceSettingsCBSUid; + + HBufC* text = StringLoader::LoadL( R_MCE_CBS_SETTINGS_TEXT, iEikonEnv ); + TUidNameInfo cbsSettings( uid, *text ); + delete text; + iMsgTypesSettings->AppendL( cbsSettings ); + + text = StringLoader::LoadL( R_MCE_GENERAL_SETTINGS_TEXT, iEikonEnv ); + TUidNameInfo generalSettings( uid, *text ); + delete text; + iMsgTypesSettings->AppendL( generalSettings ); + + } + + +// ---------------------------------------------------- +// CMceSettingsDialog::LoadMtmL +// ---------------------------------------------------- +void CMceSettingsDialog::LoadMtmL( + const TUid aMtmType, + CMtmStore& aMtmStore, + const CMtmUiDataRegistry& aUiRegistry ) + { + CBaseMtmUiData* uiData = NULL; + TRAPD( err, ( uiData = &(aMtmStore.MtmUiDataL(aMtmType)) ) ); + if( err != KErrNone ) + { + return; + } + + TInt response; + TUid canSend={KUidMtmQueryCanCreateNewMsgValue}; + TInt canSendResponse=uiData->QueryCapability( canSend, response ); + + TBool foundSettings = EFalse; + const CArrayFix& funcs = + uiData->MtmSpecificFunctions(); + const TInt numFuncs = funcs.Count(); + for (TInt funcIndex = 0; funcIndex < numFuncs && !foundSettings; funcIndex++ ) + { + CBaseMtmUiData::TMtmUiFunction func = funcs.At( funcIndex ); + if ( func.iFunctionId == KMtmUiMceSettings ) + { + iMsgTypesSettings->AppendL( TUidNameInfo( + aMtmType, + func.iCaption ) ); + foundSettings = ETrue; + } + } // end for + if ( canSendResponse == KErrNone && !foundSettings ) + { + iMsgTypesSettings->AppendL( TUidNameInfo( + aMtmType, + aUiRegistry.RegisteredMtmDllInfo(aMtmType).HumanReadableName() + )); + } + } + + +// ---------------------------------------------------- +// CMceSettingsDialog::HandleListBoxEventL +// ---------------------------------------------------- +void CMceSettingsDialog::HandleListBoxEventL( + CEikListBox* /*aListBox*/, + TListBoxEvent aEventType ) + { + switch(aEventType) + { + case EEventEnterKeyPressed: + case EEventItemSingleClicked: + ProcessCommandL( EMceSettingsCmdSettingsDialogOpen ); + break; + default: + break; + } + } + + +// ---------------------------------------------------- +// CMceSettingsDialog::OpenSubSettingsL +// ---------------------------------------------------- +void CMceSettingsDialog::OpenSubSettingsL() + { + CEikTextListBox* list=STATIC_CAST( CEikTextListBox*, + Control( EMceSettingsDialogChoiceList ) ); + const TInt numberOfItems = list->Model()->NumberOfItems(); + TInt choice = list->CurrentItemIndex(); + + // Run time Cell Broadcast variant. + TInt removedSettingItems = 0; + if ( !iCbs ) + { + removedSettingItems++; + } + + if ( choice < numberOfItems - KMceSettingsExtraItems + removedSettingItems ) + { + TBool canCreateNewAccount = iAccountManager->CanCreateNewAccountL( + (*iMsgTypesSettings)[choice].iUid ); + + if ( canCreateNewAccount ) + { + if(iDialogOpen) + { + return; + } + iDialogOpen = ETrue; + if ( iProductIncludesSelectableEmail ) + { + CMceSettingsMultipleServicesDialog::LaunchDialogL( + *iAccountManager, + ( *iMsgTypesSettings )[choice].iUid, + *iSession, + R_MCE_SETTINGS_MULTIPLE_SERVICES_DIALOG_MENUBAR_WITH_SELECTABLE_EMAIL, + R_MCE_SETTINGS_MULTIPLE_SERVICES_DIALOG ); + } + else + { + CMceSettingsMultipleServicesDialog::LaunchDialogL( + *iAccountManager, + ( *iMsgTypesSettings )[choice].iUid, + *iSession, + R_MCE_SETTINGS_MULTIPLE_SERVICES_DIALOG_MENUBAR, + R_MCE_SETTINGS_MULTIPLE_SERVICES_DIALOG ); + } + iDialogOpen = EFalse; + } + else + { + // mtm cannot create new accounts, edit only FIRST service if exists + CMsvEntrySelection* sel = + MsvUiServiceUtilities::GetListOfAccountsWithMTML( *iSession, + (*iMsgTypesSettings)[choice].iUid ); + + CleanupStack::PushL( sel ); + + if ( sel->Count() > 0 ) + { + iAccountManager->EditAccountL( (*sel)[0] ); + } + else + { // service disappeared? + + } + CleanupStack::PopAndDestroy( sel ); + } + } // end if ( choice < numberOfItems ) + else if ( iCbs && choice == numberOfItems - KMceSettingsCBS ) + { + // CBS settings are second from the end of the list + TVwsViewId viewId( KCBSApplicationId, KCBSApplicationSettingsViewId ); + STATIC_CAST( CCoeAppUi*, ControlEnv()->AppUi())->ActivateViewL( viewId ); + } + else + { + // general settings are list item in the list + CMceGeneralSettingsDialog* generalSettingsDlg = + new (ELeave) CMceGeneralSettingsDialog( iSession, *iSessionObserver, iAccountManager ); + CleanupStack::PushL( generalSettingsDlg ); + generalSettingsDlg->ConstructL( R_MCE_GENERAL_SETTINGS_CHOICE_MENUBAR ); + CleanupStack::Pop( generalSettingsDlg ); // generalSettingsDlg + generalSettingsDlg->ExecuteLD( R_MCE_GENERAL_SETTINGS ); + } + + } + + +// --------------------------------------------------------- +// CMceSettingsDialog::SortAndChangeSmsMmsEmailFirstL +// --------------------------------------------------------- +// +void CMceSettingsDialog::SortAndChangeSmsMmsEmailFirstL() + { + iMsgTypesSettings->Sort(ECmpFolded); + + ChangeMsgTypeTopL( *iMsgTypesSettings, KSenduiMtmPostcardUid ); + ChangeMsgTypeTopL( *iMsgTypesSettings, KSenduiMtmSyncMLEmailUid ); + ChangeMsgTypeTopL( *iMsgTypesSettings, KSenduiMtmSmtpUid ); + ChangeMsgTypeTopL( *iMsgTypesSettings, KSenduiMtmAudioMessageUid ); + // SMS & MMS still have own settings although the editor is common. + ChangeMsgTypeTopL( *iMsgTypesSettings, KSenduiMtmMmsUid ); + ChangeMsgTypeTopL( *iMsgTypesSettings, KSenduiMtmSmsUid ); + } + +// --------------------------------------------------------- +// CMceSettingsDialog::ChangeMsgTypeTopL +// --------------------------------------------------------- +// +void CMceSettingsDialog::ChangeMsgTypeTopL( CUidNameArray& aArray, TUid aMsgType ) const + { + TInt loop = 0; + // first change email to the top + for (loop=1; loop < aArray.Count(); loop++) + { + if (aArray[loop].iUid == aMsgType) + { + TUidNameInfo info = aArray[loop]; + aArray.InsertL( 0, info ); + aArray.Delete( loop+1 ); + break; + } + } + } + +// ---------------------------------------------------- +// CMceSettingsDialog::LaunchHelpL +// Launch help using context +// +// ---------------------------------------------------- +void CMceSettingsDialog::LaunchHelpL() const + { + CCoeAppUi* appUi = STATIC_CAST(CCoeAppUi*, ControlEnv()->AppUi()); + CArrayFix* helpContext = appUi->AppHelpContextL(); + HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), helpContext ); + } + + +// ---------------------------------------------------- +// CMceSettingsDialog::GetHelpContext +// returns helpcontext as aContext +// +// ---------------------------------------------------- +void CMceSettingsDialog::GetHelpContext + (TCoeHelpContext& aContext) const + { + aContext.iMajor = KMceApplicationUid; + aContext.iContext = KMCE_HLP_SETTINGS; + } + +// ---------------------------------------------------- +// CMceSettingsDialog::CheckCspBitL +// returns ETrue if Cell Broadcast csp bit is on +// +// ---------------------------------------------------- +TBool CMceSettingsDialog::CheckCspBitL( ) const + { + RCustomerServiceProfileCache csp; + + TInt error = csp.Open(); + if ( error ) + { + return ETrue; + } + + RMobilePhone::TCspTeleservices params; + TInt retVal = csp.CspTeleServices( params ); + csp.Close(); + + if ( retVal == KErrNone ) + { + if ( ( params&RMobilePhone::KCspSMCB ) != 0 ) + { + // Cell Broadcast CSP bit is on + return ETrue; + } + else + { + // Cell Broadcast CSP bit is off + return EFalse; + } + } + else + { + // Error: By default show CBS service + return ETrue; + } + + } + +// End of File