diff -r 000000000000 -r a4daefaec16c commsconfig/cscapplicationui/src/cscserviceview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commsconfig/cscapplicationui/src/cscserviceview.cpp Mon Jan 18 20:12:36 2010 +0200 @@ -0,0 +1,827 @@ +/* +* Copyright (c) 2007-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: CSC Applicationīs Service View +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "csc.hrh" +#include "cscappui.h" +#include "csclogger.h" +#include "cscdialog.h" +#include "cscconstants.h" +#include "cscserviceview.h" +#include "cscnoteutilities.h" +#include "cscengcchhandler.h" +#include "cscservicecontainer.h" +#include "cscengstartuphandler.h" +#include "cscengservicehandler.h" +#include "cscengbrandinghandler.h" +#include "cscengservicepluginhandler.h" +#include "cscenguiextensionpluginhandler.h" + + + +// ======== MEMBER FUNCTIONS ======== + +const TUid KAIAppUid = { 0x102750F0 }; // active idle app uid + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +CCSCServiceView::CCSCServiceView( + CCSCEngServicePluginHandler& aServicePluginHandler, + CCSCEngUiExtensionPluginHandler& aUiExtensionPluginHandler, + CCSCEngStartupHandler& aStartupHandler, + CCSCEngServiceHandler& aServiceHandler, + CCSCEngBrandingHandler& aBrandingHandler, + CCSCEngCCHHandler& aCCHHandler ) + : + iServicePluginHandler( aServicePluginHandler ), + iUiExtensionPluginHandler( aUiExtensionPluginHandler ), + iStartupHandler( aStartupHandler ), + iServiceHandler( aServiceHandler ), + iBrandingHandler( aBrandingHandler ), + iCCHHandler( aCCHHandler ), + iStartup( ETrue ) + { + } + + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CCSCServiceView::ConstructL() + { + CSCDEBUG( "CCSCServiceView::ConstructL - begin" ); + + BaseConstructL( R_CSC_VIEW_SERVICE ); + iSettingsUi = CCSCSettingsUi::NewL( *iEikonEnv ); + + CSCDEBUG( "CCSCServiceView::ConstructL - end" ); + } + + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +CCSCServiceView* CCSCServiceView::NewL( + CCSCEngServicePluginHandler& aServicePluginHandler, + CCSCEngUiExtensionPluginHandler& aUiExtensionPluginHandler, + CCSCEngStartupHandler& aStartupHandler, + CCSCEngServiceHandler& aServiceHandler, + CCSCEngBrandingHandler& aBrandingHandler, + CCSCEngCCHHandler& aCCHHandler ) + { + CCSCServiceView* self = + CCSCServiceView::NewLC( + aServicePluginHandler, + aUiExtensionPluginHandler, + aStartupHandler, + aServiceHandler, + aBrandingHandler, + aCCHHandler ); + + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +CCSCServiceView* CCSCServiceView::NewLC( + CCSCEngServicePluginHandler& aServicePluginHandler, + CCSCEngUiExtensionPluginHandler& aUiExtensionPluginHandler, + CCSCEngStartupHandler& aStartupHandler, + CCSCEngServiceHandler& aServiceHandler, + CCSCEngBrandingHandler& aBrandingHandler, + CCSCEngCCHHandler& aCCHHandler ) + { + CCSCServiceView* self = + new( ELeave ) CCSCServiceView( + aServicePluginHandler, + aUiExtensionPluginHandler, + aStartupHandler, + aServiceHandler, + aBrandingHandler, + aCCHHandler ); + + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +CCSCServiceView::~CCSCServiceView() + { + CSCDEBUG( "CCSCServiceView::~CCSCServiceView - begin" ); + + iOfferedPluginUids.Reset(); + + delete iSettingsUi; + delete iContainer; + + CSCDEBUG( "CCSCServiceView::~CCSCServiceView - end" ); + } + + +// --------------------------------------------------------------------------- +// Updates container data because of layout change. +// --------------------------------------------------------------------------- +// +void CCSCServiceView::UpdateLayout( TInt aType ) + { + CSCDEBUG( "CCSCServiceView::UpdateLayout - begin" ); + + if ( iContainer ) + { + iContainer->SetRect( ClientRect() ); + TRAP_IGNORE( iContainer->UpdateServiceViewL() ); + iContainer->HandleResourceChange( aType ); + } + + CSCDEBUG( "CCSCServiceView::UpdateLayout - end" ); + } + + +// --------------------------------------------------------------------------- +// CCSCServiceView::InitializeWithStartupParametersL +// --------------------------------------------------------------------------- +// +void CCSCServiceView::InitializeWithStartupParametersL() + { + CSCDEBUG( "CCSCServiceView::InitializeWithStartupParametersL" ); + + CCSCEngStartupHandler::TAction action = iStartupHandler.GetParamAction(); + TBool isServiceViewDefault = + CCSCEngStartupHandler::EOpenSettingsUi != action; + TUint serviceId = iStartupHandler.GetParamServiceId(); + TUid tabViewId( KNullUid ); + tabViewId.iUid = iServiceHandler.ServiceTabViewIdL( serviceId ); + iSettingsUi->InitializeL( + tabViewId, serviceId, isServiceViewDefault ? this : NULL ); + } + + +// --------------------------------------------------------------------------- +// From class CAknView. +// Handles the commands. If the command is command which is require to +// display outline-screen, the command display outline-screen +// corresponded to required. +// --------------------------------------------------------------------------- +// +void CCSCServiceView::HandleCommandL( TInt aCommand ) + { + CSCDEBUG2( "CCSCServiceView::HandleCommandL aCommand: %d", aCommand ); + + switch ( aCommand ) + { + case EAknSoftkeyOpen: + case ECSCCmdOpen: + case EAknSoftkeySelect: + HandleListboxItemOpenL(); + break; + case ECSCCommandDelete: + iContainer->DeleteServiceL(); + break; + case EAknCmdHelp: + if ( FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + CArrayFix* buf = AppUi()->AppHelpContextL(); + HlpLauncher::LaunchHelpApplicationL( + iEikonEnv->WsSession(), buf ); + } + break; + // Exit menu command. + case EAknSoftkeyExit: + case EAknSoftkeyBack: + AppUi()->HandleCommandL( EEikCmdExit ); + break; + // Let appui handle other commands. + default: + CSCDEBUG( "CCSCServiceView::HandleCommandL: !!DEFAULT!!" ); + AppUi()->HandleCommandL( aCommand ); + break; + } + } + + +// --------------------------------------------------------------------------- +// From class CAknView. +// The ID of view. +// --------------------------------------------------------------------------- +// +TUid CCSCServiceView::Id() const + { + return KCSCServiceViewId; + } + +// --------------------------------------------------------------------------- +// From class CAknView. +// Handle foreground event. +// --------------------------------------------------------------------------- +// +void CCSCServiceView::HandleForegroundEventL( TBool aForeground ) + { + if ( aForeground ) + { + ExecuteStartupActionsL( ETrue ); + } + } + + +// --------------------------------------------------------------------------- +// For handling ui extension plug-in exits +// --------------------------------------------------------------------------- +// +void CCSCServiceView::HandleUiExtensionExitL() + { + CSCDEBUG( "CCSCServiceView::HandleUiExtensionExit - begin" ); + + AppUi()->ActivateLocalViewL( KCSCServiceViewId ); + + TUid appUid = iStartupHandler.GetParamAppUid(); + + if ( appUid.iUid ) + { + // Open application matching uid + RApaLsSession session; + CleanupClosePushL( session ); + + User::LeaveIfError(session.Connect()); + + TFileName fileName; + TThreadId threadId; + + User::LeaveIfError( + session.StartDocument( fileName, appUid, threadId ) ); + + CleanupStack::PopAndDestroy( &session ); + + // Reset startup parameter app uid + iStartupHandler.ResetUid( CCSCEngStartupHandler::EAppUid ); + } + + CSCDEBUG( "CCSCServiceView::HandleUiExtensionExit - end" ); + } + + +// --------------------------------------------------------------------------- +// For updating service view +// --------------------------------------------------------------------------- +// +void CCSCServiceView::UpdateServiceViewL() + { + CSCDEBUG( "CCSCServiceView::UpdateServiceViewL - begin" ); + + iContainer->UpdateServiceViewL(); + + CSCDEBUG( "CCSCServiceView::UpdateServiceViewL - end" ); + } + + +// --------------------------------------------------------------------------- +// For deleting service. +// --------------------------------------------------------------------------- +// +void CCSCServiceView::DeleteServiceL( TUint serviceId ) + { + CSCDEBUG( "CCSCServiceView::DeleteServiceL - begin" ); + + TUid pluginUid( KNullUid ); + TInt32 servicePluginId( 0 ); + + TRAPD( err, servicePluginId = + iServiceHandler.ServiceSetupPluginIdL( serviceId ) ); + + if ( !err && servicePluginId ) + { + pluginUid.iUid = servicePluginId; + iContainer->HandleServicePluginRemovationL( pluginUid ); + } + else + { + iContainer->DeleteServiceL(); + } + + CSCDEBUG( "CCSCServiceView::DeleteServiceL - end" ); + } + +// --------------------------------------------------------------------------- +// Shows information about failed configuration. +// --------------------------------------------------------------------------- +// +void CCSCServiceView::ServiceConfiguringFailedL( TInt aIndex ) + { + CSCDEBUG( "CCSCServiceView::ServiceConfiguringFailedL - begin" ); + + TServicePluginInfo pluginInfo; + + if ( iServicePluginHandler.PluginCount( + CCSCEngServicePluginHandler::EInitialized ) > aIndex ) + { + pluginInfo = iServicePluginHandler.ItemFromPluginInfoArray( aIndex ); + + if ( pluginInfo.iProviderName.Length() ) + { + CCSCNoteUtilities::ShowInformationNoteL( + CCSCNoteUtilities::ECSCUnableToConfigureNote, + pluginInfo.iProviderName ); + } + + // Try to remove uncomplete settings by calling service setup plugin. + iServicePluginHandler.DoRemovationL( pluginInfo.iPluginsUid, EFalse ); + } + + AppUi()->ActivateLocalViewL( KCSCServiceViewId ); + + CSCDEBUG( "CCSCServiceView::ServiceConfiguringFailedL - end" ); + } + + +// --------------------------------------------------------------------------- +// Hides dialog wait note. +// --------------------------------------------------------------------------- +// + void CCSCServiceView::HideDialogWaitNote() + { + if ( iContainer ) + { + iContainer->HideDialogWaitNote(); + } + } + +// --------------------------------------------------------------------------- +// From class MEikListBoxObserver. +// For handling list box events. +// --------------------------------------------------------------------------- +// +void CCSCServiceView::HandleListBoxEventL( CEikListBox* /*aListBox*/, + TListBoxEvent aEventType ) + { + CSCDEBUG2( "CCSCServiceView::HandleListBoxEventL aEventType: %d", + aEventType ); + + switch( aEventType ) + { + case EEventEnterKeyPressed: + case EEventItemSingleClicked: + HandleListboxItemOpenL(); + break; + default: + CSCDEBUG( "CCSCServiceView::HandleListBoxEventL !!DEFAULT!!" ); + break; + } + } + + +// --------------------------------------------------------------------------- +// From class MCSCServiceContainerObserver. +// Update softkey. +// --------------------------------------------------------------------------- +// +void CCSCServiceView::UpdateCbaL() + { + if( !Cba() ) + { + return; + } + + TInt commandId ( EAknSoftkeyOpen ); + HBufC* selectText = StringLoader::LoadLC( R_CSC_MSK_SELECT ); + HBufC* openText = StringLoader::LoadLC( R_CSC_MSK_OPEN ); + + if( iContainer->CurrentItemIndex() >= 0 ) + { + if( iContainer->ListBoxItem().iPluginUid != KAccountCreationPluginUID ) + { + Cba()->SetCommandL( CEikButtonGroupContainer::EMiddleSoftkeyPosition, + commandId, *openText ); + } + else + { + commandId = EAknSoftkeySelect; + Cba()->SetCommandL( CEikButtonGroupContainer::EMiddleSoftkeyPosition, + commandId, *selectText ); + } + } + else + { + Cba()->MakeCommandVisibleByPosition( + CEikButtonGroupContainer::EMiddleSoftkeyPosition, EFalse ); + } + + Cba()->DrawDeferred(); + CleanupStack::PopAndDestroy( openText ); + CleanupStack::PopAndDestroy( selectText ); + } + + +// --------------------------------------------------------------------------- +// For handling listbox item opening +// --------------------------------------------------------------------------- +// +void CCSCServiceView::HandleListboxItemOpenL() + { + CSCDEBUG( "CCSCServiceView::HandleListboxItemOpen - begin" ); + + TListBoxItem item = iContainer->ListBoxItem(); + + switch ( item.iItemType ) + { + case TListBoxItem::EUiExtension: + { + iUiExtensionPluginHandler.LaunchUiExtensionL( + item.iPluginUid, Id() ); + break; + } + case TListBoxItem::EGeneralService: + case TListBoxItem::EServicePlugin: + { + iSettingsUi->InitializeL( Id(), item.iServiceId, this ); + iSettingsUi->LaunchSettingsUiL(); + break; + } + default: + { + User::Leave( KErrArgument ); + break; + } + } + + CSCDEBUG( "CCSCServiceView::HandleListboxItemOpen - end" ); + } + + +// --------------------------------------------------------------------------- +// For changing text in the title pane. +// --------------------------------------------------------------------------- +// +void CCSCServiceView::SetTitlePaneTextL() const + { + CSCDEBUG( "CCSCServiceView::SetTitlePaneTextL - begin" ); + + CEikStatusPane* statusPane = iEikonEnv->AppUiFactory()->StatusPane(); + + CAknTitlePane* titlePane = + static_cast ( statusPane->ControlL( + TUid::Uid( EEikStatusPaneUidTitle ) ) ); + + HBufC* text = iEikonEnv->AllocReadResourceLC( R_CSC_SERVICE_VIEW_TITLE ); + titlePane->SetTextL( text->Des() ); + CleanupStack::PopAndDestroy( text ); + + CSCDEBUG( "CCSCServiceView::SetTitlePaneTextL - end" ); + } + + +// --------------------------------------------------------------------------- +// Handle service configuration. +// --------------------------------------------------------------------------- +// +TBool CCSCServiceView::HandleServiceConfigurationL( TUid aUid ) + { + CSCDEBUG( "CCSCServiceView::HandleServiceConfigurationL" ); + + TInt initializedCount( iServicePluginHandler.PluginCount( + CCSCEngServicePluginHandler::EInitialized ) ); + + TBool canceled( EFalse ); + TServicePluginInfo pluginInfo; + + if ( KNullUid != aUid ) + { + for ( TInt i( 0 ) ; i < initializedCount ; i++ ) + { + pluginInfo = iServicePluginHandler.ItemFromPluginInfoArray( i ); + + if ( aUid == pluginInfo.iPluginsUid && !pluginInfo.iProvisioned ) + { + iStartupHandler.ResetUid( CCSCEngStartupHandler::EPluginUid ); + + iOfferedPluginUids.Append( pluginInfo.iPluginsUid ); + + CCSCNoteUtilities::TCSCNoteType + type = CCSCNoteUtilities::ECSCConfigureServiceQuery; + + if ( CCSCNoteUtilities::ShowCommonQueryL( + type, pluginInfo.iProviderName ) ) + { + iServicePluginHandler.DoProvisioningL( + pluginInfo.iPluginsUid, KCSCServiceViewId ); + } + else + { + canceled = ETrue; + } + } + } + + } + else + { + for ( TInt j( 0 ) ; j < initializedCount ; j++ ) + { + pluginInfo = iServicePluginHandler.ItemFromPluginInfoArray( j ); + + if ( !pluginInfo.iProvisioned ) + { + iOfferedPluginUids.Append( pluginInfo.iPluginsUid ); + + CCSCNoteUtilities::TCSCNoteType type = + CCSCNoteUtilities::ECSCConfigureServiceQuery; + + if ( CCSCNoteUtilities::ShowCommonQueryL( + type, pluginInfo.iProviderName ) ) + { + iServicePluginHandler.DoProvisioningL( + pluginInfo.iPluginsUid, KCSCServiceViewId ); + } + else + { + canceled = ETrue; + } + } + } + } + + return canceled; + } + + +// --------------------------------------------------------------------------- +// Executes startup actions based on startup parameters. +// --------------------------------------------------------------------------- +// +void CCSCServiceView::ExecuteStartupActionsL( + TBool aForeGroundEvent, + TBool aLaunchedFromAi ) + { + CSCDEBUG( "CCSCServiceView::ExecuteStartupActionsL - begin" ); + + CCSCEngStartupHandler::TAction action = iStartupHandler.GetParamAction(); + TUid pluginUid = iStartupHandler.GetParamPluginUid(); + TUint serviceId = iStartupHandler.GetParamServiceId(); + + switch( action ) + { + case CCSCEngStartupHandler::EAddSetupPluginService: + { + if ( KNullUid != pluginUid ) + { + HandleServiceConfigurationL( pluginUid ); + } + break; + } + case CCSCEngStartupHandler::ERemoveSetupPluginService: + { + if ( KNullUid != pluginUid && !aForeGroundEvent ) + { + TRAPD( err, iContainer->HandleServicePluginRemovationL( + pluginUid ) ); + + // If error in service plugin removal, close csc. + if ( err ) + { + AppUi()->RunAppShutter(); + } + } + break; + } + case CCSCEngStartupHandler::EOpenUiExtension: + { + if ( KNullUid != pluginUid ) + { + TRAP_IGNORE( + iUiExtensionPluginHandler.LaunchUiExtensionL( + pluginUid, Id(), aLaunchedFromAi ) ); + + iStartupHandler.ResetUid( + CCSCEngStartupHandler::EPluginUid ); + } + break; + } + case CCSCEngStartupHandler::EOpenSettingsUi: + { + if ( serviceId ) + { + TUid tabview( KNullUid ); + tabview.iUid = iServiceHandler.ServiceTabViewIdL( serviceId ); + iSettingsUi->InitializeL( tabview, serviceId, NULL ); + iSettingsUi->LaunchSettingsUiL(); + iStartupHandler.ResetServiceId(); + } + break; + } + // Default action is to check unprovisioned service setup plugins. + default: + { + TInt initializedCount( iServicePluginHandler.PluginCount( + CCSCEngServicePluginHandler::EInitialized ) ); + + for ( TInt i( 0 ) ; i < initializedCount ; i++ ) + { + TBool alreadyOffered( EFalse ); + + TServicePluginInfo pluginInfo = + iServicePluginHandler.ItemFromPluginInfoArray( i ); + + for ( TInt j( 0 ); j < iOfferedPluginUids.Count() ; j++ ) + { + if ( pluginInfo.iPluginsUid == iOfferedPluginUids[ j ] ) + { + alreadyOffered = ETrue; + break; + } + } + + if ( !pluginInfo.iProvisioned && !alreadyOffered ) + { + TBool canceled = HandleServiceConfigurationL( + pluginInfo.iPluginsUid ); + + if ( !canceled ) + { + break; + } + } + } + break; + } + } + + CSCDEBUG( "CCSCServiceView::ExecuteStartupActionsL - end" ); + } + + +// --------------------------------------------------------------------------- +// From class CAknView. +// Dynamically initializes the contents of the menu list +// --------------------------------------------------------------------------- +// +void CCSCServiceView::DynInitMenuPaneL( TInt aResourceId, + CEikMenuPane* aMenuPane ) + { + CSCDEBUG( "CCSCServiceView::DynInitMenuPaneL - begin" ); + + if ( R_CSC_SERVICEVIEW_MENU == aResourceId && aMenuPane ) + { + TBool itemSpecificCommandsEnabled = + MenuBar()->ItemSpecificCommandsEnabled(); + + if( ( iContainer->CurrentItemIndex() >= 0 ) && + itemSpecificCommandsEnabled ) + { + if( iContainer->ListBoxItem().iPluginUid != + KAccountCreationPluginUID ) + { + aMenuPane->SetItemDimmed( EAknSoftkeySelect, ETrue ); + aMenuPane->SetItemDimmed( EAknSoftkeyOpen, EFalse ); + } + else + { + aMenuPane->SetItemDimmed( EAknSoftkeySelect, EFalse ); + aMenuPane->SetItemDimmed( EAknSoftkeyOpen, ETrue ); + } + } + else + { + aMenuPane->SetItemDimmed( EAknSoftkeySelect, ETrue ); + aMenuPane->SetItemDimmed( EAknSoftkeyOpen, ETrue ); + } + + // =================================================================== + // Delete service menu option. + // =================================================================== + // + if ( !itemSpecificCommandsEnabled ) + { + TInt index = iContainer->CurrentItemIndex(); + TPoint penDownPoint = iContainer->PenDownPoint(); + iContainer->ListBox().View()->XYPosToItemIndex( + penDownPoint, index ); + iContainer->SetCurrentIndex( index ); + } + + if ( TListBoxItem::EUiExtension == + iContainer->ListBoxItem().iItemType ) + { + aMenuPane->SetItemDimmed( ECSCCommandDelete, ETrue ); + aMenuPane->SetItemSpecific( ECSCCommandDelete, EFalse ); + } + else + { + aMenuPane->SetItemDimmed( ECSCCommandDelete, EFalse ); + aMenuPane->SetItemSpecific( ECSCCommandDelete, ETrue ); + } + } + + CSCDEBUG( "CCSCServiceView::DynInitMenuPaneL - end" ); + } + + +// --------------------------------------------------------------------------- +// From class CAknView. +// Creates the Container class object. +// --------------------------------------------------------------------------- +// +void CCSCServiceView::DoActivateL( const TVwsViewId& aPrevViewId, + TUid /*aCustomMessageId*/, + const TDesC8& /*aCustomMessage*/) + { + CSCDEBUG( "CCSCServiceView::DoActivateL - begin" ); + + // Create container if it's not exists. + if( !iContainer ) + { + iContainer = CCSCServiceContainer::NewL( + ClientRect(), + *this, + iServicePluginHandler, + iUiExtensionPluginHandler, + iServiceHandler, + iBrandingHandler, + iCCHHandler ); + + SetTitlePaneTextL(); + iContainer->SetMopParent( this ); + iContainer->SetListBoxObserver( this ); + iContainer->MakeVisible( ETrue ); + AppUi()->AddToStackL( *this, iContainer ); + iContainer->SetCurrentIndex( iCurrentIndex ); + } + + // Check startup parameters to see is there something to do with plugins. + if ( iStartup ) + { + iStartup = EFalse; + if ( KAIAppUid == aPrevViewId.iAppUid ) + { + // launched from active idle + iStartupHandler.SetStartedFromHomescreen( ETrue ); + ExecuteStartupActionsL( EFalse, ETrue ); + } + else + { + iStartupHandler.SetStartedFromHomescreen( EFalse ); + ExecuteStartupActionsL(); + } + } + + UpdateCbaL(); + + CSCDEBUG( "CCSCServiceView::DoActivateL - end" ); + } + + +// --------------------------------------------------------------------------- +// From class CAknView. +// Deletes the Container class object. +// --------------------------------------------------------------------------- +// +void CCSCServiceView::DoDeactivate() + { + CSCDEBUG( "CCSCServiceView::DoDeactivate - begin" ); + + if ( iContainer ) + { + iCurrentIndex = iContainer->CurrentItemIndex(); + AppUi()->RemoveFromStack( iContainer ); + delete iContainer; + iContainer = NULL; + } + + CSCDEBUG( "CCSCServiceView::DoDeactivate - end" ); + } +