diff -r 5f0182e07bfb -r 5456b4e8b3a8 idlehomescreen/widgetmanager/src/wmplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/idlehomescreen/widgetmanager/src/wmplugin.cpp Wed Sep 01 12:32:46 2010 +0100 @@ -0,0 +1,476 @@ +/* +* Copyright (c) 2009 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: +* widget manager plugin implementation +* +*/ + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wmcommon.h" +#include "widgetmanager.hrh" +#include "wmmaincontainer.h" +#include "wmmaincontainerview.h" +#include "wmresourceloader.h" +#include "wmplugin.h" +#include "wmeffectmanager.h" +#include "wmwidgetdata.h" +#include "wminstaller.h" +#include "wmlistbox.h" + +const TInt KExecuteCommandDelay( 50000 ); // 50ms +const TInt KMaxCmdExecutionCount( 6 ); + +// --------------------------------------------------------- +// CWmPlugin::NewL +// --------------------------------------------------------- +// +CWmPlugin* CWmPlugin::NewL() + { + CWmPlugin* self = new( ELeave ) CWmPlugin(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------- +// CWmPlugin::~CWmPlugin +// --------------------------------------------------------- +// +CWmPlugin::~CWmPlugin() + { + if ( iLauncher && iLauncher->IsActive() ) + { + iLauncher->Cancel(); + } + delete iLauncher; + + if ( iWmInstaller && + iWmInstaller->IsActive() ) + { + iWmInstaller->Cancel(); + } + + // delete members + delete iResourceLoader; + delete iEffectManager; + delete iPostponedContent; + delete iWmInstaller; + } + +// --------------------------------------------------------- +// CWmPlugin::CWmPlugin +// --------------------------------------------------------- +// +CWmPlugin::CWmPlugin() + { + iPreviousViewUid.iViewUid = KNullUid; + iExecutionCount = 0; + } + +// --------------------------------------------------------- +// CWmPlugin::ConstructL +// --------------------------------------------------------- +// +void CWmPlugin::ConstructL() + { + iWmMainContainer = NULL; + iPostponedCommand = ENone; + + // store static view app ui + CEikonEnv* eikonEnv = CEikonEnv::Static(); + if ( !eikonEnv ) User::Leave( KErrUnknown ); + iViewAppUi = (CAknViewAppUi*)eikonEnv->EikAppUi(); + if ( !iViewAppUi ) User::Leave( KErrUnknown ); + + // create resource loader + iFs = &eikonEnv->FsSession(); + iResourceLoader = CWmResourceLoader::NewL( *eikonEnv ); + iEffectManager = CWmEffectManager::NewL( *eikonEnv ); + iWmInstaller = CWmInstaller::NewL( *this ); + + // main view + CWmMainContainerView* mainView = + CWmMainContainerView::NewL( *this ); + CleanupStack::PushL( mainView ); + iViewAppUi->AddViewL( mainView ); + CleanupStack::Pop( mainView ); + + // laucher for adding widgets. + iLauncher = CPeriodic::NewL( CActive::EPriorityUserInput + 1 ); + } + +// --------------------------------------------------------- +// CWmPlugin::Activate +// --------------------------------------------------------- +// +void CWmPlugin::Activate() + { + // prevents opening wm if adding widget is ongoing. + if ( !iLauncher->IsActive() ) + { + CWmMainContainerView* view = static_cast( + iViewAppUi->View( TUid::Uid(EWmMainContainerViewId) ) ); + if ( !IsActive() && view && iHsContentController ) + { + // stop displaying menubar before starting fullscreen effects + CEikMenuBar* menuBar = CEikonEnv::Static()->AppUiFactory()->MenuBar(); + if ( menuBar && menuBar->IsDisplayed() ) + { + menuBar->StopDisplayingMenuBar(); + } + + TRAP_IGNORE( + iEffectManager->BeginFullscreenEffectL( + KAppStartEffectStyle ); + iViewAppUi->ActivateLocalViewL( + TUid::Uid( EWmMainContainerViewId ) ); + ); + } + } + } + +// --------------------------------------------------------- +// CWmPlugin::DeActivate +// --------------------------------------------------------- +// +void CWmPlugin::DeActivate() + { + iPostponedCommand = ENone; + iPreviousViewUid.iViewUid = KNullUid; + CWmMainContainerView* view = static_cast( + iViewAppUi->View( TUid::Uid(EWmMainContainerViewId) ) ); + if ( view ) { view->DoDeactivate(); } + } + +// --------------------------------------------------------- +// CWmPlugin::Views +// --------------------------------------------------------- +// +void CWmPlugin::Views( RPointerArray& aViews ) + { + // return view to be destroyed. + CAknView* view = iViewAppUi->View( + TUid::Uid(EWmMainContainerViewId) ); + if ( view ) + { + aViews.Append( view ); + } + } + +// --------------------------------------------------------- +// CWmPlugin::IsActive +// --------------------------------------------------------- +// +TBool CWmPlugin::IsActive() + { + TVwsViewId activeViewId(KNullUid,KNullUid); + if ( iViewAppUi->GetActiveViewId( activeViewId ) == KErrNone && + activeViewId.iViewUid == TUid::Uid( EWmMainContainerViewId ) ) + { + if ( iPreviousViewUid.iViewUid == KNullUid && + iViewAppUi->GetDefaultViewId( iPreviousViewUid ) != KErrNone ) + { + iPreviousViewUid.iAppUid = iViewAppUi->Application()->AppDllUid(); + iPreviousViewUid.iViewUid = TUid::Uid( 1 ); + } + return ETrue; + } + + return( iPreviousViewUid.iViewUid != KNullUid ); + } + +// --------------------------------------------------------- +// CWmPlugin::CloseView +// --------------------------------------------------------- +// +void CWmPlugin::CloseView() + { + if ( IsActive() ) + { + iWmMainContainer->SetClosingDown( ETrue ); + TRAPD( err, + iEffectManager->BeginFullscreenEffectL( + KAppExitEffectStyle ); + iViewAppUi->ActivateLocalViewL( + iPreviousViewUid.iViewUid ); + ); + if ( KErrNone != err ) + { + iWmMainContainer->SetClosingDown( EFalse ); + } + } + } + +// --------------------------------------------------------- +// CWmPlugin::MainViewActivated +// --------------------------------------------------------- +// +void CWmPlugin::MainViewActivated( + const TVwsViewId& /*aViewId*/, + CWmMainContainer* aWmMainContainer ) + { + // previous view for Wm is always default view. + if ( iViewAppUi->GetDefaultViewId( iPreviousViewUid ) != KErrNone ) + { + // use default if we got wrong viewid as previous view + iPreviousViewUid.iAppUid = iViewAppUi->Application()->AppDllUid(); + iPreviousViewUid.iViewUid = TUid::Uid( 1 ); + } + + iWmMainContainer = aWmMainContainer; + iEffectManager->UiRendered(); + iWmMainContainer->SetClosingDown( EFalse ); + + // Don't forward numeric keys to phone + ForwardNumericKeysToPhone( EFalse ); + } + +// --------------------------------------------------------- +// CWmPlugin::MainViewDeactivated +// --------------------------------------------------------- +// +void CWmPlugin::MainViewDeactivated() + { + // Forward numeric keys to phone + ForwardNumericKeysToPhone( ETrue ); + + iPreviousViewUid.iViewUid = KNullUid; + iWmMainContainer = NULL; + if ( iEffectManager ) + { + iEffectManager->UiRendered(); + } + + if ( !iEffectManager->IsEffectActive() ) + { + // launch effect without delay + if ( !iLauncher->IsActive() ) + { + iExecutionCount = KMaxCmdExecutionCount; + iLauncher->Start( 0, 0, TCallBack( ExecuteCommand, this ) ); + } + } + else + { + // maximum wait time is 300ms (6 x 50ms) + if ( !iLauncher->IsActive() ) + { + iExecutionCount++; + iLauncher->Start( + KExecuteCommandDelay, + KExecuteCommandDelay, + TCallBack( ExecuteCommand, this ) ); + } + } + } + +// --------------------------------------------------------- +// CWmPlugin::ForwardNumericKeysToPhone +// --------------------------------------------------------- +// +void CWmPlugin::ForwardNumericKeysToPhone( TBool aEnabled ) + { + TInt value = aEnabled ? + EPSAiForwardNumericKeysToPhone : + EPSAiDontForwardNumericKeysToPhone; + + RProperty::Set( + KPSUidAiInformation, + KActiveIdleForwardNumericKeysToPhone, + value ); + } + +// --------------------------------------------------------- +// CWmPlugin::SetPostponedCommandL +// --------------------------------------------------------- +// +void CWmPlugin::SetPostponedCommandL( + TCommand aCommand, CHsContentInfo& aContentInfo ) + { + iPostponedCommand = aCommand; + delete iPostponedContent; + iPostponedContent = NULL; + iPostponedContent = aContentInfo.CloneL(); + } + +// --------------------------------------------------------- +// CWmPlugin::ExecuteCommand +// --------------------------------------------------------- +// +TInt CWmPlugin::ExecuteCommand( TAny* aSelf ) + { + CWmPlugin* plugin = static_cast( aSelf ); + plugin->DoExecuteCommand(); + return 0; + } + +// --------------------------------------------------------- +// CWmPlugin::DoExecuteCommand +// --------------------------------------------------------- +// +void CWmPlugin::DoExecuteCommand() + { + // prevent multiple events + if ( iLauncher->IsActive() ) + { + iLauncher->Cancel(); + } + + if ( !iEffectManager->IsEffectActive() || + iExecutionCount == KMaxCmdExecutionCount ) + { + if ( iPostponedCommand == EAddToHomescreen ) + { + TRAP_IGNORE( + TInt err( KErrNone ); + err = ContentController().AddWidgetL( *iPostponedContent ); + if ( KErrNone != err ) + ShowErrorNoteL( err ); + ); + } + iPostponedCommand = ENone; + delete iPostponedContent; + iPostponedContent = NULL; + iExecutionCount = 0; // reset counter + } + else + { + iExecutionCount++; + iLauncher->Start( + KExecuteCommandDelay, + KExecuteCommandDelay, + TCallBack( ExecuteCommand, this ) ); + } + } + +// --------------------------------------------------------- +// CWmPlugin::ShowErrorNoteL +// --------------------------------------------------------- +// +void CWmPlugin::ShowErrorNoteL( TInt aError ) + { + switch ( aError ) + { + case KHsErrorViewFull: + case KHsErrorDoesNotFit: + // Not enough space to add new widget to active page. + // Remove some content first. + ResourceLoader().InfoPopupL( + R_QTN_HS_ADD_WIDGET_NO_SPACE_NOTE, KNullDesC ); + break; + case KErrNoMemory: + case KErrDiskFull: + // do not show error note here to avoid multiple error notes + break; + default: + ResourceLoader().ErrorPopup( aError ); + break; + } + } + +// --------------------------------------------------------- +// CWmPlugin::ViewAppUi +// --------------------------------------------------------- +// +CAknViewAppUi& CWmPlugin::ViewAppUi() + { + return *iViewAppUi; + } + +// --------------------------------------------------------- +// CWmPlugin::ResourceLoader +// --------------------------------------------------------- +// +CWmResourceLoader& CWmPlugin::ResourceLoader() + { + return *iResourceLoader; + } + +// --------------------------------------------------------- +// CWmPlugin::ContentController +// --------------------------------------------------------- +// +MHsContentController& CWmPlugin::ContentController() + { + return *iHsContentController; + } + +// --------------------------------------------------------- +// CWmPlugin::FileServer +// --------------------------------------------------------- +// +RFs& CWmPlugin::FileServer() + { + return *iFs; + } + +// --------------------------------------------------------- +// CWmPlugin::NotifyWidgetListChanged +// --------------------------------------------------------- +// +void CWmPlugin::NotifyWidgetListChanged() + { + if ( iWmMainContainer && !iWmMainContainer->ClosingDown() ) + { + iWmMainContainer->HandleWidgetListChanged(); + } + } + +// --------------------------------------------------------- +// CWmPlugin::WmInstaller +// --------------------------------------------------------- +// +CWmInstaller& CWmPlugin::WmInstaller() + { + return *iWmInstaller; + } + +// --------------------------------------------------------- +// CWmPlugin::GetUnistalledWidget +// --------------------------------------------------------- +// +CWmWidgetData* CWmPlugin::GetUninstalledWidgetByUid( TUid aUid ) + { + CWmWidgetData* retVal = NULL; + if ( iWmMainContainer ) + { + const RWidgetDataValues& widgetArray = + iWmMainContainer->WmListBox().WidgetDataArray(); + for ( TInt i = 0; i < widgetArray.Count(); i++ ) + { + CWmWidgetData* widgetData = widgetArray[i]; + if ( widgetData->IsUninstalling() && + widgetData->PublisherUid() == aUid ) + { + retVal = widgetArray[i]; + break; + } + } + } + return retVal; + } + +// End of file +