logsui/AppSrc/CLogsAppUi.cpp
changeset 0 e686773b3f54
child 3 04ab22b956c2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/logsui/AppSrc/CLogsAppUi.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,1200 @@
+/*
+* 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: 
+*     Logs application UI class
+*
+*/
+ 
+
+// INCLUDE FILES
+#include <vwsdef.h>
+#include <AknQueryDialog.h>
+#include <aknnotedialog.h>
+#include <akntabgrp.h>
+#include <aknnavide.h>
+#include <featmgr.h>
+#include <sendui.h>
+#include <apgtask.h>
+#include <apgcli.h>
+#include <gsplugininterface.h>  
+#include <hlplch.h>
+#include <LogsUiCmdStarterConsts.h>
+#include <Logs.rsg>
+
+//+ __GFXTRANS__
+// Transition effects
+#include <gfxtranseffect/gfxtranseffect.h> 	
+#include <akntranseffect.h> 				
+#include "LogsUID.h"
+//-- __GFXTRANS__
+
+#include "CLogsAppUi.h"
+#include "CLogsEngine.h"
+#include "CLogsAppListView.h"
+#include "CLogsSubAppListView.h"
+#include "CLogsEventListView.h"
+#include "CLogsRecentListView.h"
+#include "CLogsDetailView.h"
+#include "CGprsCtView.h"
+#include "MLogsSharedData.h"
+#include "CCtView.h"
+#include "MLogsModel.h"
+#include "LogsConstants.hrh"
+#include "../LogsPlugin/CLogsSettingsView.h"
+
+#include "LogsDebug.h"
+#include "LogsTraces.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES  
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// ==================== LOCAL FUNCTIONS ====================
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::~CLogsAppUi
+// ----------------------------------------------------------------------------
+//
+CLogsAppUi::~CLogsAppUi()
+    {   
+    /**********************************************************************
+    Not in use anymore, Phonebook icons replaced by own icons 
+    if(iIconIdArray)
+        {
+        iIconIdArray->Reset();
+        delete iIconIdArray;
+        }
+       
+    delete iIconInfoContainer;
+    **********************************************************************/    
+	delete iSendUi;    
+	delete iServiceHandler;	
+	
+    FeatureManager::UnInitializeLib();
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::CLogsAppUi
+// ----------------------------------------------------------------------------
+//
+CLogsAppUi::CLogsAppUi( CLogsEngine* aEngine ) : 
+    iEngine( aEngine ), iResetToMain(EFalse)
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::Engine
+// ----------------------------------------------------------------------------
+//
+CLogsEngine* CLogsAppUi::Engine()
+    { 
+    return iEngine; 
+    }
+    
+// ----------------------------------------------------------------------------
+// CLogsAppUi::SendUiL
+//
+// Provide singleton instance of SendUI 
+// ownership remains in ClogsAppUi
+// ----------------------------------------------------------------------------
+//
+CSendUi* CLogsAppUi::SendUiL()
+    {
+    TRACE_ENTRY_POINT;
+    
+	if(!iSendUi)
+	    {
+		iSendUi=CSendUi::NewL();
+		LOGS_DEBUG_PRINT(LOGS_DEBUG_STRING
+            ( "CLogsAppUi::SendUiL - iSendUi:0x%x"), iSendUi ); 
+	    }
+	    
+	TRACE_EXIT_POINT;
+	return iSendUi;
+    }
+    
+// ----------------------------------------------------------------------------
+// CLogsAppUi::CallUiL
+//
+// Provide singleton instance of iServiceHandler for Phone calls etc,
+// ownership remains in ClogsAppUi. Attach AIW CallUI, PoC menus to Logs. 
+// ----------------------------------------------------------------------------
+//
+CAiwServiceHandler* CLogsAppUi::CallUiL( TBool aReset )
+    {
+    TRACE_ENTRY_POINT;
+    
+    if( aReset )
+        {
+        delete iServiceHandler;
+        iServiceHandler = NULL;
+        }
+    
+	if(!iServiceHandler)
+	    {
+		iServiceHandler = CAiwServiceHandler::NewL();
+        LOGS_DEBUG_PRINT(LOGS_DEBUG_STRING
+            ( "CLogsAppUi::CallUiL - iServiceHandler:0x%x"), iServiceHandler ); 
+
+        iServiceHandler->AttachL( R_LOGS_CALLUI_INTEREST );
+        iServiceHandler->AttachL( R_LOGS_POC_INTEREST ); 
+
+        iServiceHandler->AttachL( R_LOGS_SAVETOPBK_INTEREST );
+        
+        iServiceHandler->AttachMenuL( R_COMMON_SAVETOPBK_SUBMENU, R_LOGS_SAVETOPBK_INTEREST );                        
+
+        iServiceHandler->AttachMenuL( R_COMMON_CALLUI_SUBMENU, R_LOGS_CALLUI_INTEREST );
+        iServiceHandler->AttachMenuL( R_COMMON_POC_SUBMENU,    R_LOGS_POC_INTEREST );
+	    }
+	    
+    TRACE_EXIT_POINT;   
+	return iServiceHandler;
+    }
+    
+// ----------------------------------------------------------------------------
+// CLogsAppUi::ConstructL
+// ----------------------------------------------------------------------------
+//
+void CLogsAppUi::ConstructL()  //Called from framework (CEikDocument)
+    {
+    TRACE_ENTRY_POINT;
+       
+    iSendUi = NULL;
+    iServiceHandler = NULL;    
+
+    BaseConstructL(
+        EAknEnableSkin | EAknEnableMSK | EAknSingleClickCompatible );
+
+    SetProvideOnlyRecentViews( EFalse );   //By default we provide all views.
+    SetLogsOpenedWithSendKey( EFalse );  
+    
+/**********************************************************************    
+    Not in use anymore, Phonebook icons replaced by own icons 
+    //Read Phonebook iconIds for each type of Phonebook field.    
+    iIconInfoContainer = CPbkIconInfoContainer::NewL(); //Provides instance initialised with Phonebook's
+         												//default icon info (from PbkView.rsc).    
+    iIconIdArray = new(ELeave) CArrayFixFlat<TPbkIconId>( 1 );	
+**********************************************************************/    
+
+    SetExecutionMode( ELogsInForeground );
+    
+/*******************************************************************************
+ FIXME: Toolbar is currently always on - keeping the toolbar visibility handling 
+        sources in comments for now - remove later.    
+    //This cannot be done in DoConstructDelayedL, happens too late
+    if( AknLayoutUtils::PenEnabled() )
+        {
+    
+        iShowToolbar = iEngine->SharedDataL()->ToolbarVisibility() == 1;  
+             
+        }  
+*******************************************************************************/ 
+
+    //Construct CIdle object call back to finalise time consuming construction
+    iConstructDelayed = CIdle::NewL( CActive::EPriorityIdle );
+    iConstructDelayed->Start( TCallBack( ConstructDelayedCallbackL, this) );            
+     
+    TRACE_EXIT_POINT;           
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::ConstructDelayedCallbackL
+//
+// Called from CIdle once to finish time consuming construction operations
+// ----------------------------------------------------------------------------
+//
+TInt CLogsAppUi::ConstructDelayedCallbackL( TAny* aContainer )
+    {
+    CLogsAppUi* container = static_cast<CLogsAppUi*>( aContainer );
+    container->DoConstructDelayedL();    
+    return 0;
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::DoConstructDelayedL
+//
+// Perform time consuming construction operations once
+// ----------------------------------------------------------------------------
+//
+void CLogsAppUi::DoConstructDelayedL()
+    {
+    TRACE_ENTRY_POINT;
+    
+    if( iConstructDelayed ) 
+        {
+        if( iConstructDelayed->IsActive() ) //Sometimes cancel is expensive, so
+            {                               //check as should be no need for Cancel()
+            iConstructDelayed->Cancel();
+            }
+        
+        delete iConstructDelayed;
+        iConstructDelayed = NULL;
+        }
+
+    //Initial Logs view is created on-need in ProcessCommandParametersL. However, 
+    //AppShell doesn't currently provide option to send cmdline parameter, so we need 
+    //proactively be prepared to provide AppListView if activated later from AppShell.
+    //This is needed if we lose foreground and later gain it from AppShell to AppListView. 
+    //Because of EMSH-6JDFBV it's also better not try do the below in HandleLosingForeground()
+    //so we need to accept a minor performance penalty of executing the below already here.
+    if( ! View( TUid::Uid( ELogAppListViewId ) ) )  
+        {
+        CAknView* logsView = CLogsAppListView::NewL();    
+        CleanupStack::PushL(logsView);
+        AddViewL( logsView );       //takes ownership
+        CleanupStack::Pop(logsView);   
+        }
+        
+    TRACE_EXIT_POINT;
+    }
+
+
+/**********************************************************************
+Not in use anymore, Phonebook icons replaced by own icons 
+
+CArrayFix<TPbkIconId>* CLogsAppUi::IconIdArray()
+    {
+    return iIconIdArray;
+    }
+
+CPbkIconInfoContainer* CLogsAppUi::IconInfoContainer()
+    {
+    return iIconInfoContainer;
+    }
+**********************************************************************/    
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::CmdExit
+// ----------------------------------------------------------------------------
+//
+void CLogsAppUi::CmdExit()
+    {
+    
+/*******************************************************************************
+ FIXME: Toolbar is currently always on - keeping the toolbar visibility handling 
+        sources in comments for now - remove later.   
+    //Proceed to exit even if leave would happen
+    TInt err;
+    TRAP( err, iEngine->SharedDataL()->SetToolbarVisibility( iShowToolbar ? 1 : 0 ) ); //0=no toolbar  
+*******************************************************************************/    
+
+    Exit();
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::CmdBackL
+// ----------------------------------------------------------------------------
+//
+void CLogsAppUi::CmdBackL()
+    {
+    switch( iCurrentViewId.iUid )
+        {
+        case ELogDetailViewId:
+            ActivateLogsViewL( ELogEventListViewId );
+            break;
+
+        case ELogSettingsViewId:
+            ActivateLogsViewL( static_cast<TLogsViewIds>( iPreviousViewId.iUid ) );
+            break;
+
+        case EStmMissedListViewId: // fall through
+        case EStmReceivedListViewId:
+        case EStmDialledListViewId:
+            ActivateLogsViewL( ELogSubAppListViewId );
+            break;
+
+        case ELogSubAppListViewId: // fall through
+        case ECtViewId:
+        case EGprsCounterViewId:
+            ActivateLogsViewL( ELogAppListViewId );
+            break;
+
+        default:
+            break;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::ActivateLogsViewL
+// ----------------------------------------------------------------------------
+//
+void CLogsAppUi::ActivateLogsViewL( TLogsViewIds aView )
+    {
+    ActivateLogsViewL( aView, ELogsViewActivationNoMessage, KNullDesC8()); 
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::ActivateLogsViewL
+//
+// Activate requested view. The view is also created if it does not already exist.
+// ----------------------------------------------------------------------------
+//
+void CLogsAppUi::ActivateLogsViewL( 
+    TLogsViewIds aView,
+    TLogsViewActivationMessages aCustomMessageId,
+    const TDesC8& aCustomMessage )
+    {
+    TRACE_ENTRY_POINT;
+    
+    TBool rc( ETrue );
+    CAknView* logsView = View( TUid::Uid( aView ));
+
+    //If the view does not already exist, let's try to create it first
+    if( !logsView ) 
+        {
+        switch( aView )  //not yet exists, create the view
+            {
+            case ELogAppListViewId:
+                logsView = CLogsAppListView::NewL();
+                CleanupStack::PushL(logsView);
+                break;
+
+            case ELogSubAppListViewId:
+                logsView = CLogsSubAppListView::NewL();
+                CleanupStack::PushL(logsView);
+                break;
+
+            case ELogEventListViewId:
+                logsView = CLogsEventListView::NewL();
+                CleanupStack::PushL(logsView);
+                break;
+
+            case EStmMissedListViewId:
+                logsView = CLogsRecentListView::NewL( ELogsMissedModel );
+                CleanupStack::PushL(logsView);
+                break;
+
+            case EStmReceivedListViewId:
+                logsView = CLogsRecentListView::NewL( ELogsReceivedModel );
+                CleanupStack::PushL(logsView);
+                break;
+
+            case EStmDialledListViewId:
+                logsView = CLogsRecentListView::NewL( ELogsDialledModel );
+                CleanupStack::PushL(logsView);
+                break;
+
+            case ELogDetailViewId:
+                logsView = CLogsDetailView::NewL();
+                CleanupStack::PushL(logsView);
+                break; 
+
+            case EGprsCounterViewId:
+                logsView = CGprsCtView::NewL();
+                CleanupStack::PushL(logsView);
+                break;
+
+            case ELogSettingsViewId:  //viewId is implementation UID too in this case
+                //Settings is a Ecom plugin (implements CGSPluginInterface). CGSPluginInterface.cpp
+                //takes care of needed ecom clear up issues.
+                //Note! REComSession::FinalClose() is called in CLogsDocument destructor. Calling
+                //in CLogsAppUi dtor is too early as view framework destroys the view *after* appui has already 
+                //been destroyed.
+                {
+                CGSPluginInterface* gs = CGSPluginInterface::NewL( TUid::Uid( aView ), NULL); 
+                logsView = static_cast<CGSPluginInterface*>(gs);
+                CleanupStack::PushL(logsView);                
+                gs->CustomOperationL( NULL, NULL );
+                }
+                break;
+                                   
+            case ECtViewId:
+                logsView = CCtView::NewL();
+                CleanupStack::PushL(logsView);
+                break;
+
+            default:
+                break;
+            }
+
+        if( logsView )
+            {                       //Registers the view with the view server            
+            AddViewL( logsView );   // takes ownership of logsView 
+            CleanupStack::Pop(logsView);   
+            }
+        else
+            {
+            rc = EFalse;
+            }
+        }
+
+    //Activate the requested view
+    if( rc )
+        {    
+        ActivateLocalViewL( TUid::Uid( aView ), 
+                            TUid::Uid( aCustomMessageId ), 
+                            aCustomMessage );
+         
+        // If activating settings view, call SetCurrentViewId here, cause
+        // settings view can't access CLogsAppUi's functions
+        if (aView == ELogSettingsViewId)
+        	{
+        	SetCurrentViewId(TUid::Uid(aView));
+        	}
+        }
+        
+    TRACE_EXIT_POINT;
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::SetPreviousViewId
+// ----------------------------------------------------------------------------
+//
+void CLogsAppUi::SetPreviousViewId( TUid aView )
+    {
+    iPreviousViewId = aView;
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::SetCurrentViewId
+// ----------------------------------------------------------------------------
+//
+void CLogsAppUi::SetCurrentViewId( TUid aView )
+    {
+    iCurrentViewId = aView;
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::CmdOkL
+// ----------------------------------------------------------------------------
+//
+void CLogsAppUi::CmdOkL( TInt aIndex )
+    {    
+    if( TUid::Uid( ELogAppListViewId ) == iCurrentViewId )
+        {        
+        switch( aIndex )
+            {
+            case EStmStmSubAppId:
+                ActivateLogsViewL( ELogSubAppListViewId );
+                break;
+
+            case EStmTimersSubAppId:
+                ActivateLogsViewL( ECtViewId );
+                break;
+
+            case EGprsCountSubAppId:
+                ActivateLogsViewL( EGprsCounterViewId );
+                break;
+
+            default:
+                break;
+            }
+        }
+    
+    else if( TUid::Uid( ELogSubAppListViewId ) == iCurrentViewId )
+        {
+        switch( aIndex )
+            {
+            case EStmMissedId:
+                ActivateLogsViewL( EStmMissedListViewId );
+                break;
+
+            case EStmReceivedId:
+                ActivateLogsViewL( EStmReceivedListViewId );
+                break;
+
+            case EStmDialledId:
+                ActivateLogsViewL( EStmDialledListViewId );
+                break;
+
+            default:
+                break;
+            }
+        }
+    
+    else if( TUid::Uid( ELogEventListViewId ) == iCurrentViewId )
+        {
+        if( iEngine->Model( ELogsMainModel )->Count() )
+            {
+            ActivateLogsViewL( ELogDetailViewId );
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::HandleCommandL
+// ----------------------------------------------------------------------------
+//
+void CLogsAppUi::HandleCommandL( TInt aCommand )
+    {
+    TRACE_ENTRY_POINT;
+    switch( aCommand )
+        {
+        case EEikCmdExit:   //We receive this when e.g. close app is selected in fast swapping list.
+            {
+            LOGS_DEBUG_PRINT(LOGS_DEBUG_STRING
+            		( "CLogsAppUi::HandleCommandL(0x%x) - EEikCmdExit: real exit"), this );
+            CmdExit(); //Do real exit (close Logs).
+            break;     
+            }
+            
+        case EAknCmdHideInBackground:
+            {
+            TBool hideInBg( ETrue );
+#ifdef _DEBUG  //Debug mode, logs exits completely
+            hideInBg = EFalse;  
+#endif
+            if(hideInBg)
+                {
+                LOGS_DEBUG_PRINT(LOGS_DEBUG_STRING
+                        ( "CLogsAppUi::HandleCommandL(0x%x) - EAknCmdHideInBackground: fake exit"), this );
+                // Fake exit - leave app to memory but hide from user
+                 HideLogsToBackgroundL();
+                }
+            else
+                { 
+                LOGS_DEBUG_PRINT(LOGS_DEBUG_STRING
+                        ( "CLogsAppUi::HandleCommandL(0x%x) - EAknCmdHideInBackground: exit completely"), this );
+                //logs exits completely
+                CmdExit();
+                }
+            break;
+            }
+        
+        case EAknSoftkeyExit:
+        case ELogsCmdMenuExit:
+            {
+            if (ExitHidesInBackground())
+            	{
+            	LOGS_DEBUG_PRINT(LOGS_DEBUG_STRING
+            			( "CLogsAppUi::HandleCommandL(0x%x) - EAknSoftkeyExit: fake exit"), this ); 
+            	// Fake exit - leave app to memory but hide from user
+            	HideLogsToBackgroundL();
+            	}
+            else
+            	{
+            	LOGS_DEBUG_PRINT(LOGS_DEBUG_STRING
+            			( "CLogsAppUi::HandleCommandL(0x%x) - EAknSoftkeyExit: real exit"), this ); 
+            	//Do real exit, close Logs.
+            	CmdExit(); 
+            	}
+            break;
+            }       
+
+        case ELogsCmdMenuSettings:
+            ActivateLogsViewL( ELogSettingsViewId );
+            break;
+
+        case ELogsCmdFailedDueActiveCall:
+            {
+            CAknNoteDialog* noteDlg = new( ELeave ) CAknNoteDialog( CAknNoteDialog::ENoTone,
+                            CAknNoteDialog::ELongTimeout );
+            noteDlg->ExecuteLD( R_LOGS_NOTE_DURING_CALL_OPTION_NOT_ALLOWED );
+            break;
+            }
+
+        case EAknCmdHelp:
+            {
+            HlpLauncher::LaunchHelpApplicationL(iEikonEnv->WsSession(), AppHelpContextL());
+            break;
+            }
+
+        default:
+            iExitOrEndPressed = ENone;      //Reset also here 
+            break;          
+        }
+        
+    TRACE_EXIT_POINT;
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::HideLogsToBackgroundL
+// Leave the application in memory
+// ----------------------------------------------------------------------------
+//
+void CLogsAppUi::HideLogsToBackgroundL()
+    {  
+    TRACE_ENTRY_POINT;
+    
+    //+ __GFXTRANS__
+       
+    // Always use exit effect even if this is actually application switch
+    // Note: Not allowed to call GfxTransEffect::EndFullScreen() as AVKON takes care of that when
+    // EApplicationExit context is used!  
+    // Set effect begin point
+       			
+   	iExitOrEndPressed = EExitPressed; 	//Reset to obey EEikCmdExit to do real exit (e.g. in case low mem, backup etc)                           
+   	SetExecutionMode( ELogsInBackground_ExitOrEndPressed );
+
+   	//Clear info whether we were called externally (Provide complete Logs to user next time)
+   	SetProvideOnlyRecentViews( EFalse ); 
+   	                
+   	// In case foreground is later gained without commandline parameters, switch to 
+   	// Logs main view instead of the Dialled calls view.   
+    SetResetViewOnFocusRegain(ETrue);
+    
+    //Reset the ALS view selection for counters view, so that next time when Logs is opened all lines 
+   	//are again shown as default
+   	if ( View( TUid::Uid( ECtViewId ))) //View() returns null if view doesn't exist
+   		{
+   	    CCtView* view = static_cast<CCtView*>( View( TUid::Uid( ECtViewId )));
+   	    view->SetAlsLine( EAllLines );
+   	    }
+    
+    // Delete contact link checker when hiding log to background
+    Engine()->DeleteCntLinkChecker();
+    
+   	// With the ELogsViewActivationBackground message, the ActivateLogsViewL will send
+   	// a view activation message and we can go to background before it completes.
+   	// We leave dialled calls view open as that is the most important use case for Logs
+   	SetCustomControl(1);
+   	ActivateLogsViewL(EStmDialledListViewId, ELogsViewActivationBackground, KNullDesC8());
+   	      
+    TRACE_EXIT_POINT;
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::HandleWsEventL
+// ----------------------------------------------------------------------------
+//
+void CLogsAppUi::HandleWsEventL(
+    const TWsEvent& aEvent,
+    CCoeControl* aDestination )
+    {
+    TRACE_ENTRY_POINT;
+    switch (aEvent.Type())
+        {
+        case EEventFocusGained:
+            {
+            // If Logs is on background because Exit has been pressed, and we have not received
+            // a commandline message, Logs main view is to be activated when regaining foreground.
+            //
+            // This handling is needed due to the performance optimization of dialled calls used case
+            // where we leave dialled calls view on background after user selecting Exit. 
+            // This handling prevents errors like MMAN-6VADLV or MMHI-6V7ABV.
+            // 
+            if (ExecutionMode() == ELogsInBackground_ExitOrEndPressed && ResetViewOnFocusRegain())
+                {
+                SetResetViewOnFocusRegain(EFalse); // prevent further view switches
+                ActivateLogsViewL(ELogAppListViewId);
+                }
+           
+            CAknAppUi::HandleWsEventL( aEvent, aDestination );                    
+            break;
+            }
+            
+        case KAknUidValueEndKeyCloseEvent:  //0x101F87F0  (Avkon.hrh)
+
+            //We have received KAknUidValueEndKeyCloseEvent. Let it go to FW (so we dont catch it here). 
+            //Next we can wait EEikCmdExit to be received from FW to our HandleCommandL.
+            iExitOrEndPressed = EEndPressed;  
+                   
+          
+            /*******************************************************************************
+             FIXME: Toolbar is currently always on - keeping the toolbar visibility handling 
+                    sources in comments for now - remove later.
+                    
+            //IsShown() happens too late in CmdExit() when End key is pressed as Toolbar
+            //has already hidden itself. So get status here (i.e cannot be done when EEikCmdExit 
+            //is received e.g because of backup)
+            if( CurrentPopupToolbar() ) 
+                {
+                iShowToolbar = CurrentPopupToolbar()->IsShown(); //iToolbarRef->IsShown();     
+                }
+            ********************************************************************************/                 
+
+        default:
+            
+            // All other events are forwarded normally to base class
+            CAknAppUi::HandleWsEventL( aEvent, aDestination ); 
+            break;
+        }
+        
+    TRACE_EXIT_POINT;    
+    }
+
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::ResetToLogsMainView
+// ----------------------------------------------------------------------------
+//
+TBool CLogsAppUi::ResetViewOnFocusRegain() const
+    {
+    return iResetToMain;
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::SetResetToLogsMainView
+// ----------------------------------------------------------------------------
+//		
+void CLogsAppUi::SetResetViewOnFocusRegain(TBool aResetToMain)
+    {
+    iResetToMain = aResetToMain;
+    }
+		
+		
+// ----------------------------------------------------------------------------
+// CLogsAppUi::ActiveViewId
+// ----------------------------------------------------------------------------
+//
+TLogsViewIds CLogsAppUi::ActiveViewId()
+    {
+    return TLogsViewIds( iCurrentViewId.iUid );
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::PreviousAppUid
+// ----------------------------------------------------------------------------
+//
+TUid CLogsAppUi::PreviousAppUid() const
+    {
+    return iPreviousAppUid;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::SetPreviousAppUid
+// ----------------------------------------------------------------------------
+//
+void CLogsAppUi::SetPreviousAppUid( TUid aUid )
+    {
+    iPreviousAppUid = aUid;
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::SetProvideOnlyRecentViews
+// ----------------------------------------------------------------------------
+//
+void CLogsAppUi::SetProvideOnlyRecentViews( TBool aProvideOnlyRecentViews )
+    {
+    iProvideOnlyRecentViews = aProvideOnlyRecentViews;
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::ProvideOnlyRecentViews
+// ----------------------------------------------------------------------------
+//
+TBool CLogsAppUi::ProvideOnlyRecentViews() const
+    {
+    return iProvideOnlyRecentViews;
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::TabChangedL
+//
+// Activates the Logs view that corresponds to tab id of activated tab in tab group in navi pane
+// ----------------------------------------------------------------------------
+//
+void CLogsAppUi::TabChangedL(TInt aIndex)
+    {
+#if defined(_DEBUG)
+    _LIT( KPanicMsg, "CLogsAppUi::TabChangedL");
+    CEikStatusPane* statusPane = NULL;
+    statusPane = iEikonEnv->AppUiFactory()->StatusPane();
+#endif  // _DEBUG
+
+    __ASSERT_DEBUG( statusPane, User::Panic(KPanicMsg, KErrCorrupt) );
+
+    CAknNavigationControlContainer* naviCtrlContainer = NULL;
+    naviCtrlContainer = static_cast<CAknNavigationControlContainer*>( StatusPane()->
+                    ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) );
+    __ASSERT_DEBUG( naviCtrlContainer, User::Panic(KPanicMsg, KErrCorrupt) );
+
+    CAknNavigationDecorator* decorator = naviCtrlContainer->Top();
+    __ASSERT_DEBUG( decorator && decorator->ControlType() == CAknNavigationDecorator::ETabGroup,
+                    User::Panic(KPanicMsg, KErrCorrupt));
+
+    CAknTabGroup* tabGroup = static_cast<CAknTabGroup*>(decorator->DecoratedControl());
+    __ASSERT_DEBUG( tabGroup && aIndex >= 0 && aIndex < tabGroup->TabCount(),
+                    User::Panic(KPanicMsg, KErrCorrupt));
+
+    //TabIds in resource file are same as viewIds, so we can use them directly to activate a view
+    const TInt viewId(tabGroup->TabIdFromIndex(aIndex));
+    ActivateLogsViewL(static_cast<TLogsViewIds>(viewId));
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::EventListViewCurrent
+// ----------------------------------------------------------------------------
+//
+TInt CLogsAppUi::EventListViewCurrent() const
+    {
+    CAknView* view = View( TUid::Uid( ELogEventListViewId ) );
+
+    if( view )
+        {
+        return ( static_cast<CLogsEventListView*>( view ) )->EventListCurrent();
+        }
+    else
+        {
+        return KErrNotFound;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::SetEventListViewCurrent
+// ----------------------------------------------------------------------------
+//
+void CLogsAppUi::SetEventListViewCurrent( TInt aCurrent )
+    {
+    CAknView* view = View( TUid::Uid( ELogEventListViewId ) );
+
+    if( view )
+        {
+        ( static_cast<CLogsEventListView*>( view ) )->
+                                SetEventListCurrent( aCurrent );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::ExecutionMode
+// ----------------------------------------------------------------------------
+//
+TInt CLogsAppUi::ExecutionMode() const
+    {
+    return iExecutionMode;
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::SetExecutionMode
+// ----------------------------------------------------------------------------
+//
+void CLogsAppUi::SetExecutionMode( TInt aMode )
+    {
+    if (aMode == ELogsInForeground )
+        {
+        // Make sure that the view gets foreground when view activated.
+        SetCustomControl(0);
+        }
+    iExecutionMode = aMode;
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::LogsOpenedWithSendKey
+// ----------------------------------------------------------------------------
+//    
+TBool CLogsAppUi::LogsOpenedWithSendKey()
+    {
+    return iLogsOpenedWithSendKey;
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::SetLogsOpenedWithSendKey
+// ----------------------------------------------------------------------------
+//  
+void CLogsAppUi::SetLogsOpenedWithSendKey(TBool aLogsOpenedWithSendKey)
+    {
+    iLogsOpenedWithSendKey = aLogsOpenedWithSendKey;
+    }    
+
+/*******************************************************************************
+ FIXME: Toolbar is currently always on - keeping the toolbar visibility handling 
+        sources in comments for now - remove later.
+        
+// ----------------------------------------------------------------------------
+// CLogsAppUi::ToolbarVisibility()
+// ----------------------------------------------------------------------------
+//
+TInt CLogsAppUi::ToolbarVisibility() const
+    {
+    return iShowToolbar; 
+    }
+ 
+// ----------------------------------------------------------------------------
+// CLogsAppUi::RecordToolbarVisibility()
+//
+// Record current toolbar visibility 
+// ----------------------------------------------------------------------------
+//
+void CLogsAppUi::RecordToolbarVisibility() 
+    { 
+    CAknView* view = View( iCurrentViewId  );
+
+    if( view && view->IsForeground())
+        {
+        switch( iCurrentViewId.iUid )
+            {
+            case ELogEventListViewId:
+            case EStmMissedListViewId:
+            case EStmReceivedListViewId:
+            case EStmDialledListViewId:
+            case ELogDetailViewId:
+                if( CurrentPopupToolbar() ) 
+                    {
+                    iShowToolbar = CurrentPopupToolbar()->IsShown(); 
+                    }
+            }
+        }      
+    }
+ *******************************************************************************/
+   
+// ----------------------------------------------------------------------------
+// CLogsAppUi::HandleControlEventL
+//
+// from MCoeControlObserver        
+// ----------------------------------------------------------------------------
+//
+void CLogsAppUi::HandleControlEventL( 
+    CCoeControl* /* aControl */,   
+    TCoeEvent /* aEventType */ ) 
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CLogsAppUi::DynInitToolbarL
+// --------------------------------------------------------------------------
+//
+void CLogsAppUi::DynInitToolbarL( 
+    TInt /* aResourceId */, 
+    CAknToolbar* /* aToolbar */ )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CLogsAppUi::OfferToolbarEventL
+// --------------------------------------------------------------------------
+//
+void CLogsAppUi::OfferToolbarEventL( TInt aCommand )
+    {
+    ProcessCommandL( aCommand );
+    }    
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::HandleMessageL
+//
+// Handle message sent by Logs client. Called by framework, when LogsUiCmdStarter
+// request invocation of a specific view.
+// ----------------------------------------------------------------------------
+//
+MCoeMessageObserver::TMessageResponse CLogsAppUi::HandleMessageL(
+    TUint32 aClientHandleOfTargetWindowGroup,
+    TUid aMessageUid,
+    const TDesC8& aMessageParameters )
+    {
+    // If aTail is set, other app starts Logs
+    if (aMessageParameters.Length())
+	    {
+		TFileName dummy;
+  		TApaCommand cmd=EApaCommandRun;
+  		ProcessCommandParametersL(cmd,dummy,aMessageParameters);
+  		return EMessageHandled;
+	    }
+
+    return CAknViewAppUi::HandleMessageL(
+        aClientHandleOfTargetWindowGroup,
+        aMessageUid,
+        aMessageParameters);
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::ProcessCommandParametersL
+//
+// Called by framework when external application requests startup of Logs and invocation 
+// of a specific view. Also called by Logs when Logs has received a message requesting 
+// invocation of a specific view. Orginators of these messages are:
+// - LogsUiCmdStarter::CmdStartL / LogsUiCmdStarter::CmdStart 
+// - CAknSoftNotificationSubject::LaunchMissedCallsAppL()
+// - Context sensitive Help application (when certain logs view can be opened from help)
+//
+// IMPORTANT: This command line parameter interface is PRIVATE and may be replaced
+// in future with more generic solution. So do not use this unless agreed with Logs
+// project.
+//
+// For invocation of Logs application use the LogsUiCmdStarter helper functionality 
+// available in LogsUiCmdStarter.h.
+//
+// ----------------------------------------------------------------------------
+//
+TBool CLogsAppUi::ProcessCommandParametersL(
+    TApaCommand aCommand,
+    TFileName& aDocumentName,
+    const TDesC8& aTail )
+    {
+    TRACE_ENTRY_POINT;
+    
+    //Parameter strings used to invoke Logs from external applications, e.g Phone, Missed Call
+    //Notification, Help. Note that AppShell does not use this method but instead uses view 
+    //based invocation (for ELogAppListViewId)
+    
+     //1. Officially supported Logs views fo opening.    
+    _LIT8(m_old,"m");      //This can be removed when missed indicator uses the new value
+
+     //2. Non-supported Logs views for opening (for private use).    
+    _LIT8(events,"events");                 //ELogEventListViewId
+    _LIT8(timers,"timers");                 //ECtViewId
+    _LIT8(packetcounter,"packetcounter");   //EGprsCounterViewId
+    _LIT8(settings,"settings");             //ELogSettingsViewId
+    _LIT8(callregister,"callregister");     //ELogSubAppListViewId
+
+    //For internal use only    
+    _LIT8(dontActivate, "dontactivate");
+    TPtrC8 dontActivateMsg = dontActivate(); 
+    
+    // Check first if we are going to background
+    if (aCommand == EApaCommandBackground)
+    	{
+    	HideLogsToBackgroundL();
+    	}
+    //1. Officially supported Logs views.
+    else if( aTail.Compare( LogsUiCmdStarterConsts::KDialledView() ) == 0 )
+        {
+        SetProvideOnlyRecentViews( ETrue ); 
+        SetLogsOpenedWithSendKey( ETrue );           
+        SetExecutionMode( ELogsInForeground );
+        ActivateLogsViewL( EStmDialledListViewId );      
+        }
+    else if( aTail.Compare( LogsUiCmdStarterConsts::KMissedView() ) == 0 || aTail.Compare( m_old ) == 0 )
+        {
+        SetProvideOnlyRecentViews( ETrue );     
+        SetExecutionMode( ELogsInForeground );
+        ActivateLogsViewL( EStmMissedListViewId );         
+        }
+    else if( aTail.Compare( LogsUiCmdStarterConsts::KReceivedView() ) == 0  )
+        {
+        SetProvideOnlyRecentViews( ETrue );   
+        SetExecutionMode( ELogsInForeground );
+        ActivateLogsViewL( EStmReceivedListViewId );         
+        }
+    else if( aTail.Compare( LogsUiCmdStarterConsts::KCountersView() ) == 0  )
+        {
+        SetProvideOnlyRecentViews( EFalse );  
+        SetExecutionMode( ELogsInForeground );
+        ActivateLogsViewL( ELogAppListViewId );         
+        }
+    
+    //2. The views below are supported privately *only* for Context sensitive help application. 
+    //For other uses they are not visible, i.e. are not available in LogsUiCmdStarter because
+    //Logs application may change in the future (e.g. some views may be dropped). 
+    //However, when Logs application changes, then the corresponding helps need to be changed too 
+    //in parallel so we don't end up in situation in which default view is opened instead
+    //of a requested view that has been removed from Logs.
+    else if( aTail.Compare( events ) == 0  )
+        {
+        SetProvideOnlyRecentViews( EFalse ); 
+        SetExecutionMode( ELogsInForeground );
+        ActivateLogsViewL( ELogEventListViewId );         
+        }
+    else if( aTail.Compare( timers ) == 0  )
+        {
+        SetProvideOnlyRecentViews( EFalse ); 
+        SetExecutionMode( ELogsInForeground );
+        ActivateLogsViewL( ECtViewId );         
+        }
+    else if( aTail.Compare( packetcounter ) == 0  )
+        {
+        SetProvideOnlyRecentViews( EFalse );     
+        SetExecutionMode( ELogsInForeground );
+        ActivateLogsViewL( EGprsCounterViewId );         
+        }
+    else if( aTail.Compare( settings ) == 0  )
+        {
+        SetProvideOnlyRecentViews( EFalse );     
+        SetExecutionMode( ELogsInForeground );
+        ActivateLogsViewL( ELogSettingsViewId );         
+        }
+    else if( aTail.Compare( callregister ) == 0  )
+        {
+        SetProvideOnlyRecentViews( EFalse );    
+        SetExecutionMode( ELogsInForeground );
+        ActivateLogsViewL( ELogSubAppListViewId );         
+        }
+
+    //3. Skip view activation attempts        
+    else if( aTail.Compare( dontActivateMsg ) == 0  )
+        {
+        //No op
+        }
+        
+    //3. Default view
+    else 
+        {
+        SetProvideOnlyRecentViews( EFalse ); 
+        if (aCommand != EApaCommandBackground )
+            {
+            SetExecutionMode( ELogsInForeground );
+            }
+      
+        //AppShell doesn't currently provide option to send cmdline parameter, so provide 
+        //AppListView (or SubAppListView) as it is probably activated later from AppShell.        
+        if ( FeatureManager::FeatureSupported( KFeatureIdSimpleLogs ) )
+            {
+            ActivateLogsViewL( ELogSubAppListViewId, 
+                               aCommand == EApaCommandBackground ? 
+                                   ELogsViewActivationBackground : ELogsViewActivationNoMessage, 
+                               KNullDesC8() );       
+            }
+        else
+            {    
+            ActivateLogsViewL( ELogAppListViewId, 
+                               aCommand == EApaCommandBackground ? 
+                                   ELogsViewActivationBackground : ELogsViewActivationNoMessage, 
+                               KNullDesC8() ); 
+            }
+        }
+        
+    // We have received a commandline parameter so no need to reset to Logs main view
+    // when foreground\focus regained (see HandleWsEvent).
+    SetResetViewOnFocusRegain(EFalse); 
+    
+    TRACE_EXIT_POINT;
+    return CAknViewAppUi::ProcessCommandParametersL( aCommand, aDocumentName, aTail );        
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsAppUi::StartApplicationL
+//
+// Start an external application
+// ----------------------------------------------------------------------------
+//
+TBool CLogsAppUi::StartApplicationL(
+    TUid aUid,
+    const TDesC8& aTail )
+    {
+    TApaTaskList taskList( CCoeEnv::Static()->WsSession() );
+    TApaTask task = taskList.FindApp( aUid );
+    
+    if( task.Exists() ) 
+        {
+        const TUid dummyUID = { 0x0 };
+        task.SendMessage( dummyUID, aTail );
+        task.BringToForeground();  
+        }
+    else
+        { 
+        TApaAppInfo appInfo;
+        RApaLsSession lsSession;
+        User::LeaveIfError( lsSession.Connect() );        
+        CleanupClosePushL( lsSession );
+        
+        if( lsSession.GetAppInfo( appInfo, aUid ) == KErrNone )
+            {
+            CApaCommandLine* cmdLine = CApaCommandLine::NewLC();
+            cmdLine->SetExecutableNameL( appInfo.iFullName );
+            cmdLine->SetCommandL( EApaCommandRun );
+            cmdLine->SetTailEndL( aTail );
+
+            lsSession.StartApp( *cmdLine );
+            CleanupStack::PopAndDestroy( cmdLine );
+            }
+
+        CleanupStack::PopAndDestroy();  // lsSession
+        }
+        
+    return 0;
+    }
+
+
+//  End of File