--- /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 <psln.rsg>
+#include "PslnModel.h"
+#include "PslnWallpaperView.h"
+#include "PslnWallpaperContainer.h"
+#include "PslnConst.h"
+#include "PslnUi.h"
+#include "PslnDRMImplementation.h"
+#include "PslnDebug.h"
+
+// General services
+#include <MGFetch.h>
+#include <AknSkinsInternalCRKeys.h>
+#include <centralrepository.h>
+#include <StringLoader.h>
+#include <AknGlobalNote.h>
+
+#ifdef RD_SLIDESHOW_WALLPAPER
+// Slide set wallpaper.
+#include <pslnslidesetwallpaperdialog.h>
+#include <mmf/common/mmfcontrollerpluginresolver.h>
+#include <ecom/resolver.h>
+#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<CPslnWallpaperContainer*>
+ (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<CPslnWallpaperContainer*>
+ (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