diff -r 6b5204869ed5 -r 89c890c70182 psln/Src/PslnScreenSaverView.cpp --- a/psln/Src/PslnScreenSaverView.cpp Fri Jun 25 18:53:58 2010 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,818 +0,0 @@ -/* -* Copyright (c) 2005-2007 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: Screen saver view. -* -*/ - - -// INCLUDE FILES - -// RProperty keys. -#include -#include - -// Central repository. -#include -#include - -// AVKON services. -#include -#include -#include -#include -#include - -// Power save mode setting -#include - -// Psln specific. -#include -#include "PslnModel.h" -#include "PslnScreenSaverView.h" -#include "PslnScreenSaverContainer.h" -#include "PslnConst.h" -#include "PslnUi.h" - -// CONSTANTS -// Number of default system screensavers. -const TInt KPslnSystemScreenSavers = 2; -// Value in PubSub when screensaver preview is off. -const TInt KPslnScreenSaverPreviewOff = 0; - -// ============================ MEMBER FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// C++ default constructor can NOT contain any code, that might leave. -// ----------------------------------------------------------------------------- -// -CPslnScreenSaverView::CPslnScreenSaverView() - { - } - -// ----------------------------------------------------------------------------- -// Symbian 2nd phase constructor can leave. -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::ConstructL() - { - BaseConstructL( R_PSLN_SCREENSAVER_VIEW ); - - iNaviPaneContext = iPslnUi->PslnTabGroup(); - - iScreenSaverRepository = NULL; - iScreenSaverNotifier = CCenRepNotifyHandler::NewL( - *this, - *iScreenSaverRepository, - CCenRepNotifyHandler::EIntKey, - NULL ); - - // Load screensavers. - iModel->LoadScreensaverArrayL(); - } - -// ----------------------------------------------------------------------------- -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -CPslnScreenSaverView* CPslnScreenSaverView::NewLC() - { - CPslnScreenSaverView* self = new (ELeave) CPslnScreenSaverView(); - CleanupStack::PushL( self ); - self->ConstructL(); - return self; - } - -// Destructor -CPslnScreenSaverView::~CPslnScreenSaverView() - { - if ( iPreviewModeSubscriber ) - { - iPreviewModeSubscriber->Cancel(); - } - iPreviewModeProperty.Close(); - delete iPreviewModeSubscriber; - if ( iPreviewStateSubscriber ) - { - iPreviewStateSubscriber->Cancel(); - } - iPreviewStateProperty.Close(); - delete iPreviewStateSubscriber; - - if(iPsmClient) - { - iPsmClient->CancelPowerSaveModeNotificationRequest(); - delete iPsmClient; - } - - if ( iWaitDlg ) - { - delete iWaitDlg; - } - - if ( iScreenSaverNotifier->IsActive() ) - { - iScreenSaverNotifier->StopListening(); - } - delete iScreenSaverNotifier; - delete iScreenSaverRepository; - } - -// ----------------------------------------------------------------------------- -// CPslnScreenSaverView::Id -// ----------------------------------------------------------------------------- -// -TUid CPslnScreenSaverView::Id() const - { - return KPslnScreenSaverView; - } - -// ----------------------------------------------------------------------------- -// CPslnScreenSaverView::HandleCommandL -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::HandleCommandL( TInt aCommand ) - { - TInt currentItem = 0; - if ( iContainer ) - { - currentItem = iContainer->CurrentItemIndex(); - } - switch ( aCommand ) - { - case EPslnCmdAppChangeScreenSaver: - if ( iModel->ScreensaverHasCapability( currentItem, EScpCapsConfigure ) ) - { - HandleScreenSaverSettingsL( currentItem ); - } - else - { - HandleScreenSaverActivationL( currentItem ); - } - break; - case EPslnCmdAppSetScreenSaver: -#ifdef __WINS__ - // Trap in wins => unhandled leave propagated to UI level. - TRAP_IGNORE( HandleScreenSaverActivationL( currentItem ) ); -#else - HandleScreenSaverActivationL( currentItem ); -#endif //__WINS__ - break; - - case EPslnCmdPreviewScreenSaver: - HandleScreenSaverPreviewL( currentItem ); - break; - - case EPslnCmdAppSettings: - HandleScreenSaverSettingsL( currentItem ); - break; - - case EAknSoftkeyExit: - aCommand = EAknCmdExit; - //lint -fallthrough - default: - iPslnUi->HandleCommandL( aCommand ); - break; - } - } - -// ----------------------------------------------------------------------------- -// When screensaver list is updated due to install/uninstall of screensaver, -// this method is called. -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::HandlePluginListChangeL() - { - // Set highlight to selected item. - if ( iContainer ) - { - static_cast (iContainer)->UpdateListBoxL(); - - TInt newDefault = iModel->CurrentPropertyIndexL( KPslnScreenSettingId ); - if ( newDefault == KErrNotFound ) - { - // If no default found, assume that date is default. - newDefault = 0; - iModel->SetCurrentPropertyTypeL( - KPslnScreenSettingId, - newDefault ); - } - iContainer->SetCurrentItemIndexAndDraw( newDefault ); - CheckMiddleSoftkeyLabelL(); - } - } - -// ----------------------------------------------------------------------------- -// When this method is called, view checks based on highlight focus, if the MSK -// label is correct. -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::CheckMiddleSoftkeyLabelL() - { - // First remove any prevous commands. - RemoveCommandFromMSK(); - - if ( IsChangeCommandVisibleL() ) - { - // Set middle softkey as Change. - CPslnBaseView::SetMiddleSoftKeyLabelL( - R_PSLN_MSK_CHANGE, - EPslnCmdAppChangeScreenSaver ); - } - else if(IsApplyCommandVisibleL()) - { - // For "Date" and for inactive screensavers MSK Label is Apply. - // Apply is also used for simple installed screensavers that do not have settings. - CPslnBaseView::SetMiddleSoftKeyLabelL( - R_PSLN_MSK_ACTIVATE, - EPslnCmdAppSetScreenSaver ); - - } - else - { - // when current focus and ticked item is Date. - // Do not show MSK. - CPslnBaseView::SetMiddleSoftKeyLabelL( - R_PSLN_MSK_DUMMY, - EPslnCmdAppSetScreenSaver ); - } - } - -// --------------------------------------------------------------------------- -// This is callback method for iPreviewModeSubscriber. -// This method is not allowed to leave - if it leaves, subscription is not -// activated. -// --------------------------------------------------------------------------- -// -TInt CPslnScreenSaverView::HandlePreviewModeChanged( TAny *aPtr ) - { - CPslnScreenSaverView* self = - static_cast(aPtr); - TInt value = KErrNone; - if ( self->iPreviewModeSubscriber ) - { - self->iPreviewModeProperty.Get( value ); - } - - if ( value == KPslnScreenSaverPreviewOff ) - { - - // Stop listening for preview mode changes. - if ( self->iPreviewModeSubscriber ) - { - self->iPreviewModeSubscriber->Cancel(); - } - - // Restore the original screen saver - self->iModel->ActivateScreenSaver( - KErrNotFound, - EPslnScreenSaverPreviewDeactivation ); - - if ( self->iContainer ) - { - // Update container. - TRAP_IGNORE( - static_cast - (self->iContainer)->UpdateListBoxL() ); - } - } - return KErrNone; - } - -// --------------------------------------------------------------------------- -// This is callback method for iPreviewStateSubscriber. -// This method is not allowed to leave - if it leaves, subscription is not -// activated. -// --------------------------------------------------------------------------- -// -TInt CPslnScreenSaverView::HandlePreviewStateChanged( TAny* aPtr ) - { - CPslnScreenSaverView* self = - static_cast(aPtr); - TInt value = KErrNone; - if ( self->iPreviewStateSubscriber ) - { - self->iPreviewStateProperty.Get( value ); - } - - return KErrNone; - } - -// ----------------------------------------------------------------------------- -// Screensaver array needs to be loaded before activating the view. -// It is done from UI class. -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::DoActivateL( - const TVwsViewId& aPrevViewId, - TUid aCustomMessageId, - const TDesC8& aCustomMessage ) - { - CPslnBaseView::DoActivateL( - aPrevViewId, - aCustomMessageId, - aCustomMessage ); - - // If view is directly activated (not through main view), update - // tab group (and main view's active folder). The static views - // have same UID as their tab index. - if ( aPrevViewId.iAppUid != KUidPsln ) - { - iPslnUi->UpdateTabIndex( - KPslnScreenSaverView.iUid, - KPslnScreenSaverView.iUid ); - } - - // Notify model that we are ready to receive changes in screensavers. - iModel->EnableScreenSaverNotifications( ETrue, *this ); - - if ( !iScreenSaverNotifier->IsActive() ) - { - iScreenSaverNotifier->StartListeningL(); - } - - iPsmClient = CPsmClient::NewL(*this); - iPsmClient->RequestPowerSaveModeNotification(); - - // Set highlight to selected item. - if ( iContainer ) - { - iContainer->SetCurrentItemIndexAndDraw( - iModel->CurrentPropertyIndexL( KPslnScreenSettingId ) ); - } - CheckMiddleSoftkeyLabelL(); - } - -// ----------------------------------------------------------------------------- -// This is called when view is deactivated (when another view has been activated), -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::DoDeactivate() - { - CPslnBaseView::DoDeactivate(); - - // Notify model that we are no longer active. - // Get the pointer to model from UI class (even though base view also has it) - // because, the model might have been deleted at this point and base class is - // not aware of the deletion. - if ( iPslnUi->Model() ) - { - iPslnUi->Model()->EnableScreenSaverNotifications( EFalse, *this ); - } - - if(iPsmClient) - { - iPsmClient->CancelPowerSaveModeNotificationRequest(); - delete iPsmClient; - iPsmClient = NULL; - } - } - -// ----------------------------------------------------------------------------- -// CPslnScreenSaverView::DynInitMenuPaneL -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::DynInitMenuPaneL( - TInt aResourceId, CEikMenuPane* aMenuPane ) - { - if ( aResourceId == R_PSLN_SS_VIEW_MENUPANE ) - { - if ( iContainer ) - { - iCurrentItem = iContainer->CurrentItemIndex(); - } - - if ( IsChangeCommandVisibleL() ) - { - // Remove Set screensaver, if current selection is already active. - aMenuPane->SetItemDimmed( EPslnCmdAppSetScreenSaver, ETrue ); - } - else if ( IsApplyCommandVisibleL() ) - { - // Remove Change screensaver if - // a) not active screensaver - // b) not of Date type - // c) installed screensaver is such that it does not have settings. - aMenuPane->SetItemDimmed( EPslnCmdAppChangeScreenSaver, ETrue ); - } - else - { - // when current focus and ticked item is Date. - // a) do not show apply - // b) do not show change - aMenuPane->SetItemDimmed( EPslnCmdAppSetScreenSaver, ETrue ); - aMenuPane->SetItemDimmed( EPslnCmdAppChangeScreenSaver, ETrue ); - } - - // If it is System screen saver, or the plug-in doesn't allow editing - // of settings, remove 'Settings' item. - if ( ( iCurrentItem < KPslnSystemScreenSavers ) || - ( !iModel->ScreensaverHasCapability( - iCurrentItem, EScpCapsConfigure ) ) ) - { - // Set Settings off. - aMenuPane->SetItemDimmed( EPslnCmdAppSettings, ETrue ); - } - } - CPslnBaseView::DynInitMenuPaneL( aResourceId, aMenuPane ); - } - -// ----------------------------------------------------------------------------- -// CPslnScreenSaverView::HandleListBoxSelectionL -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::HandleListBoxSelectionL() - { - if ( iContainer ) - { - iCurrentItem = iContainer->CurrentItemIndex(); - } - if ( IsChangeCommandVisibleL() ) - { - HandleCommandL( EPslnCmdAppChangeScreenSaver ); - } - else - { - HandleCommandL( EPslnCmdAppSetScreenSaver ); - } - } - -// ----------------------------------------------------------------------------- -// CPslnScreenSaverView::HandleListBoxItemHighlightL -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::HandleListBoxItemHighlightL() - { - } - -// ----------------------------------------------------------------------------- -// CPslnScreenSaverView::NewContainerL -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::NewContainerL() - { - iContainer = new (ELeave) CPslnScreenSaverContainer(); - iContainer->SetMiddleSoftkeyObserver( this ); - } - -// ----------------------------------------------------------------------------- -// CPslnScreenSaverView::SetTitlePaneL -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::SetTitlePaneL( TInt& aResourceId ) - { -#ifdef RD_CONTROL_PANEL - aResourceId = R_PSLN_TITLE_PANE_SCREENSAVER; -#endif //RD_CONTROL_PANEL - } - -// ----------------------------------------------------------------------------- -// If wallpaper image has changed, update container. -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::HandleNotifyInt( TUint32 /*aId*/, TInt /*aNewValue*/ ) - { - - TInt value = KErrNone; - if ( iPreviewModeSubscriber ) - { - iPreviewModeProperty.Get( value ); - } - - if( iContainer && ( value == KPslnScreenSaverPreviewOff ) ) - { - // Update container. - TRAP_IGNORE( - static_cast - (iContainer)->UpdateListBoxL() ); - } - } - -// ----------------------------------------------------------------------------- -// If the whole repository changes, update container. -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::HandleNotifyGeneric( TUint32 aId ) - { - if ( aId == NCentralRepositoryConstants::KInvalidNotificationId || iContainer ) - { - // Update container. - TRAP_IGNORE( - static_cast - (iContainer)->UpdateListBoxL() ); - } - } - -// ----------------------------------------------------------------------------- -// In case of error, try to re-start listening. -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::HandleNotifyError( - TUint32 /*aId*/, - TInt aError, - CCenRepNotifyHandler* aHandler ) - { - if ( ( aError != KErrNone ) && aHandler ) - { - TRAP_IGNORE( aHandler->StartListeningL() ); - } - } - -// ----------------------------------------------------------------------------- -// CPslnScreenSaverView::HandleScreenSaverActivationL -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::HandleScreenSaverActivationL( TInt aCurrentItem ) - { - TInt PsmMode = 0; - iPsmClient->PsmSettings().GetCurrentMode( PsmMode ); - if ( PsmMode == EPsmsrvModePowerSave ) // PSM on, setting is protected - { - HBufC* buf = StringLoader::LoadLC( R_PSLN_QTN_PSM_INFONOTE ); - CAknInformationNote* note = new (ELeave) CAknInformationNote( ETrue ); - note->ExecuteLD( *buf ); - CleanupStack::PopAndDestroy( buf ); - return; - } - - TRAPD( err, DoInvokeScreenSaverFunctionL( - aCurrentItem, - EScpCapsSelectionNotification ) ); - - if ( err == KErrNone ) - { - TRAPD( seterr,iModel->SetCurrentPropertyTypeL( - KPslnScreenSettingId, - aCurrentItem ) ); - if( seterr == KErrCancel ) - { - return; - } - else - { - User::LeaveIfError( seterr ); - } - - if ( iContainer ) - { - // Update container. - static_cast - (iContainer)->UpdateListBoxL(); - } - CheckMiddleSoftkeyLabelL(); - } - - return; - } - -// ----------------------------------------------------------------------------- -// CPslnScreenSaverView::HandleScreenSaverPreviewL -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::HandleScreenSaverPreviewL( TInt aCurrentItem ) - { - TRAPD( err, DoInvokeScreenSaverFunctionL( - aCurrentItem, - EScpCapsPreviewNotification ) ); - - if ( err == KErrNone ) - { - // Start listening for screensaver preview mode key changes. - CreatePreviewModeSubscriberL(); - CreatePreviewStateSubscriberL(); - - User::LeaveIfError( - iModel->ActivateScreenSaver( - aCurrentItem, - EPslnScreenSaverPreviewActivation ) ); - } - - return; - } - -// ----------------------------------------------------------------------------- -// CPslnScreenSaverView::HandleScreenSaverSettingsL -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::HandleScreenSaverSettingsL( TInt aCurrentItem ) - { - // Indicate to the plugin that active screensaver is possibly modified. - // Configure plugin. - TRAP_IGNORE( DoInvokeScreenSaverFunctionL( - aCurrentItem, - EScpCapsConfigure ) ); - } - -// ----------------------------------------------------------------------------- -// Non-Leaving version of wait note launching. -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::LaunchNote() - { - TRAP_IGNORE( LaunchNoteL() ); - } - -// ----------------------------------------------------------------------------- -// Launches wait note. -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::LaunchNoteL() - { - HBufC* noteText = StringLoader::LoadLC( R_PSLN_QTN_GEN_NOTE_OPENING ); - - if ( !iWaitDlg ) - { - // Create note and launch it. - CAknWaitDialog* requestingNote = new(ELeave) CAknWaitDialog( - (REINTERPRET_CAST( CEikDialog**, &iWaitDlg ) ), ETrue ); - iWaitDlg = requestingNote; - requestingNote->PrepareLC( R_PSLN_GENERAL_WAIT_NOTE ); - if ( noteText ) - { - requestingNote->SetTextL( noteText->Des() ); - } - requestingNote->RunLD(); - } - - CleanupStack::PopAndDestroy( noteText ); - } - -// ----------------------------------------------------------------------------- -// Non-Leaving version of wait note removal. -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::RemoveNote() - { - TRAP_IGNORE( RemoveNoteL() ); - } - -// ----------------------------------------------------------------------------- -// Removes opening note and stops listening for preview state changes. -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::RemoveNoteL() - { - // Stop listening for preview mode changes. - if ( iPreviewStateSubscriber ) - { - iPreviewStateSubscriber->Cancel(); - } - // Remove wait note. - if ( iWaitDlg ) - { - iWaitDlg->ProcessFinishedL(); - iWaitDlg = NULL; - } - } - -// ----------------------------------------------------------------------------- -// Invokes screensaver function. -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::DoInvokeScreenSaverFunctionL( - const TInt aCurrentItem, const TScPluginCaps aType ) - { - // Offer selection notification, if requested by the saver - if( iModel && iModel->ScreensaverHasCapability( - aCurrentItem, - aType ) ) - { - iModel->InvokeSSPluginFunctionL( - aCurrentItem, - aType ); - } - } - -// ----------------------------------------------------------------------------- -// Creates subscriber and starts to listen. -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::CreatePreviewModeSubscriberL() - { - if ( !iPreviewModeSubscriber ) - { - iPreviewModeSubscriber = - new (ELeave) CPslnPropertySubscriber( - TCallBack( HandlePreviewModeChanged, this ), - iPreviewModeProperty ); - } - iPreviewModeSubscriber->Subscribe(); - } - -void CPslnScreenSaverView::CreatePreviewStateSubscriberL() - { - if ( !iPreviewStateSubscriber ) - { - iPreviewStateSubscriber = - new (ELeave) CPslnPropertySubscriber( - TCallBack( HandlePreviewStateChanged, this ), - iPreviewStateProperty ); - } - iPreviewStateSubscriber->Subscribe(); - } - -// ----------------------------------------------------------------------------- -// Remove unnecessary commands from Middle softkey. -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::RemoveCommandFromMSK() - { - CEikButtonGroupContainer* cbaGroup = Cba(); - if ( cbaGroup ) - { - cbaGroup->RemoveCommandFromStack( KPslnMSKControlID, EPslnCmdAppSetScreenSaver ); - } - } - -// ----------------------------------------------------------------------------- -// Is 'Change' command visible or not. -// ----------------------------------------------------------------------------- -// -TBool CPslnScreenSaverView::IsChangeCommandVisibleL() const - { - if ( !iContainer ) - { - return EFalse; - } - - TInt currentItem = KErrNotFound; - currentItem = iContainer->CurrentItemIndex(); - - // Remove Change screensaver if - // a) not active screensaver - // b) not of Date type - // c) installed screensaver is such that it does not have settings. - if ( currentItem == iModel->CurrentPropertyIndexL( KPslnScreenSettingId ) && - iModel->ScreensaverHasCapability( currentItem, EScpCapsConfigure ) ) - { - return ETrue; - } - - return EFalse; - } - - -// ----------------------------------------------------------------------------- -// Is the focus item the same as the setting -// ----------------------------------------------------------------------------- -// -TBool CPslnScreenSaverView::IsApplyCommandVisibleL() const - { - if ( !iContainer ) - { - return EFalse; - } - - TInt currentItem = KErrNotFound; - currentItem = iContainer->CurrentItemIndex(); - - // Remove Apply screensaver if - // a) the focused item is the same as ticked - // c) - - TBool retVal = ETrue; - if ( currentItem == iModel->CurrentPropertyIndexL( KPslnScreenSettingId )) - { - retVal = EFalse; - } - return retVal; - } - - -// ----------------------------------------------------------------------------- -// Called when the power save mode is changed. -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::PowerSaveModeChanged( const TPsmsrvMode /*aMode*/ ) - { - TRAP_IGNORE( iContainer->SetCurrentItemIndexAndDraw( - iModel->CurrentPropertyIndexL( KPslnScreenSettingId ) ) ); - TRAP_IGNORE( CheckMiddleSoftkeyLabelL() ); - - if ( iPsmClient ) - { - iPsmClient->RequestPowerSaveModeNotification(); - } - } - - -// ----------------------------------------------------------------------------- -// Called when some wrong with the power save mode change. -// ----------------------------------------------------------------------------- -// -void CPslnScreenSaverView::PowerSaveModeChangeError( const TInt /*aError*/ ) - { - } - - -// End of File