--- /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