phonebookui/Phonebook2/Application/src/CPbk2AppUi.cpp
branchRCL_3
changeset 20 f4a778e096c2
child 21 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/Application/src/CPbk2AppUi.cpp	Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,598 @@
+/*
+* Copyright (c) 2005-2007 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:  Phonebook 2 application UI.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPbk2AppUi.h"
+
+// Phonebook 2
+#include "CPbk2StartupMonitor.h"
+#include "CPbk2Application.h"
+#include "CPbk2Document.h"
+#include "CPbk2ViewExplorer.h"
+#include "CPbk2TabGroupContainerExtensionModifier.h"
+#include "MPbk2ApplicationServices.h"
+#include "MPbk2ApplicationServices2.h"
+#include <CPbk2AppViewBase.h>
+#include <Pbk2DataCaging.hrh>
+#include <CPbk2StoreManager.h>
+#include <Pbk2MenuFilteringFlags.hrh>
+#include <Pbk2Commands.hrh>
+#include <CPbk2UIExtensionManager.h>
+#include <MPbk2UIExtensionFactory.h>
+#include <CPbk2ViewState.h>
+#include <Phonebook2PrivateCRKeys.h>
+#include <CPbk2SortOrderManager.h>
+#include <MPbk2ContactNameFormatter.h>
+#include <Pbk2ContactNameFormatterFactory.h>
+#include <CPbk2StorePropertyArray.h>
+#include <CPbk2FieldPropertyArray.h>
+#include <CPbk2TabGroupContainer.h>
+#include <MPbk2ContactViewSupplier.h>
+#include <Pbk2CommonUi.rsg>
+#include <Pbk2UID.h>
+#include <Phonebook2PublicPSKeys.h> 
+
+// Virtual Phonebook
+#include <VPbkVariant.hrh>
+
+// System includes
+#include <aknview.h>
+#include <eikmenup.h>
+#include <centralrepository.h>
+#include <gfxtranseffect/gfxtranseffect.h>
+#include <akntranseffect.h>
+#include <e32property.h>
+
+// Debugging headers
+#include <Pbk2Config.hrh>
+#include <Pbk2Debug.h>
+#include <Pbk2Profile.h>
+
+/// Unnamed namespace for local definitions
+namespace {
+
+_LIT( KPbk2CommandsDllResFileName, "Pbk2Commands.rsc" );
+_LIT( KPbk2UiControlsDllResFileName, "Pbk2UiControls.rsc" );
+_LIT( KPbk2CommonUiDllResFileName, "Pbk2CommonUi.rsc" );
+
+}  /// namespace
+
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::CPbk2AppUi
+// --------------------------------------------------------------------------
+//
+CPbk2AppUi::CPbk2AppUi() :
+        iUiControlsResourceFile( *iCoeEnv ),
+        iCommandsResourceFile( *iCoeEnv ),
+        iCommonUiResourceFile( *iCoeEnv )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::~CPbk2AppUi
+// Application views will be deleted by the base class destructor
+// --------------------------------------------------------------------------
+//
+CPbk2AppUi::~CPbk2AppUi()
+    {
+    CCoeEnv::Static()->RemoveForegroundObserver( *this );
+
+    delete iStartupMonitor;
+    delete iTabGroups;
+    delete iViewExplorer;
+    iUiControlsResourceFile.Close();
+    iCommandsResourceFile.Close();
+    iCommonUiResourceFile.Close();
+    Release( iAppUiExtension );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::ConstructL
+// --------------------------------------------------------------------------
+//
+void CPbk2AppUi::ConstructL()
+    {
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPbk2AppUi::ConstructL(0x%x)"), this);
+
+    PBK2_PROFILE_START(Pbk2Profile::EAppUiConstruction);
+
+    // Init base class
+    // Use local impl of the LocalVariationFeatureEnabled because app globals
+    // haven't been initialized yet at this point.
+    PBK2_PROFILE_START(Pbk2Profile::EAppUiBaseConstruct);
+    
+    //Set the single click compatibility on
+    if ( LocalVariationFeatureEnabled( EVPbkLVEnableMiddleSoftKey ) )
+        {
+        BaseConstructL( EAknEnableSkin | EAknEnableMSK | EAknSingleClickCompatible );
+        }
+    else
+        {
+        BaseConstructL( EAknEnableSkin | EAknSingleClickCompatible );
+        }
+    
+    PBK2_PROFILE_END(Pbk2Profile::EAppUiBaseConstruct);
+
+    // Load resource files
+    PBK2_PROFILE_START(Pbk2Profile::EAppUiResouceFileLoading);
+    iUiControlsResourceFile.OpenL(KPbk2RomFileDrive,
+        KDC_RESOURCE_FILES_DIR, KPbk2UiControlsDllResFileName);
+    iCommandsResourceFile.OpenL(KPbk2RomFileDrive,
+        KDC_RESOURCE_FILES_DIR, KPbk2CommandsDllResFileName);
+    iCommonUiResourceFile.OpenL(KPbk2RomFileDrive,
+        KDC_RESOURCE_FILES_DIR, KPbk2CommonUiDllResFileName);
+    PBK2_PROFILE_END(Pbk2Profile::EAppUiResouceFileLoading);
+
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPbk2AppUi::ConstructL(0x%x) Creating globals"), this);
+    // Initialize global objects after loading the resource files
+    PBK2_PROFILE_START(Pbk2Profile::EAppUiCreateGlobals);
+    iAppServices = PhonebookDocument()->ApplicationServicesL();
+    iAppServicesExtension = reinterpret_cast<MPbk2ApplicationServices2*>
+        ( PhonebookDocument()->ApplicationServicesL()->
+            MPbk2ApplicationServicesExtension(
+                KMPbk2ApplicationServicesExtension2Uid ) );
+    PhonebookDocument()->CreateGlobalsL();
+    PBK2_PROFILE_END(Pbk2Profile::EAppUiCreateGlobals);
+
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPbk2AppUi::ConstructL(0x%x) Globals created"), this);
+
+    // Create view explorer
+    PBK2_PROFILE_START(Pbk2Profile::EAppUiCreateViewExplorer);
+    iViewExplorer = CPbk2ViewExplorer::NewL( *this );
+    PBK2_PROFILE_END(Pbk2Profile::EAppUiCreateViewExplorer);
+
+    // Create AppUi extension
+    PBK2_PROFILE_START(Pbk2Profile::EAppUiCreateAppUiExtension);
+    MPbk2UIExtensionFactory* extFactory =
+        PhonebookDocument()->ExtensionManager().FactoryL();
+    iAppUiExtension = extFactory->CreatePbk2AppUiExtensionL
+        ( iAppServices->ContactManager() );
+    PBK2_PROFILE_END(Pbk2Profile::EAppUiCreateAppUiExtension);
+
+    // Create tab group
+    PBK2_PROFILE_START(Pbk2Profile::EViewExplorerConstructionCreateTabGroup);
+    // Allow extensions to extend the tab group
+    CPbk2TabGroupContainerExtensionModifier* tabGroupModifier =
+            CPbk2TabGroupContainerExtensionModifier::NewLC(
+                    *iAppUiExtension);
+    // Read and create the tab groups
+    iTabGroups = CPbk2TabGroupContainer::NewL( *iViewExplorer,
+            *tabGroupModifier );
+    CleanupStack::PopAndDestroy(tabGroupModifier);
+    PBK2_PROFILE_END(Pbk2Profile::EViewExplorerConstructionCreateTabGroup);
+
+    // Create start-up monitor
+    PBK2_PROFILE_START(Pbk2Profile::EAppUiCreateStartupMonitor);
+    iStartupMonitor = CPbk2StartupMonitor::NewL
+        ( *iAppUiExtension, iAppServices->StoreProperties(),
+          iAppServices->StoreConfiguration(),
+          iAppServices->ContactManager() );
+    iStartupMonitor->StartupBeginsL();
+    PBK2_PROFILE_END(Pbk2Profile::EAppUiCreateStartupMonitor);
+
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPbk2AppUi::ConstructL(0x%x) Opening AllContactsView"), this);
+
+    // Open the all contacts view...
+    Phonebook2::Pbk2AppUi()->ApplicationServices().
+        ViewSupplier().AllContactsViewL();
+
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPbk2AppUi::ConstructL(0x%x) Opening stores"), this);
+
+    // ...and only after that, order the stores to be opened
+    PBK2_PROFILE_START(Pbk2Profile::EAppUiOpenStores);
+    iAppServicesExtension->StoreManager().OpenStoresL();
+    PBK2_PROFILE_END(Pbk2Profile::EAppUiOpenStores);
+
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPbk2AppUi::ConstructL(0x%x) Launching names list"), this);
+
+    // Create views
+    PBK2_PROFILE_START(Pbk2Profile::EAppUiCreateViews);
+    iViewExplorer->CreateViewsL();
+    PBK2_PROFILE_END(Pbk2Profile::EAppUiCreateViews);
+
+    CCoeEnv::Static()->AddForegroundObserverL(*this);
+
+    if ( !IsForeground() )
+        {
+        if ( ExitHidesInBackground() )
+            {
+            LeavePbkInMemExitL();
+            }
+        }
+    
+    PBK2_PROFILE_END(Pbk2Profile::EAppUiConstruction);
+
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPbk2AppUi::ConstructL end"));
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::Document
+// --------------------------------------------------------------------------
+//
+CPbk2Document* CPbk2AppUi::PhonebookDocument() const
+    {
+    // Explicit cast: the document must always be of type CPbk2Document
+    return static_cast<CPbk2Document*>( Document() );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::StoreManager
+// --------------------------------------------------------------------------
+//
+CPbk2StoreManager& CPbk2AppUi::StoreManager() const
+    {
+    return iAppServicesExtension->StoreManager();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::Pbk2Application
+// --------------------------------------------------------------------------
+//
+CPbk2Application* CPbk2AppUi::Pbk2Application() const
+    {
+    // Explicit cast: the application must always be of type CPbk2Application
+    return static_cast<CPbk2Application*>( Application() );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::ExitL
+// --------------------------------------------------------------------------
+//
+void CPbk2AppUi::ExitL()
+    {
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING("CPbk2AppUi::ExitL"));
+
+    TInt err = RProperty::Set( TUid::Uid( KPbk2PSUidPublic ),
+                               KPhonebookOpenCompleted, EPhonebookClosed );
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPbk2AppUi::ExitL set pubsub key to EPhonebookClosed (%d)"), err);
+
+#ifdef _DEBUG
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING("CPbk2AppUi::ExitL real exit debug"));
+    CAknViewAppUi::ProcessCommandL( EAknCmdExit );
+#else
+    if ( ExitHidesInBackground() )
+    	{
+    	LeavePbkInMemExitL();
+    	}
+    else
+    	{
+    	PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING("CPbk2AppUi::ExitL real exit"));
+		CAknViewAppUi::ProcessCommandL( EAknCmdExit );
+    	}   
+#endif
+    
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING("CPbk2AppUi::ExitL end"));
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::ActivatePhonebookViewL
+// --------------------------------------------------------------------------
+//
+void CPbk2AppUi::ActivatePhonebookViewL
+        ( TUid aViewId, const CPbk2ViewState* aViewState /*=NULL*/ )
+    {
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING("CPbk2AppUi::ActivatePhonebookViewL"));
+    
+    if ( aViewState )
+        {
+        HBufC8* stateBuf = aViewState->PackLC();
+        ActivateLocalViewL(aViewId, CPbk2ViewState::Uid(), *stateBuf);
+        CleanupStack::PopAndDestroy();  // stateBuf
+        }
+    else
+        {
+        ActivateLocalViewL(aViewId);
+        }
+    
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING("CPbk2AppUi::ActivatePhonebookViewL end"));
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::ActiveView
+// --------------------------------------------------------------------------
+//
+CPbk2AppViewBase* CPbk2AppUi::ActiveView() const
+    {
+    // Explicit cast: iView must always be of type CPbk2AppViewBase
+    return static_cast<CPbk2AppViewBase*>( iView );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::Pbk2ViewExplorer
+// --------------------------------------------------------------------------
+//
+MPbk2ViewExplorer* CPbk2AppUi::Pbk2ViewExplorer() const
+    {
+    return iViewExplorer;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::Pbk2StartupMonitor
+// --------------------------------------------------------------------------
+//
+MPbk2StartupMonitor* CPbk2AppUi::Pbk2StartupMonitor() const
+    {
+    return iStartupMonitor;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::TabGroup
+// --------------------------------------------------------------------------
+//
+CPbk2TabGroupContainer* CPbk2AppUi::TabGroups() const
+    {
+    return iTabGroups;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::KeyEventHandler
+// --------------------------------------------------------------------------
+//
+MPbk2KeyEventHandler& CPbk2AppUi::KeyEventHandler()
+    {
+    return *this;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::ApplicationServices
+// --------------------------------------------------------------------------
+//
+MPbk2ApplicationServices& CPbk2AppUi::ApplicationServices() const
+    {
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPbk2AppUi::ApplicationServices() returning 0x%x"), iAppServices );
+
+    return *iAppServices;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::HandleCommandL
+// --------------------------------------------------------------------------
+//
+void CPbk2AppUi::HandleCommandL( TInt aCommand )
+    {
+    switch ( aCommand )
+        {
+        case EEikCmdExit:
+            {
+            // Standard exit command
+            CmdExit();
+            break;
+            }
+            
+        case EAknCmdHideInBackground:
+        	{
+            // Leave app in ram
+        	LeavePbkInMemExitL();
+        	break;
+        	}
+
+        case EAknCmdExit:
+        case EAknSoftkeyExit:
+        case EPbk2CmdExit:
+            {
+            // Perhaps leave app in ram
+            ExitL();
+            break;
+            }      
+            
+        case EAknSoftkeyBack:
+            {
+            iViewExplorer->ActivatePreviousViewL( NULL );
+            break;
+            }
+
+        default:
+            {
+            CAknViewAppUi::HandleCommandL( aCommand );
+            break;
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::ExitApplication
+// --------------------------------------------------------------------------
+//
+void CPbk2AppUi::ExitApplication()
+    {
+    Exit();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::HandleGainingForeground
+// --------------------------------------------------------------------------
+//
+void CPbk2AppUi::HandleGainingForeground()
+    {    
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING("CPbk2AppUi::HandleGainingForeground"));
+
+    if ( ExitHidesInBackground() )
+        {
+        TRAP_IGNORE( iStartupMonitor->RestartStartupL() );
+        }
+    
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING("CPbk2AppUi::HandleGainingForeground end"));
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::HandleLosingForeground
+// --------------------------------------------------------------------------
+//
+void CPbk2AppUi::HandleLosingForeground()
+    {
+    PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING(
+            "void CPbk2AppUi::HandleLosingForeground" ) );    
+
+    // we need to close possible popup menu when application is sent to
+    // background. Otherwise AvKon will likely crash since its
+    // intermediate state array is corrupted.
+    
+    // make sure we have a view
+    if (ActiveView())
+        {
+        ActiveView()->ClosePopup();
+        }
+    
+    PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING(
+                "void CPbk2AppUi::HandleLosingForeground end" ) );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::DynInitMenuPaneL
+// --------------------------------------------------------------------------
+//
+void CPbk2AppUi::DynInitMenuPaneL
+        ( TInt /*aResourceId*/, CEikMenuPane* /*aMenuPane*/ )
+    {
+    // All menu filtering happens elsewhere
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::HandleKeyEventL
+// --------------------------------------------------------------------------
+//
+TKeyResponse CPbk2AppUi::HandleKeyEventL
+        ( const TKeyEvent& aKeyEvent, TEventCode aType )
+    {
+    if (Pbk2ProcessKeyEventL(aKeyEvent, aType))
+        {
+        return EKeyWasConsumed;
+        }
+    return EKeyWasNotConsumed;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::HandleResourceChangeL
+// --------------------------------------------------------------------------
+//
+void CPbk2AppUi::HandleResourceChangeL(TInt aType)
+    {
+    CAknAppUiBase::HandleResourceChangeL( aType );
+
+    // This is needed to change the application icon when the skin changes
+    // (especially if a contact with a thumbnail is currently selected
+    // and the app icon is not visible)
+    CEikStatusPane* pane = StatusPane();
+    if ( pane )
+        {
+        pane->HandleResourceChange( aType );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::HandleForegroundEventL
+// --------------------------------------------------------------------------
+//
+void CPbk2AppUi::HandleForegroundEventL( TBool aForeground )
+    {
+    iAppServicesExtension->StoreManager().EnableCompression( aForeground );
+
+    CAknViewAppUi::HandleForegroundEventL( aForeground );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::Pbk2ProcessKeyEventL
+// --------------------------------------------------------------------------
+//
+TBool CPbk2AppUi::Pbk2ProcessKeyEventL
+        ( const TKeyEvent& aKeyEvent, TEventCode aType )
+    {
+    return iTabGroups->HandleNavigationKeyEventL( aKeyEvent, aType );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::CmdExit
+// --------------------------------------------------------------------------
+//
+inline void CPbk2AppUi::CmdExit()
+    {
+    CAknViewAppUi::Exit();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::LocalVariationFeatureEnabled
+// --------------------------------------------------------------------------
+//
+TBool CPbk2AppUi::LocalVariationFeatureEnabled( TInt aFeatureFlag )
+    {
+    TBool ret( EFalse );
+    TInt lvFlags( KErrNotFound );
+    CRepository* key = NULL;
+    // Read local variation flags
+    TRAPD( err, key =
+            CRepository::NewL( TUid::Uid( KCRUidPhonebook ) ) );
+    // if NewL fails do not set iLVFlags, new query is made next time
+    if ( err == KErrNone )
+        {
+        err = key->Get( KPhonebookLocalVariationFlags, lvFlags );
+        if ( err != KErrNone )
+            {
+            // If there were problems reading the flags,
+            // assume everything is off
+            lvFlags = 0;
+            }
+        delete key;
+        }
+
+    if ( lvFlags != KErrNotFound )
+        {
+        ret = lvFlags & aFeatureFlag;
+        }
+
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppUi::LeavePbkInMemExitL
+// --------------------------------------------------------------------------
+//
+void CPbk2AppUi::LeavePbkInMemExitL()
+	{
+	PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING("CPbk2AppUi::LeavePbkInMemExitL"));
+	
+	// Diasable bring to foreground on view activation event
+	SetCustomControl(1);
+	
+	// Hide application in background
+	HideInBackground();
+	 
+	// Activation of Names list view will send application to
+	// background. Application can not be sent here to background
+	// because  activation is asynchronous operation and application
+	// could be set to background before the view activation.
+	CPbk2ViewState* state = CPbk2ViewState::NewLC();
+	            state->SetFlags( CPbk2ViewState::EInitialized |
+	                CPbk2ViewState::ESendToBackground );
+	
+	ActivatePhonebookViewL( Phonebook2::KPbk2NamesListViewUid, state );
+	
+	CleanupStack::PopAndDestroy( state );
+	
+	PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING("CPbk2AppUi::LeavePbkInMemExitL end"));
+	}
+//  End of File