psln/Src/PslnWallpaperView.cpp
changeset 0 2f259fa3e83a
child 18 0aa5fbdfbc30
--- /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