photosgallery/slideshow/view/src/shwslideshowview.cpp
changeset 0 4e91876724a2
child 2 7d9067c6fcb1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/photosgallery/slideshow/view/src/shwslideshowview.cpp	Thu Dec 17 08:45:44 2009 +0200
@@ -0,0 +1,1296 @@
+/*
+* Copyright (c) 2007-2008 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:    Implementation of Slideshow view
+*
+*/
+
+
+
+
+
+// INCLUDE FILES
+#include <aknnotewrappers.h> 
+#include "shwslideshowview.h"
+
+#include <aknViewAppUi.h>
+#include <eikmenub.h>   // for access to CEikButtonGroupContainer (from Cba())
+#include <AknUtils.h>	// for CompleteWithAppPath
+#include <AknWaitDialog.h>
+#include <StringLoader.h>
+
+#include <alf/alfcontrolgroup.h>
+#include <alf/alfenv.h>
+#include <alf/alfdisplay.h>
+#include <alf/alfutil.h>
+#include <alf/alfroster.h>
+
+//Hg 
+//#include <hg/hgcontextutility.h>
+#include <glxhdmicontroller.h>
+#include <glxresourceutilities.h>               // for CGlxResourceUtilities
+#include <glxresolutionutility.h>               // for CGlxResolutionUtility
+#include <shwslideshowview.rsg> // view's resource
+#include <data_caging_path_literals.hrh>	// for resource directory path
+#include <glxlog.h>
+#include <glxtracer.h>
+#include <aknsoundsystem.h>				// for CAknKeySoundSystem
+#include <avkon.rsg>					// for R_AVKON_SILENT_SKEY_LIST
+#include <mpxcollectionpath.h>
+#include <coeutils.h> 
+#include <eiksoftkeypostingtransparency.h>
+#include "mpxcollectionutility.h"
+#include "glxfilterfactory.h"  // for TGlxFilterFactory
+#include "mglxmedialist.h"
+#include "glxuiutility.h"
+#include "shwslideshowengine.h"
+#include "shweffectinfo.h"
+#include "shwslideshowvolumecontrol.h"
+#include "shwslideshowbacklighttimer.h"
+#include "shwslideshowview.hrh"   // for EShwSlideshowCmdContinue
+#include "shwslideshowkeyhandler.h"
+#include "shwslideshowpausehandler.h"
+#include "shwslideshowtelephonehandler.h"
+#include "shwcallback.h"
+#include "shwsettingsmodel.h"
+#include "shwgesturecontrol.h"
+#include "shwviewtimer.h"
+#include "shwmediakeyshandler.h"
+#include <glxtexturemanager.h>
+namespace
+    {
+    _LIT(KShwSlideshowViewResource,"shwslideshowview.rsc");
+    const TInt KShwDefaultDelayMicroSeconds = 5000000;	// 5s
+    const TInt KVolumeControlGroupId = 1;
+    // Reuse the plug-in's uid
+    const TInt KViewId = 0x20007199;
+    //gontrol goup id has to be locally unique
+    const TInt KShwGestureControlGroupId = 2;
+    const TInt KGestureControlGroupId = 44;
+    //This constant is used to calculate the index of the item for which texture has to removed.
+    //6 = 5(iterator value in forward or backward direction for fullscreen) + 1(focus index);
+    const TInt KSlideShowIterator = 2; 
+    //Constant which says maximum number of fullscreen textures that we have have at a time.
+    //11 = (5(5 fullscreen texture backwards)+1(fucus index texture)+5(5 fullscreen texture forwards))
+    const TInt KSlideShowTextureOffset = 3;
+    }
+//display screen furniture for KShowForSeconds    
+const TInt KShowForSeconds = 5;
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Default constructor. Inlined to save a few bits of ROM
+// ---------------------------------------------------------------------------
+// 
+inline CShwSlideshowView::CShwSlideshowView() :
+        CGlxViewBase(ETrue) // workaround - force synchronous view activation
+    {
+    TRACER("CShwSlideshowView::CShwSlideshowView");
+    GLX_LOG_INFO( "CShwSlideshowView::CShwSlideshowView" );
+    }
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CShwSlideshowView* CShwSlideshowView::NewLC()
+    {
+    TRACER("CShwSlideshowView::NewLC");
+    GLX_LOG_INFO( "CShwSlideshowView::NewLC" );
+    CShwSlideshowView* self = new ( ELeave ) CShwSlideshowView;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CShwSlideshowView::~CShwSlideshowView()
+    {
+    TRACER("CShwSlideshowView::~CShwSlideshowView");
+  	GLX_LOG_INFO( "CShwSlideshowView::~CShwSlideshowView()" );
+    
+    // delete media list population call back
+    delete iPopulateListCallBack;
+    
+    // delete engine async starter
+    delete iAsyncCallBack;
+
+    // Cleanup both the lists in case view was not deactivated
+    if ( iMediaList )
+        {
+        iMediaList->Close();
+        }
+
+    if ( iFilteredList )
+        {
+        iFilteredList->Close();
+        }
+		
+    // Remove the back light timer
+    delete iBackLightTimer;
+
+    // Delete the control groups
+    if ( iEnv )
+        {
+        iEnv->DeleteControlGroup( KVolumeControlGroupId );
+        iVolumeControlGroup = NULL;
+        if(iGestureControlGroup)
+            {
+            CAlfControl* gesture = (&(iGestureControlGroup->Control(1))); // CGestureControl is 1
+            iGestureControlGroup->Remove(gesture);
+            }
+        iEnv->DeleteControlGroup( KShwGestureControlGroupId );
+        iGestureControlGroup = NULL;
+    delete iGestureControl;
+        }
+
+    // Turn back on the keypad tones
+    AppUi()->KeySounds()->PopContext();
+    
+    // Delete resource file
+    if ( iResourceOffset )
+        {
+        CCoeEnv::Static()->DeleteResourceFile( iResourceOffset );
+        iResourceOffset = NULL;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// ShowProgressDialogL.
+// -----------------------------------------------------------------------------	
+TInt CShwSlideshowView::ShowProgressDialogL()
+	{
+	TRACER("CShwSlideshowView::ShowProgressDialogL");
+  	GLX_LOG_INFO( "CShwSlideshowView::ShowProgressDialogL" );
+
+    // Set to landscape orientation
+    // Note that the orientation switch is performed here rather than in the
+    // view activation to ensure the correct use of the screen furniture layout
+    iUiUtility->SetAppOrientationL( EGlxOrientationLandscape );
+    // Set display background as a solid black colour
+	iDisplay->SetClearBackgroundL( CAlfDisplay::EClearWithColor );
+	
+	// Setup the progress dialog
+    iWaitDialog = new ( ELeave ) CAknWaitDialog(
+		reinterpret_cast< CEikDialog** >( &iWaitDialog ), ETrue );
+    iWaitDialog->PrepareLC( R_SHW_WAIT_NOTE );
+    // Dialog is non-modal so request dismissal callbacks
+    iWaitDialog->SetCallback( this );
+    // Load string for dialog
+    HBufC* title = StringLoader::LoadLC( R_SHW_WAIT_DLG_OPENING );
+    iWaitDialog->SetTextL( *title );
+    CleanupStack::PopAndDestroy( title );
+
+	// Show the dialog, we show it non blocking so no use for the return value
+	iWaitDialog->RunLD();
+	// set the callback to be engine start
+	iAsyncCallBack->Set( 
+	    TShwCallBack< CShwSlideshowView, StartEngineL >( this ) );
+    // if both lists are ready
+    if( iInputListReady && iPlayListReady )
+        {
+    	// make the async callback, this will end up calling StartEngineL()
+    	// in CAsyncCallback::RunL once the scheduler next time runs.
+    	iAsyncCallBack->CallBack();
+        }
+
+    // return value needed as this is a TCallBack
+    return KErrNone;
+	}
+
+// -----------------------------------------------------------------------------
+// StartEngineL
+// -----------------------------------------------------------------------------
+TInt CShwSlideshowView::StartEngineL()
+    {
+    TRACER("CShwSlideshowView::StartEngineL");
+  	GLX_LOG_INFO( "CShwSlideshowView::StartEngineL" );
+    // Check that the list has some items
+  	if( iFilteredList )
+        {
+	    TInt filteredCount = iFilteredList->Count();
+	    TInt inputlistCount = iMediaList->Count();
+	    if ( ( inputlistCount < 1 )||
+	         ( filteredCount  < 1 ) )
+	        {
+	      	GLX_LOG_INFO2( 
+	            "CShwSlideshowView::PopulateListL error, counts: %d, %d", 
+	                inputlistCount, filteredCount );
+	        iEngineStartFailed = ETrue;
+	        // need to dismiss the dialog if it's still there
+	        if( iWaitDialog )
+	            {
+	            iWaitDialog->ProcessFinishedL();
+	            }
+	        }
+	    else
+	        {
+	        // The list should now be populated, so set the focus
+	       	SetListFocusL();
+	       	// Need to take latest screen size as layout has changed
+	       	TRect currentScreen;
+	       	TSize screenSize;
+	       	AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EScreen,currentScreen);
+	       	screenSize = currentScreen.Size();
+	    	iEngine->StartL( 
+	    	    *iEnv, *iDisplay, *iFilteredList, *this, screenSize );
+	        }
+        }  
+    // return value needed as this is a TCallBack
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// PopulateListL
+// -----------------------------------------------------------------------------
+TInt CShwSlideshowView::PopulateListL()
+    {
+    TRACER("CShwSlideshowView::PopulateListL");
+  	GLX_LOG_INFO( "CShwSlideshowView::PopulateListL" );
+    // Setup a filter given the play direction and the path
+    CMPXFilter* filter = NULL;
+
+    // take current filter and add the slideshow parameters in it
+    // If we play forwards, we dont revert the original order and if we
+    // play backwards we need to just revert the original order
+    // Note we dont know the original order and cant ask for it as its set by the
+    // plug-in and never returned to the client side.
+
+    // we need the full path for the filter creation so that the selection can be 
+    // extracted from there
+    CMPXCollectionPath* fullpath = iMediaList->PathLC();
+    // create the filter
+    filter = TGlxFilterFactory::CreateSlideShowFilterFromExistingFilterL( 
+        iMediaList->Filter(), fullpath,
+        iPlayDirection);
+    CleanupStack::PushL( filter );
+
+    // Use this DLL's uid as the hierarchy id
+    TGlxHierarchyId hierarchyId = TUid( NShwSlideshow::KEngineDllUid ).iUid;
+    iFilteredList = MGlxMediaList::InstanceL( *iCollectionPath, hierarchyId, filter );
+    iFilteredList->AddMediaListObserverL( this );
+
+    CleanupStack::PopAndDestroy( filter );
+    CleanupStack::PopAndDestroy( fullpath );
+
+    // return value needed as this is a TCallBack
+    return KErrNone;
+    }
+	
+// ---------------------------------------------------------------------------
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------------------------
+// 
+void CShwSlideshowView::ConstructL()
+    {
+    TRACER("CShwSlideshowView::ConstructL");
+  	GLX_LOG_INFO( "CShwSlideshowView::ConstructL()" );
+
+	// Load the view's resources
+    TFileName resourceFile( KDC_APP_RESOURCE_DIR );
+    resourceFile.Append( KShwSlideshowViewResource ); 
+    CGlxResourceUtilities::GetResourceFilenameL( resourceFile );  
+    iResourceOffset = iCoeEnv->AddResourceFileL( resourceFile );
+	
+	// AknView base construction
+    BaseConstructL( R_SHW_SLIDESHOW_PLAY_VIEW );
+    
+	// Glx view base construction
+    ViewBaseConstructL();
+    
+    // Create async engine starter with standard priority
+	iAsyncCallBack = new( ELeave ) CAsyncCallBack( CActive::EPriorityStandard );
+
+    // Create the back light timer
+    iBackLightTimer = CShwSlideshowBackLightTimer::NewL();
+    
+	iEnv = iUiUtility->Env();
+   	iDisplay = iUiUtility->Display();
+
+    // Construct the volume control
+    iVolumeControl = CShwSlideshowVolumeControl::
+        NewL( *iEnv,
+        	  *iUiUtility,
+        	  KShwDefaultDelayMicroSeconds );
+    // Create a control group for the volume control
+    iVolumeControlGroup = &iEnv->NewControlGroupL( KVolumeControlGroupId );
+    // doc says the following takes ownership, but reality is different!
+	iVolumeControlGroup->AppendL( iVolumeControl );
+	
+    iGestureControlGroup = &iEnv->NewControlGroupL( KShwGestureControlGroupId );
+	
+	// construct the gesture control group
+	iShwGestureControl = CShwGestureControl::NewL(*iEnv,*iDisplay,*this);
+	iGestureControlGroup->AppendL( iShwGestureControl );
+	
+	iGestureControl = GestureHelper::CGestureControl::NewLC( 
+            *iShwGestureControl, *iEnv, *iDisplay, KGestureControlGroupId );
+	iGestureControlGroup->AppendL( iGestureControl );
+	
+    // doc says the following takes ownership, but reality is different!
+    
+    CleanupStack::Pop( iGestureControl );
+	// Need a mechanism to distinguish when we receive the MusicVolume 
+	// callback for the first time
+	iCurrentVolume = -1;
+    iPopulateListCallBack = new( ELeave )
+        CAsyncCallBack( CActive::EPriorityStandard );
+    // set the callback for the media list population
+    iPopulateListCallBack->Set(
+        TShwCallBack< CShwSlideshowView, PopulateListL >( this ) );
+    iMSKPressed = EFalse;
+    iLSKPressed = EFalse;
+    
+    //Get the HgContextUtility instance
+//    iContextUtility = iUiUtility->ContextUtility();
+    
+    }
+   
+// ---------------------------------------------------------------------------
+// From CAknView
+// Returns views id.
+// ---------------------------------------------------------------------------
+//
+TUid CShwSlideshowView::Id() const
+    {
+    TRACER("CShwSlideshowView::Id()");
+    GLX_LOG_INFO( "CShwSlideshowView::Id()" );
+    return TUid::Uid( KViewId );
+    }
+
+// ---------------------------------------------------------------------------
+// From CAknView
+// Foreground event handling function.
+// ---------------------------------------------------------------------------
+//
+void CShwSlideshowView::HandleForegroundEventL(TBool aForeground)
+    {
+    TRACER("CShwSlideshowView::HandleForegroundEventL");
+  	GLX_LOG_INFO( "CShwSlideshowView::HandleForegroundEventL()" );
+
+    if( aForeground )
+        {
+        // we gained the foreground
+        iPauseHandler->SwitchToForegroundL();
+        }
+    else
+        {
+        // Something else has gained the foreground
+        iPauseHandler->SwitchToBackgroundL();
+        }
+
+    CAknView::HandleForegroundEventL(aForeground);
+    }
+
+// -----------------------------------------------------------------------------
+// From CGlxViewBase
+// DoViewActivateL.
+// -----------------------------------------------------------------------------
+void CShwSlideshowView::DoViewActivateL(const TVwsViewId& /*aPrevViewId*/,
+										TUid /*aCustomMessageId*/,
+										const TDesC8& aCustomMessage)
+    {
+    TRACER("CShwSlideshowView::DoViewActivateL");
+    GLX_LOG_INFO( "CShwSlideshowView::DoViewActivateL()" );
+    
+    // remove the status pane
+	AppUi()->StatusPane()->MakeVisible(EFalse);
+
+    //make the softkeys invisible
+	AppUi()->Cba()->MakeVisible(EFalse);
+	
+	// Hide the application toolbar when slide show is started 
+	if ( AppUi()->PopupToolbar() ) 
+		{
+	    AppUi()->PopupToolbar()->SetToolbarVisibility( EFalse );
+		AppUi()->PopupToolbar()->MakeVisible(EFalse);
+		}	
+    // reset failure flag
+    iEngineStartFailed = EFalse;
+
+    iHdmiController = CGlxHdmiController::NewL();
+    // Engine related construction
+    // Instantiate the slideshow engine, with this class as its observer
+    __ASSERT_DEBUG( !iEngine, Panic( EGlxPanicAlreadyInitialised ) );
+    iEngine = CShwSlideshowEngine::NewL( *this );
+
+    // Instantiate the pause handler, it encapsulates the pause rules
+    __ASSERT_DEBUG( !iPauseHandler, Panic( EGlxPanicAlreadyInitialised ) );
+    iPauseHandler = CShwSlideShowPauseHandler::NewL( *iEngine );
+
+    // Instantiate the key handler, encapsulates all key handling logic
+    __ASSERT_DEBUG( !iKeyHandler, Panic( EGlxPanicAlreadyInitialised ) );
+    iKeyHandler = CShwSlideShowKeyHandler::NewL( *iEngine, *iPauseHandler,
+                                                  reinterpret_cast<TInt&>(iShwState ));
+    AppUi()->AddToStackL( iKeyHandler, ECoeStackPriorityDefault,
+        ECoeStackFlagRefusesFocus );
+
+    // Create the telephone call handler
+    __ASSERT_DEBUG( !iTelephoneHandler, Panic( EGlxPanicAlreadyInitialised ) );
+    iTelephoneHandler = CShwTelephoneHandler::NewL( *iEngine, *iPauseHandler );
+    iTelephoneHandler->StartL();
+
+    // Extract the media list's path and the playback direction from
+    // the custom message data
+    GetPathAndPlaybackDirectionL( aCustomMessage );
+
+    // Ensure the back light stays on
+    iBackLightTimer->StartL();
+
+    // Request asynch callback that will end up in ShowProgressDialogL
+    // once the active scheduler runs
+    iAsyncCallBack->Set( 
+        TShwCallBack< CShwSlideshowView, ShowProgressDialogL >( this ) );
+    iAsyncCallBack->CallBack();
+
+    iDisplay->Roster().ShowL( *iGestureControlGroup,KAlfRosterShowAtTop );
+    
+    iTicker = CShwTicker::NewL(*this);
+    
+    InitializeShwFurnitureL();
+    iUiUtility->Display()->SetVisibleArea(TRect(TPoint(0,0),AlfUtil::ScreenSize()));
+    }
+
+// -----------------------------------------------------------------------------
+// From CGlxViewBase
+// DoViewDeactivate.
+// -----------------------------------------------------------------------------
+void CShwSlideshowView::DoViewDeactivate()
+    {
+    TRACER("CShwSlideshowView::DoViewDeactivate");
+    GLX_LOG_INFO( "CShwSlideshowView::DoViewDeactivate()" );
+    if (iHdmiController)
+        {
+        GLX_LOG_INFO( "CShwSlideshowView::DoViewDeactivate() - delete hdmicontroller" );
+        delete iHdmiController;
+        iHdmiController = NULL;
+        }
+
+    //check if we have engine active object starting
+    if( iPopulateListCallBack->IsActive() )
+        {
+        //cancel the engine start
+        iPopulateListCallBack->Cancel();
+        }
+
+    //check if we have engine active object starting
+    if( iAsyncCallBack->IsActive() )
+        {
+        //cancel the engine start
+        iAsyncCallBack->Cancel();
+        }
+    
+    //Hide the volume control group, iDisplay and iVolumeControlGroup
+    //are always valid so no need to test for != NULL
+   	iDisplay->Roster().Hide( *iVolumeControlGroup );
+
+
+  	//Ensure we revert to a proper background
+    TRAP_IGNORE( 
+        {
+        iDisplay->SetClearBackgroundL( CAlfDisplay::EClearWithSkinBackground );
+        } ); 
+
+
+    //Ensure we don't get any more key events
+    AppUi()->RemoveFromStack( iKeyHandler );	
+    delete iKeyHandler;
+    iKeyHandler = NULL;
+    
+    //Stop handling telephone calls
+    delete iTelephoneHandler;
+    iTelephoneHandler = NULL;
+    
+    //delete the pause handler 
+    //it is used by key and telephone handlers so do this last
+    delete iPauseHandler;
+    iPauseHandler = NULL;
+
+	//Cancel the back light timer
+    iBackLightTimer->Cancel();
+
+
+    //Stop the slideshow!
+    //NOTE! this needs to be done before the list is closed as the 
+    //destructor removes the engine as medialist observer and also
+    //removes the contexts from the list
+    delete iEngine;
+    iEngine = NULL;
+
+    delete iCollectionPath;
+    iCollectionPath = NULL;
+
+    //Ensure we don't get any more list callbacks
+    if( iMediaList )
+        {
+        iMediaList->RemoveMediaListObserver( this );
+        //need to close the list
+        iMediaList->Close();
+        //set to NULL to prevent double delete
+        iMediaList = NULL;
+        }
+    //Ensure we don't get any more list callbacks
+    if ( iFilteredList )
+        {
+        iFilteredList->RemoveMediaListObserver( this );
+        //need to also close the list
+        iFilteredList->Close();
+        //set to NULL to prevent double delete
+        iFilteredList = NULL;
+        }
+   iDisplay->Roster().Hide( *iGestureControlGroup );
+    
+    if(iTicker)
+    	{
+    	delete iTicker;
+    	iTicker =NULL;
+    	}
+	AppUi()->RemoveFromStack( iShwCba );
+	delete iShwCba;
+	iShwCba =NULL;
+	if(iMediaKeyHandler)
+		{
+		delete iMediaKeyHandler;
+		iMediaKeyHandler = NULL;
+		}
+    }
+
+// ---------------------------------------------------------------------------
+// From MGlxMediaListObserver
+// HandleItemAddedL
+// ---------------------------------------------------------------------------
+//
+void CShwSlideshowView::HandleItemAddedL( TInt /*aStartIndex*/,
+										  TInt /*aEndIndex*/,
+										  MGlxMediaList* /*aList*/ )
+    {
+    }
+	
+// ---------------------------------------------------------------------------
+// From MGlxMediaListObserver
+// HandleMediaL
+// ---------------------------------------------------------------------------
+//
+void CShwSlideshowView::HandleMediaL( TInt /*aListIndex*/,
+									  MGlxMediaList* /*aList*/)
+    {
+    }
+	
+// ---------------------------------------------------------------------------
+// From MGlxMediaListObserver
+// HandleItemRemoved
+// ---------------------------------------------------------------------------
+//
+void CShwSlideshowView::HandleItemRemovedL( TInt /*aStartIndex*/,
+										   TInt /*aEndIndex*/,
+										   MGlxMediaList* /*aList*/ )
+	{
+	}
+	
+// ---------------------------------------------------------------------------
+// From MGlxMediaListObserver
+// HandleItemModifiedL.
+// ---------------------------------------------------------------------------
+//
+void CShwSlideshowView::HandleItemModifiedL( 
+	const RArray<TInt>& /*aItemIndexes*/, MGlxMediaList* /*aList*/ )
+	{
+	}
+	
+// ---------------------------------------------------------------------------
+// From MGlxMediaListObserver
+// HandleAttributesAvailableL.
+// ---------------------------------------------------------------------------
+//
+void CShwSlideshowView::HandleAttributesAvailableL(
+	TInt /*aItemIndex*/,
+	const RArray<TMPXAttribute>& /*aAttributes*/,
+	MGlxMediaList*/* aList*/ )
+    {
+    }
+	
+// ---------------------------------------------------------------------------
+// From MGlxMediaListObserver
+// HandleFocusChangedL.
+// ---------------------------------------------------------------------------
+//
+void CShwSlideshowView::HandleFocusChangedL( NGlxListDefs::TFocusChangeType /*aType*/,
+											TInt /*aNewIndex*/,
+											TInt /*aOldIndex*/,
+											MGlxMediaList* /*aList*/)
+    {
+    TRACER("CShwSlideshowView::HandleFocusChangedL()");
+	if(iFilteredList)
+	    {
+	    if (iFilteredList->Count() && iHdmiActive)
+            {
+            if(iFilteredList->Count() > KSlideShowTextureOffset)
+                {
+                RemoveTexture();
+                }
+            SetImage();
+            }    
+	    }
+    }
+	
+// ---------------------------------------------------------------------------
+// From MGlxMediaListObserver
+// HandleItemSelected.
+// ---------------------------------------------------------------------------
+//
+void CShwSlideshowView::HandleItemSelectedL( TInt /*aIndex*/,
+											TBool /*aSelected*/,
+											MGlxMediaList* /*aList*/)
+    {
+    }
+	
+// ---------------------------------------------------------------------------
+// From MGlxMediaListObserver
+// HandleMessageL.
+// ---------------------------------------------------------------------------
+//
+void CShwSlideshowView::HandleMessageL( const CMPXMessage& /*aMessage*/,
+										MGlxMediaList* /*aList*/)
+	{
+	}
+
+// ---------------------------------------------------------------------------
+// From MGlxMediaListObserver
+// HandlePopulated.
+// ---------------------------------------------------------------------------
+//
+void CShwSlideshowView::HandlePopulatedL( MGlxMediaList* aList )
+	{
+	TRACER("CShwSlideshowView::HandlePopulatedL");
+    GLX_LOG_INFO( "CShwSlideshowView::HandlePopulatedL" );
+
+    if( iMediaList == aList )
+        {
+        // input list is ready
+        iInputListReady = ETrue;
+        // read the selection and filter
+        // note that these cannot be read until the list has been populated
+    	// make the async callback, this will end up calling PopulateListL()
+    	// in CAsyncCallback::RunL once the scheduler next time runs.
+    	iPopulateListCallBack->CallBack();
+        }
+    else if( iFilteredList == aList )
+        {
+        // playable list is ready
+        iPlayListReady = ETrue;
+        }
+    
+    // the filtered list has been populated so start the engine
+    if( iInputListReady && iPlayListReady )
+        {
+    	// make the async callback, this will end up calling StartEngineL()
+    	// in CAsyncCallback::RunL once the scheduler next time runs.
+        // this is a no-op if the callback is already active
+    	iAsyncCallBack->CallBack();
+        }
+	}
+
+// ---------------------------------------------------------------------------
+// From MShwEngineObserver
+// Engine started callback.
+// ---------------------------------------------------------------------------
+//
+void CShwSlideshowView::EngineStartedL()
+    {
+    TRACER("CShwSlideshowView::EngineStartedL");
+  	GLX_LOG_INFO( "CShwSlideshowView::EngineStartedL()" );
+    
+    if ( iWaitDialog )
+        {
+        // cancel the progress bar
+        iWaitDialog->ProcessFinishedL();
+        }
+    iShwState = EShwPlay;
+    ReplaceCommandSetL(R_SHW_SOFTKEYS_END_PAUSE,R_SHW_SOFTKEYS_END_PAUSE);
+    ShowShwFurnitureL();
+    }
+    
+// ---------------------------------------------------------------------------
+// From MShwEngineObserver
+// Engine paused callback.
+// ---------------------------------------------------------------------------
+//
+void CShwSlideshowView::EnginePausedL()
+    {
+    TRACER("CShwSlideshowView::EnginePausedL");
+  	GLX_LOG_INFO( "CShwSlideshowView::EnginePausedL()" );
+    
+    // Cancel the backlight if it's on
+    if ( iBackLightTimer->IsRunning() )
+        {
+        iBackLightTimer->Cancel();
+        }
+        
+    if(!iUiUtility->IsExitingState())
+    	{
+    	iShwState = EShwPause;
+   		ReplaceCommandSetL(R_SHW_SOFTKEYS_END_CONTINUE,R_SHW_SOFTKEYS_END_PAUSE);
+    	ShowShwFurnitureL();
+    	}
+    }
+
+// ---------------------------------------------------------------------------
+// From MShwEngineObserver
+// Engine resumed callback.
+// ---------------------------------------------------------------------------
+//
+void CShwSlideshowView::EngineResumedL()   
+	{
+	TRACER("CShwSlideshowView::EngineResumedL");
+  	GLX_LOG_INFO( "CShwSlideshowView::EngineResumedL" );
+    // Re-enable the backlight if it's off
+    if ( !iBackLightTimer->IsRunning() )
+        {
+        iBackLightTimer->StartL();
+        }
+    iShwState = EShwPlay;
+    ReplaceCommandSetL(R_SHW_SOFTKEYS_END_PAUSE,R_SHW_SOFTKEYS_END_CONTINUE);
+    ShowShwFurnitureL();
+	}
+// ---------------------------------------------------------------------------
+// From MShwEngineObserver
+// Engine LSK Pressed
+// ---------------------------------------------------------------------------
+//
+void CShwSlideshowView::EngineLSKPressedL()   
+    {
+    TRACER("CShwSlideshowView::EngineLSKPressedL");
+    GLX_LOG_INFO( "CShwSlideshowView::EngineLSKPressedL" );
+    iLSKPressed = ETrue;
+    iPauseHandler->UserToggledPauseL();     
+    }
+// ---------------------------------------------------------------------------
+// From MShwEngineObserver
+// Engine Toggle Ui callback.EngineLSKPressedL
+// ---------------------------------------------------------------------------
+//
+void CShwSlideshowView::EngineToggleUiStateL()   
+    {
+    TRACER("CShwSlideshowView::EngineToggleUiStateL");
+    GLX_LOG_INFO( "CShwSlideshowView::EngineToggleUiStateL" );
+    iMSKPressed = ETrue;
+    if(iShwFurniture == EFurnitureVisible)
+        {
+        HideShwFurniture();
+        }
+    else
+        {
+        ShowShwFurnitureL();
+        }    
+    }
+
+// ---------------------------------------------------------------------------
+// From MShwEngineObserver
+// Engine encountered an error and we need to exit.
+// ---------------------------------------------------------------------------
+void CShwSlideshowView::ErrorDuringSlideshowL()
+    {
+    TRACER("CShwSlideshowView::ErrorDuringSlideshowL");
+  	GLX_LOG_INFO( "CShwSlideshowView::ErrorDuringSlideshowL" );
+    iEngineStartFailed = ETrue;
+    // need to dismiss the dialog if it's still there
+    if( iWaitDialog )
+        {
+        iWaitDialog->ProcessFinishedL();
+        }
+    else
+        {
+        ProcessCommandL( EAknSoftkeyBack );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// From MShwMusicObserver
+// MusicOn.
+// -----------------------------------------------------------------------------
+void CShwSlideshowView::MusicOnL()
+    {
+    TRACER("CShwSlideshowView::MusicOnL");
+  	GLX_LOG_INFO( "CShwSlideshowView::MusicOnL" );
+    // Turn on the keypad tones
+    AppUi()->KeySounds()->PushContextL( R_AVKON_SILENT_SKEY_LIST );
+    // if MusicOn leaves, MusicOff will get called
+    // initialize the medikey control only if music is on.
+    // delayed initialization intended
+    // since there is a conflict if slideshow is launched from full screen
+   	iMediaKeyHandler = CShwMediaKeyUtility::NewL();
+    }
+	
+// -----------------------------------------------------------------------------
+// From MShwMusicObserver
+// MusicOff.
+// -----------------------------------------------------------------------------
+void CShwSlideshowView::MusicOff()
+    {
+    TRACER("CShwSlideshowView::MusicOff");
+  	GLX_LOG_INFO( "CShwSlideshowView::MusicOff" );
+  	// 
+  	TInt resource_id = AppUi()->KeySounds()->TopContext();
+  	if( R_AVKON_SILENT_SKEY_LIST == resource_id )
+  	    {
+        // Turn off the keypad tones
+        AppUi()->KeySounds()->PopContext();
+  	    }
+
+    // If it's visible, hide the volume control
+    iDisplay->Roster().Hide( *iVolumeControlGroup );
+    //delete the media key handler
+    if(iMediaKeyHandler)
+		{
+		delete iMediaKeyHandler;
+		iMediaKeyHandler = NULL;
+		}
+    }
+	
+// -----------------------------------------------------------------------------
+// From MShwMusicObserver
+// MusicVolume.
+// -----------------------------------------------------------------------------
+void CShwSlideshowView::MusicVolumeL(TInt aCurrentVolume, TInt aMaxVolume)
+    {
+    TRACER("CShwSlideshowView::MusicVolume");
+  	GLX_LOG_INFO( "CShwSlideshowView::MusicVolume" );
+    if (aCurrentVolume != iCurrentVolume)
+        {
+        // Store the changed value
+        iCurrentVolume = aCurrentVolume;
+        iVolumeControl->SetVolume(aCurrentVolume, aMaxVolume);
+        }
+    // Always show the control even if the volume hasn't changed, e.g. @ 100%
+    iVolumeControl->RefreshL();
+    }
+
+// -----------------------------------------------------------------------------
+// From MShwMusicObserver
+// ErrorWithTrackL.
+// -----------------------------------------------------------------------------
+void CShwSlideshowView::ErrorWithTrackL( TInt /*aErrorCode*/ )
+    {
+    TRACER("CShwSlideshowView::ErrorWithTrackL");
+    // we dont use the error code as any kind of error with track file
+    // means we cannot play it.
+    // set the music to off if there was an error in track (file missing etc)
+    // this way the user gets notification only once
+    // ER:  EMSR-77PCSJ
+    CShwSettingsModel* shwSettingsMdl = CShwSettingsModel::NewL();
+    CleanupStack::PushL( shwSettingsMdl );
+    shwSettingsMdl->SaveMusicStateL( EFalse );
+    CleanupStack::PopAndDestroy( shwSettingsMdl );
+
+	// Display the error note
+	HBufC* noteBuf = StringLoader::LoadLC(
+	    R_SHW_QTN_LGAL_NOTE_SLIDESHOW_DEFINE );
+    CAknInformationNote* note = new (ELeave) CAknInformationNote;
+    CleanupStack::Pop( noteBuf );
+    note->ExecuteLD( *noteBuf );
+    }
+
+// -----------------------------------------------------------------------------
+// From MProgressDialogCallback
+// Gets called when a dialog is dismissed.
+// -----------------------------------------------------------------------------
+void CShwSlideshowView::DialogDismissedL( TInt aButtonId )
+    {
+    TRACER("CShwSlideshowView::DialogDismissedL");
+  	GLX_LOG_INFO( "CShwSlideshowView::DialogDismissedL" );
+    if ( iEngineStartFailed || aButtonId == EEikBidCancel )
+        {
+        // Cancel the callback
+        iAsyncCallBack->Cancel();
+        // Send the back command to return to the previous view
+        ProcessCommandL( EAknSoftkeyBack );    
+        }	       
+    }
+
+// -----------------------------------------------------------------------------
+// SetupScreenFurnitureL.
+// -----------------------------------------------------------------------------	
+void CShwSlideshowView::SetupScreenFurnitureL()
+    {
+    TRACER("CShwSlideshowView::SetupScreenFurnitureL");
+  	GLX_LOG_INFO( "CShwSlideshowView::SetupScreenFurnitureL" );
+    // Create the soft keys
+    // Left (bottom in landscape orientation)
+    HBufC* softKeyTextLeft = StringLoader::LoadLC( R_SHW_SOFTKEY_LEFT );
+    // SetSoftKeyL takes ownership of softKeyText
+    //SetSoftkeyL( EGlxLeftSoftkey,  EShwSlideshowCmdContinue, softKeyTextLeft );
+    CleanupStack::Pop( softKeyTextLeft );
+    // Right (top in landscape orientation)
+    HBufC* softKeyTextRight = StringLoader::LoadLC( R_SHW_SOFTKEY_RIGHT );
+    // SetSoftKeyL takes ownership of softKeyText
+    //SetSoftkeyL( EGlxRightSoftkey,  EAknSoftkeyBack, softKeyTextRight );
+    CleanupStack::Pop( softKeyTextRight );
+    
+    }
+
+// -----------------------------------------------------------------------------
+// GetPathAndPlaybackDirectionL
+// -----------------------------------------------------------------------------
+void CShwSlideshowView::GetPathAndPlaybackDirectionL( const TDesC8& aData )
+	{
+	TRACER("CShwSlideshowView::GetPathAndPlaybackDirectionL");
+  	GLX_LOG_INFO( "CShwSlideshowView::GetPathAndPlaybackDirectionL" );
+	// reset state flags for list population
+	iInputListReady = iPlayListReady = EFalse;
+
+	 // Create a copy of the media list using the path and the play direction
+	RDesReadStream stream( aData );
+	CleanupClosePushL( stream );
+	stream.ReadInt32L();
+
+
+	//Get the play direction.
+	
+	CShwSettingsModel* shwSettingsMdl = CShwSettingsModel::NewL();
+        CleanupStack::PushL( shwSettingsMdl );
+        iPlayDirection = static_cast< NShwSlideshow::
+	TPlayDirection>(shwSettingsMdl->PlayOrderL());	
+        CleanupStack::PopAndDestroy( shwSettingsMdl );   
+
+
+
+	// Retrieve the path
+	iCollectionPath = CMPXCollectionPath::NewL();
+	iCollectionPath->InternalizeL( stream );
+	// Create the media list from the path
+	iMediaList = MGlxMediaList::InstanceL( *iCollectionPath  );
+	// the list might be already populated
+	if( iMediaList->IsPopulated() )
+	    {
+        iInputListReady = ETrue;
+        // list is ready so read the selection and filter already now
+        // need to do this while on DoViewActivateL as the previous view
+        // may loose the selection while it is closing
+        PopulateListL();
+	    }
+	else
+	    {
+    	// add us as an observer for the input list as well
+    	// we cannot read the path and filter before the list is populated
+    	iMediaList->AddMediaListObserverL( this );
+	    }
+	
+	CleanupStack::PopAndDestroy( &stream );
+	}
+
+// -----------------------------------------------------------------------------
+// SetListFocusL.
+// -----------------------------------------------------------------------------
+void CShwSlideshowView::SetListFocusL()
+    {
+    TRACER("CShwSlideshowView::SetListFocusL");
+  	GLX_LOG_INFO( "CShwSlideshowView::SetListFocusL" );
+    // Ensure that we start the slideshow from the correct image index:
+    // if there are any selected images we always start from the first one,
+    // otherwise we try to use the item with focus from the unfiltered list
+    // so long as it hasn't been filtered out, in which case we use the first image.
+    TInt selectionCount = iCollectionPath->Selection().Count();
+    TInt focusIndex = 0;
+    if ( selectionCount == 0 )
+        {
+        // nothing selected, so determine which item has focus in the original list
+        focusIndex = iMediaList->FocusIndex();
+        const TGlxMedia& mediaItem = iMediaList->Item( focusIndex );
+        // is this item in the filtered list?
+        TGlxIdSpaceId spaceId = iMediaList->IdSpaceId( focusIndex );
+        focusIndex = iFilteredList->Index( spaceId, mediaItem.Id() );
+        if ( focusIndex == KErrNotFound )
+            {
+            // it's been filtered out so just use the first item
+            focusIndex = 0;
+            }
+        }
+    iFilteredList->SetFocusL( NGlxListDefs::EAbsolute, focusIndex );
+    SetImage();
+    iHdmiActive = ETrue;
+//    iContextUtility->PublishPhotoContextL(item.Uri());
+    }
+
+
+// -----------------------------------------------------------------------------
+// HandleTickL.
+// act on timer expiry
+// -----------------------------------------------------------------------------
+//
+void CShwSlideshowView::HandleTickL()
+	{
+	TRACER("CShwSlideshowView::HandleTickL");
+	GLX_LOG_INFO( "CShwSlideshowView::HandleTickL" );
+	if(iShwFurniture != EFurnitureVisible)
+		{
+		ShowShwFurnitureL();
+		}
+	else
+		{
+		HideShwFurniture();
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// HandleTickCancelled.
+// act on timer cancelled
+// -----------------------------------------------------------------------------
+//
+void CShwSlideshowView::HandleTickCancelled()
+	{
+	
+	}
+	
+// -----------------------------------------------------------------------------
+// HandleShwGestureEventL.
+// act on gestures
+// -----------------------------------------------------------------------------
+//	
+void CShwSlideshowView::HandleShwGestureEventL(MShwGestureObserver::TShwGestureEventType aType)
+	{
+	TRACER("CShwSlideshowView::HandleShwGestureEventL");
+	GLX_LOG_INFO( "CShwSlideshowView::HandleShwGestureEventL" );
+	iTicker->CancelTicking();
+	switch(aType)
+		{
+		case ETapEvent:
+			{
+			if(iShwFurniture == EFurnitureVisible)
+				{
+				HideShwFurniture();
+				}
+			else
+				{
+				ShowShwFurnitureL();
+				}
+			break;
+			}
+		case ESwipeLeft:
+			{
+			iEngine->NextItemL();
+			break;
+			}
+		case ESwipeRight:
+			{
+			iEngine->PreviousItemL();
+			break;
+			}
+		default:
+			{
+			break;
+			}
+		}
+	}
+// -----------------------------------------------------------------------------
+// InitializeShwFurnitureL.
+// set sof keys and the volume slider
+// -----------------------------------------------------------------------------
+//
+void CShwSlideshowView::InitializeShwFurnitureL()
+	{
+	TRACER("CShwSlideshowView::InitializeShwFurnitureL");
+	GLX_LOG_INFO( "CShwSlideshowView::InitializeShwFurnitureL" );
+	// initialize softkeys
+	InitializeCbaL();
+	}
+	
+// -----------------------------------------------------------------------------
+// InitializeCbaL.
+// set sof keys
+// -----------------------------------------------------------------------------
+//
+void CShwSlideshowView::InitializeCbaL()
+	{
+	TRACER("CShwSlideshowView::InitializeCbaL");
+	GLX_LOG_INFO( "CShwSlideshowView::InitializeCbaL" );
+	// initialize with the end-pause command set as that is the one 
+	// we are supposed to show immediately on slideshow play
+	// orientation: set to Vertical as slide show is always intended to
+	// run in landscape mode
+    iShwCba = CEikButtonGroupContainer::NewL(
+        CEikButtonGroupContainer::ECba,
+        CEikButtonGroupContainer::EVertical,
+        this, R_SHW_SOFTKEYS_END_PAUSE );
+    iShwCba->MakeVisible(EFalse); 
+    //set the current active command set
+	ReplaceCommandSetL(R_SHW_SOFTKEYS_END_PAUSE,R_SHW_SOFTKEYS_END_PAUSE);
+	}
+	
+// -----------------------------------------------------------------------------
+// ReplaceCommandSetL.
+// replaces a  commandset with a new one
+// -----------------------------------------------------------------------------
+//	
+void CShwSlideshowView::ReplaceCommandSetL(TInt aNewComandId, TInt aOldCommandSet)
+	{
+	TRACER("CShwSlideshowView::ReplaceCommandSetL");
+	GLX_LOG_INFO( "CShwSlideshowView::ReplaceCommandSetL" );
+	//find and remove the command set
+    TInt pos = iShwCba->PositionById( aOldCommandSet );
+    if( pos != KErrNotFound )
+        {
+        iShwCba->RemoveCommandFromStack( pos, aOldCommandSet );
+        }
+    // set the new command set
+    iShwCba->SetCommandSetL( aNewComandId );
+    // keep the current active command set
+    iCurrentActiveCommandSet = aNewComandId;
+    }
+
+	
+// -----------------------------------------------------------------------------
+// HideShwFurnitureL.
+// hide softkeys and the volume slider
+// -----------------------------------------------------------------------------
+//
+void CShwSlideshowView::HideShwFurniture()
+	{
+	TRACER("CShwSlideshowView::HideShwFurnitureL");
+	GLX_LOG_INFO( "CShwSlideshowView::HideShwFurnitureL" );
+	iTicker->CancelTicking();
+	iShwCba->MakeVisible(EFalse);
+	iShwCba->DrawNow();
+	if(iMediaKeyHandler)
+	    {
+	    iVolumeControl->Hide();
+	    }	
+	iShwFurniture = EFurnitureHidden;
+	
+	}
+	
+// -----------------------------------------------------------------------------
+// ShowShwFurnitureL.
+// show softkeys and the volume slider
+// -----------------------------------------------------------------------------
+//
+void CShwSlideshowView::ShowShwFurnitureL()
+	{
+	TRACER("CShwSlideshowView::ShowShwFurnitureL");
+	GLX_LOG_INFO( "CShwSlideshowView::ShowShwFurnitureL" );
+	iTicker->CancelTicking();
+	iShwCba->MakeVisible(ETrue);
+	iShwCba->DrawNow();
+	if(iMediaKeyHandler)
+	    {
+	    iVolumeControl->ShowControlL();
+	    }
+	iShwFurniture = EFurnitureVisible;
+	//start the timer to keep the up the screen furniture for 5 seconds
+	iTicker->StartTicking(KShowForSeconds);
+	}
+	
+// -----------------------------------------------------------------------------
+// ProcessCommandL.
+// handle softkey events
+// -----------------------------------------------------------------------------
+//
+void CShwSlideshowView::ProcessCommandL(TInt aCommandId)
+	{
+	TRACER("CShwSlideshowView::ProcessCommandL");
+	GLX_LOG_INFO( "CShwSlideshowView::ProcessCommandL" );
+	switch(aCommandId)
+		{
+        case EShwSlideshowCmdEnd:
+        	{
+        	iShwState = EShwExiting;
+        	aCommandId = EAknSoftkeyBack;
+        	iDisplay->Roster().Hide( *iGestureControlGroup );        
+        	break;
+        	}
+        //When user presses MSK or LSK this cmd will Generated
+        case EShwSlideshowCmdPause:
+		case EShwSlideshowCmdContinue:
+			{
+					// If MSK preesed to toggle visibility of softekey
+					if(iMSKPressed)
+		                {
+		                iMSKPressed = EFalse;
+		                }            
+		            else if(iLSKPressed)
+		                {
+		                iLSKPressed = EFalse;// Already Handlled
+		                }
+		            else
+		                {
+		                iPauseHandler->UserToggledPauseL();
+		                }
+		            break;  
+					}
+
+        default:
+        	{
+        	break;
+        	}
+		}
+	CGlxViewBase::ProcessCommandL(aCommandId);
+	}
+// -----------------------------------------------------------------------------
+// SetImage.
+// To set Image to external display if HDmi connected
+// -----------------------------------------------------------------------------
+//
+void CShwSlideshowView::SetImage()
+    {
+    TRACER("CShwSlideshowView::SetImage");
+    TGlxMedia item = iFilteredList->Item( iFilteredList->FocusIndex() );
+    TInt frameCount(0);
+    TSize orignalSize;
+    TBool aFramesPresent  = item.GetFrameCount(frameCount);
+    TBool adimension  = item.GetDimensions(orignalSize);
+    iHdmiController->SetImageL(item.Uri(), orignalSize, frameCount);
+    }
+// ---------------------------------------------------------------------------
+// 
+// Gets the index of the item for which the texture has to be removed
+// ---------------------------------------------------------------------------
+//
+TInt CShwSlideshowView::GetIndexToBeRemoved()
+    {
+    TRACER("CShwSlideshowView::GetIndexToBeRemoved");
+    TInt indextoberemoved;
+    TInt count = iFilteredList->Count();
+    TInt focusIndex = iFilteredList->FocusIndex();
+    if(iPlayDirection == NShwSlideshow::EPlayForwards)
+        {
+        indextoberemoved = focusIndex-KSlideShowIterator;
+        if(indextoberemoved < 0)
+            {
+            indextoberemoved = count+indextoberemoved;              
+            }
+        }
+       else
+        {
+        indextoberemoved = focusIndex+KSlideShowIterator;
+        if(indextoberemoved > count-1)
+          {
+          indextoberemoved = indextoberemoved-count;
+          }        
+        }
+    GLX_LOG_INFO1("CShwSlideshowView::GetIndexToBeRemoved Index to be removed is %d",indextoberemoved);
+    return indextoberemoved;
+    }
+// ---------------------------------------------------------------------------
+// 
+// Remove the texture on every swipe while HDMI is connected.
+// ---------------------------------------------------------------------------
+//
+void CShwSlideshowView::RemoveTexture()
+    {
+    TRACER("CShwSlideshowView::RemoveTexture");
+    const TGlxMedia& item = iFilteredList->Item(GetIndexToBeRemoved());
+    iUiUtility->GlxTextureManager().RemoveTexture(item.Id(),EFalse);
+    }