messagingappbase/mcesettings/mcesettingsgsplugin/src/MceSettingsGSPluginContainer.cpp
changeset 0 72b543305e3a
child 25 fa1df4b99609
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/mcesettings/mcesettingsgsplugin/src/MceSettingsGSPluginContainer.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,451 @@
+/*
+* Copyright (c) 2006 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:   Messaging Settings sub-menu in General Settings.
+*
+*/
+
+
+
+// INCLUDE FILES
+
+
+
+#include <MuiuMsvUiServiceUtilities.h> //MsvUiServiceUtilities
+#include <MtmExtendedCapabilities.hrh>  // KUidMtmQueryCanCreateNewMsgValue
+
+#include <mtudreg.h>        // CMtmUiDataRegistry
+#include <MTMStore.h>       // CMtmStore
+#include <msvids.h>       // KMsvRootIndexEntryId, KMsvNullIndexEntryId
+
+#include <MceSettingsArrays.h>                 // CMceUidNameArray
+#include <MceSettingsSessionObserver.h>        // CMceSettingsSessionObserver
+#include <MceSettingsGeneralSettingsDialog.h>  // CMceGeneralSettingsDialog
+#include <MceSettingsMultipleServicesDialog.h> // CMceSettingsMultipleServicesDialog
+#include <aknlists.h>                          // CAknSettingStyleListBox
+#include <MceSettingsGSPluginRsc.rsg>          // Resources
+#include <RCustomerServiceProfileCache.h>      // RCustomerServiceProfileCache
+#include <SenduiMtmUids.h>                     // KSenduiMtmSmtpUid, KSenduiMtmSmsUid,
+                                               // KSenduiMtmMmsUid
+#include <csxhelp/mce.hlp.hrh>                 // Help file
+#include "MceSettingsGSPluginContainer.h"      // own header
+
+#include <featmgr.h>  // CR : 401-1806
+
+
+// CONSTANTS
+const TUid KCBSApplicationId                = {0x101F4CD3};
+const TUid KCBSApplicationSettingsViewId    = {6};
+const TInt KMceSettingsExtraItems           = 2;
+const TInt KMceSettingsCBS                  = 2;
+const TInt KMceSettingsCBSUid               = 42;
+const TUid KMceApplicationId                = { 0x100058C5 };
+
+//CMAIL Update
+#define KUidMsgTypeFsMtmVal               0x2001F406
+
+// ========================= MEMBER FUNCTIONS ================================
+
+// ---------------------------------------------------------------------------
+// CMceSettingsGSPluginContainer::CMceSettingsGSPluginContainer()
+// Default constructor.
+// ---------------------------------------------------------------------------
+//
+CMceSettingsGSPluginContainer::CMceSettingsGSPluginContainer()
+    {
+    iDialogOpen = EFalse;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMceSettingsGSPluginContainer::ConstructL(const TRect& aRect)
+// Symbian OS phase 2 constructor
+// ---------------------------------------------------------------------------
+//
+void CMceSettingsGSPluginContainer::ConstructL( const TRect& aRect )
+    {
+    // Construct iListBox
+    iListBox = new ( ELeave ) CAknSettingStyleListBox;
+    iMsvSession = CMsvSession::OpenSyncL(*this);
+    iAccountManager = CMceSettingsSessionObserver::NewL( iMsvSession );
+    iEmailFramework = EFalse;
+    
+    FeatureManager::InitializeLibL();
+    
+    if ( FeatureManager::FeatureSupported( KFeatureIdFfEmailFramework ) )
+     {
+            iEmailFramework = ETrue;
+     }
+    
+    FeatureManager::UnInitializeLib();
+   
+    
+    BaseConstructL( aRect, R_MCEUI_MAINVIEW_TITLE, 0 );// last parameter 0, since dynamic listbox
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMceSettingsGSPluginContainer::~CMceSettingsGSPluginContainer()
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CMceSettingsGSPluginContainer::~CMceSettingsGSPluginContainer()
+    {
+    delete iAccountManager;
+    delete iMsgTypesSettings;
+    delete iMsvSession;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMceSettingsGSPluginContainer::ConstructListBoxL()
+// See header for details.
+// ---------------------------------------------------------------------------
+//
+void CMceSettingsGSPluginContainer::ConstructListBoxL( TInt /*aResLbxId*/ )
+    {
+    // listbox creation and initialization
+    iListBox->SetContainerWindowL( *this );
+    iListBox->ConstructL( this, EAknListBoxLoopScrolling );
+    iListBox->CreateScrollBarFrameL( ETrue );
+    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
+        CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+
+    UpdateSettingItemsL();
+    CTextListBoxModel* model = iListBox->Model();
+    model->SetItemTextArray( iMsgTypesSettings );
+    model->SetOwnershipType( ELbmDoesNotOwnItemArray );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMceSettingsGSPluginContainer::OfferKeyEventL()
+// See header for details.
+// ---------------------------------------------------------------------------
+//
+TKeyResponse CMceSettingsGSPluginContainer::OfferKeyEventL(
+    const TKeyEvent& aKeyEvent,
+    TEventCode aType )
+    {
+    return iListBox->OfferKeyEventL( aKeyEvent, aType );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceSettingsGSPluginContainer::GetHelpContext()
+// See header for details.
+// -----------------------------------------------------------------------------
+//
+void CMceSettingsGSPluginContainer::GetHelpContext( TCoeHelpContext& aContext ) const
+    {
+    aContext.iMajor = KMceApplicationId;
+    aContext.iContext = KMCE_HLP_SETTINGS;
+    }
+    
+    
+// -----------------------------------------------------------------------------
+// CMceSettingsGSPluginContainer::UpdateSettingItemsL()
+// See header for details.
+// -----------------------------------------------------------------------------
+//    
+void CMceSettingsGSPluginContainer::UpdateSettingItemsL()
+    {
+    if ( !iMsgTypesSettings )
+        {
+        iMsgTypesSettings = CMceUidNameArray::NewL();
+        }
+    else
+        {
+        iMsgTypesSettings->Reset();
+        }
+
+    CMtmUiDataRegistry* uiRegistry = iAccountManager->UiRegistry();
+    CMtmStore* mtmStore = iAccountManager->MtmStore();
+    const TInt count = uiRegistry->NumRegisteredMtmDlls();
+    TInt loop = 0;
+    for ( loop = 0; loop < count; loop++ )
+        {
+        LoadMtmL( uiRegistry->MtmTypeUid( loop ), *mtmStore );
+        }
+
+    // this is not used anywhere, two last items in the list are
+    // ALWAYS cbs settings and mce general settings
+
+    // Sort settings groups
+    SortAndChangeSmsMmsEmailFirstL();
+
+    // Check Cell Broadcast Csp bit
+    iCbs = CheckCspBitL();
+
+
+    TUid uid;
+    uid.iUid = KMceSettingsCBSUid;
+
+    HBufC* text = StringLoader::LoadL( R_MCEUI_CBS_SETTINGS_TEXT, iEikonEnv );
+    TUidNameInfo cbsSettings( uid, *text );
+    delete text;
+    iMsgTypesSettings->AppendL( cbsSettings );
+
+    text = StringLoader::LoadL( R_MCEUI_GENERAL_SETTINGS_TEXT, iEikonEnv );
+    TUidNameInfo generalSettings( uid, *text );
+    delete text;
+    iMsgTypesSettings->AppendL( generalSettings );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceSettingsGSPluginContainer::LoadMtmL
+//
+// -----------------------------------------------------------------------------
+//
+void CMceSettingsGSPluginContainer::LoadMtmL(
+    const TUid aMtmType,
+    CMtmStore& aMtmStore )
+    {
+    
+    TUid   mtmUid = TUid::Uid(aMtmType.iUid);
+    
+    TBool notSelectableMtm = ( (mtmUid == KSenduiMtmSmtpUid)  
+            || (mtmUid == KSenduiMtmSyncMLEmailUid) 
+            || (aMtmType.iUid == KUidMsgTypeFsMtmVal) ) ;
+    
+    // Cmail changes - EMail, Sync EMail, Freestyle Settings will not be populated in the Messaging settings 
+    
+    if( !( (iEmailFramework) && (notSelectableMtm) ) )
+    {
+      
+    CBaseMtmUiData* uiData = NULL;
+    TRAPD( err, ( uiData = &(aMtmStore.MtmUiDataL(aMtmType)) ) );
+    if( err != KErrNone )
+        {
+        return;
+        }
+    TBool foundSettings = EFalse;
+    const CArrayFix<CBaseMtmUiData::TMtmUiFunction>& 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  
+    }//end if
+        
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceUi::HandleSessionEventL
+//
+// -----------------------------------------------------------------------------
+//
+void CMceSettingsGSPluginContainer::HandleSessionEventL(
+    TMsvSessionEvent aEvent,
+    TAny* /*aArg1*/,
+    TAny* aArg2,
+    TAny* /*aArg3*/ )
+    {
+    TMsvId folderId = KMsvNullIndexEntryId;
+
+    // ConstructL must have left as we have returned to the active scheduler
+    // before complete construction
+    switch (aEvent)
+        {
+    case EMsvServerReady:
+    case EMsvCorruptedIndexRebuilt:
+        break;
+    case EMsvMtmGroupInstalled:
+    case EMsvMtmGroupDeInstalled:
+        UpdateSettingItemsL();
+        break;
+    case EMsvEntriesCreated:
+    case EMsvEntriesDeleted:
+    case EMsvEntriesChanged:
+        folderId = (*(TMsvId*) (aArg2));
+        if ( folderId == KMsvRootIndexEntryId )
+            {
+            UpdateSettingItemsL();
+            }
+        break;
+
+    case EMsvServerFailedToStart:
+    case EMsvServerTerminated:
+    case EMsvCloseSession:
+    case EMsvGeneralError:
+    case EMsvMediaUnavailable:
+    case EMsvMediaAvailable:
+    default:
+        break;
+        }
+    }
+    
+    
+// -----------------------------------------------------------------------------
+// CMceSettingsGSPluginContainer::EditSubSettingsL()
+//
+// -----------------------------------------------------------------------------
+//
+void CMceSettingsGSPluginContainer::EditSubSettingsL()
+    {
+    const TInt numberOfItems = iListBox->Model()->NumberOfItems();
+    TInt choice = iListBox->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 mtm supports account creation then open new dialog to handle many accounts
+            TInt value = CMceSettingsMultipleServicesDialog::CreateAndExecuteL(
+                *iAccountManager,  (*iMsgTypesSettings)[choice].iUid, iMsvSession );
+            iDialogOpen = EFalse;
+            }
+        else
+            {
+            // mtm cannot create new accounts, edit only FIRST service if exists
+            CMsvEntrySelection* sel =
+                MsvUiServiceUtilities::GetListOfAccountsWithMTML( *iMsvSession, (*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
+        TInt value = CMceGeneralSettingsDialog::CreateAndExecuteL(
+            iMsvSession,
+            *this );
+        }
+    }
+
+
+// ---------------------------------------------------------
+// CMceSettingsGSPluginContainer::SortAndChangeSmsMmsEmailFirstL
+// ---------------------------------------------------------
+//
+void CMceSettingsGSPluginContainer::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 );
+    }
+
+
+// ---------------------------------------------------------
+// CMceSettingsGSPluginContainer::ChangeMsgTypeTopL
+// ---------------------------------------------------------
+//
+void CMceSettingsGSPluginContainer::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;
+            }
+        }
+    }
+
+
+// ----------------------------------------------------
+// CMceSettingsGSPluginContainer::CheckCspBitL
+// returns ETrue if Cell Broadcast csp bit is on
+//
+// ----------------------------------------------------
+TBool CMceSettingsGSPluginContainer::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