diff -r 000000000000 -r 2f259fa3e83a psln/Src/PslnWallpaperView.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/psln/Src/PslnWallpaperView.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,565 @@ +/* +* 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: Wallpaper view. +* +*/ + + +// INCLUDE FILES +// Psln specific +#include +#include "PslnModel.h" +#include "PslnWallpaperView.h" +#include "PslnWallpaperContainer.h" +#include "PslnConst.h" +#include "PslnUi.h" +#include "PslnDRMImplementation.h" +#include "PslnDebug.h" + +// General services +#include +#include +#include +#include +#include + +#ifdef RD_SLIDESHOW_WALLPAPER +// Slide set wallpaper. +#include +#include +#include +#endif // RD_SLIDESHOW_WALLPAPER + +// CONSTANTS +// Granularity for wallpaper items. +const TInt KPslnFileArrayGranularity = 4; +// Index of selected file item from MGFetch. +const TInt KPslnSelectedFile = 0; + +// Index of current wallpaper item selection. +enum TPslnWallpaperSelection + { + EPslnNoneWP = 0, + EPslnUserDefinedWP, + EPslnSlideSetWP + }; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +// +CPslnWallpaperView::CPslnWallpaperView() + { + } + +// ----------------------------------------------------------------------------- +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CPslnWallpaperView::ConstructL() + { + PSLN_TRACE_DEBUG("CPslnWallpaperView::ConstructL BEGIN"); + BaseConstructL( R_PSLN_WALLPAPER_VIEW ); + + iNaviPaneContext = iPslnUi->PslnTabGroup(); + + iWallpaperRepository = CRepository::NewL( KCRUidPersonalisation ); + iWallpaperNotifier = CCenRepNotifyHandler::NewL( + *this, + *iWallpaperRepository, + CCenRepNotifyHandler::EIntKey, + KPslnWallpaperType ); + iWpDlgRunnig = EFalse; + PSLN_TRACE_DEBUG("CPslnWallpaperView::ConstructL END"); + } + +// ----------------------------------------------------------------------------- +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPslnWallpaperView* CPslnWallpaperView::NewLC() + { + CPslnWallpaperView* self = new (ELeave) CPslnWallpaperView(); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// Destructor +CPslnWallpaperView::~CPslnWallpaperView() + { + if ( iWallpaperNotifier ) + { + iWallpaperNotifier->StopListening(); + } + delete iWallpaperNotifier; + delete iWallpaperRepository; + } + +// ----------------------------------------------------------------------------- +// CPslnWallpaperView::Id +// ----------------------------------------------------------------------------- +// +TUid CPslnWallpaperView::Id() const + { + return KPslnWallpaperView; + } + +// ----------------------------------------------------------------------------- +// CPslnWallpaperView::HandleCommandL +// ----------------------------------------------------------------------------- +// +void CPslnWallpaperView::HandleCommandL( TInt aCommand ) + { + if ( aCommand == EAknSoftkeyOk || + aCommand == EPslnCmdAppSetWallpaper || + aCommand == EPslnCmdAppChangeWallpaper || + aCommand == EPslnCmdWallpaperConfigure ) + { + if ( iContainer ) + { + TInt setBgImage = KErrNone; + // If User specified is selected. + switch ( iContainer->CurrentItemIndex() ) + { + case EPslnUserDefinedWP: + { + if ( iWpDlgRunnig ) + { + return; + } + if ( !ShowBackgroundImageListL() ) + { + return; + } + iModel->SetCurrentPropertyTypeL( + KPslnBgIdleSettingId, + EPslnUserDefinedWP ); + } + break; + case EPslnNoneWP: + if ( iActiveWallpaper != EPslnNoneWP ) + { + iModel->SetCurrentPropertyTypeL( + KPslnBgIdleSettingId, + EPslnNoneWP ); + setBgImage = iModel->SetBackgroundImagePath( KNullDesC ); + if ( setBgImage != KErrNone ) + { + iPslnUi->HandleImageErrorsL( setBgImage ); + } + } + else + { + // No need to do anything. + return; + } + break; + case EPslnSlideSetWP: + { +#ifdef RD_SLIDESHOW_WALLPAPER + if ( iWpDlgRunnig ) + { + //Try not run slideset dialog more than once. + return; + } + RImplInfoPtrArray array; + const TUid wallpaperUid = { 0x102823AD }; + const TEComResolverParams emptyParams; + REComSession::ListImplementationsL( + wallpaperUid, + emptyParams, + KRomOnlyResolverUid, + array ); + CleanupResetAndDestroyPushL( array ); + + CImplementationInformation* info = array[ KPslnWallpaperSlideSettingDialog ]; + TUid implUid = info->ImplementationUid(); + + CPslnSlidesetDialogInterface* plugin = + CPslnSlidesetDialogInterface::NewL( implUid ); + if ( aCommand == EPslnCmdWallpaperConfigure ) + { + plugin->SetDialogFlag( + CPslnSlidesetDialogInterface::EPslnLaunchMode, + CPslnSlidesetDialogInterface::EPslnConfigureOnly ); + } + if ( aCommand == EPslnCmdAppSetWallpaper && + plugin->GetDialogFlag( + CPslnSlidesetDialogInterface::EPslnConfigurability ) == + CPslnSlidesetDialogInterface::EPslnDirectActivationPossible ) + { + delete plugin; // just delete the plugin as it is not needed. + iWallpaperRepository->Set( KPslnWallpaperType, EPslnSlideSetWP ); + UpdateCurrentItem(); + } + else + { + iWpDlgRunnig = ETrue; + plugin->ExecuteDialogLD(); + iWpDlgRunnig = EFalse; + } + + plugin = NULL; + CleanupStack::PopAndDestroy(); // array + + // Plugin stores wallpaper type, if it deems that the user selection is valid. + +#endif // RD_SLIDESHOW_WALLPAPER + } + break; + default: + break; + } + + // Update container. + static_cast + (iContainer)->UpdateListBoxL(); + CheckMiddleSoftkeyLabelL(); + } + } + else + { + if ( ( aCommand == EAknSoftkeyBack ) && iWpDlgRunnig ) + { + return; + } + iPslnUi->HandleCommandL( aCommand ); + } + } + +// ----------------------------------------------------------------------------- +// When this method is called, view checks based on highlight focus, if the MSK +// label is correct. +// ----------------------------------------------------------------------------- +// +void CPslnWallpaperView::CheckMiddleSoftkeyLabelL() + { + // First remove any prevous commands. + RemoveCommandFromMSK(); + + if ( iContainer ) + { + iCurrentItem = iContainer->CurrentItemIndex(); + } + + // Set MSK label. + if ( iActiveWallpaper != iCurrentItem ) + { + // Set middle softkey as Apply, if: + // a) 'None' is selected + // b) highlight is on inactive selection + CPslnBaseView::SetMiddleSoftKeyLabelL( + R_PSLN_MSK_ACTIVATE, + EPslnCmdAppSetWallpaper ); + } + else if ( iActiveWallpaper == 0 ) + { + CPslnBaseView::SetMiddleSoftKeyLabelL( + R_PSLN_MSK_DUMMY, + EPslnCmdEmptyCommand ); + } + else + { + // Otherwise set middle softkey as Change. + CPslnBaseView::SetMiddleSoftKeyLabelL( + R_PSLN_MSK_CHANGE, + EPslnCmdAppChangeWallpaper ); + } + } + +// ----------------------------------------------------------------------------- +// If wallpaper image has changed, update container. +// ----------------------------------------------------------------------------- +// +void CPslnWallpaperView::HandleNotifyInt( TUint32 aId, TInt /*aNewValue*/ ) + { + if ( ( aId == KPslnWallpaperType ) && iContainer ) + { + TInt previousValue = UpdateCurrentItem(); + if ( iActiveWallpaper != previousValue ) + { + UpdateContainer(); + } + } + } + +// ----------------------------------------------------------------------------- +// If the whole repository changes, update container. +// ----------------------------------------------------------------------------- +// +void CPslnWallpaperView::HandleNotifyGeneric( TUint32 aId ) + { + if ( ( aId == NCentralRepositoryConstants::KInvalidNotificationId || + aId == KPslnWallpaperType ) && iContainer ) + { + TInt previousValue = UpdateCurrentItem(); + if ( iActiveWallpaper != previousValue ) + { + UpdateContainer(); + } + } + } + +// ----------------------------------------------------------------------------- +// In case of error, try to re-start listening. +// ----------------------------------------------------------------------------- +// +void CPslnWallpaperView::HandleNotifyError( + TUint32 /*aId*/, + TInt aError, + CCenRepNotifyHandler* aHandler ) + { + if ( ( aError != KErrNone ) && aHandler ) + { + TRAP_IGNORE( aHandler->StartListeningL() ); + } + } + +// ----------------------------------------------------------------------------- +// CPslnWallpaperView::DoActivateL +// ----------------------------------------------------------------------------- +// +void CPslnWallpaperView::DoActivateL( + const TVwsViewId& aPrevViewId, + TUid aCustomMessageId, + const TDesC8& aCustomMessage ) + { + PSLN_TRACE_DEBUG("CPslnWallpaperView::DoActivateL START"); + 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( + KPslnWallpaperView.iUid, + KPslnWallpaperView.iUid ); + } + + if ( iContainer ) + { + UpdateCurrentItem(); + // Set highlight to selected item. + iContainer->SetCurrentItemIndexAndDraw( iActiveWallpaper ); + } + if ( iWallpaperNotifier ) + { + iWallpaperNotifier->StartListeningL(); + } + CheckMiddleSoftkeyLabelL(); + iWpDlgRunnig = EFalse; + PSLN_TRACE_DEBUG("CPslnWallpaperView::DoActivateL END"); + } + +// ----------------------------------------------------------------------------- +// CPslnWallpaperView::DynInitMenuPaneL +// ----------------------------------------------------------------------------- +// +void CPslnWallpaperView::DynInitMenuPaneL( + TInt aResourceId, CEikMenuPane* aMenuPane ) + { + if ( aResourceId == R_PSLN_WALLPAPER_MENUPANE ) + { + if ( iContainer ) + { + iCurrentItem = iContainer->CurrentItemIndex(); + } + // Remove change if none is selected, or highlight is not in active item. + if ( iActiveWallpaper != iCurrentItem ) + { + aMenuPane->SetItemDimmed( EPslnCmdAppChangeWallpaper, ETrue ); + } + else if ( iActiveWallpaper == 0 ) + { + aMenuPane->SetItemDimmed( EPslnCmdAppSetWallpaper, ETrue ); + aMenuPane->SetItemDimmed( EPslnCmdAppChangeWallpaper, ETrue ); + } + else + { + aMenuPane->SetItemDimmed( EPslnCmdAppSetWallpaper, ETrue ); + } + +#ifdef RD_SLIDESHOW_WALLPAPER + + if ( iCurrentItem != EPslnSlideSetWP ) + { + aMenuPane->SetItemDimmed( EPslnCmdWallpaperConfigure, ETrue ); + } +#endif // RD_SLIDESET_WALLPAPER + } + CPslnBaseView::DynInitMenuPaneL( aResourceId, aMenuPane ); + } + +// ----------------------------------------------------------------------------- +// CPslnWallpaperView::HandleListBoxSelectionL +// ----------------------------------------------------------------------------- +// +void CPslnWallpaperView::HandleListBoxSelectionL() + { + if ( iContainer ) + { + iCurrentItem = iContainer->CurrentItemIndex(); + } + HandleCommandL( EAknSoftkeyOk ); + } + +// ----------------------------------------------------------------------------- +// CPslnWallpaperView::HandleListBoxItemHighlightL +// ----------------------------------------------------------------------------- +// +void CPslnWallpaperView::HandleListBoxItemHighlightL() + { + } + +// ----------------------------------------------------------------------------- +// CPslnWallpaperView::NewContainerL +// ----------------------------------------------------------------------------- +// +void CPslnWallpaperView::NewContainerL() + { + iContainer = new(ELeave) CPslnWallpaperContainer(); + iContainer->SetMiddleSoftkeyObserver( this ); + } + +// ----------------------------------------------------------------------------- +// CPslnWallpaperView::SetTitlePaneL +// ----------------------------------------------------------------------------- +// +void CPslnWallpaperView::SetTitlePaneL( TInt& aResourceId ) + { +#ifdef RD_CONTROL_PANEL + aResourceId = R_PSLN_TITLE_PANE_WALLPAPER; +#endif //RD_CONTROL_PANEL + } + +// --------------------------------------------------------------------------- +// CPslnWallpaperView::CbaExitEnabled +// --------------------------------------------------------------------------- +// +TInt CPslnWallpaperView::CbaResourceId( const TVwsViewId& /*aPrevViewId*/,TUid aCustomMessageId ) + { + return aCustomMessageId.iUid ? + R_AVKON_SOFTKEYS_OPTIONS_EXIT : R_AVKON_SOFTKEYS_OPTIONS_BACK; + } + +// --------------------------------------------------------------------------- +// CPslnWallpaperView::ShowBackgroundImageListL +// --------------------------------------------------------------------------- +// +TBool CPslnWallpaperView::ShowBackgroundImageListL() + { + PSLN_TRACE_DEBUG("CPslnWallpaperView::ShowBackgroundImageListL"); + TBool retVal = EFalse; + CDesCArrayFlat* files = + new (ELeave) CDesCArrayFlat( KPslnFileArrayGranularity ); + CleanupStack::PushL( files ); + CPslnDRMImplementation* verifier = NULL; + verifier = CPslnDRMImplementation::NewL(); + CleanupStack::PushL( verifier ); + + PSLN_TRACE_DEBUG("CPslnWallpaperView::ShowBackgroundImageListL MGFetch"); + iWpDlgRunnig = ETrue; + TBool selected = EFalse; + TRAPD( err,selected = MGFetch::RunL( *files, EImageFile, EFalse, verifier ) ); + iWpDlgRunnig = EFalse; + User::LeaveIfError( err ); + if ( !verifier ) + { + PSLN_TRACE_DEBUG("CPslnWallpaperView::ShowBackgroundImageListL DRM Error"); + } + + else if( selected && ( files->MdcaCount() > 0 ) ) + { + PSLN_TRACE_DEBUG("CPslnWallpaperView::ShowBackgroundImageListL Fetch successful"); + TInt setBgImage = iModel->SetBackgroundImagePath( + files->MdcaPoint( KPslnSelectedFile ) ); + if ( setBgImage != KErrNone ) + { + if ( setBgImage == KLeaveExit ) + { + User::Leave( KLeaveExit ); + } + else + { + iPslnUi->HandleImageErrorsL( setBgImage ); + } + } + else + { + // Image selected, no DRM issues. + retVal = ETrue; + } + CheckMiddleSoftkeyLabelL(); + } + else + { + PSLN_TRACE_DEBUG("CPslnWallpaperView::ShowBackgroundImageListL Fetch cancelled"); + } + + CleanupStack::PopAndDestroy( 2, files ); // verifier, files + + PSLN_TRACE_DEBUG("CPslnWallpaperView::ShowBackgroundImageListL METHOD COMPLETED"); + return retVal; + } + +// --------------------------------------------------------------------------- +// Updates the container. +// --------------------------------------------------------------------------- +// +void CPslnWallpaperView::UpdateContainer() + { + PSLN_TRACE_DEBUG("CPslnWallpaperView::UpdateContainer START"); + if ( iContainer ) + { + TRAP_IGNORE( static_cast + (iContainer)->UpdateListBoxL(); + CheckMiddleSoftkeyLabelL(); + ); + } + PSLN_TRACE_DEBUG("CPslnWallpaperView::UpdateContainer END"); + } + +// --------------------------------------------------------------------------- +// Removes unnecessary commands from Middle softkey. +// --------------------------------------------------------------------------- +// +void CPslnWallpaperView::RemoveCommandFromMSK() + { + CEikButtonGroupContainer* cbaGroup = Cba(); + if ( cbaGroup ) + { + cbaGroup->RemoveCommandFromStack( KPslnMSKControlID, EPslnCmdAppSetWallpaper ); + cbaGroup->RemoveCommandFromStack( KPslnMSKControlID, EPslnCmdAppChangeWallpaper ); + } + } + +// --------------------------------------------------------------------------- +// Updates current item. +// --------------------------------------------------------------------------- +// +TInt CPslnWallpaperView::UpdateCurrentItem() + { + TInt previousValue = iActiveWallpaper; + iActiveWallpaper = iModel->CurrentPropertyIndex( KPslnBgIdleSettingId ); + return previousValue; + } + +// End of File