mpxplugins/viewplugins/views/collectionviewhg/src/mpxcollectionviewhgimp.cpp
changeset 0 ff3acec5bc43
child 1 8118492f1bdf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mpxplugins/viewplugins/views/collectionviewhg/src/mpxcollectionviewhgimp.cpp	Thu Dec 17 08:45:05 2009 +0200
@@ -0,0 +1,7785 @@
+/*
+* Copyright (c) 2006 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 Collection view
+*
+*/
+
+// INCLUDE FILES
+#include <bldvariant.hrh>
+#include <f32file.h>
+#include <eikmenub.h>
+#include <coeutils.h>
+#include <aknlists.h>
+#include <aknViewAppUi.h>
+#include <AknQueryDialog.h>
+#include <StringLoader.h>
+#include <aknnavilabel.h>
+#include <aknnavide.h>
+#include <akntitle.h>
+#include <textresolver.h>
+#include <aknnotewrappers.h>
+#include <aknnavi.h>
+#include <hlplch.h>
+#include <avkon.hrh>
+#include <avkon.rsg>
+#include <avkon.mbg>
+#include <sendui.h>
+#include <cmessagedata.h>
+#include <centralrepository.h>
+#include <mprofileengine.h>
+#include <akndlgshut.h>
+#ifdef RD_MULTIPLE_DRIVE
+#include <driveinfo.h>
+#endif //RD_MULTIPLE_DRIVE
+
+#include <upnpcopycommand.h>
+#include <AiwServiceHandler.h>  //Copy to remote feature
+
+#include <mediarecognizer.h>
+#include <featmgr.h>
+#include <aknmediatorfacade.h>
+#include <MediatorCommandInitiator.h>
+#include <mediatordomainuids.h>
+
+#include <mplayersecondarydisplayapi.h>
+#include <data_caging_path_literals.hrh>
+#include <layoutmetadata.cdl.h>
+#include <mpxplaybackframeworkdefs.h>
+#include <mpxcollectionmessage.h>
+#include <mpxviewutility.h>
+#include <mpxmusicplayerviewplugin.hrh>
+#include <mpxcollectionviewhg.rsg>
+#include <mpxcollectionviewhg.mbg>
+#include <mpxcommonui.rsg>
+#include <mpxcollectionutility.h>
+#include <mpxplaybackutility.h>
+#include <mpxplaybackmessage.h>
+#include <mpxmedia.h>
+#include <mpxcollectionhelperfactory.h>
+#include <mpxcollectionplaylist.h>
+#include <mpxmediacontainerdefs.h>
+#include <mpxmediamusicdefs.h>
+#include <mpxmediacollectiondetaildefs.h>
+#include <mpxmediadrmdefs.h>
+#include <mpxmediaarray.h>
+#include <mpxcollectioncommanddefs.h>
+#include <mpxcommandgeneraldefs.h>
+#include <mpxmessagegeneraldefs.h>
+#include <mpxcommandgeneraldefs.h>
+#include <mpxcollectioncommanddefs.h>
+#include <mpxviewpluginmanager.h>
+#include <mpxviewplugin.h>
+#include <mpxbacksteppingutility.h>
+#include <mpxcollectionopenutility.h>
+
+#include <mpxfindinmusicshop.h>
+#include <mpxfindinmusicshopcommon.h>  // KFindInMShopKeyInValid
+#include <MusicWapCenRepKeys.h>
+
+// cenrep key need to be checked whether USB cable is connected in MTP/Combined Mode
+#include <UsbWatcherInternalPSKeys.h>
+#include <usbpersonalityids.h>
+#include <mpxappui.hrh>
+#include <mpxinternalcrkeys.h>
+#include <mpxtlshelper.h>
+#include <mpxuser.h>
+#include "mpxcollectionviewhglistboxarray.h"
+#include "mpxcommoncontainer.hrh"
+#include "mpxcommonuihelper.h"
+#include "mpxcollectionviewhgcontainer.h"
+#include "mpxcollectionviewhg.hrh"
+#include "mpxcollectionviewhg.hlp.hrh"
+#include "mpxcollectionviewhgimp.h"
+#include "mpxviewprivatepskeys.h"
+#include "mpxlog.h"
+
+
+// CONSTANTS
+_LIT( KMPXCollectionRscPath, "mpxcollectionviewhg.rsc" );
+
+const TInt KMilliSecondsToSeconds( 1000 );
+const TInt KMPXReorderNaviPaneGranularity( 2 );
+const TInt KMPXMaxBufferLength( 160 );
+const TInt KMPXMaxTimeLength( 36 );
+const TInt KMPXDurationDisplayResvLen( 10 );
+const TInt KMPXPlaylistExportRetry( 10 );
+const TInt KMPXDirectionUp( -1 );
+const TInt KMPXDirectionDown( 1 );
+const TInt KMPXErrDataNotReady( -8000 );
+const TInt KMPXErrDataNotReadyCacheCommand( -8001 );
+const TInt KMPXArrayGranularity( 100 );
+const TInt KMusicCollectionMenuLevel( 2 );
+
+_LIT( KMPXCollDetailsItemsFormat, "%S\t%S" );
+
+_LIT( KCategoryEmpty, "" );
+
+const TInt KIncrementalDelayNone = 0;
+const TInt KIncrementalDelayHalfSecond = 1000000;
+const TInt KIncrementalFetchBlockSize = 400;
+const TInt KIncrementalDirectionCount = 8;
+const TInt KProgressBarMaxValue = 100;  // Max Value for the Progress Info bar
+const TInt KWaitNoteImpUid = 0x101FFC6C; // refresh wait note UID
+#ifdef __ENABLE_PODCAST_IN_MUSIC_MENU
+const TInt KMusicMenuPodcastMenuItemIndex = 4; // podcast menu item index
+#define KPodcastCollectionUid 0x101FFC3C
+#endif
+
+const TInt KMaxIntLen( 10 );
+_LIT8( KMVPrefix, "MVviewID:" );
+const TInt KMVPrefixLen( 9 );
+
+// Music setting
+const TUid KCRUidMPXMPSettings = {0x101FFCDC};
+const TUint32 KMPXMusicStoreUID = 0x00000003;
+const TUint32 KOperatorMusicStore = 0x00000004;
+const TUint32 KOperatorMusicStoreType = 0x00000005;
+const TUint32 KOperatorMusicStoreDisplayName = 0x00000006;
+const TUint32 KOperatorMusicStoreNativeUid = 0x00000007;
+const TUint32 KOperatorMusicStoreJavaName = 0x00000008;
+const TUint32 KOperatorMusicStoreWebPage = 0x00000009;
+const TUint32 KOperatorMusicStoreURI = 0x0000000A;
+
+
+const TInt KJavaMusicShopType( 1 );
+const TInt KUIDMaxLength = 8;
+const TInt KMPXMaxHistoryLength( 255 );
+
+#define KProgressDownloadUid  0x10207BCD
+
+// Music collection browse type
+const TInt KMPXCollectionArtistAlbum( 3 );
+const TInt KMPXCollectionGenre( 5 );
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CMPXCollectionViewHgImp* CMPXCollectionViewHgImp::NewL()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::NewL" );
+    CMPXCollectionViewHgImp* self = CMPXCollectionViewHgImp::NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CMPXCollectionViewHgImp* CMPXCollectionViewHgImp::NewLC()
+    {
+    CMPXCollectionViewHgImp* self = new ( ELeave ) CMPXCollectionViewHgImp();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CMPXCollectionViewHgImp::~CMPXCollectionViewHgImp()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::~CMPXCollectionViewHgImp" );
+
+    if ( iCoverDisplay )
+        {
+        delete iCommandInitiator;
+        }
+
+    // Cleanup observer, does not panic if not found
+    //
+    AppUi()->RemoveViewDeactivationObserver( this );
+
+    if ( iCollectionUtility )
+        {
+        iCollectionUtility->Close();
+        }
+
+    if ( iPlaybackUtility )
+        {
+        TRAP_IGNORE( iPlaybackUtility->RemoveObserverL( *this ) );
+        iPlaybackUtility->Close();
+        }
+
+    if ( iViewUtility )
+        {
+        iViewUtility->RemoveObserver( this );
+        iViewUtility->Close();
+        }
+
+    if ( iCollectionUiHelper )
+        {
+        iCollectionUiHelper->Close();
+        }
+
+    if ( iCollectionHelper )
+        {
+        iCollectionHelper->Close();
+        }
+
+    if ( iProfileEngine )
+        {
+        iProfileEngine->Release();
+        }
+
+    if ( iUpnpFrameworkSupport )
+        {
+        MPX_DEBUG1(_L("CMPXCollectionViewHgImp::~CMPXCollectionViewHgImp Detaching 'Copy to external' menu service..."));
+        if ( iServiceHandler )
+            {
+            iServiceHandler->DetachMenu( R_MPX_COLLECTION_VIEW_MENU_1,
+                                     R_MPX_UPNP_COPY_TO_EXTERNAL_MENU_INTEREST );
+        iServiceHandler->DetachMenu( R_MPX_USE_AS_CASCADE,
+                                 R_MPX_AIW_ASSIGN_INTEREST );
+            delete iServiceHandler;
+            iServiceHandler = NULL;
+            }
+        iPlayersList.Close();
+        delete iSubPlayerName;
+        }
+    if ( iUpnpCopyCommand )
+        {
+        delete iUpnpCopyCommand;
+        }
+
+    if ( iServiceHandler )
+        {
+        iServiceHandler->DetachMenu( R_MPX_USE_AS_CASCADE,
+                                 R_MPX_AIW_ASSIGN_INTEREST );
+        delete iServiceHandler;
+        }
+    if ( iMediaRecognizer )
+        {
+        delete iMediaRecognizer;
+        }
+
+    if( iBackSteppingUtility )
+        {
+        iBackSteppingUtility->Close();
+        }
+
+    if ( iResourceOffset )
+        {
+        iEikonEnv->DeleteResourceFile( iResourceOffset );
+        }
+
+    if ( iContainer )
+        {
+        AppUi()->RemoveFromStack( iContainer );
+        delete iContainer;
+        }
+
+    delete iNaviDecorator;
+    delete iUserPlaylists;
+    delete iCommonUiHelper;
+    delete iSendUi;
+    delete iTitle;
+    delete iDuration;
+    delete iOriginalTitle;
+    delete iOriginalDuration;
+    delete iNewName;
+    delete iBottomIndex;
+    delete iCurrentCba;
+    delete iIncrementalOpenUtil;
+    delete iCachedSelectionIndex;
+    FeatureManager::UnInitializeLib();
+    delete iOperatorMusicStoreName ;
+    if ( iOperatorMusicStoreURI )
+        {
+        delete iOperatorMusicStoreURI;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// ---------------------------------------------------------------------------
+//
+CMPXCollectionViewHgImp::CMPXCollectionViewHgImp() :
+    iLastDepth( 1 ), iPlayIndex( KErrNotFound ),
+    iSetMediaLCount( KErrNotFound ),
+    iCurrentHighlightedIndex( KErrNotFound ),
+    iCachedCommand( KErrNotFound ),
+    iNoteType( EMPXNoteNotDefined ),
+	iFirstIncrementalBatch( ETrue )
+	{
+    MPX_FUNC( "CMPXCollectionViewHgImp::CMPXCollectionViewHgImp" );
+    iUsingNokiaService = EFalse;
+#ifdef __ENABLE_MSK
+    iCurrentMskId = KErrNotFound;
+    iShowContextMenu = EFalse;
+    iCollectionCacheReady = ETrue;
+#endif // __ENABLE_MSK
+#ifdef __ENABLE_PODCAST_IN_MUSIC_MENU
+    iPodcast = EFalse;
+#endif // __ENABLE_PODCAST_IN_MUSIC_MENU
+    iInAlbumArtDialog = EFalse;
+
+    iMarkedAll = EFalse;
+    // grab the current process priority
+    RProcess proc;
+    iPriority = proc.Priority();
+    }
+
+void CMPXCollectionViewHgImp::HandleStatusPaneSizeChange()
+    {
+	MPX_FUNC( "CMPXCollectionViewHgImp::HandleStatusPaneSizeChange" );
+	CMPXCollectionViewHg::HandleStatusPaneSizeChange();
+	if ( iContainer )
+        {
+		iContainer->SetRect( ClientRect() );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::ConstructL()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::ConstructL" );
+
+// initialize FeatureManager
+    FeatureManager::InitializeLibL();
+
+    if ( FeatureManager::FeatureSupported( KFeatureIdCoverDisplay ) )
+        {
+        iCoverDisplay = ETrue;
+        iCommandInitiator = CMediatorCommandInitiator::NewL( NULL );
+        }
+    else
+        {
+        iCoverDisplay = EFalse;
+        }
+
+
+    CCoeEnv* coeEnv( iEikonEnv );
+    TParse parse;
+    parse.Set( KMPXCollectionRscPath, &KDC_APP_RESOURCE_DIR, NULL );
+    TFileName resourceFile( parse.FullName() );
+    User::LeaveIfError( MPXUser::CompleteWithDllPath( resourceFile ) );
+    BaflUtils::NearestLanguageFile( coeEnv->FsSession(), resourceFile );
+    iResourceOffset = coeEnv->AddResourceFileL( resourceFile );
+
+    BaseConstructL( R_MPX_COLLECTION_VIEW );
+
+    iIsEmbedded = iEikonEnv->StartedAsServerApp();
+
+    // create a new collection utility bound to the default context.
+    iCollectionUtility = MMPXCollectionUtility::NewL( this, KMcModeDefault );
+    iPlaybackUtility = MMPXPlaybackUtility::UtilityL( KPbModeDefault );
+    iPlaybackUtility->AddObserverL( *this );
+    iViewUtility = MMPXViewUtility::UtilityL();
+    iViewUtility->AddObserverL( this );
+    iBottomIndex = new (ELeave) CArrayFixFlat<TInt>( 1 );
+
+    iCommonUiHelper = CMPXCommonUiHelper::NewL( iCollectionUtility );
+    iCollectionUiHelper = CMPXCollectionHelperFactory::NewCollectionUiHelperL();
+
+    // Monitor for view activation
+    AppUi()->AddViewActivationObserverL( this );
+
+    if (!iUpnpCopyCommand )
+        {
+        MPX_TRAPD ( error, iUpnpCopyCommand = CUpnpCopyCommand::NewL() );
+		    if ( error == KErrNone )
+            {
+            iUpnpFrameworkSupport = ETrue;
+            iServiceHandler = CAiwServiceHandler::NewL();
+            MPX_DEBUG1("CMPXCollectionViewHgImp::ConstructL() Attaching 'Copy to external' menu service...");
+            MPX_TRAP( iErrorAttachCopyMenu, iServiceHandler->AttachMenuL( R_MPX_COLLECTION_VIEW_MENU_1,
+                                                   R_MPX_UPNP_COPY_TO_EXTERNAL_MENU_INTEREST ) );
+            if ( iErrorAttachCopyMenu == KErrNotSupported )
+                {
+                // when CCoeEnv is not available
+                User::Leave( iErrorAttachCopyMenu );
+                }
+            MPX_DEBUG2( "CMPXCollectionViewHgImp::ConstructL(): attach Copy menu error: %d", iErrorAttachCopyMenu );
+            }
+        else
+            {
+            iUpnpFrameworkSupport = EFalse;
+            iUpnpCopyCommand = NULL;
+            }
+        }
+    iMediaRecognizer = CMediaRecognizer::NewL();
+    if ( iServiceHandler == NULL)
+        {
+        iServiceHandler = CAiwServiceHandler::NewL();
+        }
+    MPX_DEBUG1("CMPXCollectionViewHgImp::ConstructL() Attaching 'use tone as' menu service...");
+    MPX_TRAP( iErrorAttachAssignMenu, iServiceHandler->AttachMenuL( R_MPX_USE_AS_CASCADE,
+                                               R_MPX_AIW_ASSIGN_INTEREST ) );
+
+    iNaviPane =
+        static_cast<CAknNavigationControlContainer*>
+        ( iAvkonViewAppUi->StatusPane()->ControlL(
+            TUid::Uid( EEikStatusPaneUidNavi ) ) );
+    iNaviDecorator = iNaviPane->CreateNavigationLabelL( KNullDesC );
+    //Create label to change text in Navi pane
+    iNaviLabel = static_cast<CAknNaviLabel*>
+            ( iNaviDecorator->DecoratedControl() );
+
+    TInt flags( 0 );
+    CRepository* repository = CRepository::NewL( KCRUidMPXMPFeatures );
+    repository->Get( KMPXMPLocalVariation, flags );
+    delete repository;
+    iGoToMusicShopOptionHidden =
+        !static_cast<TBool>( flags & KMPXEnableGoToMusicShopOption );
+    iUsingNokiaService =
+        static_cast<TBool>( flags & KMPXEnableFindInMusicShopOption );
+    MPX_DEBUG2( "CMPXCollectionViewHgImp::ConstructL(): iUsingNokiaService: %d", iUsingNokiaService );
+    iDisablePodcasting = flags&KMPXDisablePodcastingOption ? ETrue : EFalse;
+
+#ifdef _DEBUG
+    iExitOptionHidden = EFalse;
+#else // _DEBUG
+    iExitOptionHidden = iCommonUiHelper->ExitOptionHiddenL() && !iIsEmbedded;
+#endif // _DEBUG
+
+    iBottomIndex->AppendL( 0 );
+    iProfileEngine = CreateProfileEngineL();
+
+    _LIT_SECURITY_POLICY_C1(KMPlayerRemoteReadPolicy, ECapabilityReadUserData);
+    _LIT_SECURITY_POLICY_C1(KMPlayerRemoteWritePolicy, ECapabilityWriteUserData);
+
+    if (iGoToMusicShopOptionHidden)
+        {
+        iMusicStoreUID = 0;
+        }
+    else
+        {
+        // Get music store uid from cenrep
+        //
+        TBuf8< KUIDMaxLength > musicStoreUID;
+        TRAP_IGNORE(
+            {
+            CRepository* repository = CRepository::NewL( KCRUidMPXMPSettings );
+            repository->Get( KMPXMusicStoreUID, musicStoreUID );
+            delete repository;
+            repository = NULL;
+            } );
+
+        GetUint32Presentation( iMusicStoreUID, musicStoreUID, 0 );
+        if (iMusicStoreUID == 0)
+            {
+            iGoToMusicShopOptionHidden = ETrue;
+            }
+        }
+    MPX_DEBUG2("CMPXCollectionViewHgImp::ConstructL musicStoreUID = %x", iMusicStoreUID);
+
+    TInt retval(KErrNone);
+    // P/S key for music shop
+    retval = RProperty::Define( TUid::Uid(iMusicStoreUID),
+                                KMShopCategoryId,
+                                RProperty::EInt,
+                                KMPlayerRemoteReadPolicy,
+                                KMPlayerRemoteWritePolicy );
+
+    if( retval != KErrAlreadyExists)
+        {
+        RProperty::Set( TUid::Uid(iMusicStoreUID),
+                        KMShopCategoryId,
+                        KFindInMShopKeyInValid );  // initialize Find In Musicshop was not called
+
+
+        RProperty::Define(  TUid::Uid(iMusicStoreUID),
+                            KMShopCategoryName,
+                            RProperty::ELargeText,
+                            KMPlayerRemoteReadPolicy,
+                            KMPlayerRemoteWritePolicy );
+        }
+
+    iCachedSelectionIndex = new ( ELeave )CArrayFixFlat<TInt>( KMPXArrayGranularity );
+    iIncrementalOpenUtil = CMPXCollectionOpenUtility::NewL( this );
+
+    // Initialize the Back Stepping Service Utility with the MPX Music Player
+    iBackSteppingUtility = MMPXBackSteppingUtility::UtilityL();
+    iBackSteppingUtility->InitializeL(
+        TUid::Uid( KMusicPlayerAppUidConstant ) );
+    iActivateBackStepping = EFalse;
+
+    iIsAddingToPlaylist = EFalse;
+
+       // Get music store information from cenrep
+   //
+   TBuf8< KUIDMaxLength > operatorMusicStoreUID;
+
+   iOperatorMusicStoreName = HBufC16::NewL( KMPXMaxHistoryLength );
+   TPtr operatorMusicStoreMenuOption = iOperatorMusicStoreName->Des();
+
+   HBufC16* musicStoreJavaName = HBufC16::NewLC( KMPXMaxHistoryLength );
+   TPtr operatorMusicStoreJavaName = musicStoreJavaName->Des();
+
+   TRAP_IGNORE(
+    {
+    CRepository* musicshoprepository = CRepository::NewL( KCRUidMPXMPSettings );
+    musicshoprepository->Get( KOperatorMusicStore, iOperatorMusicStore );
+    if(iOperatorMusicStore)
+        {
+        musicshoprepository->Get( KOperatorMusicStoreType, iOperatorMusicStoreType );
+        musicshoprepository->Get( KOperatorMusicStoreDisplayName, operatorMusicStoreMenuOption );
+        if (iOperatorMusicStoreType == KJavaMusicShopType)
+            {
+            musicshoprepository->Get( KOperatorMusicStoreJavaName, operatorMusicStoreJavaName );
+            }
+        else
+            {
+            musicshoprepository->Get( KOperatorMusicStoreNativeUid, operatorMusicStoreUID );
+            GetUint32Presentation( iOperatorNativeMusicStoreUID, operatorMusicStoreUID, 0 );
+
+            musicshoprepository->Get(KOperatorMusicStoreWebPage, iMusicStoreWebPage);
+            iOperatorMusicStoreURI = HBufC16::NewL( KMPXMaxHistoryLength );
+            TPtr16 operatorMusicStoreuri = iOperatorMusicStoreURI->Des();
+            musicshoprepository->Get(KOperatorMusicStoreURI, operatorMusicStoreuri);
+
+            }
+        }
+    delete musicshoprepository;
+    musicshoprepository = NULL;
+    } );
+
+    if(iOperatorMusicStoreType == KJavaMusicShopType)
+        {
+            TApaAppInfo appInfo;
+            RApaLsSession apaSession;
+            User::LeaveIfError( apaSession.Connect() );
+            CleanupClosePushL( apaSession );
+            User::LeaveIfError( apaSession.GetAllApps() );
+
+            while ( apaSession.GetNextApp( appInfo ) == KErrNone )
+                {
+                if(appInfo.iFullName.Right(8).Compare(_L(".fakeapp")) == 0)
+                    {
+                    TApaAppCaption appname;
+                    appname = appInfo.iCaption ;
+                    if (!appInfo.iCaption.Compare(operatorMusicStoreJavaName))
+                        {
+                        iOperatorMusicStoreUID = appInfo.iUid;
+                        }
+                    }
+                }
+            CleanupStack::PopAndDestroy(&apaSession); // close apaSession
+        }
+    //else
+    //    {
+    //    GetUint32Presentation( iMusicStoreUID, operatorMusicStoreUID, 0 );
+    //    }
+    CleanupStack::PopAndDestroy(musicStoreJavaName);
+
+    TInt retval2(KErrNone);
+    // P/S key for usb unblocking
+    retval2 = RProperty::Define( KMPXViewPSUid,
+                                KMPXUSBUnblockingPSStatus,
+                                RProperty::EInt,
+                                KMPlayerRemoteReadPolicy,
+                                KMPlayerRemoteWritePolicy );
+
+    TInt usbStatus;
+    RProperty::Get(KPSUidUsbWatcher, KUsbWatcherSelectedPersonality, usbStatus);
+
+
+    // if object doesn't exist or the usb doesn't connect
+    if(( retval2 != KErrAlreadyExists )
+            || ( usbStatus != KUsbPersonalityIdPCSuite
+                    || usbStatus != KUsbPersonalityIdMS
+                    || usbStatus != KUsbPersonalityIdPTP
+                    || usbStatus != KUsbPersonalityIdMTP
+                    || usbStatus != KUsbPersonalityIdPCSuiteMTP ))
+        {
+        RProperty::Set( KMPXViewPSUid,
+                        KMPXUSBUnblockingPSStatus,
+                        EMPXUSBUnblockingPSStatusUninitialized );
+        }
+    // if usb mode is in MTP mode or pc suite mode
+    else if ( usbStatus == KUsbPersonalityIdMTP
+    		|| usbStatus == KUsbPersonalityIdPCSuiteMTP
+    		|| usbStatus == KUsbPersonalityIdPCSuite )
+    	{
+    	RProperty::Set( KMPXViewPSUid,
+    			KMPXUSBUnblockingPSStatus,
+    			EMPXUSBUnblockingPSStatusActive );
+    	}
+    }
+
+// ---------------------------------------------------------------------------
+// Delete the selected items
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::DeleteSelectedItemsL(TInt aCommand)
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::DeleteSelectedItemsL" );
+
+    // if reorder mode is on, or something is currently deleting, disable delete
+    TBool isIgnore( iContainer->IsInReorderMode() || iIsDeleting );
+
+    CMPXCommonListBoxArrayBase* listboxArray(
+        iContainer->ListBoxArray() );
+    const CMPXMedia& containerMedia( listboxArray->ContainerMedia() );
+    TInt currentIndex( iContainer->CurrentLbxItemIndex() );
+
+    // Marked indicies
+    // cannot use the caches indexes since this can be reached by pressing the cancel key
+    const CArrayFix<TInt>* array (
+        iContainer->CurrentSelectionIndicesL() ); // not owned
+    TInt arrayCount( array->Count() );
+
+    if ( !isIgnore )
+        {
+        if ( iContainer->CurrentListItemCount() == 0 )
+            {
+            // list is empty
+            isIgnore = ETrue;
+            }
+        if ( !isIgnore &&
+            containerMedia.IsSupported( KMPXMediaGeneralNonPermissibleActions ) )
+            {
+            TMPXGeneralNonPermissibleActions attr(
+                containerMedia.ValueTObjectL<TMPXGeneralNonPermissibleActions>(
+                KMPXMediaGeneralNonPermissibleActions ) );
+            if ( attr & EMPXWrite )
+                {
+                isIgnore = ETrue;
+                }
+            }
+        if ( !isIgnore )
+            {
+            const CMPXMedia& media( listboxArray->MediaL( currentIndex ) );
+            if ( ( arrayCount == 0 || arrayCount == 1 ) &&
+                ( media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) == KMPXInvalidItemId ) )
+                {
+                // not marked, or only 1 item is marked
+                // and the highlighted item is not yet available
+                isIgnore = ETrue;
+                }
+            else if ( media.IsSupported( KMPXMediaGeneralNonPermissibleActions ) )
+                {
+                TMPXGeneralNonPermissibleActions attr(
+                    media.ValueTObjectL<TMPXGeneralNonPermissibleActions>(
+                        KMPXMediaGeneralNonPermissibleActions ) );
+                if ( attr & EMPXWrite )
+                    {
+                    isIgnore = ETrue;
+                    }
+                }
+            }
+        }
+
+    if ( !isIgnore )
+        {
+        // Create a copy of collection path
+        CMPXCollectionPath* path( iCollectionUtility->Collection().PathL() );
+        CleanupStack::PushL( path );
+        HBufC* promptTxt( NULL );
+        HBufC* waitNoteText( NULL );
+        TInt waitNoteCBA( R_AVKON_SOFTKEYS_EMPTY );
+        MPX_DEBUG2( "CMPXCollectionViewHgImp::DeleteSelectedItemsL delete array count = %d", arrayCount );
+
+        TMPXGeneralType containerType(
+            containerMedia.ValueTObjectL<TMPXGeneralType>(
+                KMPXMediaGeneralType ) );
+        TMPXGeneralCategory containerCategory(
+            containerMedia.ValueTObjectL<TMPXGeneralCategory>(
+                KMPXMediaGeneralCategory ) );
+
+        if ( arrayCount > 1 )
+            {
+            if ( containerType == EMPXItem && containerCategory == EMPXPlaylist )
+                {
+                // playlist view
+                waitNoteText = StringLoader::LoadLC(
+                    R_MPX_QTN_NMP_NOTE_REMOVING_MANY );
+                promptTxt = StringLoader::LoadLC(
+                    R_MPX_QTN_MUS_QUERY_CONF_REMOVE_MANY,
+                    arrayCount );
+                }
+            else
+                {
+                waitNoteText = StringLoader::LoadLC(
+                    R_MPX_QTN_NMP_DEL_SONGS_WAIT_NOTE );
+                promptTxt = StringLoader::LoadLC(
+                    R_MPX_QTN_NMP_DEL_SONGS_QUERY,
+                    arrayCount );
+                }
+            waitNoteCBA = R_MPX_COLLECTION_WAITNOTE_SOFTKEYS_EMPTY_STOP;
+            iConfirmationDlg = CAknQueryDialog::NewL(
+                CAknQueryDialog::EConfirmationTone );
+            if ( iCoverDisplay )
+                {
+                if ( containerType == EMPXItem && containerCategory == EMPXPlaylist )
+                    {
+                    iConfirmationDlg->PublishDialogL(
+                        EMPlayerQueryRemoveTracks,
+                        KMPlayerNoteCategory);
+                    iWaitNoteId = EMPlayerNoteRemovingMany;
+                    }
+                else
+                    {
+                    iConfirmationDlg->PublishDialogL(
+                        EMPlayerQueryDeleteTracks,
+                        KMPlayerNoteCategory);
+                    iWaitNoteId = EMPlayerNoteDeletingMany;
+                    }
+                CAknMediatorFacade* covercl(
+                    AknMediatorFacade( iConfirmationDlg ) );
+                if ( covercl )
+                    {
+                    covercl->BufStream().WriteInt32L( arrayCount );
+                    }
+                }
+            if(iCollectionReady || aCommand == EMPXCmdCommonDelete )
+                {
+            for ( TInt i = 0; i < arrayCount; i++ )
+                {
+                MPX_DEBUG2( "CMPXCollectionViewHgImp::DeleteSelectedItemsL delete array index = %d", array->At( i ) );
+                path->SelectL( array->At(i) );
+                    }
+                }
+            }
+        else
+            {
+            // not marked, process the highlighted item
+            const CMPXMedia& media( listboxArray->MediaL(
+                ( arrayCount > 0 ) ? array->At( 0 ) : currentIndex ) );
+            const TDesC& title( media.ValueText( KMPXMediaGeneralTitle ) );
+
+            TMPXGeneralType type(
+                media.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType ) );
+            TMPXGeneralCategory category(
+                media.ValueTObjectL<TMPXGeneralCategory>(
+                    KMPXMediaGeneralCategory ) );
+
+            if ( containerType == EMPXItem && containerCategory == EMPXPlaylist )
+                {
+                // playlist view
+                waitNoteText = StringLoader::LoadLC(
+                    R_MPX_QTN_MUS_NOTE_REMOVING_TRACK, title );
+                promptTxt = StringLoader::LoadLC(
+                    R_MPX_QTN_MUS_QUERY_CONF_REMOVE_TRACK,
+                    title );
+                }
+            else if ( containerType == EMPXItem && containerCategory == EMPXArtist
+                && type == EMPXItem && category == EMPXAlbum && currentIndex == 0 )
+                {
+                // deleting first entry in artist/album view
+                const TDesC& containerTitle(
+                    containerMedia.ValueText( KMPXMediaGeneralTitle ) );
+                waitNoteText = StringLoader::LoadLC(
+                    R_MPX_QTN_MUS_QUERY_CONF_DELETE_ALL, containerTitle );
+                waitNoteCBA = R_MPX_COLLECTION_WAITNOTE_SOFTKEYS_EMPTY_STOP;
+                promptTxt = StringLoader::LoadLC(
+                    R_MPX_QTN_NMP_QUERY_CONF_DELETE_GROUP,
+                    containerTitle );
+                }
+            else
+                {
+                if ( ( type == EMPXItem && category == EMPXSong ) ||
+                    ( type == EMPXItem && category == EMPXPlaylist ) )
+                    {
+                    // tracks level, or deleting a playlist
+                    waitNoteText = StringLoader::LoadLC(
+                        R_MPX_QTN_ALBUM_WAITING_DELETING, title );
+                    promptTxt = StringLoader::LoadLC(
+                        R_MPX_QTN_QUERY_COMMON_CONF_DELETE,
+                        title );
+                    }
+                else
+                    {
+                    // deleting a group
+                    if ( ( currentIndex == ( iContainer->CurrentListItemCount() - 1 ) ) &&
+                        title.Compare( KNullDesC ) == 0 )
+                        {
+                        // check for unknown entry
+                        // if it's the last entry, and it's null text
+                        // load "unknown" text to display in prompt
+                        HBufC* unknownText( StringLoader::LoadLC( R_MPX_QTN_MP_UNKNOWN ) );
+                        waitNoteText = StringLoader::LoadLC(
+                            R_MPX_QTN_MUS_QUERY_CONF_DELETE_ALL, *unknownText );
+                        promptTxt = StringLoader::LoadL(
+                            R_MPX_QTN_NMP_QUERY_CONF_DELETE_GROUP, *unknownText );
+                        CleanupStack::Pop( waitNoteText );
+                        CleanupStack::PopAndDestroy( unknownText );
+                        CleanupStack::PushL( waitNoteText );
+                        CleanupStack::PushL( promptTxt );
+                        }
+                    else
+                        {
+                        waitNoteText = StringLoader::LoadLC(
+                            R_MPX_QTN_MUS_QUERY_CONF_DELETE_ALL, title );
+                        promptTxt = StringLoader::LoadLC(
+                            R_MPX_QTN_NMP_QUERY_CONF_DELETE_GROUP, title );
+                        }
+                    waitNoteCBA = R_MPX_COLLECTION_WAITNOTE_SOFTKEYS_EMPTY_STOP;
+                    }
+                }
+            iConfirmationDlg = CAknQueryDialog::NewL(
+                CAknQueryDialog::EConfirmationTone );
+            if ( iCoverDisplay )
+                {
+                if ( containerType == EMPXItem && containerCategory == EMPXPlaylist )
+                    {
+                    iConfirmationDlg->PublishDialogL(
+                        EMPlayerQueryRemoveTrack,
+                        KMPlayerNoteCategory);
+                    iWaitNoteId = EMPlayerNoteRemovingTrack;
+                    }
+                else if ( containerType == EMPXItem && containerCategory == EMPXArtist
+                    && type == EMPXItem && category == EMPXAlbum && currentIndex == 0 )
+                    {
+                    iConfirmationDlg->PublishDialogL(
+                        EMPlayerQueryDeleteCategory,
+                        KMPlayerNoteCategory);
+                    iWaitNoteId = EMPlayerNoteDeletingSingle;
+                    }
+                else
+                    {
+                    if ( ( type == EMPXItem && category == EMPXSong ) ||
+                        ( type == EMPXItem && category == EMPXPlaylist ) )
+                        {
+                        // tracks level
+                        iConfirmationDlg->PublishDialogL(
+                            EMPlayerQueryDeleteCategory,
+                            KMPlayerNoteCategory);
+                        iWaitNoteId = EMPlayerNoteDeletingSingle;
+                        }
+                    else
+                        {
+                        iConfirmationDlg->PublishDialogL(
+                            EMPlayerQueryDeleteTrack,
+                            KMPlayerNoteCategory);
+                        iWaitNoteId = EMPlayerNoteDeletingSingle;
+                        }
+                    }
+                CAknMediatorFacade* covercl(
+                    AknMediatorFacade( iConfirmationDlg ) );
+                if ( covercl )
+                    {
+                    covercl->BufStream() << title;
+                    }
+                iItemTitle.Set( title );
+                }
+//#endif //__COVER_DISPLAY
+// Cover UI end
+            if(iCollectionReady || aCommand == EMPXCmdCommonDelete )
+                {
+            path->SelectL( arrayCount > 0 ? array->At( 0 ) : currentIndex );
+                }
+            }
+        iConfirmationDlg->SetPromptL( *promptTxt );
+        CleanupStack::PopAndDestroy( promptTxt );
+        TBool performDelete(EFalse);
+        if(iCachedCommand == aCommand)
+            {
+            performDelete = ETrue;
+            }
+        if (!performDelete)
+            {
+        if ( iConfirmationDlg->ExecuteLD( R_MPX_CUI_DELETE_CONFIRMATION_QUERY ) )
+                {
+                performDelete = ETrue;
+                }
+            }
+        if (performDelete)
+            {
+            HandleCommandL( EMPXCmdIgnoreExternalCommand );
+// Cover UI start
+//#ifdef __COVER_DISPLAY
+        if ( iCoverDisplay )
+            {
+            InitiateWaitDialogL();
+            }
+//#endif // __COVER_DISPLAY
+// Cover UI end
+            MPX_PERF_START_EX( MPX_PERF_SHOW_WAITNOTE );
+            if(iCachedCommand != aCommand)
+                {
+                iIsWaitNoteCanceled = EFalse;
+                StartProgressNoteL();
+				TPtr buf = waitNoteText->Des();
+				UpdateProcessL(0, buf);
+                }
+
+                if ( !iIsWaitNoteCanceled )
+                    {
+                    iIsDeleting = ETrue;
+                    iCollectionUiHelper->DeleteL( *path, this );
+                    }
+                else if( iContainer )
+                    {
+                    // delete was canceled before it even began, clear marked items
+                    iContainer->ClearLbxSelection();
+                    }
+                iIsWaitNoteCanceled = EFalse;
+
+
+            if(iContainer->FindBoxVisibility())
+                {
+                iContainer->EnableFindBox(EFalse);
+                }
+            }
+        iConfirmationDlg = NULL;
+        CleanupStack::PopAndDestroy( waitNoteText );
+        CleanupStack::PopAndDestroy( path );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Initiates wait dialog
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::InitiateWaitDialogL()
+    {
+    if ( iCommandInitiator )
+        {
+        HBufC8* filename8 = HBufC8::NewLC( KMaxFileName );
+        filename8->Des().Copy( iItemTitle );
+        HBufC8* data = HBufC8::NewLC(KMaxFileName);
+
+        TPtr8 dataPtr = data->Des();
+        RDesWriteStream str(dataPtr);
+
+        TPtrC8 b(KNullDesC8);
+        b.Set(*filename8);
+
+        str << b;
+        str.CommitL();
+
+        iCommandInitiator->IssueCommand( KMediatorSecondaryDisplayDomain,
+                                    KMPlayerNoteCategory,
+                                    iWaitNoteId,
+                                    TVersion ( 0,0,0 ),
+                                    *data );
+
+        CleanupStack::PopAndDestroy( data );
+        CleanupStack::PopAndDestroy( filename8 );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Updates list box
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::UpdateListBoxL(
+    const CMPXMedia& aEntries,
+    TInt aIndex,
+    TBool aComplete)
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::UpdateListBox" );
+    MPX_DEBUG2( "CMPXCollectionViewHgImp::UpdateListBox aIndex = %d", aIndex );
+    if ( iContainer )
+        {
+        CMPXCollectionPath* cpath( iCollectionUtility->Collection().PathL() );
+        MPX_DEBUG_PATH(*cpath);
+
+        CleanupStack::PushL( cpath );
+
+        TInt topIndex = 0;
+        if (iContainer->IsInReorderMode())
+            {
+            TInt currentItem( iContainer->CurrentLbxItemIndex() );
+            TInt currentBottomIndex( iContainer->BottomLbxItemIndex() );
+            topIndex = iContainer->CalculateTopIndex( currentBottomIndex ) ;
+            }
+
+        CMPXCommonListBoxArrayBase* array( iContainer->ListBoxArray() );
+        array->ResetMediaArrayL();
+        array->AppendMediaL( aEntries );
+        iCollectionCacheReady = ETrue;
+        //keep the marked item indicies
+        const CArrayFix<TInt>* markedList = iContainer->CurrentSelectionIndicesL();
+		if ( iFirstIncrementalBatch )
+            {
+            iContainer->HandleLbxItemAdditionL();
+            iFirstIncrementalBatch = EFalse;
+            }
+		else
+			{
+			iContainer->HandleListBoxArrayEventL(
+			MMPXCommonListBoxArrayObserver::EMPXCommonListBoxArrayEventMediaArrayChange );
+			}
+
+        if (aComplete)
+            {
+            iFirstIncrementalBatch = ETrue;
+            }
+        //mark all again after list box item addition
+        if (iMarkedAll)
+            {
+            iContainer->HandleMarkableListProcessCommandL(EAknMarkAll);
+            if (aComplete)
+                {
+                iMarkedAll = EFalse;
+                }
+            }
+		   //mark again individual items after list box item addition
+        else if ( markedList )
+            {
+		       TInt markedItemCount( markedList->Count() );
+		       if ( markedItemCount >0 )
+                {
+                iContainer->SetCurrentSelectionIndicesL( const_cast<CArrayFix<TInt>*>(markedList) );
+                }
+            }
+        UpdatePlaybackStatusL();
+
+        if ( iBackOneLevel || iPossibleJump )
+            {
+            if ( cpath->Levels() == iLastDepth )
+                {
+                iLastDepth--;
+                iContainer->SetLbxTopItemIndex(
+                    iContainer->CalculateTopIndex(
+                    iBottomIndex->At( iLastDepth ) ) );
+                iContainer->SetLbxCurrentItemIndexAndDraw( aIndex );
+                iBottomIndex->Delete( iLastDepth );
+                }
+            else
+                {
+                MPX_DEBUG1( "CMPXCollectionViewHgImp::UpdateListBox Invalid history, rebuilding" );
+                // invalid path, rebuild with all 0. possibily caused by a jump in views
+                iBottomIndex->Reset();
+                iLastDepth = cpath->Levels();
+                for ( TInt i = 0; i < iLastDepth; i++ )
+                    {
+                    iBottomIndex->AppendL( 0 );
+                    }
+                iContainer->SetLbxCurrentItemIndexAndDraw( aIndex );
+                }
+            iPossibleJump = EFalse;
+            iBackOneLevel = EFalse;
+            }
+        else
+            {
+            if ( iAddingSong )
+                {
+                // always highlight the last item when a track
+                // is added in add tracks view
+                TInt currentItemCount =
+                    iContainer->CurrentListItemCount();
+                if ( currentItemCount > 0 )
+                    {
+                    iContainer->
+                        SetLbxCurrentItemIndexAndDraw( currentItemCount - 1 );
+                    }
+                }
+            else if ( iCurrentHighlightedIndex > KErrNotFound &&
+                ( iCurrentHighlightedIndex <
+                iContainer->CurrentListItemCount() ) )
+                {
+                if (iContainer->IsInReorderMode())
+                    {
+                    iContainer->SetLbxTopItemIndex( topIndex );
+                    }
+                iContainer->
+                    SetLbxCurrentItemIndexAndDraw( iCurrentHighlightedIndex );
+                iCollectionUtility->Collection().CommandL(
+                    EMcCmdSelect, iCurrentHighlightedIndex );
+                iCurrentHighlightedIndex = KErrNotFound;
+                }
+            else if ( ( aIndex > 0 )
+                && ( aIndex < iContainer->CurrentListItemCount() ) )
+                {
+                iContainer->SetLbxCurrentItemIndexAndDraw( aIndex );
+                }
+            else
+                {
+                iContainer->SetLbxCurrentItemIndexAndDraw( 0 );
+                }
+            }
+        if (!aComplete || cpath->Levels() == KMusicCollectionMenuLevel || iContainer->IsInReorderMode())
+            {
+            iContainer->EnableFindBox(EFalse);
+            }
+        else
+            {
+            iContainer->EnableFindBox(ETrue);
+            }
+
+        CleanupStack::PopAndDestroy( cpath );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Displays error notes.
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandleError( TInt aError )
+    {
+    MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleError(%d)", aError );
+    ASSERT( aError );
+
+    // only display error message if collection view is in the foreground
+    if ( iContainer )
+        {
+        TRAP_IGNORE( iCommonUiHelper->HandleErrorL( aError ) );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Updates the navi pane
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::UpdateNaviPaneL()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::UpdateNaviPaneL" );
+    if ( iContainer &&
+        (iViewUtility->ActiveViewType() !=
+                       TUid::Uid( KMPXPluginTypeAddSongsEditorUid )) &&
+        (iViewUtility->ActiveViewType() !=
+                      TUid::Uid( KMPXPluginTypeAlbumArtEditorUid )) &&
+        (iViewUtility->ActiveViewType() !=
+                      TUid::Uid( KMPXPluginTypeMetadataEditorUid ))
+       )
+        {
+        MPX_DEBUG2("CMPXCollectionViewHgImp::UpdateNaviPaneL updating %d", iDuration);
+        if ( iDuration )
+            {
+            iNaviLabel->SetTextL( *iDuration );
+            iNaviPane->PushL( *iNaviDecorator );
+            }
+        else
+            {
+            iNaviPane->Pop( iNaviDecorator );
+            }
+        iNaviPane->DrawNow();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Updates the title pane
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::UpdateTitlePaneL()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::UpdateTitlePaneL" );
+    // Set title
+
+    if ( iViewUtility->ActiveViewType() ==
+        TUid::Uid( KMPXPluginTypeCollectionUid ) ||
+        ( iViewUtility->ActiveViewType() ==
+         TUid::Uid( KMPXPluginTypeWaitNoteDialogUid ) && iContainer ) )
+        {
+        CAknTitlePane* title( NULL );
+
+        TRAP_IGNORE(
+            {
+            title = static_cast<CAknTitlePane*>
+                ( StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
+            } );
+
+        if ( title )
+            {
+            if ( iTitle )
+                {
+                title->SetTextL( *iTitle );
+                }
+            else if ( !iIsEmbedded )
+                {
+                // use default title if no metadata is available
+                // and is not in embedded view
+                HBufC* titleText = StringLoader::LoadLC(
+                    R_MPX_COLLECTION_VIEW_TITLE );
+                title->SetTextL( *titleText );
+                CleanupStack::PopAndDestroy( titleText );
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Updates playback status indicator
+// ---------------------------------------------------------------------------
+//
+TInt CMPXCollectionViewHgImp::UpdatePlaybackStatusL()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::UpdatePlaybackStatusL" );
+    TInt ret( KErrNotFound );  // default selection
+    if ( iContainer )
+        {
+        TMPXPlaybackState pbState( EPbStateNotInitialised );
+        TInt selectedIndex( KErrNotFound );
+        TMPXItemId selectedItemId( KMPXInvalidItemId );
+        CMPXCollectionPath* cpath( iCollectionUtility->Collection().PathL() );
+        CleanupStack::PushL( cpath );
+
+        MMPXSource* source( iPlaybackUtility->Source() );
+        if ( source )
+            {
+            CMPXCollectionPlaylist* playlist( source->PlaylistL() );
+            if ( playlist )
+                {
+                CleanupStack::PushL( playlist );
+                CMPXCollectionPath* pbPath(
+                    CMPXCollectionPath::NewL( playlist->Path() ) );
+                CleanupStack::PushL( pbPath );
+                TInt playbackPathCount( pbPath->Levels() );
+                if ( cpath->Levels() == playbackPathCount )
+                    {
+                    // not comparing the index
+                    TBool isEqual( ETrue );
+                    for ( TInt i = 0; i < playbackPathCount - 1; i++ )
+                        {
+                        if ( cpath->Id( i ) != pbPath->Id( i ) )
+                            {
+                            isEqual = EFalse;
+                            break;
+                            }
+                        }
+                    if ( isEqual )
+                        {
+                        selectedIndex = pbPath->Index();
+                        selectedItemId = pbPath->Id();
+                        ret = selectedIndex;
+                        pbState = iPlaybackUtility->StateL();
+                        }
+                    }
+                CleanupStack::PopAndDestroy( pbPath );
+                CleanupStack::PopAndDestroy( playlist );
+                }
+            }
+        CleanupStack::PopAndDestroy( cpath );
+        if ( selectedIndex != KErrNotFound )
+            {
+            if ( iContainer->IsInReorderMode() )
+                {
+                // in reorder mode, need to pass unique ID to list box
+                // to search for now playing song
+                iContainer->SetPlaybackStatusByIdL( selectedItemId, pbState );
+                }
+            else
+                {
+                // Fixed for EBLI-7AG8ZN, the Playlist in the Engine is updated
+                // later than UI (because of Inc Open), so index does not work
+                iContainer->SetPlaybackStatusByIdL( selectedItemId, pbState, selectedIndex );
+                }
+            }
+        }
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// Start a refreshing note
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::StartWaitNoteL( TWaitNoteType aNoteType )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::StartWaitNoteL" );
+    TUid waitnoteId = TUid::Uid( KMPXPluginTypeWaitNoteDialogUid );
+    TUid activeView = iViewUtility->ActiveViewType();
+    if( !iIsEmbedded && activeView != waitnoteId )
+        {
+        TPckg<TWaitNoteType> note = aNoteType;
+        HBufC* arg = MPXUser::AllocL( note );
+        CleanupStack::PushL( arg );
+        RProcess proc;
+        iPriority = proc.Priority();
+        proc.SetPriority( EPriorityHigh );
+        iNoteType = aNoteType;
+        iViewUtility->ActivateViewL( waitnoteId, arg );
+        CleanupStack::PopAndDestroy( arg );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Start a Progress note
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::StartProgressNoteL()
+    {
+    iProgressDialog = new (ELeave) CAknProgressDialog(
+        (REINTERPRET_CAST(CEikDialog**, &iProgressDialog)),
+        ETrue);
+    iProgressDialog->PrepareLC(R_MPX_PROGRESS_NOTE);
+    iProgressInfo = iProgressDialog->GetProgressInfoL();
+    iProgressDialog->SetCallback(this);
+    iProgressDialog->RunLD();
+    iProgressInfo->SetFinalValue(KProgressBarMaxValue);
+    }
+
+// ---------------------------------------------------------------------------
+// Update the Progress note
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::UpdateProcessL( TInt aProgress, const TDesC& aProgressText )
+    {
+    if ( iProgressDialog )
+        {
+        iProgressDialog->SetTextL(aProgressText);
+        iProgressInfo->SetAndDraw(aProgress);
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Close waitnote dialog
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::CloseWaitNoteL()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::CloseWaitNoteL" );
+    if( !iUSBOnGoing && !iIsEmbedded)
+        {
+        RProcess proc;
+        proc.SetPriority( iPriority );
+        // Fix for ESLU-7CFEPF, try to close the WaitNote even if it's not the current view
+        TRAP_IGNORE(
+            CMPXViewPlugin* pi =
+                iViewUtility->ViewPluginManager().PluginL( TUid::Uid(KWaitNoteImpUid) );
+            pi->DeactivateView();
+            );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// Change the navi pane
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::UpdateReorderNaviPaneL()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::UpdateReorderNaviPaneL" );
+    delete iDuration;
+    iDuration = NULL;
+
+    // Set playlist counter text to pos/size by default
+    CArrayFixFlat<TInt>* params =
+        new ( ELeave ) CArrayFixFlat<TInt>( KMPXReorderNaviPaneGranularity );
+    CleanupStack::PushL( params );
+    // Position of selection in index
+    params->AppendL( iContainer->CurrentLbxItemIndex() + 1 );
+    // Total Number of items in lbx
+    params->AppendL( iContainer->TotalListItemCount() );
+    iDuration = StringLoader::LoadL(
+        R_MPX_CUI_POSITION_COUNTER_TXT, *params );
+    CleanupStack::PopAndDestroy( params );
+    UpdateNaviPaneL();
+    }
+
+// ---------------------------------------------------------------------------
+// Activates reorder mode
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::ActivateReorderGrabbedModeL()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::ActivateReorderGrabbedModeL" );
+    iIsGrabbed = ETrue;
+    TInt currentItem( iContainer->CurrentLbxItemIndex() );
+    iContainer->EnableFindBox( EFalse );
+    iContainer->SetReorderGrabbedMode( ETrue, currentItem );
+    if ( !iContainer->IsInReorderMode() )
+        {
+        iContainer->UpdateReorderTitleIconL();
+
+        if ( iTitle )
+            {
+            delete iOriginalTitle;
+            iOriginalTitle = NULL;
+            iOriginalTitle = iTitle->AllocL();
+            delete iTitle;
+            iTitle = NULL;
+            }
+        iTitle = StringLoader::LoadL( R_QTN_NMP_TITLE_REORDER_LIST );
+        UpdateTitlePaneL();
+
+        if ( iDuration )
+            {
+            delete iOriginalDuration;
+            iOriginalDuration = NULL;
+            iOriginalDuration = iDuration->AllocL();
+            delete iDuration;
+            iDuration = NULL;
+            }
+        iContainer->ActivateReorderMode( ETrue );
+        SetNewCbaL( R_MPX_CUI_REORDER_DROP_CANCEL_CBA );
+        }
+    iContainer->SetLbxCurrentItemIndexAndDraw( currentItem );
+    UpdateReorderNaviPaneL();
+    }
+
+// ---------------------------------------------------------------------------
+// Deactivates reorder mode
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::DeactivateReorderGrabbedModeL( TBool aExit )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::DeactivateReorderGrabbedModeL" );
+    iIsGrabbed = EFalse;
+    delete iCurrentCba;
+    iCurrentCba = NULL;
+
+    iContainer->SetReorderGrabbedMode( EFalse );
+    if ( aExit )
+        {
+        CEikButtonGroupContainer* cba = Cba();
+        if ( cba )
+            {
+            cba->SetCommandSetL( R_AVKON_SOFTKEYS_OPTIONS_BACK );
+            cba->DrawDeferred();
+
+#ifdef __ENABLE_MSK
+            // set middle softkey label display
+            UpdateMiddleSoftKeyDisplayL( R_QTN_MSK_PLAY );
+#endif // __ENABLE_MSK
+
+            }
+
+        iContainer->RestoreOriginalTitleIconL();
+        delete iTitle;
+        iTitle = NULL;
+        if ( iOriginalTitle )
+            {
+            iTitle = iOriginalTitle->AllocL();
+            delete iOriginalTitle;
+            iOriginalTitle = NULL;
+            }
+        UpdateTitlePaneL();
+
+        delete iDuration;
+        iDuration = NULL;
+        if ( iOriginalDuration )
+            {
+            iDuration = iOriginalDuration->AllocL();
+            delete iOriginalDuration;
+            iOriginalDuration = NULL;
+            }
+        if ( iViewUtility->ActiveViewType() == TUid::Uid( KMPXPluginTypeCollectionUid ) )
+            {
+            UpdateNaviPaneL();
+            }
+        iContainer->ActivateReorderMode( EFalse );
+        iContainer->EnableFindBox( ETrue );
+        }
+    iContainer->HandleLbxItemAdditionPreserveIndexL();
+    }
+
+// -----------------------------------------------------------------------------
+// Change the button group
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::SetNewCbaL( TInt aResId )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::SetNewCbaL" );
+    if ( !iCurrentCba )
+        {
+        iCurrentCba = CEikButtonGroupContainer::NewL(
+            CEikButtonGroupContainer::ECba,
+            CEikButtonGroupContainer::EHorizontal,
+            this,
+            aResId, *iContainer );
+        }
+    else
+        {
+        iCurrentCba->SetCommandSetL( aResId );
+        iCurrentCba->DrawDeferred();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Display the details dialog
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::DisplayDetailsDialogL( MDesC16Array& aDataArray,
+    TInt aDialogResourceId, TInt aTitleResourceId )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::DisplayDetailsDialogL" );
+    CAknSingleHeadingPopupMenuStyleListBox* list =
+        new ( ELeave ) CAknSingleHeadingPopupMenuStyleListBox;
+    CleanupStack::PushL( list );
+    CAknPopupList* popupList = CAknPopupList::NewL(
+        list, R_AVKON_SOFTKEYS_OK_EMPTY,
+        AknPopupLayouts::EMenuGraphicHeadingWindow);
+    CleanupStack::PushL( popupList );
+    list->ConstructL( popupList, CEikListBox::ELeftDownInViewRect );
+    list->CreateScrollBarFrameL( ETrue );
+    list->ScrollBarFrame()->SetScrollBarVisibilityL(
+        CEikScrollBarFrame::EOff,
+        CEikScrollBarFrame::EAuto);
+
+    // Enable Marquee
+    static_cast<CEikFormattedCellListBox*>( list )->ItemDrawer()->ColumnData()->
+        EnableMarqueeL( ETrue );
+
+    // Retrieve heading array
+    CDesCArrayFlat* headingsArray(
+        iCoeEnv->ReadDesCArrayResourceL( aDialogResourceId ) );
+    CleanupStack::PushL( headingsArray );
+
+    // Item array combines heading array and data array
+    CDesCArrayFlat* itemArray =
+        new ( ELeave ) CDesCArrayFlat( headingsArray->Count() );
+    CleanupStack::PushL( itemArray );
+
+    TInt count = headingsArray->Count();
+    for ( TInt i = 0; i < count; i++ )
+        {
+        HBufC* item = HBufC::NewLC(
+            headingsArray->MdcaPoint( i ).Length() +
+            aDataArray.MdcaPoint( i ).Length() +
+            KMPXDurationDisplayResvLen );
+
+        TPtrC tempPtr1 = headingsArray->MdcaPoint( i );
+        TPtrC tempPtr2 = aDataArray.MdcaPoint( i );
+
+        item->Des().Format( KMPXCollDetailsItemsFormat,
+                            &tempPtr1,
+                            &tempPtr2 );
+
+        itemArray->AppendL( *item );
+        CleanupStack::PopAndDestroy( item );
+        }
+
+    CleanupStack::Pop( itemArray );
+    CleanupStack::PopAndDestroy( headingsArray );
+
+    // Set list items
+    CTextListBoxModel* model = list->Model();
+    model->SetOwnershipType( ELbmOwnsItemArray );
+    model->SetItemTextArray( itemArray );
+
+    // Set title
+    HBufC* title = StringLoader::LoadLC( aTitleResourceId );
+    popupList->SetTitleL( *title );
+    CleanupStack::PopAndDestroy( title );
+
+    // Show popup list
+    CleanupStack::Pop( popupList );
+    popupList->ExecuteLD();
+    CleanupStack::PopAndDestroy( list );
+    }
+
+// -----------------------------------------------------------------------------
+// Display collection details
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::DoShowCollectionDetailsL( const CMPXMedia& aMedia )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::ShowCollectionDetailsL" );
+    CDesCArrayFlat* dataArray =
+        new ( ELeave ) CDesCArrayFlat( EMPXCollectionDetailsCount );
+    CleanupStack::PushL( dataArray );
+
+    // number of items
+    HBufC* dataToAppend = HBufC::NewLC( KMPXMaxBufferLength );
+    TInt songsCount( 0 );
+    if ( aMedia.IsSupported( KMPXMediaColDetailNumberOfItems ) )
+        {
+        songsCount = aMedia.ValueTObjectL<TInt>( KMPXMediaColDetailNumberOfItems );
+        }
+    TPtr ptr( dataToAppend->Des() );
+    ptr.AppendNum( songsCount );
+    AknTextUtils::LanguageSpecificNumberConversion( ptr );
+    dataArray->AppendL( ptr );
+    CleanupStack::PopAndDestroy( dataToAppend );
+
+    // total duration
+    TInt duration( 0 );
+    if ( aMedia.IsSupported( KMPXMediaColDetailDuration ) )
+        {
+        duration = aMedia.ValueTObjectL<TInt>( KMPXMediaColDetailDuration );
+        }
+    if ( duration > 0 )
+        {
+        dataToAppend = iCommonUiHelper->DisplayableDurationInTextL( duration/KMilliSecondsToSeconds );
+        CleanupStack::PushL( dataToAppend );
+        ptr.Set( dataToAppend->Des() );
+        AknTextUtils::LanguageSpecificNumberConversion( ptr );
+        dataArray->AppendL( ptr );
+        CleanupStack::PopAndDestroy( dataToAppend );
+        }
+    else
+        {
+        dataArray->AppendL( KNullDesC );
+        }
+
+#ifdef RD_MULTIPLE_DRIVE
+    RFs& fileSession( iCoeEnv->FsSession() );
+    TDriveList driveList;
+    TInt driveCount(0);
+    TInt64 freePhoneMemory(KErrNotFound);
+    TInt64 freeInternalMemory(KErrNotFound);
+    TInt64 freeExternalMemory(KErrNotFound);
+    TVolumeInfo volInfo;
+
+    // Get all visible drives
+    User::LeaveIfError( DriveInfo::GetUserVisibleDrives(
+           fileSession, driveList, driveCount ) );
+    MPX_DEBUG2 ("CMPXCollectionViewHgImp::ShowCollectionDetailsL - driveCount = %d", driveCount);
+
+    for( TInt driveNum = EDriveA; driveNum <= EDriveZ; driveNum++ )
+        {
+        if (driveList[driveNum])
+            {
+            // Get the volume information
+            if ( fileSession.Volume( volInfo, driveNum ) == KErrNone )
+                {
+                // Get the drive status
+                TUint driveStatus(0);
+                DriveInfo::GetDriveStatus( fileSession, driveNum, driveStatus );
+
+                // Add up free memory depending on memory location
+                if ( driveNum == EDriveC )
+                    {
+                    if ( freePhoneMemory == KErrNotFound )
+                        {
+                        freePhoneMemory = 0;
+                        }
+                    freePhoneMemory += volInfo.iFree;
+                    }
+                else if ( driveStatus & DriveInfo::EDriveInternal )
+                    {
+                    if ( freeInternalMemory == KErrNotFound )
+                        {
+                        freeInternalMemory = 0;
+                        }
+                    freeInternalMemory += volInfo.iFree;
+                    }
+                else if ( driveStatus &
+                    (DriveInfo::EDriveRemovable | DriveInfo::EDriveRemote) )
+                    {
+                    if ( freeExternalMemory == KErrNotFound )
+                        {
+                        freeExternalMemory = 0;
+                        }
+                    freeExternalMemory += volInfo.iFree;
+                    }
+                }
+            }
+        }
+
+    // phone memory free
+    if ( freePhoneMemory != KErrNotFound )
+        {
+        dataToAppend = iCommonUiHelper->UnitConversionL(
+            freePhoneMemory, ETrue );
+        ptr.Set(dataToAppend->Des());
+        AknTextUtils::LanguageSpecificNumberConversion( ptr);
+        }
+    else
+        {
+        dataToAppend = StringLoader::LoadL(
+            R_MPX_CUI_COLLECTION_DETAILS_MEMORY_UNAVAILABLE );
+        ptr.Set(dataToAppend->Des());
+        }
+
+    CleanupStack::PushL( dataToAppend );
+    dataArray->AppendL( ptr );
+    CleanupStack::PopAndDestroy( dataToAppend );
+
+    // internal memory (mass storage) free
+    if ( freeInternalMemory != KErrNotFound )
+        {
+        dataToAppend = iCommonUiHelper->UnitConversionL(
+            freeInternalMemory, ETrue );
+        ptr.Set(dataToAppend->Des());
+        AknTextUtils::LanguageSpecificNumberConversion( ptr);
+        }
+    else
+        {
+        dataToAppend = StringLoader::LoadL(
+            R_MPX_CUI_COLLECTION_DETAILS_MEMORY_UNAVAILABLE );
+        ptr.Set(dataToAppend->Des());
+        }
+
+    CleanupStack::PushL( dataToAppend );
+    dataArray->AppendL( ptr );
+    CleanupStack::PopAndDestroy( dataToAppend );
+
+    // removable/remote (memory card) memory free
+    if ( freeExternalMemory != KErrNotFound )
+        {
+        dataToAppend = iCommonUiHelper->UnitConversionL(
+            freeExternalMemory, ETrue );
+        ptr.Set(dataToAppend->Des());
+        AknTextUtils::LanguageSpecificNumberConversion( ptr);
+        }
+    else
+        {
+        dataToAppend = StringLoader::LoadL(
+            R_MPX_CUI_COLLECTION_DETAILS_CARD_UNAVAILABLE_ITEM );
+        ptr.Set(dataToAppend->Des());
+        }
+    CleanupStack::PushL( dataToAppend );
+    dataArray->AppendL( ptr );
+    CleanupStack::PopAndDestroy( dataToAppend );
+#else
+    // phone memory free
+    HBufC* driveLetter = StringLoader::LoadLC( R_MPX_COLLECTION_PHONE_MEMORY_ROOT_PATH );
+    RFs& fileSession( iCoeEnv->FsSession() );
+    TVolumeInfo volInfo;
+    TDriveUnit driveUnit( *driveLetter ); // Get the drive
+    CleanupStack::PopAndDestroy( driveLetter );
+    if ( KErrNone == fileSession.Volume( volInfo, ( TInt )driveUnit ) )
+        {
+        dataToAppend = iCommonUiHelper->UnitConversionL( volInfo.iFree, ETrue );
+        ptr.Set(dataToAppend->Des());
+        AknTextUtils::LanguageSpecificNumberConversion( ptr);
+        }
+    else
+        {
+        dataToAppend = StringLoader::LoadL(
+            R_MPX_CUI_COLLECTION_DETAILS_CARD_UNAVAILABLE_ITEM );
+        ptr.Set(dataToAppend->Des());
+        }
+    CleanupStack::PushL( dataToAppend );
+    dataArray->AppendL( ptr );
+    CleanupStack::PopAndDestroy( dataToAppend );
+
+    // memory card
+    driveLetter = StringLoader::LoadLC( R_MPX_COLLECTION_MEMORY_CARD_ROOT_PATH );
+    driveUnit = *driveLetter; // Get the drive
+    CleanupStack::PopAndDestroy( driveLetter );
+    if ( fileSession.Volume( volInfo, ( TInt )driveUnit ) == KErrNone )
+        {
+        dataToAppend = iCommonUiHelper->UnitConversionL( volInfo.iFree, ETrue );
+        ptr.Set(dataToAppend->Des());
+        AknTextUtils::LanguageSpecificNumberConversion( ptr);
+        }
+    else
+        {
+        dataToAppend = StringLoader::LoadL(
+            R_MPX_CUI_COLLECTION_DETAILS_CARD_UNAVAILABLE_ITEM );
+        ptr.Set(dataToAppend->Des());
+        }
+    CleanupStack::PushL( dataToAppend );
+    dataArray->AppendL( ptr );
+    CleanupStack::PopAndDestroy( dataToAppend );
+#endif // RD_MULTIPLE_DRIVE
+
+    // last refreshed
+    TInt64 lastRefreshed( 0 );
+    if ( aMedia.IsSupported( KMPXMediaColDetailLastRefreshed ) )
+        {
+        lastRefreshed = aMedia.ValueTObjectL<TInt64>( KMPXMediaColDetailLastRefreshed );
+        }
+    TTime time( lastRefreshed );
+    dataToAppend = HBufC::NewLC(
+        KMPXMaxTimeLength + KMPXDurationDisplayResvLen );
+    HBufC* format( StringLoader::LoadLC( R_QTN_DATE_USUAL_WITH_ZERO ) );
+    TPtr modDatePtr( dataToAppend->Des() );
+    time.FormatL( modDatePtr, *format );
+    CleanupStack::PopAndDestroy( format );
+    AknTextUtils::LanguageSpecificNumberConversion( modDatePtr );
+    dataArray->AppendL( modDatePtr );
+    CleanupStack::PopAndDestroy( dataToAppend );
+
+    DisplayDetailsDialogL( *dataArray,
+        R_MPX_CUI_COLLECTION_DETAILS_HEADINGS,
+        R_MPX_QTN_NMP_TITLE_COLLECTION_DETAILS );
+    CleanupStack::PopAndDestroy( dataArray );
+    }
+
+// -----------------------------------------------------------------------------
+// Display playlist details
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::DoShowPlaylistDetailsL( const CMPXMedia& aMedia )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::ShowPlaylistDetailsL" );
+    CDesCArrayFlat* dataArray =
+        new ( ELeave ) CDesCArrayFlat( EMPXPlaylistDetailsCount );
+    CleanupStack::PushL( dataArray );
+
+    // playlist name
+    if ( aMedia.IsSupported( KMPXMediaGeneralTitle ) )
+        {
+        dataArray->AppendL( aMedia.ValueText( KMPXMediaGeneralTitle ) );
+        }
+    else if ( aMedia.IsSupported( KMPXMediaGeneralUri ) )
+        {
+        TParsePtrC fileDetail( aMedia.ValueText( KMPXMediaGeneralUri ) );
+        dataArray->AppendL( fileDetail.Name() );
+        }
+    else
+        {
+        dataArray->AppendL( KNullDesC );
+        }
+
+    // number of songs
+    TInt songsCount( 0 );
+    if ( aMedia.IsSupported( KMPXMediaGeneralCount ) )
+        {
+        songsCount = aMedia.ValueTObjectL<TInt>( KMPXMediaGeneralCount );
+        }
+    HBufC* dataToAppend = HBufC::NewLC( KMPXMaxBufferLength );
+    TPtr ptr( dataToAppend->Des() );
+    ptr.AppendNum( songsCount );
+    AknTextUtils::LanguageSpecificNumberConversion( ptr );
+    dataArray->AppendL( ptr );
+    CleanupStack::PopAndDestroy( dataToAppend );
+
+    // Duration
+    TInt duration( 0 );
+    if ( aMedia.IsSupported( KMPXMediaGeneralDuration ) )
+        {
+        duration = aMedia.ValueTObjectL<TInt>( KMPXMediaGeneralDuration );
+        }
+    if ( duration > 0 )
+        {
+        dataToAppend = iCommonUiHelper->DisplayableDurationInTextL( duration/KMilliSecondsToSeconds );
+        CleanupStack::PushL( dataToAppend );
+        ptr.Set( dataToAppend->Des() );
+        AknTextUtils::LanguageSpecificNumberConversion( ptr );
+        dataArray->AppendL( ptr );
+        CleanupStack::PopAndDestroy( dataToAppend );
+        }
+    else
+        {
+        dataArray->AppendL( KNullDesC );
+        }
+
+    // Location
+    TUint flags( aMedia.ValueTObjectL<TUint>( KMPXMediaGeneralFlags ) );
+    TUint isVirtual( ( flags ) & ( KMPXMediaGeneralFlagsIsVirtual ) );
+    if ( !isVirtual )
+        {
+        if ( aMedia.IsSupported( KMPXMediaGeneralUri ) )
+            {
+            dataArray->AppendL( aMedia.ValueText( KMPXMediaGeneralUri ) );
+            }
+        else
+            {
+            dataArray->AppendL( KNullDesC );
+            }
+        }
+
+    // last refreshed
+    TInt64 lastMod( 0 );
+    if ( aMedia.IsSupported( KMPXMediaGeneralDate ) )
+        {
+        lastMod = aMedia.ValueTObjectL<TInt64>( KMPXMediaGeneralDate );
+        }
+    TTime time( lastMod );
+    dataToAppend = HBufC::NewLC(
+        KMPXMaxTimeLength + KMPXDurationDisplayResvLen );
+    HBufC* format = StringLoader::LoadLC( R_QTN_DATE_USUAL_WITH_ZERO );
+    ptr.Set( dataToAppend->Des() );
+    time.FormatL( ptr, *format );
+    CleanupStack::PopAndDestroy( format );
+    AknTextUtils::LanguageSpecificNumberConversion( ptr );
+    dataArray->AppendL( ptr );
+    CleanupStack::PopAndDestroy( dataToAppend );
+
+    dataToAppend = HBufC::NewLC(
+        KMPXMaxTimeLength + KMPXDurationDisplayResvLen );
+    format = StringLoader::LoadLC( R_QTN_TIME_USUAL );
+    ptr.Set( dataToAppend->Des() );
+    time.FormatL( ptr, *format );
+    CleanupStack::PopAndDestroy( format );
+    AknTextUtils::LanguageSpecificNumberConversion( ptr );
+    dataArray->AppendL( ptr );
+    CleanupStack::PopAndDestroy( dataToAppend );
+
+    TInt headingResource( isVirtual ?
+        R_MPX_CUI_PLAYLIST_DETAILS_HEADINGS_WITHOUT_URI :
+        R_MPX_CUI_PLAYLIST_DETAILS_HEADINGS_WITH_URI );
+    DisplayDetailsDialogL( *dataArray, headingResource,
+        R_MPX_QTN_NMP_TITLE_PLAYLIST_DETAILS );
+    CleanupStack::PopAndDestroy( dataArray );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Handles Upnp menus from DynInitMenuPaneL()
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandleDynInitUpnpL(
+    TInt aResourceId,
+    CEikMenuPane& aMenuPane )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::HandleDynInitUpnpL()" );
+
+    if ( !IsUpnpVisible() )
+        {
+        GetCurrentPlayerDetails();
+
+        if ( iCurrentPlayerType == EPbLocal )
+            {
+            aMenuPane.SetItemDimmed(
+                EMPXCmdUpnpPlayVia,
+                ETrue);
+            }
+        aMenuPane.SetItemDimmed(
+            EMPXCmdUPnPAiwCmdCopyToExternalCriteria,
+            ETrue);
+        }
+    else
+        {
+        MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleDynInitUpnpL(): UPnP visible and media" );
+        TInt currentItem( iContainer->CurrentLbxItemIndex() );
+
+        const CMPXMedia& media =
+            (iContainer->ListBoxArray())->MediaL( currentItem );
+        TMPXGeneralType type( EMPXNoType );
+        if (media.IsSupported(KMPXMediaGeneralType))
+            {
+            type =
+                media.ValueTObjectL<TMPXGeneralType>(KMPXMediaGeneralType);
+            }
+
+        if ( ( type == EMPXItem ) ||
+             ( type == EMPXGroup ) )
+            {
+            MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleDynInitUpnpL(): folder or song" );
+            if ( iErrorAttachCopyMenu != KErrNone )
+                {
+                MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleDynInitUpnpL(): error, Dim Copy" );
+                aMenuPane.SetItemDimmed(
+                    EMPXCmdUPnPAiwCmdCopyToExternalCriteria,
+                    ETrue);
+                }
+            else
+                {
+                if (iServiceHandler->HandleSubmenuL(aMenuPane))
+                    {
+                    return;
+                    }
+
+                if ( iServiceHandler->IsAiwMenu(aResourceId))
+                    {
+                    MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleDynInitUpnpL(): Aiw menu" );
+                    CAiwGenericParamList& in = iServiceHandler->InParamListL();
+
+                    iServiceHandler->InitializeMenuPaneL(aMenuPane, aResourceId, EMPXCmdUPnPAiwCmdCopyToExternalCriteria, in);
+                    MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleDynInitUpnpL(): after InitializeMenuPaneL" );
+                    }
+                }
+            }
+         else
+            {
+            aMenuPane.SetItemDimmed(
+                EMPXCmdUpnpPlayVia,
+                ETrue);
+            aMenuPane.SetItemDimmed(
+                EMPXCmdUPnPAiwCmdCopyToExternalCriteria,
+                ETrue);
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::IsUpnpVisible
+// Checks if UPnP access point is defined
+// -----------------------------------------------------------------------------
+//
+TBool CMPXCollectionViewHgImp::IsUpnpVisible()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::IsUpnpVisible" );
+ 	  TBool returnValue = EFalse;
+
+   	if ( iUpnpCopyCommand  && iUpnpFrameworkSupport)
+        {
+        returnValue = iUpnpCopyCommand->IsAvailableL();
+        }
+    return returnValue;
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::AddPlayersNamesToMenuL
+// Taken from Gallery upnp support implementation
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::AddPlayersNamesToMenuL( CEikMenuPane& aMenuPane )
+    {
+    RArray<TMPXPlaybackPlayerType> playerTypes;
+    CleanupClosePushL(playerTypes);
+
+    MMPXPlayerManager& manager = iPlaybackUtility->PlayerManager();
+    manager.GetPlayerTypesL(playerTypes);
+
+    GetCurrentPlayerDetails();
+
+    TInt countPlayersTypes( playerTypes.Count() );
+    TInt countLocalType(0);
+    TInt countRemoteType(0);
+
+    if ( countPlayersTypes >= 1 )
+        {
+        iPlayersList.Close();
+
+        for ( TInt i = 0; i < countPlayersTypes; i++ )
+            {
+            MPX_DEBUG3( "playerTypes[%d]: %d", i, playerTypes[i] );
+            switch (playerTypes[i])
+                {
+                case EPbLocal:
+                    {
+                    // we only show 1 specific type once in the menu
+                    if ( countLocalType == 0 )
+                        {
+                        AddPlayerNameToMenuL( aMenuPane,
+                                            EMPXCmdUpnpPlayViaLocal,
+                                            manager,
+                                            playerTypes[i] );
+
+                        countLocalType++;
+                        }
+                    break;
+                    }
+                case EPbRemote:
+                    {
+                    // we only show 1 specific type once in the menu
+                    if ( countRemoteType == 0 )
+                        {
+                        AddPlayerNameToMenuL( aMenuPane,
+                                            EMPXCmdUpnpPlayViaRemotePlayer,
+                                            manager,
+                                            playerTypes[i] );
+                        countRemoteType++;
+                        }
+                    break;
+                    }
+                default:
+                    {
+                    // default case is handled in the next loop, we want
+                    // to add any "other" player at the end of the list
+                    break;
+                    }
+                }
+            } // for loop
+
+        for ( TInt i = 0; i < countPlayersTypes; i++ )
+            {
+            MPX_DEBUG3( "playerTypes[%d]: %d", i, playerTypes[i] );
+            // EPbLocal and EPbRemote were already added to the
+            // submenu in the previous loop
+            if ( playerTypes[i] != EPbLocal &&
+                 playerTypes[i] != EPbRemote )
+                {
+                // EPbUnknown or else
+                TBool alreadyInTheList( EFalse );
+
+                for ( TInt j = 0; j < i; j++)
+                    {
+                    // if the new playertype is already in the list
+                    if ( playerTypes[i] == playerTypes[j] )
+                        {
+                        alreadyInTheList = ETrue;
+                        break;
+                        }
+                    }
+
+                if ( !alreadyInTheList )
+                    {
+                    HBufC* buf = manager.PlayerTypeDisplayNameL(playerTypes[i]);
+
+                    if ( buf )
+                        {
+                        CleanupStack::PushL(buf);
+                        AddPlayerNameToMenuL( aMenuPane,
+                                            EMPXCmdUpnpPlayViaRemotePlayer,
+                                            manager,
+                                            playerTypes[i],
+                                            *buf );
+                        CleanupStack::PopAndDestroy(buf);
+                        }
+                    // else we don't do anything. other player type is not
+                    // currently supported. Implementation will be finalized
+                    // when the requirement is defined.
+                    }
+                }
+            }
+        }
+
+    CleanupStack::PopAndDestroy(&playerTypes);
+
+    if ( iPlayersList.Count() <= 1 )
+        {
+        aMenuPane.SetItemDimmed( EMPXCmdUpnpPlayViaRemotePlayer,
+                                  ETrue );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::AddPlayerNameToMenuL
+// Taken from Gallery upnp support implementation
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::AddPlayerNameToMenuL( CEikMenuPane& aMenuPane,
+                                                TInt aCommandId,
+                                                MMPXPlayerManager& aPlayerManager,
+                                                TMPXPlaybackPlayerType& aPlayerType,
+                                                const TDesC& aMenuText )
+    {
+    RArray<TUid> players;
+    CleanupClosePushL(players);
+    aPlayerManager.GetPlayerListL(players, aPlayerType);
+
+    // For now we only keep the first player we find
+    // Local player is always the first one in the list
+    // Ui spec limitation
+    MPX_DEBUG2( "players[0]: %d", players[0].iUid );
+    if ( aCommandId == EMPXCmdUpnpPlayViaLocal )
+        {
+        iPlayersList.Insert(players[0], 0);
+        }
+    else if ( ( aCommandId == EMPXCmdUpnpPlayViaRemotePlayer ) &&
+              (iPlayersList.Count() > 1) )
+        {
+        iPlayersList.Insert(players[0], 1);
+        }
+    else
+        {
+        iPlayersList.AppendL(players[0]);
+        }
+    CleanupStack::PopAndDestroy(&players);
+
+    // if the player is of unknown type
+    if ( ( aCommandId != EMPXCmdUpnpPlayViaRemotePlayer ) &&
+         ( aCommandId != EMPXCmdUpnpPlayViaLocal ) )
+        {
+        CEikMenuPaneItem::SData menuItem;
+        menuItem.iText.Copy( aMenuText );
+        menuItem.iCascadeId = 0;
+        menuItem.iFlags = EEikMenuItemRadioEnd;
+
+        menuItem.iCommandId = aCommandId + (iPlayersList.Count() - 1);
+        aCommandId = menuItem.iCommandId;
+
+        aMenuPane.AddMenuItemL( menuItem );
+        }
+
+    if ( iCurrentPlayerType == aPlayerType )
+        {
+        aMenuPane.SetItemButtonState( aCommandId, EEikMenuItemSymbolOn );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::GetCurrentPlayerDetails
+// Retrieves the current player name and type
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::GetCurrentPlayerDetails()
+    {
+    MMPXPlayerManager& manager = iPlaybackUtility->PlayerManager();
+    TUid currentlyUsedPlayer;
+    TInt currentlyUsedSubPlayer;
+    iCurrentPlayerType = EPbLocal;
+    delete iSubPlayerName;
+    iSubPlayerName = NULL;
+    TRAP_IGNORE( manager.GetSelectionL( iCurrentPlayerType,
+                                        currentlyUsedPlayer,
+                                        currentlyUsedSubPlayer,
+                                        iSubPlayerName));
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::SelectNewPlayerL
+// Selects a new player for audio playback
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::SelectNewPlayerL( TInt aCommand )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::SelectNewPlayerL()" );
+    MPX_DEBUG2( "CMPXCollectionViewHgImp::SelectNewPlayerL(%d)", aCommand );
+
+    TInt errorSelectPlayer( KErrCancel );
+
+    switch (aCommand)
+        {
+        case EMPXCmdUpnpPlayViaLocal:
+            {
+            // if Local is not already the current player, select it
+            if ( iCurrentPlayerType != EPbLocal )
+                {
+                MMPXPlayerManager& manager = iPlaybackUtility->PlayerManager();
+                MPX_TRAP( errorSelectPlayer, manager.ClearSelectPlayersL() );
+                }
+            else // no need to reselect it but always start playback
+                {
+                errorSelectPlayer = KErrNone;
+                }
+            break;
+            }
+        default:
+            {
+            if ( aCommand >= EMPXCmdUpnpPlayViaRemotePlayer )
+                {
+                HBufC* buf = HBufC::NewLC( KMaxUidName );
+                buf->Des().AppendNum(
+                     (iPlayersList[aCommand -
+                                   EMPXCmdUpnpPlayViaLocal]).iUid );
+
+                // ActivateViewL leaves with KErrCancel if the dialog is
+                // cancelled
+                // ActivateViewL leaves with KErrInUse if the selected player
+                // is already the active player
+                MPX_TRAP(errorSelectPlayer, iViewUtility->ActivateViewL(
+                                TUid::Uid( KMPXPluginTypeUPnPBrowseDialogUid ),
+                                buf ));
+                CleanupStack::PopAndDestroy( buf );
+                }
+            break;
+            }
+        }
+
+    GetCurrentPlayerDetails();
+
+    // If InUse, the player selected is already the current one, we start playback anyway
+    // contrary to Playback view
+    if ( ( errorSelectPlayer == KErrNone ) ||
+         ( errorSelectPlayer == KErrInUse ) )
+        {
+        // Starts playback by calling OpenL() for the selected track
+        CMPXCommonListBoxArrayBase* array = iContainer->ListBoxArray();
+        if ( array && ( iContainer->TotalListItemCount() > 0 ) )
+            {
+            MPX_DEBUG1( "CMPXCollectionViewHgImp::SelectNewPlayerL() before MediaL()" );
+
+            TInt currentListBoxItemIndex(
+                iContainer->CurrentLbxItemIndex() );
+
+            if ( currentListBoxItemIndex >= 0 )
+                {
+                const CMPXMedia& media = array->MediaL( currentListBoxItemIndex );
+
+                TMPXGeneralType type( EMPXNoType );
+                TMPXGeneralCategory category( EMPXNoCategory );
+
+                if ( media.IsSupported( KMPXMediaGeneralType ) )
+                    {
+                    type = media.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType );
+                    }
+
+                if ( media.IsSupported( KMPXMediaGeneralCategory ) )
+                    {
+                    category = media.ValueTObjectL<TMPXGeneralCategory>(
+                                    KMPXMediaGeneralCategory );
+                    }
+
+                MPX_DEBUG2( "CMPXCollectionViewHgImp::SelectNewPlayerL() currentIndex %d", currentListBoxItemIndex );
+
+                // Needed to reset the status of iPreservedState
+                iPlaybackUtility->CommandL(EPbCmdResetPreserveState);
+
+                if ( ( type == EMPXItem ) && ( category == EMPXSong ) )
+                    {
+                    MPX_DEBUG1( "CMPXCollectionViewHgImp::SelectNewPlayerL() type is EMPXItem" );
+                    if(iCollectionCacheReady)
+                        {
+                        iCollectionUtility->Collection().OpenL( currentListBoxItemIndex );
+						iFirstIncrementalBatch = ETrue;
+                        }
+                    }
+                else if ( ( type == EMPXItem ) && ( category == EMPXPlaylist ) )
+                    {
+                    MPX_DEBUG1( "CMPXCollectionViewHgImp::SelectNewPlayerL() category is EMPXPlaylist" );
+                    // if we want to play a playlist, we need to find out
+                    // if it's empty first
+                    ASSERT( iCurrentFindAllLOp == EMPXOpFindAllLIdle );
+
+                    TMPXItemId id(
+                        media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
+                    CMPXMedia* entry = CMPXMedia::NewL();
+                    CleanupStack::PushL( entry );
+                    entry->SetTObjectValueL<TMPXGeneralType>(
+                        KMPXMediaGeneralType, EMPXGroup );
+                    entry->SetTObjectValueL<TMPXGeneralCategory>(
+                        KMPXMediaGeneralCategory, EMPXSong );
+                    entry->SetTObjectValueL<TMPXItemId>(
+                        KMPXMediaGeneralId, id );
+                    RArray<TMPXAttribute> attrs;
+                    CleanupClosePushL( attrs );
+                    attrs.Append( KMPXMediaGeneralId );
+                    iCollectionUtility->Collection().FindAllL(
+                                            *entry, attrs.Array(), *this );
+                    iCurrentFindAllLOp = EMPXOpFindAllLUpnpPlayback;
+
+                    CleanupStack::PopAndDestroy( &attrs );
+                    CleanupStack::PopAndDestroy( entry );
+                    }
+                else // if a folder is selected
+                    {
+                    MPX_DEBUG1( "CMPXCollectionViewHgImp::SelectNewPlayerL() type is EMPXGroup" );
+                    if(iCollectionCacheReady)
+                        {
+                        iCollectionUtility->Collection().OpenL( currentListBoxItemIndex,
+                                                            EMPXOpenPlaylistOnly);
+						iFirstIncrementalBatch = ETrue;
+                        }
+                    }
+                }
+            }
+        }
+    else if ( errorSelectPlayer != KErrCancel )
+        {
+        User::LeaveIfError(errorSelectPlayer);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::CopySelectedItemsToRemoteL
+// Copies selected file(s) to remote player
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::CopySelectedItemsToRemoteL()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::CopySelectedItemsToRemoteL()" );
+
+    TInt index( iContainer->CurrentLbxItemIndex() );
+    if ( index >= 0 )
+        {
+        CMPXCommonListBoxArrayBase* array = iContainer->ListBoxArray();
+        const CMPXMedia& media = array->MediaL( index );
+
+        TMPXGeneralType type( EMPXNoType );
+        TMPXGeneralCategory category( EMPXNoCategory );
+
+       if ( media.IsSupported( KMPXMediaGeneralType ) )
+            {
+            type =
+                media.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType );
+            }
+        if ( media.IsSupported( KMPXMediaGeneralCategory ) )
+            {
+            category =
+                media.ValueTObjectL<TMPXGeneralCategory>( KMPXMediaGeneralCategory );
+            }
+
+        CMPXCollectionPath* cpath =
+                              iCollectionUtility->Collection().PathL();
+        CleanupStack::PushL( cpath );
+
+        if ( ( type == EMPXItem ) && ( category == EMPXSong ) )
+            {
+            const CArrayFix<TInt>* arrayIndex =
+                iContainer->CurrentSelectionIndicesL();
+            TInt arrayCount( arrayIndex->Count() );
+
+            cpath->ClearSelection();
+            if ( arrayCount > 0 )
+                {
+                for (TInt index=0; index < arrayCount; index++)
+                    {
+                    cpath->SelectL(arrayIndex->At(index));
+                    }
+                }
+            else
+                {
+                cpath->Set( index );
+                }
+
+            // Ask for the list of selected song paths: will return in HandleMedia()
+            ASSERT( iCurrentMediaLOp == EMPXOpMediaLIdle );
+            RArray<TMPXAttribute> attrs;
+            CleanupClosePushL(attrs);
+            attrs.Append( KMPXMediaGeneralUri );
+            iCollectionUtility->Collection().MediaL( *cpath, attrs.Array() );
+            iCurrentMediaLOp = EMPXOpMediaLCopyToRemote;
+            CleanupStack::PopAndDestroy( &attrs );
+            }
+        else // if a folder is selected
+            {
+            TMPXItemId id(0);
+            if ( media.IsSupported( KMPXMediaGeneralId ) )
+                {
+                id = media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId );
+                }
+
+            RArray<TInt> supportedIds;
+            CleanupClosePushL(supportedIds);
+            supportedIds.AppendL(KMPXMediaIdGeneral);
+
+            CMPXMedia* entry = CMPXMedia::NewL(supportedIds.Array());
+            CleanupStack::PushL(entry);
+            entry->SetTObjectValueL( KMPXMediaGeneralType, EMPXGroup );
+
+            entry->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXSong );
+
+            entry->SetTObjectValueL( KMPXMediaGeneralId, id );
+
+            if ( category == EMPXAlbum )
+                {
+                const CMPXMedia& containerMedia = array->ContainerMedia();
+                TMPXGeneralCategory containerCategory( EMPXNoCategory );
+                if ( containerMedia.IsSupported( KMPXMediaGeneralCategory ) )
+                    {
+                    containerCategory = containerMedia.ValueTObjectL<TMPXGeneralCategory>(
+                                                KMPXMediaGeneralCategory );
+                    }
+
+                if ( containerCategory == EMPXArtist )
+                    {
+                    // artist/album level, need to specify artist ID in container ID
+                    TMPXItemId containerId =
+                        containerMedia.ValueTObjectL<TMPXItemId>(
+                            KMPXMediaGeneralId );
+                    entry->SetTObjectValueL<TMPXItemId>(
+                        KMPXMediaGeneralContainerId, containerId );
+                    }
+                }
+
+            RArray<TMPXAttribute> attrs;
+            CleanupClosePushL(attrs);
+            attrs.Append( KMPXMediaGeneralUri );
+
+            ASSERT( iCurrentFindAllLOp == EMPXOpFindAllLIdle );
+            iCollectionUtility->Collection().FindAllL( *entry,
+                                                       attrs.Array(),
+                                                       *this );
+            iCurrentFindAllLOp = EMPXOpFindAllLUpnp;
+
+            CleanupStack::PopAndDestroy( &attrs );
+            CleanupStack::PopAndDestroy( entry );
+            CleanupStack::PopAndDestroy( &supportedIds );
+            }
+        CleanupStack::PopAndDestroy( cpath );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::DoHandleCopyToRemoteL
+// Handle call back from collectionframework for Copy to Remote command
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::DoHandleCopyToRemoteL(
+    const CMPXMedia& aMedia, TBool aComplete )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::DoHandleCopyToRemoteL()");
+
+    CMPXMediaArray* mediaArray( NULL );
+    TInt fileCount( 0 );
+
+    if ( aMedia.IsSupported( KMPXMediaArrayContents ) )
+        {
+        mediaArray =
+            aMedia.Value<CMPXMediaArray>( KMPXMediaArrayContents );
+        if ( mediaArray )
+            {
+            fileCount = mediaArray->Count();
+            }
+        }
+    MPX_DEBUG2("CMPXCollectionViewHgImp::DoHandleCopyToRemoteL Entry count = %d", fileCount);
+
+    // Change this to Global will be needed if FindAll() is called
+    // repeatedly until aComplete is ETrue (Inc9?)
+    CAiwGenericParamList* aiwCopyInParamList = CAiwGenericParamList::NewLC();
+
+    // multiple files or folder
+    if ( fileCount > 0 )
+        {
+        if ( mediaArray )
+            {
+            for ( TInt i = 0; i < fileCount; i++ )
+                {
+                CMPXMedia* media( mediaArray->AtL( i ) );
+
+                const TDesC& location =
+                    media->ValueText( KMPXMediaGeneralUri );
+                MPX_DEBUG3( "CMPXCollectionViewHgImp::DoHandleCopyToRemote %d filePath = %S", i, &location );
+
+                TAiwVariant path( location );
+                TAiwGenericParam fileParameter( EGenericParamFile,
+                                                path );
+                aiwCopyInParamList->AppendL( fileParameter );
+                }
+            }
+        }
+    else // single file
+        {
+        TMPXGeneralType type( EMPXNoType );
+
+        if ( aMedia.IsSupported( KMPXMediaGeneralType ) )
+            {
+            type = aMedia.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType );
+            }
+
+        if ( type == EMPXItem )
+            {
+            const TDesC& location =
+                aMedia.ValueText( KMPXMediaGeneralUri );
+            TAiwVariant path( location );
+            MPX_DEBUG2( "CMPXCollectionViewHgImp::DoHandleCopyToRemote filePath = %S", &location );
+
+            TAiwGenericParam fileParameter( EGenericParamFile, path );
+            aiwCopyInParamList->AppendL( fileParameter );
+            }
+        }
+
+    if ( ( aiwCopyInParamList->Count() > 0 ) &&
+         aComplete )
+        {
+        CAiwGenericParamList* outParamList = CAiwGenericParamList::NewLC();
+        // do not allow the copy dialog to be dismissed by external command
+        HandleCommandL( EMPXCmdIgnoreExternalCommand );
+        iServiceHandler->ExecuteMenuCmdL(
+                  EMPXCmdUPnPAiwCmdCopyToExternalCriteria, /* command id */
+                  *aiwCopyInParamList,   /* in parameters */
+                  *outParamList,          /* out parameters */
+                  0,                      /* options */
+                  NULL );                 /* call back */
+        HandleCommandL( EMPXCmdHandleExternalCommand );
+
+        CleanupStack::PopAndDestroy( outParamList );
+        }
+
+    // Clear selection
+    if( iContainer )
+        {
+        iContainer->ClearLbxSelection();
+        }
+
+    CleanupStack::PopAndDestroy( aiwCopyInParamList );
+    }
+
+// -----------------------------------------------------------------------------
+// Find playlists
+// -----------------------------------------------------------------------------
+//
+TInt CMPXCollectionViewHgImp::FindPlaylistsL()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::FindPlaylistsL" );
+    TInt entriesCount( 0 );
+    delete iUserPlaylists;
+    iUserPlaylists = NULL;
+    iUserPlaylists = iCommonUiHelper->FindPlaylistsL();
+
+    if ( iUserPlaylists )
+        {
+        const CMPXMediaArray* mediaArray =
+            iUserPlaylists->Value<CMPXMediaArray>( KMPXMediaArrayContents );
+        User::LeaveIfNull(const_cast<CMPXMediaArray*>(mediaArray));
+
+        entriesCount = mediaArray->Count();
+        MPX_DEBUG2( "CMPXCollectionViewHgImp::FindPlaylistsL Entry count = %d", entriesCount );
+        }
+    else
+        {
+        MPX_DEBUG1( "CMPXCollectionViewHgImp::FindPlaylistsL Error getting playlist" );
+        User::Leave( KErrNotFound );
+        }
+    return entriesCount;
+    }
+
+// -----------------------------------------------------------------------------
+// Save the playlist after reorder
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::SaveCurrentPlaylistL()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::SaveCurrentPlaylistL" );
+    CMPXCommonListBoxArrayBase* listboxArray =
+        iContainer->ListBoxArray();
+    TInt currentIndex( iContainer->CurrentLbxItemIndex() );
+    TInt origIndex( iContainer->GetOriginalIndex() );
+    const CMPXMedia& media( listboxArray->MediaL( origIndex ) );
+    TMPXItemId id( media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
+    const CMPXMedia& containerMedia = listboxArray->ContainerMedia();
+    TMPXItemId playlistId( containerMedia.ValueTObjectL<TMPXItemId>(
+        KMPXMediaGeneralId ) );
+    MPX_DEBUG4( "CMPXCollectionViewHgImp::SaveCurrentPlaylistL song 0x%x is moved from %d to %d",
+         id.iId1, origIndex, currentIndex );
+    MPX_DEBUG2( "CMPXCollectionViewHgImp::SaveCurrentPlaylistL playlist ID 0x%x", playlistId.iId1 );
+    iIsSavingReorderPlaylist = ETrue;
+    iCollectionUiHelper->ReorderPlaylistL(
+        playlistId, id, origIndex, currentIndex, this );
+    iCurrentHighlightedIndex = currentIndex;
+    }
+
+// -----------------------------------------------------------------------------
+// Handles rename operation complete
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandleRenameOpCompleteL()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::HandleRenameOpCompleteL" );
+    iSetMediaLCount = KErrNotFound;
+    MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleRenameOpCompleteL dismiss wait note" );
+    iCommonUiHelper->DismissWaitNoteL();
+    HandleCommandL( EMPXCmdHandleExternalCommand );
+    if ( iInvalidFileExist )
+        {
+        // there are invalid files, diplay info note
+        HBufC* string = StringLoader::LoadLC(
+            R_MPX_COLLECTION_NOTE_RENAME_WITH_INVALID, *iNewName );
+        iCommonUiHelper->DisplayInfoNoteL( *string );
+        CleanupStack::PopAndDestroy( string );
+        }
+    MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleRenameOpCompleteL calling OpenL" );
+    // path changed messages were ignored during rename, need to
+    // manually refresh the screen
+    DoIncrementalOpenL();
+    }
+
+// -----------------------------------------------------------------------------
+// checks if send option should be shown
+// -----------------------------------------------------------------------------
+//
+TBool CMPXCollectionViewHgImp::SendOptionVisibilityL()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::SendOptionVisibilityL" );
+    TBool isHidden( iContainer->TotalListItemCount() < 1 );
+
+    if ( !isHidden )
+        {
+        CMPXCommonListBoxArrayBase* baseArray =
+            iContainer->ListBoxArray();
+        CMPXCollectionViewListBoxArray* array =
+            static_cast<CMPXCollectionViewListBoxArray*>( baseArray );
+        TInt selectionCount( 0 );
+        if ( iSelectionIndexCache)
+            {
+            selectionCount = iSelectionIndexCache->Count();
+            }
+
+        if ( selectionCount > 0 )
+            {
+            TBool isValid( EFalse );
+            for ( TInt i = 0; i < selectionCount && !isValid; i++ )
+                {
+                // multiple selection
+                isValid = !array->IsItemBrokenLinkL(
+                    iSelectionIndexCache->At( i ) );
+                isValid = isValid &&
+                    !array->IsItemCorruptedL(
+                    iSelectionIndexCache->At( i ));
+                }
+            // if anything is valid, display the item
+            isHidden = !isValid;
+            }
+        else
+            {
+            //single selection
+            isHidden = array->IsItemBrokenLinkL(
+                iContainer->CurrentLbxItemIndex() );
+            isHidden = isHidden ||
+                array->IsItemCorruptedL(
+                iContainer->CurrentLbxItemIndex() );
+            }
+        }
+
+    return isHidden;
+    }
+
+// -----------------------------------------------------------------------------
+// Checks if Set as ringtone option should be shown
+// -----------------------------------------------------------------------------
+//
+TBool CMPXCollectionViewHgImp::SetAsRingToneOptionVisibilityL()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::SetAsRingToneOptionVisibilityL" );
+    TBool isHidden( iContainer->TotalListItemCount() < 1 );
+
+    if ( !isHidden )
+        {
+        CMPXCollectionViewListBoxArray* array =
+            static_cast<CMPXCollectionViewListBoxArray*>(
+            iContainer->ListBoxArray() );
+        const CMPXMedia& media =
+            array->MediaL( iContainer->CurrentLbxItemIndex() );
+
+        // if item is not yet fetched from database, assume that it's valid
+        if ( !( media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) ==
+            KMPXInvalidItemId ) )
+            {
+            CMPXMedia* criteria = CMPXMedia::NewL();
+            CleanupStack::PushL( criteria );
+            RArray<TMPXAttribute> attrs;
+            CleanupClosePushL( attrs );
+            attrs.Append( KMPXMediaGeneralUri );
+            attrs.Append( KMPXMediaDrmProtected );
+            attrs.Append( KMPXMediaDrmCanSetAutomated );
+            criteria->SetTObjectValueL<TMPXGeneralType>(
+                KMPXMediaGeneralType,
+                media.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType ) );
+            criteria->SetTObjectValueL<TMPXGeneralCategory>(
+                KMPXMediaGeneralCategory,
+                media.ValueTObjectL<TMPXGeneralCategory>( KMPXMediaGeneralCategory ) );
+            if ( media.IsSupported( KMPXMediaGeneralCollectionId ) )
+                {
+                criteria->SetTObjectValueL<TUid>(
+                    KMPXMediaGeneralCollectionId,
+                    media.ValueTObjectL<TUid>( KMPXMediaGeneralCollectionId ) );
+                }
+            else
+                {
+                CMPXCollectionPath* path( iCollectionUtility->Collection().PathL() );
+                CleanupStack::PushL( path );
+                criteria->SetTObjectValueL<TUid>(
+                    KMPXMediaGeneralCollectionId,
+                    TUid::Uid( path->Id( 0 ) ) );
+                CleanupStack::PopAndDestroy( path );
+                }
+            criteria->SetTObjectValueL<TMPXItemId>(
+                KMPXMediaGeneralId,
+                media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
+
+            CMPXMedia* songInfo = iCollectionUtility->Collection().FindAllL( *criteria,
+                                                             attrs.Array() );
+            CleanupStack::PopAndDestroy( &attrs );
+            CleanupStack::PushL( songInfo );
+
+            const CMPXMediaArray* mediaArray(
+                songInfo->Value<CMPXMediaArray>( KMPXMediaArrayContents ) );
+            User::LeaveIfNull(const_cast<CMPXMediaArray*>(mediaArray));
+
+            if ( mediaArray->Count() > 0 )
+                {
+                CMPXMedia* si( mediaArray->AtL( 0 ) );
+                if ( si->IsSupported( KMPXMediaDrmProtected ) )
+                    {
+                    if ( si->ValueTObjectL<TBool>( KMPXMediaDrmProtected ) &&
+                        si->IsSupported( KMPXMediaDrmCanSetAutomated ) )
+                        {
+                        // if it's drm protected, check if
+                        // KMPXMediaDrmCanSetAutomated
+                        isHidden = !( si->ValueTObjectL<TBool>( KMPXMediaDrmCanSetAutomated ) );
+                        }
+                    }
+                }
+            CleanupStack::PopAndDestroy( songInfo );
+            CleanupStack::PopAndDestroy( criteria );
+            }
+        }
+    return isHidden;
+    }
+
+// -----------------------------------------------------------------------------
+// Checks if file details option should be shown
+// -----------------------------------------------------------------------------
+//
+TBool CMPXCollectionViewHgImp::FileDetailsOptionVisibilityL()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::FileDetailsOptionVisibilityL" );
+    TInt selectionCount( 0 );
+    if ( iSelectionIndexCache)
+        {
+        selectionCount = iSelectionIndexCache->Count();
+        }
+    TBool isHidden( iContainer->TotalListItemCount() < 1 ||
+            selectionCount );
+    if ( !isHidden )
+        {
+        CMPXCollectionViewListBoxArray* array =
+            static_cast<CMPXCollectionViewListBoxArray*>(
+            iContainer->ListBoxArray() );
+        const CMPXMedia& media = array->MediaL(
+            iContainer->CurrentLbxItemIndex() );
+
+        if ( media.IsSupported( KMPXMediaGeneralFlags ) )
+            {
+            TUint flags( media.ValueTObjectL<TUint>( KMPXMediaGeneralFlags ) );
+            if ( ( flags ) & ( KMPXMediaGeneralFlagsIsMissingDetails ) )
+                {
+                isHidden = ETrue;
+                }
+            }
+        }
+    return isHidden;
+    }
+
+// -----------------------------------------------------------------------------
+// Handle send command.
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::DoSendL()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::DoSendL" );
+
+
+    CMPXCommonListBoxArrayBase* listboxArray(
+        iContainer->ListBoxArray() );
+    TInt currentIndex( iContainer->CurrentLbxItemIndex() );
+    const CMPXMedia& media( listboxArray->MediaL(
+        iContainer->CurrentLbxItemIndex() ) );
+
+    // Marked indicies
+    TInt arrayCount( iSelectionIndexCache->Count() );
+
+    if ( ( arrayCount == 0 || arrayCount == 1 ) &&
+        ( media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) == KMPXInvalidItemId ) )
+        {
+        // not marked, or only 1 item is marked
+        // and the highlighted item is not yet available
+        MPX_DEBUG1( "CMPXCollectionViewHgImp::DoSendL item not yet fetched" );
+        }
+    else
+        {
+        CMPXCollectionPath* path = iCollectionUtility->Collection().PathL();
+        CleanupStack::PushL( path );
+
+        MPX_DEBUG2( "CMPXCollectionViewHgImp::DoSendL array count = %d", arrayCount );
+        if ( arrayCount > 1 )
+            {
+            // if more than 1 selected
+            for ( TInt i = 0; i < arrayCount; i++ )
+                {
+                MPX_DEBUG2( "CMPXCollectionViewHgImp::DoSendL array index = %d", iSelectionIndexCache->At( i ) );
+                path->SelectL( iSelectionIndexCache->At(i) );
+                }
+            }
+        else
+            {
+            // if only 1 item is marked, treat it as single selection
+            path->Set( ( arrayCount == 1 ) ?
+                iSelectionIndexCache->At( 0 ) : iContainer->CurrentLbxItemIndex() );
+            }
+
+        RArray<TMPXAttribute> attrs;
+        CleanupClosePushL(attrs);
+        attrs.Append(
+            TMPXAttribute( KMPXMediaIdGeneral,
+                EMPXMediaGeneralUri | EMPXMediaGeneralSize |
+                EMPXMediaGeneralCollectionId |
+                EMPXMediaGeneralFlags | EMPXMediaGeneralId |
+                EMPXMediaGeneralType | EMPXMediaGeneralCategory ) );
+        iCurrentMediaLOp = EMPXOpMediaLSend;
+        iCollectionUtility->Collection().MediaL( *path, attrs.Array() );
+        CleanupStack::PopAndDestroy( &attrs );
+        CleanupStack::PopAndDestroy( path );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Handle send playlist command
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::DoSendPlaylistL( TMPXItemId aItemId )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::DoSendPlaylistL" );
+    // export the playlist to file system, and send the playlist
+    // when the operation is completed
+    HBufC* defaultDrive = iCommonUiHelper->DefaultDriveLC();
+    TFileName defaultPath;
+    defaultPath.Append( *defaultDrive );
+    RFs& fileSession = iCoeEnv->FsSession();
+    TBool folderExist = BaflUtils::FolderExists( fileSession, defaultPath );
+    TInt count( 0 );
+    // use time stamp as the directory name for export, so that
+    // it won't overwrite any existing files.  It will search for the first
+    // available folder that is not currently in the file system
+    while ( folderExist )
+        {
+        if ( count++ > KMPXPlaylistExportRetry )
+            {
+            MPX_DEBUG1( "CMPXCollectionViewHgImp::DoSendPlaylistL maximum retry count reached, leaving" );
+            User::Leave( KErrNotReady );
+            }
+        defaultPath.Copy( *defaultDrive );
+        TTime timeStamp;
+        timeStamp.UniversalTime();
+        defaultPath.AppendNum( timeStamp.Int64() );
+        defaultPath.Append( KPathDelimiter );
+        folderExist = BaflUtils::FolderExists( fileSession, defaultPath );
+        }
+    CleanupStack::PopAndDestroy( defaultDrive );
+    MPX_DEBUG2( "CMPXCollectionViewHgImp::DoSendPlaylistL creating path = %S", &defaultPath );
+    BaflUtils::EnsurePathExistsL( fileSession, defaultPath );
+    // playlist is sent in the call back of this function
+    iCollectionUiHelper->ExportPlaylistL( aItemId, defaultPath, this );
+    }
+
+// -----------------------------------------------------------------------------
+// Handle call back from collectionframework for send command
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::DoHandleSendL( const CMPXMedia& aMedia )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::DoHandleSendL" );
+    TInt invalidFileCount( 0 );
+    TInt maxSize( 0 );
+    CMessageData* messageData = CMessageData::NewLC();
+
+    TInt fileCount( 0 );
+    if( aMedia.IsSupported( KMPXMediaArrayContents ) )
+        {
+        const CMPXMediaArray* mediaArray =
+            aMedia.Value<CMPXMediaArray>( KMPXMediaArrayContents );
+        User::LeaveIfNull(const_cast<CMPXMediaArray*>(mediaArray));
+        fileCount = mediaArray->Count();
+
+        }
+    MPX_DEBUG2( "CMPXCollectionViewHgImp::DoHandleSendL Entry count = %d", fileCount );
+
+    if ( fileCount > 0 )
+        {
+        const CMPXMediaArray* mediaArray =
+            aMedia.Value<CMPXMediaArray>( KMPXMediaArrayContents );
+        User::LeaveIfNull(const_cast<CMPXMediaArray*>(mediaArray));
+
+        CMPXMedia* media( NULL );
+        for ( TInt i = 0; i < fileCount; i++ )
+            {
+            media = mediaArray->AtL( i );
+            TUint flags( media->ValueTObjectL<TUint>( KMPXMediaGeneralFlags ) );
+            const TDesC& location = media->ValueText( KMPXMediaGeneralUri );
+
+            if ( !( flags & KMPXMediaGeneralFlagsIsInvalid ) &&
+                ConeUtils::FileExists( location ) )
+                {
+                TInt fileSize( 0 );
+                if ( media->IsSupported( KMPXMediaGeneralSize ) )
+                    {
+                    fileSize = media->ValueTObjectL<TInt>( KMPXMediaGeneralSize );
+                    }
+                else
+                    {
+                    RFs& fileSession = iCoeEnv->FsSession();
+                    TEntry pl;
+                    fileSession.Entry( location, pl );
+                    fileSize = pl.iSize;
+                    }
+                if ( fileSize > maxSize )
+                    {
+                    maxSize = fileSize;
+                    }
+                messageData->AppendAttachmentL( location );
+                }
+            else
+                {
+                UpdateDatabaseFlagL( KErrNotFound, *media,
+                    KMPXMediaGeneralFlagsIsInvalid, ETrue, EFalse );
+                invalidFileCount++;
+                }
+            }
+        }
+    else
+        {
+        // single file
+        fileCount = 1;
+        TUint flags = aMedia.ValueTObjectL<TUint>( KMPXMediaGeneralFlags );
+        const TDesC& location = aMedia.ValueText( KMPXMediaGeneralUri );
+
+        if ( !( flags & KMPXMediaGeneralFlagsIsInvalid ) &&
+            ConeUtils::FileExists( location ) )
+            {
+            TInt fileSize( 0 );
+            if ( aMedia.IsSupported( KMPXMediaGeneralSize ) )
+                {
+                fileSize = aMedia.ValueTObjectL<TInt>( KMPXMediaGeneralSize );
+                }
+            else
+                {
+                RFs& fileSession = iCoeEnv->FsSession();
+                TEntry pl;
+                fileSession.Entry( location, pl );
+                fileSize = pl.iSize;
+                }
+            if ( fileSize > maxSize )
+                {
+                maxSize = fileSize;
+                }
+            messageData->AppendAttachmentL( location );
+            }
+        else
+            {
+            UpdateDatabaseFlagL( KErrNotFound, aMedia,
+                KMPXMediaGeneralFlagsIsInvalid, ETrue, EFalse );
+            invalidFileCount++;
+            }
+        }
+    TBool confirmOk( EFalse );
+    MPX_DEBUG3( "CMPXCollectionViewHgImp::DoHandleSendL Invalid Count = %d, Total Count = %d", invalidFileCount, fileCount );
+    if ( invalidFileCount )
+        {
+        if ( invalidFileCount == fileCount )
+            {
+            // all files are invalid
+            iCommonUiHelper->DisplayInfoNoteL( ( invalidFileCount == 1 ) ?
+                R_MPX_COLLECTION_INFO_FILE_NOT_FOUND :
+                R_MPX_COLLECTION_SEND_ALL_INVALID_SONGS_NOTE_TXT );
+            }
+        else
+            {
+            // Show confirmation query if invalid file found
+            HBufC* queryTxt = StringLoader::LoadLC(
+                R_MPX_COLLECTION_QUERY_SEND_INVALID_SONGS_TXT );
+            CAknQueryDialog* query = CAknQueryDialog::NewL(
+                CAknQueryDialog::EConfirmationTone );
+            CleanupStack::PushL( query );
+            query->PublishDialogL( EMPlayerNoteSendInvalidSongs,
+                                KMPlayerNoteCategory);
+            CleanupStack::Pop( query );
+            confirmOk = query->ExecuteLD(
+                R_MPX_COLLECTION_GENERIC_CONFIRMATION_QUERY,
+                *queryTxt );
+            CleanupStack::PopAndDestroy( queryTxt );
+            }
+        }
+
+    if ( !invalidFileCount || confirmOk )
+        {
+        if ( !iSendUi )
+            {
+            iSendUi = CSendUi::NewL();
+            }
+        TSendingCapabilities capabilities(
+            0,
+            maxSize,
+            TSendingCapabilities::ESupportsAttachments );
+        // ignore commands from external clients so that the
+        // sending is not interrupted
+        HandleCommandL( EMPXCmdIgnoreExternalCommand );
+        // send ui leaves with error 0 if canceled, have to be trapped
+        MPX_TRAPD( err, iSendUi->ShowQueryAndSendL( messageData, capabilities ) );
+        if ( err != KErrNone )
+            {
+            HandleError( err );
+            }
+        HandleCommandL( EMPXCmdHandleExternalCommand );
+        }
+
+    // Clear selection
+    iContainer->ClearLbxSelection();
+    CleanupStack::PopAndDestroy( messageData );
+    }
+
+// -----------------------------------------------------------------------------
+// Handle rename command
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::DoHandleRenameL()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::DoHandleRenameL" );
+    CMPXCommonListBoxArrayBase* listboxArray(
+        iContainer->ListBoxArray() );
+    TInt currentIndex( iContainer->CurrentLbxItemIndex() );
+    const CMPXMedia& currentMedia( listboxArray->MediaL( currentIndex ) );
+    TMPXGeneralCategory category(
+        currentMedia.ValueTObjectL<TMPXGeneralCategory>( KMPXMediaGeneralCategory ) );
+    switch ( category )
+        {
+        case EMPXPlaylist:
+            {
+            // rename playlist
+            iCurrentMediaLOp = EMPXOpMediaLRenamePlaylist;
+            CMPXCollectionPath* path = iCollectionUtility->Collection().PathL();
+            CleanupStack::PushL( path );
+            path->Set( iContainer->CurrentLbxItemIndex() );
+            RArray<TMPXAttribute> attrs;
+            CleanupClosePushL(attrs);
+            attrs.Append(
+                TMPXAttribute( KMPXMediaIdGeneral,
+                    EMPXMediaGeneralUri | EMPXMediaGeneralId |
+                    EMPXMediaGeneralTitle ) );
+            iCollectionUtility->Collection().MediaL( *path, attrs.Array() );
+            CleanupStack::PopAndDestroy( &attrs );
+            CleanupStack::PopAndDestroy( path );
+            break;
+            }
+        case EMPXAlbum:
+        case EMPXArtist:
+        case EMPXGenre:
+        case EMPXComposer:
+            {
+            delete iNewName;
+            iNewName = NULL;
+            iNewName = HBufC::NewL( KMaxFileName );
+            TPtr ptr( iNewName->Des() );
+
+            // Set default text as current selected item text
+            const CMPXMediaArray& mediaAry = listboxArray->MediaArray();
+            CMPXMedia* origMedia( mediaAry.AtL( currentIndex ) );
+            const TDesC& title = origMedia->ValueText( KMPXMediaGeneralTitle );
+            ptr.Append( title.Left(KMaxFileName) );
+
+            CAknTextQueryDialog* query = CAknTextQueryDialog::NewL( ptr );
+            CleanupStack::PushL( query );
+            query->SetMaxLength( KMaxFileName );
+            HBufC* promptTxt = StringLoader::LoadLC( R_MPX_QTN_NMP_PRMPT_NEW_NAME );
+            query->SetPromptL( *promptTxt );
+            query->SetPredictiveTextInputPermitted( ETrue );
+            CleanupStack::PopAndDestroy( promptTxt );
+            query->PublishDialogL(
+                    EMPlayerQueryPrmptNewName,
+                    KMPlayerNoteCategory);
+            CleanupStack::Pop( query );
+            if ( query->ExecuteLD( R_MPX_CUI_RENAME_QUERY ) )
+                {
+                TMPXItemId id(
+                    currentMedia.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
+
+                CMPXMedia* media = CMPXMedia::NewL();
+                CleanupStack::PushL( media );
+                media->SetTObjectValueL<TMPXGeneralType>(
+                    KMPXMediaGeneralType, EMPXGroup );
+                media->SetTObjectValueL<TMPXGeneralCategory>(
+                    KMPXMediaGeneralCategory, EMPXSong );
+                media->SetTObjectValueL<TMPXItemId>( KMPXMediaGeneralId, id );
+
+                switch ( category )
+                    {
+                    case EMPXAlbum:
+                        {
+                        iCurrentFindAllLOp = EMPXOpFindAllLRenameAlbum;
+                        // check if it's album or artist/album
+                        const CMPXMedia& containerMedia = listboxArray->ContainerMedia();
+                        TMPXGeneralCategory containerCategory(
+                            containerMedia.ValueTObjectL<TMPXGeneralCategory>(
+                             KMPXMediaGeneralCategory ) );
+                        if ( containerCategory == EMPXArtist )
+                            {
+                            // artist/album level, need to specify artist ID in container ID
+                            TMPXItemId containerId(
+                                containerMedia.ValueTObjectL<TMPXItemId>(
+                                    KMPXMediaGeneralId ) );
+                            media->SetTObjectValueL<TMPXItemId>(
+                                KMPXMediaGeneralContainerId, containerId );
+                            }
+                        break;
+                        }
+                    case EMPXArtist:
+                        {
+                        iCurrentFindAllLOp = EMPXOpFindAllLRenameArtist;
+                        break;
+                        }
+                    case EMPXGenre:
+                        {
+                        iCurrentFindAllLOp = EMPXOpFindAllLRenameGenre;
+                        break;
+                        }
+                    case EMPXComposer:
+                        {
+                        iCurrentFindAllLOp = EMPXOpFindAllLRenameComposer;
+                        break;
+                        }
+                    default:
+                        {
+                        ASSERT( 0 );
+                        break;
+                        }
+                    }
+                RArray<TMPXAttribute> attrs;
+                CleanupClosePushL( attrs );
+                attrs.Append(
+                    TMPXAttribute( KMPXMediaIdGeneral,
+                        EMPXMediaGeneralId | EMPXMediaGeneralUri |
+                        EMPXMediaGeneralCollectionId |
+                        EMPXMediaGeneralType | EMPXMediaGeneralCategory | EMPXMediaGeneralFlags ) );
+                if ( category == EMPXAlbum || category == EMPXArtist )
+                    {
+                    attrs.Append( TMPXAttribute( KMPXMediaIdMusic,
+                        EMPXMediaMusicAlbumArtFileName ) );
+                    }
+                iCollectionUtility->Collection().FindAllL( *media, attrs.Array(), *this );
+                CleanupStack::PopAndDestroy( &attrs );
+                CleanupStack::PopAndDestroy( media );
+                }
+            break;
+            }
+        default:
+            {
+            // shouldn't reach here
+            ASSERT( 0 );
+            break;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Prepares media object for selected items
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::PrepareMediaForSelectedItemsL( CMPXMedia& aMedia )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::PrepareMediaForSelectedItemsL" );
+    CMPXMediaArray* mediaArray( CMPXMediaArray::NewL() );
+    CleanupStack::PushL( mediaArray );
+    CMPXCommonListBoxArrayBase* listBoxArray =
+        iContainer->ListBoxArray();
+    TInt count( iSelectionIndexCache->Count() );
+
+    CMPXCollectionPath* path( iCollectionUtility->Collection().PathL() );
+    CleanupStack::PushL( path );
+    TMPXItemId id( path->Id( 0 ) );
+    MPX_DEBUG2( "CMPXCollectionViewHgImp::PrepareMediaForSelectedItemsL collection ID = 0x%x", id.iId1 );
+    CleanupStack::PopAndDestroy( path );
+
+    if ( count > 0 )
+        {
+        if ( count == 1 )
+            {
+            // marked one item, if it's not valid, ignore the command
+            const CMPXMedia& listBoxMedia = listBoxArray->MediaL( iSelectionIndexCache->At(0) );
+            if ( listBoxMedia.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) == KMPXInvalidItemId )
+                {
+                // leave with special error code, this error
+                // should not trigger any error message, the operation should
+                // be terminated silently
+                User::Leave( KMPXErrDataNotReady );
+                }
+            }
+        for ( TInt i = 0; i < count; i++ )
+            {
+            const CMPXMedia& listBoxMedia = listBoxArray->MediaL( iSelectionIndexCache->At(i) );
+            if ( listBoxMedia.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) == KMPXInvalidItemId )
+                {
+                // item not ready, cache this command and execute
+                // it when the data becomes valid
+                User::Leave( KMPXErrDataNotReadyCacheCommand );
+                }
+            CMPXMedia* entry( PopulateMediaLC( listBoxMedia, id ) );
+            mediaArray->AppendL( entry );
+            CleanupStack::Pop( entry );
+            }
+        }
+    else
+        {
+        const CMPXMedia& listBoxMedia = listBoxArray->MediaL(
+            iContainer->CurrentLbxItemIndex() );
+        if ( listBoxMedia.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) == KMPXInvalidItemId )
+            {
+            // leave with special error code, this error
+            // should not trigger any error message, the operation should
+            // be terminated silently
+            User::Leave( KMPXErrDataNotReady );
+            }
+        else
+            {
+            CMPXMedia* entry( PopulateMediaLC( listBoxMedia, id ) );
+            mediaArray->AppendL( entry );
+            CleanupStack::Pop( entry );
+            }
+        }
+    aMedia.SetTObjectValueL( KMPXMediaGeneralCollectionId, id );
+    aMedia.SetCObjectValueL( KMPXMediaArrayContents, mediaArray );
+    aMedia.SetTObjectValueL( KMPXMediaArrayCount, mediaArray->Count() );
+    iNumSongAddedToPlaylist = mediaArray->Count();
+    CleanupStack::PopAndDestroy( mediaArray );
+    }
+
+// -----------------------------------------------------------------------------
+// Populates media object with information needed for save to
+// existing playlist
+// -----------------------------------------------------------------------------
+//
+CMPXMedia* CMPXCollectionViewHgImp::PopulateMediaLC(
+    const CMPXMedia& aMedia, TMPXItemId aCollectionId )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::PopulateMediaLC" );
+    CMPXMedia* entry = CMPXMedia::NewL();
+    CleanupStack::PushL( entry );
+    entry->SetTextValueL(
+        KMPXMediaGeneralTitle,
+        aMedia.ValueText( KMPXMediaGeneralTitle ) );
+    entry->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem);
+    entry->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXSong );
+    entry->SetTObjectValueL( KMPXMediaGeneralId,
+        aMedia.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
+    entry->SetTObjectValueL( KMPXMediaGeneralCollectionId, aCollectionId );
+    return entry;
+    }
+
+// -----------------------------------------------------------------------------
+// Handle rename playlist command
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::DoHandleRenamePlaylistL( const CMPXMedia& aMedia )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::DoHandleRenamePlaylistL" );
+    const TDesC& uri = aMedia.ValueText( KMPXMediaGeneralUri );
+    TParsePtrC fn( uri );
+#ifdef _DEBUG
+    TPtrC ptr( fn.NameAndExt() );
+    MPX_DEBUG2( "CMPXCollectionViewHgImp::DoHandleRenamePlaylistL Original Uri = %S", &ptr );
+#endif
+    HBufC* playlistName = HBufC::NewLC( KMaxFileName );
+    TPtr playlistNamePtr = playlistName->Des();
+    const TDesC& title = aMedia.ValueText( KMPXMediaGeneralTitle );
+    TInt ret = iCommonUiHelper->LaunchRenameDialogL(
+        title, playlistNamePtr, fn.DriveAndPath() );
+    if ( ret )
+        {
+        CMPXMedia* media = CMPXMedia::NewL();
+        CleanupStack::PushL( media );
+        media->SetTObjectValueL<TMPXGeneralType>(
+            KMPXMediaGeneralType, EMPXItem );
+        media->SetTObjectValueL<TMPXGeneralCategory>(
+            KMPXMediaGeneralCategory, EMPXPlaylist );
+        TMPXItemId id( aMedia.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
+        media->SetTObjectValueL<TMPXItemId>( KMPXMediaGeneralId, id );
+        TParsePtrC newFn( *playlistName );
+        media->SetTextValueL( KMPXMediaGeneralTitle, newFn.NameAndExt() );
+        iCollectionUiHelper->RenameL( *media, this );
+        CleanupStack::PopAndDestroy( media );
+        }
+    CleanupStack::PopAndDestroy( playlistName );
+    }
+
+// ---------------------------------------------------------------------------
+// Set/clears the flags for item in database
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::UpdateDatabaseFlagL(
+    TInt aIndex, const CMPXMedia& aMedia, TUint aFlag,
+    TBool aSet, TBool aEnableInfoDialog )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::UpdateDatabaseFlagL" );
+    MPX_DEBUG3( "CMPXCollectionViewHgImp::UpdateDatabaseFlagL aFlag = 0x%x, aSet = %d", aFlag, aSet );
+    CMPXCommonListBoxArrayBase* array( iContainer->ListBoxArray() );
+    ASSERT( array );
+
+    // set the item as invalid
+    TUint flags( 0 );
+    if ( aSet )
+        {
+        flags = KMPXMediaGeneralFlagsSetOrUnsetBit;
+        }
+    flags |= aFlag;
+
+    MPX_DEBUG2( "CMPXCollectionViewHgImp::UpdateDatabaseFlagL flag after 0x%x", flags );
+    CMPXMedia* entry = CMPXMedia::NewL();
+    CleanupStack::PushL( entry );
+    if ( aIndex > KErrNotFound )
+        {
+        MPX_DEBUG2( "CMPXCollectionViewHgImp::UpdateDatabaseFlagL using aIndex = %d", aIndex );
+        const CMPXMedia& media = array->MediaL( aIndex );
+        TMPXItemId id( media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
+        TMPXGeneralType type(
+            media.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType ) );
+        TMPXGeneralCategory category(
+            media.ValueTObjectL<TMPXGeneralCategory>( KMPXMediaGeneralCategory ) );
+        entry->SetTObjectValueL<TMPXItemId>( KMPXMediaGeneralId, id );
+        entry->SetTObjectValueL<TMPXGeneralType>(
+            KMPXMediaGeneralType, type );
+        entry->SetTObjectValueL<TMPXGeneralCategory>(
+            KMPXMediaGeneralCategory, category );
+        }
+    else
+        {
+        // try to look for the info inside aMedia
+        if ( aMedia.IsSupported( KMPXMediaGeneralId ) )
+            {
+            TMPXItemId id( aMedia.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
+            entry->SetTObjectValueL<TMPXItemId>( KMPXMediaGeneralId, id );
+            }
+        if ( aMedia.IsSupported( KMPXMediaGeneralType ) )
+            {
+            TMPXGeneralType type(
+                aMedia.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType ) );
+            entry->SetTObjectValueL<TMPXGeneralType>(
+                KMPXMediaGeneralType, type );
+            }
+        if ( aMedia.IsSupported( KMPXMediaGeneralCategory ) )
+            {
+            TMPXGeneralCategory category(
+                aMedia.ValueTObjectL<TMPXGeneralCategory>(
+                    KMPXMediaGeneralCategory ) );
+            entry->SetTObjectValueL<TMPXGeneralCategory>(
+                KMPXMediaGeneralCategory, category );
+            }
+        }
+    TUid collectionId( aMedia.ValueTObjectL<TUid>( KMPXMediaGeneralCollectionId ) );
+    entry->SetTObjectValueL<TUid>(
+        KMPXMediaGeneralCollectionId, collectionId );
+    entry->SetTObjectValueL<TUint>( KMPXMediaGeneralFlags, flags );
+
+    // Update the collection via CommandL
+    CMPXCommand* cmd( CMPXCommand::NewL() );
+    CleanupStack::PushL( cmd );
+    cmd->SetTObjectValueL( KMPXCommandGeneralId, KMPXCommandIdCollectionSet );
+    cmd->SetTObjectValueL( KMPXCommandGeneralDoSync, ETrue );
+    TUid colId( entry->ValueTObjectL<TUid>(KMPXMediaGeneralCollectionId) );
+    cmd->SetTObjectValueL( KMPXCommandGeneralCollectionId, colId.iUid );
+    cmd->SetCObjectValueL<CMPXMedia>( KMPXCommandColSetMedia, entry );
+    iCollectionUtility->Collection().CommandL( *cmd );
+    CleanupStack::PopAndDestroy( cmd );
+
+    CleanupStack::PopAndDestroy( entry );
+    if ( aEnableInfoDialog && KMPXMediaGeneralFlagsIsInvalid == aFlag )
+        {
+        iCommonUiHelper->DisplayInfoNoteL( R_MPX_COLLECTION_INFO_FILE_NOT_FOUND );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Get duration of current view
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::GetDurationL()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::GetDurationL" );
+    CMPXCollectionPath* cpath = iCollectionUtility->Collection().PathL();
+    CleanupStack::PushL( cpath );
+    cpath->Back();  // Container
+    RArray<TMPXAttribute> attrs;
+    CleanupClosePushL(attrs);
+    iCurrentMediaLOp = EMPXOpMediaLGetContainerInfo;
+    attrs.Append( KMPXMediaGeneralDuration );
+    iCollectionUtility->Collection().MediaL( *cpath, attrs.Array() );
+    CleanupStack::PopAndDestroy( &attrs );
+    CleanupStack::PopAndDestroy( cpath );
+    }
+
+// ---------------------------------------------------------------------------
+// Handles file check result
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::DoHandleFileCheckResultL(
+    TUid aViewToActivate, const CMPXMedia& aMedia )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::HandleFileCheckResultL" );
+    const TDesC& location = aMedia.ValueText( KMPXMediaGeneralUri );
+    if ( location.Length() == 0 || ConeUtils::FileExists( location ) )
+        {
+#ifdef SINGLE_CLICK_INCLUDED
+        HandleListBoxEventL( NULL, EEventItemSingleClicked );
+#else
+        HandleListBoxEventL( NULL, EEventItemClicked );   
+#endif
+        HBufC* buf = HBufC::NewLC( 5 ); // magic number, array granularity
+        buf->Des().AppendNum( iContainer->CurrentLbxItemIndex() );
+        // Activate view via View Framework
+        iViewUtility->ActivateViewL( aViewToActivate, buf );
+        CleanupStack::PopAndDestroy( buf );
+        }
+    else
+        {
+        // mark database entry for this item as invalid
+        UpdateDatabaseFlagL( iContainer->CurrentLbxItemIndex(),
+            aMedia, KMPXMediaGeneralFlagsIsInvalid, ETrue );
+        }
+    }
+
+#ifdef __ENABLE_MSK
+// ---------------------------------------------------------------------------
+// Updates the middle softkey display
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::UpdateMiddleSoftKeyDisplayL( TInt aMskId )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::UpdateMiddleSoftKeyDisplayL" );
+    CEikButtonGroupContainer* cba = Cba();
+    if ( cba )
+        {
+        if ( !iContainer->CurrentListItemCount() ) // list is empty
+            {
+            // remove middle softkey label
+            iCommonUiHelper->RemoveMiddleSoftKeyLabel( *cba );
+            MPX_DEBUG1( "CMPXCollectionViewHgImp::UpdateMiddleSoftKeyDisplayL - remove label, list is empty" );
+            }
+        else if ( iContainer->CurrentSelectionIndicesL()->Count() ) // marked items
+            {
+            CFbsBitmap* bitmap = NULL;
+            CFbsBitmap* mask = NULL;
+            AknsUtils::CreateColorIconL(
+                AknsUtils::SkinInstance(),
+                KAknsIIDQgnPropMskMenu,
+                KAknsIIDQsnComponentColors,
+                EAknsCIQsnComponentColorsCG13,
+                bitmap,
+                mask,
+                AknIconUtils::AvkonIconFileName(),
+                EMbmAvkonQgn_prop_msk_menu,
+                EMbmAvkonQgn_prop_msk_menu_mask,
+                KRgbBlack);
+
+            CleanupStack::PushL(bitmap);
+            CleanupStack::PushL(mask);
+
+            // set middle softkey icon
+            iCommonUiHelper->SetMiddleSoftKeyIconL(*cba, bitmap, mask);
+
+            CleanupStack::PopAndDestroy(2, bitmap);
+            MPX_DEBUG1("CMPXCollectionViewHgImp::UpdateMiddleSoftKeyDisplayL - items marked, show icon");
+            }
+        else
+            {
+            // set middle softkey label
+            iCommonUiHelper->SetMiddleSoftKeyLabelL(
+                *cba,
+                aMskId,
+                EAknSoftkeyForwardKeyEvent );
+            iCurrentMskId = aMskId;
+            MPX_DEBUG1( "CMPXCollectionViewHgImp::UpdateMiddleSoftKeyDisplayL - label displayed" );
+            }
+        cba->DrawDeferred();
+        }
+    }
+#endif // __ENABLE_MSK
+
+
+// ---------------------------------------------------------------------------
+// Handles the completion of adding a playlist event
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandleAddCompletedL(
+    CMPXMedia* aPlaylist, TInt aError )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::HandleAddCompletedL" );
+    iAddingToNewPlaylist = EFalse;
+    iCommonUiHelper->DismissWaitNoteL();
+    HandleCommandL( EMPXCmdHandleExternalCommand );
+    if ( aError == KErrNone )
+        {
+        // Show confirmation note
+        if( aPlaylist->IsSupported( KMPXMediaGeneralId ) )
+            {
+            iPlaylistId = aPlaylist->ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId );
+            }
+        MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleAddCompletedL iPlaylistId = 0x%x", iPlaylistId.iId1 );
+        if ( iCurrentPlaylistOp != EMPXOpPLCreating )
+            {
+            HBufC* confirmTxt( NULL );
+            const TDesC& title( aPlaylist->ValueText( KMPXMediaGeneralTitle ) );
+            TMPlayerSecondaryDisplayNote noteId( EMPlayerNoteNone );
+            if ( iNumSongAddedToPlaylist > 1 )
+                {
+                confirmTxt = StringLoader::LoadLC(
+                    R_MPX_QTN_MUS_MULTIPLE_TRACKS_ADDED_TO_PL,
+                    title, iNumSongAddedToPlaylist );
+                noteId = EMPlayerNoteAddManySongToPlaylist;
+                }
+            else
+                {
+                confirmTxt = StringLoader::LoadLC(
+                    R_MPX_QTN_MUS_NOTE_TRACK_ADDED_TO_PL, title );
+                noteId = EMPlayerNoteAddSongToPlaylist;
+                }
+
+            CAknConfirmationNote* note = new ( ELeave ) CAknConfirmationNote();
+
+            note->PublishDialogL(
+                noteId,
+                KMPlayerNoteCategory );
+
+            if ( iCoverDisplay )
+                {
+                CAknMediatorFacade* covercl = AknMediatorFacade( note );
+                if ( covercl )
+                    {
+                    covercl->BufStream() << title;
+                    if ( iNumSongAddedToPlaylist > 1 )
+                        {
+                        covercl->BufStream().WriteInt32L( iNumSongAddedToPlaylist );
+                        }
+                    }
+                }
+
+            note->ExecuteLD( *confirmTxt );
+            CleanupStack::PopAndDestroy( confirmTxt );
+
+            }
+        else // iCurrentPlaylistOp == EMPXOpPLCreating
+            {
+            // Re-open the collection, because we cannot
+            // depend on the change events that could be a race condition
+            // against this HandleAddCompleteL() callback!
+            //
+            DoIncrementalOpenL();
+            }
+        }
+    else
+        {
+        HandleError( aError );
+        }
+
+    delete aPlaylist;
+    if ( iContainer )
+        {
+        iContainer->ClearLbxSelection();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Handles the completion of setting a media event.
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandleSetCompletedL( CMPXMedia* aMedia, TInt aError )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::HandleSetCompletedL" );
+    delete aMedia;
+    if ( aError == KErrNone )
+        {
+        // save successful, set flag so that it can't be saved again
+        MPXTlsHelper::SetNeedSave( EFalse );
+        }
+    else
+        {
+        if (iContainer->IsInReorderMode())
+            {
+            DeactivateReorderGrabbedModeL(ETrue);
+            }
+        HandleError( aError );
+        }
+    if ( iIsSavingReorderPlaylist )
+        {
+        // change messages are ignored during save command,
+        // when save is complete, it should open the collection again to refresh
+        // display data
+        DoIncrementalOpenL();
+        iIsSavingReorderPlaylist = EFalse;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Handle playback message
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::DoHandlePlaybackMessageL( const CMPXMessage& aMessage )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::DoHandlePlaybackMessageL" );
+    TMPXMessageId id( aMessage.ValueTObjectL<TMPXMessageId>( KMPXMessageGeneralId ) );
+    if ( KMPXMessageGeneral == id )
+        {
+        TInt type( aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralType ) );
+        TInt data( aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralData ) );
+        TInt event( aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralEvent ) );
+        switch ( event )
+            {
+            case TMPXPlaybackMessage::EActivePlayerChanged:
+            case TMPXPlaybackMessage::EStateChanged:
+                {
+                MPX_DEBUG2( "CMPXCollectionViewHgImp::HandlePlaybackMessageL - EStateChanged(%d)", type );
+                UpdatePlaybackStatusL();
+                break;
+                }
+            case TMPXPlaybackMessage::EError:
+                {
+                if ( iCommonUiHelper )
+                    {
+                    iCommonUiHelper->DismissWaitNoteL();
+                    HandleCommandL( EMPXCmdHandleExternalCommand );
+                    }
+                if ( iIsDeleting )
+                    {
+                    iCollectionUiHelper->Cancel();
+                    iIsDeleting = EFalse;
+                    // if delete is interrupted, reopen
+                    DoIncrementalOpenL();
+                    }
+                MPX_DEBUG2( "CMPXCollectionViewHgImp::HandlePlaybackMessageL Error = %d", data );
+                break;
+                }
+            case TMPXPlaybackMessage::EPlayerUnavailable:
+                {
+                if ( iUpnpFrameworkSupport )
+                    {
+                    if ( data == KErrNotFound )
+                        {
+                        if ( iViewUtility->ActiveViewType() ==
+                            TUid::Uid( KMPXPluginTypeCollectionUid ) )
+                            {
+                            if ( iSubPlayerName )
+                                {
+                                HBufC* dialogText = StringLoader::LoadLC( R_MPX_COLLECTION_NOTE_REMOTE_CONNECTION_FAILED,
+                                                                          *iSubPlayerName );
+                                CAknErrorNote* errNote = new(ELeave) CAknErrorNote(ETrue);
+                                errNote->SetTimeout(CAknNoteDialog::ELongTimeout);
+                                errNote->ExecuteLD( *dialogText );
+                                CleanupStack::PopAndDestroy( dialogText );
+                                }
+                            }
+                        }
+                    }
+                // else we don't show any error note
+                break;
+                }
+            default:
+                {
+                // ignore other messages
+                break;
+                }
+            }
+        // Fix EBLI-7CFE4D press select key very quick cause System Error KErrArgument
+        if (event != TMPXPlaybackMessage::ECommandReceived)
+            {
+            iHandlingKeyEvent = EFalse;
+            }
+        }
+    else
+        {
+        iHandlingKeyEvent = EFalse;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Handle collection message
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::DoHandleCollectionMessageL( const CMPXMessage& aMessage )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::DoHandleCollectionMessageL" );
+    TMPXMessageId id( aMessage.ValueTObjectL<TMPXMessageId>( KMPXMessageGeneralId ) );
+    if ( KMPXMessageGeneral == id )
+        {
+        TInt event( aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralEvent ) );
+        TInt type( aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralType ) );
+        TInt data( aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralData ) );
+        MPX_DEBUG4( "CMPXCollectionViewHgImp::DoHandleCollectionMessageL Event = %d, Type() = %d, data = %d",
+            event, type, data );
+
+        // Only handle collection messages while collection view is in focus
+        // and not transitioning views
+        if( iContainer )
+            {
+
+            if ( event == TMPXCollectionMessage::EPathChanged &&
+                 type == EMcPathChangedByOpen &&
+                 data == EMcContainerOpened
+                 )
+                { // Open new entries
+                MPX_DEBUG1( "CMPXCollectionViewHgImp::DoHandleCollectionMessageL calling OpenL EMcPathChangedByOpen" );
+                if ( iContainer->IsInReorderMode() )
+                    {
+                    MPX_DEBUG1( "CMPXCollectionViewHgImp::DoHandleCollectionMessageL canceling reorder mode" );
+                    // cancel reorder mode if path has changed
+                    ProcessCommandL( EMPXCmdReorderDone );
+                    }
+                if( iContainer->CurrentSelectionIndicesL()->Count() )
+                    {
+                    HandleCommandL( EAknUnmarkAll );
+                    }
+
+                // Incremental Open when browsing to the next level
+                DoIncrementalOpenL();
+                }
+            else if ( event == TMPXCollectionMessage::EPathChanged &&
+                      type == EMcPathChangedByCollectionChange )
+                {
+                // Re-Fetch entries only if we are in playlist
+                // creation idle stage. Ignore change messages during playlist op
+                // because there are race conditions and we don't know
+                // which handle open is actually opening the playlist!
+                //
+                // don't call openL if it's currently deleting
+                // don't call openL if saving after reorder
+                // don't call openL if renaming
+                if( iCurrentPlaylistOp == EMPXOpPLIdle  && !iIsDeleting
+                    && !iIsSavingReorderPlaylist && iSetMediaLCount == KErrNotFound )
+                    {
+                    MPX_DEBUG1( "CMPXCollectionViewHgImp::DoHandleCollectionMessageL calling OpenL EMcPathChangedByCollectionChange" );
+                    if( iContainer->CurrentSelectionIndicesL()->Count() )
+                        {
+                        HandleCommandL( EAknUnmarkAll );
+                        }
+                    // dismiss find pane if it's visible
+                    if( iContainer->FindBoxVisibility() )
+                        {
+                        iContainer->EnableFindBox( EFalse );
+                        }
+                    DoIncrementalOpenL();
+                    }
+                else
+                    {
+                    MPX_DEBUG4( "CMPXCollectionViewHgImp::DoHandleCollectionMessageL PathChange Message Ignored iIsDeleting = %d, iCurrentPlaylistOp = %d, iIsSavingReorderPlaylist = %d", iIsDeleting, iCurrentPlaylistOp, iIsSavingReorderPlaylist );
+                    MPX_DEBUG2( "CMPXCollectionViewHgImp::DoHandleCollectionMessageL PathChange Message Ignored iSetMediaLCount = %d", iSetMediaLCount );
+                    }
+                }
+            else if ( event == TMPXCollectionMessage::EPathChanged &&
+                 type == EMcPathChangedByOpen &&
+                 data == EMcItemOpened)
+                {
+                // opened a song, revert back one level when collection view
+                // is activated again
+                iIncrementalOpenUtil->Stop();
+                iBackOneLevel = ETrue;
+                }
+            else if( event == TMPXCollectionMessage::EBroadcastEvent )
+                {
+                MPX_DEBUG2( "CMPXCollectionViewHgImp::DoHandleCollectionMessageL - broadcast type = %d", type );
+                if ( type == EMcMsgDiskRemoved &&
+                     iViewUtility->ActiveViewType() != TUid::Uid(KMPXPluginTypeWaitNoteDialogUid) )
+                    {
+                    AknDialogShutter::ShutDialogsL( *CEikonEnv::Static() );
+                    }
+                if ( iConfirmationDlg && ( type == EMcMsgUSBMTPStart || type == EMcMsgUSBMassStorageStart ) )
+                    {
+                    TKeyEvent kEvent;
+                    kEvent.iCode = EKeyEscape;
+                    kEvent.iScanCode = EStdKeyEscape;
+                    iConfirmationDlg->OfferKeyEventL( kEvent, EEventKey );
+                    }
+
+                }
+        else if ( event == TMPXCollectionMessage::EFocusChanged && iContainer && iCoverDisplay )
+            {
+            if ( data != KErrNotFound &&
+                 data < iContainer->CurrentListItemCount() &&
+                 !iIgnoreNextFocusChangedMessage )
+                {
+                MPX_DEBUG2( "CMPXCollectionViewHgImp::DoHandleCollectionMessageL - EFocusChanged to %d", data );
+                iContainer->SetLbxCurrentItemIndexAndDraw( data );
+                }
+            iIgnoreNextFocusChangedMessage = EFalse;
+            }
+            } // if iContainer
+
+        // System events need to be checked regardless of iContainer
+        //
+        if( event == TMPXCollectionMessage::EBroadcastEvent )
+            {
+            if((type == EMcMsgUSBMassStorageStart ) || (type == EMcMsgUSBMTPEnd) || (type == EMcMsgRefreshEnd))
+                {
+                iCollectionCacheReady = EFalse;
+                }
+            // USB flags
+            //
+            if( type == EMcMsgUSBMassStorageStart || type == EMcMsgUSBMTPStart )
+                {
+                iUSBOnGoing = ETrue;
+                }
+            else if( type == EMcMsgUSBMassStorageEnd || type == EMcMsgUSBMTPEnd )
+                {
+                iUSBOnGoing = EFalse;
+                RProperty::Set( KMPXViewPSUid,
+                                KMPXUSBUnblockingPSStatus,
+                                EMPXUSBUnblockingPSStatusUninitialized );
+                }
+            else if( type == EMcMsgUSBMTPNotActive )
+                {
+                RProperty::Set( KMPXViewPSUid,
+                                KMPXUSBUnblockingPSStatus,
+                                EMPXUSBUnblockingPSStatusActive );
+				}
+
+            if ( iIsEmbedded && type == EMcMsgUSBMassStorageEnd )
+            	{
+            	DoIncrementalOpenL();
+            	}
+            } // if event == EBroadcastEvent
+        } // if ( KMPXMessageGeneral == id )
+    }
+
+// ---------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::DoIncrementalOpenL
+// Start the incremental fetching algorithm
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::DoIncrementalOpenL( TBool aShowWaitDlg )
+    {
+     MPX_FUNC( "CMPXCollectionViewHgImp::DoIncrementalOpenL" );
+    // Show the opening note if > 1.5 seconds
+    if( aShowWaitDlg )
+        {
+        //StartWaitNoteL( EMPXOpeningNote );
+        }
+
+    // Cancel any reads
+    iIncrementalOpenUtil->Stop();
+
+    // Start the read
+    RArray<TMPXAttribute> attrs;
+    CleanupClosePushL( attrs );
+    TArray<TMPXAttribute> ary = attrs.Array();
+    iIncrementalOpenUtil->SetDelay( KIncrementalDelayNone );
+    iIncrementalOpenUtil->StartL( ary, KIncrementalFetchBlockSize,
+                                  KErrNotFound, CMPXCollectionOpenUtility::EFetchNormal );
+    iIncrementalOpenUtil->SetDelay( KIncrementalDelayHalfSecond );
+    CleanupStack::PopAndDestroy( &attrs );
+
+    // Default empty text
+    iContainer->SetLbxEmptyTextL( KNullDesC );
+    iContainer->DrawDeferred();
+    iFirstIncrementalBatch = ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// Start wait note for delayed action due to the items not ready
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::StartDelayedActionL(
+    TInt aCommand, TDesC& aNote,TBool aSkipDisplay  )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::StartDelayedActionL" );
+    HandleCommandL( EMPXCmdIgnoreExternalCommand );
+    if(!aSkipDisplay)
+        {
+    	iCommonUiHelper->ShowWaitNoteL( aNote, R_AVKON_SOFTKEYS_EMPTY, ETrue, this );
+        }
+
+    iCachedCommand = aCommand;
+    const CArrayFix<TInt>* array (
+        iContainer->CurrentSelectionIndicesL() ); // not owned
+    TInt arrayCount( array->Count() );
+    iCachedSelectionIndex->Reset();
+    for ( TInt i = 0; i < arrayCount; i++ )
+        {
+        iCachedSelectionIndex->AppendL( array->At( i ) );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From MProgressDialogCallback
+// Callback method. Get's called when a dialog is dismissed
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::DialogDismissedL( TInt aButtonId )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::DialogDismissedL" );
+    if ( iCommandInitiator )
+        {
+        iCommandInitiator->CancelCommand( KMediatorSecondaryDisplayDomain,
+                                      KMPlayerNoteCategory,
+                                      iWaitNoteId );
+        }
+
+    switch ( aButtonId )
+        {
+        case EAknSoftkeyCancel:
+            {
+            iIsWaitNoteCanceled = ETrue;
+            if( iIsDeleting )
+                {
+                iCollectionUiHelper->Cancel();
+                iIsDeleting = EFalse;
+                // if delete is interrupted, reopen
+                }
+            else if ( iSetMediaLCount > 0 )
+                {
+                // cancel the async request
+                iCollectionUtility->Collection().CancelRequest();
+                iSetMediaLCount = KErrNotFound;
+
+                DoIncrementalOpenL();
+                }
+            else if ( iIsAddingToPlaylist )
+                {
+                // cancel incremental adding of songs
+                iCommonUiHelper->CancelCollectionOperation();
+                iIsAddingToPlaylist = EFalse;
+                }
+            break;
+            }
+        default:
+            {
+            // no special handling for other cases
+            break;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From MMPXCollectionObserver
+// Handle collection message
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandleCollectionMessage(
+    CMPXMessage* aMessage, TInt aError )
+    {
+    if ( aError == KErrNone && aMessage )
+        {
+        TRAP_IGNORE( DoHandleCollectionMessageL( *aMessage ) );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From MMPXCollectionObserver
+// Handles the collection entries being opened. Typically called
+// when client has Open()'d a folder
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandleOpenL(
+    const CMPXMedia& aEntries,
+    TInt aIndex,
+    TBool aComplete,
+    TInt aError )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::HandleOpenL 4" );
+    iHandlingKeyEvent = EFalse;
+    if( aError == KErrNone )
+        {
+        if ( !iContainer )
+            {
+            // View is not active. Ignore.
+            return;
+            }
+        // handle deferred notification when view is in focus but not for view transitions
+        if ( iActivateBackStepping )
+            {
+	        HandleBacksteppingActivation();
+		    }
+
+        iCollectionReady = aComplete;
+#ifdef __ENABLE_PODCAST_IN_MUSIC_MENU
+        if( iPodcast && !iDisablePodcasting )
+            {
+            iPodcast = EFalse;
+            UpdateListBoxL( aEntries, KMusicMenuPodcastMenuItemIndex, aComplete );
+            ( void ) aIndex;
+            }
+        else
+            {
+            UpdateListBoxL( aEntries, aIndex, aComplete );
+            }
+#else
+        UpdateListBoxL( aEntries, aIndex, aComplete );
+#endif // __ENABLE_PODCAST_IN_MUSIC_MENU
+        if ( iContainer )
+            {
+            iContainer->ContentIsReady( ETrue );
+            // this has to be done after the list box media is properly
+            // updated
+            if ( !iContainer->FindBoxVisibility() )
+                {
+                MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleOpenL find box not visible" );
+#ifdef __ENABLE_PODCAST_IN_MUSIC_MENU
+                CMPXCollectionPath* cpath( iCollectionUtility->Collection().PathL() );
+                CleanupStack::PushL( cpath );
+
+                CMPXCommonListBoxArrayBase* listboxArray(
+                    iContainer->ListBoxArray() );
+                const CMPXMedia& media( listboxArray->ContainerMedia() );
+
+                TMPXGeneralType containerType( EMPXNoType );
+                if ( media.IsSupported( KMPXMediaGeneralType ) )
+                    {
+                    containerType = media.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType );
+                    }
+
+                TMPXGeneralCategory containerCategory( EMPXNoCategory );
+                if ( media.IsSupported( KMPXMediaGeneralCategory ) )
+                    {
+                    containerCategory = media.ValueTObjectL<TMPXGeneralCategory>( KMPXMediaGeneralCategory );
+                    }
+                TBool landscapeOrientation = Layout_Meta_Data::IsLandscapeOrientation();
+                CEikButtonGroupContainer* cba = Cba();
+                if ( cba && containerType == EMPXGroup && containerCategory == EMPXAlbum && landscapeOrientation )
+                    {
+                    cba->SetCommandSetL( R_MPX_COLLECTION_TRANSPARENT_CBA );
+                    cba->MakeVisible( EFalse );
+					cba->DrawDeferred();
+                    }
+                else if ( cba )
+                    {
+                    cba->SetCommandSetL(
+                        ( cpath->Levels() == 3 && !iIsEmbedded ) ?
+                        R_MPX_OPTIONS_HIDE_CBA : R_AVKON_SOFTKEYS_OPTIONS_BACK );
+                    cba->MakeVisible( ETrue );
+                    cba->DrawDeferred();
+                    }
+
+                CleanupStack::PopAndDestroy(cpath);
+#else
+                CEikButtonGroupContainer* cba = Cba();
+                if ( cba )
+                    {
+                    cba->SetCommandSetL(
+                        ( iViewUtility->ViewHistoryDepth() == 1 && !iIsEmbedded ) ?
+                        R_AVKON_SOFTKEYS_OPTIONS_EXIT : R_AVKON_SOFTKEYS_OPTIONS_BACK );
+                    cba->DrawDeferred();
+                    }
+#endif
+                }
+            else
+                {
+                MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleOpenL find box visible" );
+                }
+
+            CMPXCommonListBoxArrayBase* array(
+                iContainer->ListBoxArray() );
+            const CMPXMedia& containerMedia = array->ContainerMedia();
+            if ( containerMedia.IsSupported( KMPXMediaGeneralTitle ) )
+                {
+                delete iTitle;
+                iTitle = NULL;
+                iTitle = containerMedia.ValueText( KMPXMediaGeneralTitle ).AllocL();
+                }
+            if ( !iContainer->IsInReorderMode() &&
+                !iAddingSong &&
+                !iInAlbumArtDialog &&
+                !iInSongDetails )
+                {
+                UpdateTitlePaneL();
+                }
+
+            TMPXGeneralType containerType( EMPXNoType );
+            if( containerMedia.IsSupported( KMPXMediaGeneralType ) )
+                {
+                containerType = containerMedia.ValueTObjectL<TMPXGeneralType>(
+                                KMPXMediaGeneralType );
+                }
+
+            TMPXGeneralCategory containerCategory( EMPXNoCategory );
+            if( containerMedia.IsSupported( KMPXMediaGeneralCategory ) )
+                {
+                containerCategory = containerMedia.ValueTObjectL<TMPXGeneralCategory>(
+                                    KMPXMediaGeneralCategory );
+                }
+            MPX_DEBUG3( "CMPXCollectionViewHgImp::HandleOpenL container type = %d, category = %d", containerType, containerCategory );
+
+            CEikMenuBar* menuBar( MenuBar() );
+            TInt resId( KErrNotFound );
+#ifdef __ENABLE_MSK
+            TInt mskId( R_QTN_MSK_OPEN );
+#endif // __ENABLE_MSK
+            if ( iIsEmbedded )
+                {
+                // embedded playlist view
+                iContainer->EnableMarking( ETrue );
+                menuBar->SetMenuTitleResourceId( R_MPX_COLLECTION_VIEW_MENUBAR_EMBEDDED_PLAYLIST_VIEW );
+                resId = R_MPX_COLLECTION_SONG_LBX_EMPTYTEXT;
+#ifdef __ENABLE_MSK
+                mskId = R_QTN_MSK_PLAY;
+#endif // __ENABLE_MSK
+                }
+            else
+                {
+                if ( containerType == EMPXGroup && containerCategory == EMPXCollection )
+                    {
+                    // music menu view
+                    iContainer->EnableMarking( EFalse );
+                    menuBar->SetMenuTitleResourceId( R_MPX_COLLECTION_VIEW_MENUBAR_MUSIC_MENU );
+                    }
+                else if ( ( containerType == EMPXGroup && containerCategory == EMPXPlaylist ) || // playlist view
+                    ( containerType == EMPXGroup && containerCategory == EMPXArtist ) || // artist view
+                    ( containerType == EMPXItem && containerCategory == EMPXArtist ) || // artist/album view
+                    ( containerType == EMPXGroup && containerCategory == EMPXAlbum ) || // album view
+                    ( containerType == EMPXGroup && containerCategory == EMPXGenre ) || // genre view
+                    ( containerType == EMPXGroup && containerCategory == EMPXComposer ) ) // composer view
+                    {
+                    iContainer->EnableMarking( EFalse );
+                    menuBar->SetMenuTitleResourceId( R_MPX_COLLECTION_VIEW_MENUBAR_NO_MARKING );
+                    switch ( containerCategory )
+                        {
+                        case EMPXArtist:
+                            {
+                            if ( containerType == EMPXGroup )
+                                {
+                                // artist view
+                                resId = R_MPX_COLLECTION_ARTIST_LBX_EMPTYTEXT;
+                                }
+                            else if ( containerType == EMPXItem )
+                                {
+                                // artist/album view
+                                resId = R_MPX_COLLECTION_ALBUM_LBX_EMPTYTEXT;
+                                }
+                            else
+                                {
+                                // should not reach here
+                                ASSERT( 0 );
+                                }
+                            break;
+                            }
+                        case EMPXAlbum:
+                            {
+                            // album view
+                            resId = R_MPX_COLLECTION_ALBUM_LBX_EMPTYTEXT;
+                            break;
+                            }
+                        case EMPXGenre:
+                            {
+                            // genre view
+                            resId = R_MPX_COLLECTION_GENRE_LBX_EMPTYTEXT;
+                            break;
+                            }
+                        case EMPXComposer:
+                            {
+                            // composer view
+                            resId = R_MPX_COLLECTION_COMPOSER_LBX_EMPTYTEXT;
+                            break;
+                            }
+                        case EMPXPlaylist:
+                            {
+                            // no special handling for playlist
+                            break;
+                            }
+                        default:
+                            {
+                            // should not reach here
+                            ASSERT( 0 );
+                            break;
+                            }
+                        }
+                    }
+                else
+                    {
+                    // tracks view
+#ifdef SINGLE_CLICK_INCLUDED
+                    iContainer->EnableMarking( EFalse );
+                    menuBar->SetMenuTitleResourceId( R_MPX_COLLECTION_VIEW_MENUBAR_NO_MARKING );
+#else
+                    iContainer->EnableMarking( ETrue );
+                    menuBar->SetMenuTitleResourceId( R_MPX_COLLECTION_VIEW_MENUBAR );
+#endif
+                    resId = R_MPX_COLLECTION_SONG_LBX_EMPTYTEXT;
+#ifdef __ENABLE_MSK
+                    mskId = R_QTN_MSK_PLAY;
+#endif // __ENABLE_MSK
+                    }
+                }
+
+            if ( resId != KErrNotFound )
+                {
+                HBufC* emptyText = StringLoader::LoadLC( resId );
+                iContainer->SetLbxEmptyTextL( *emptyText );
+                CleanupStack::PopAndDestroy( emptyText );
+                iContainer->DrawDeferred();
+                }
+
+#ifdef __ENABLE_MSK
+            // set middle softkey label display
+            UpdateMiddleSoftKeyDisplayL( mskId );
+#endif // __ENABLE_MSK
+
+            switch ( iCurrentPlaylistOp )
+                {
+                case EMPXOpPLCreating:
+                    {
+                    MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleOpenL searching for playlist" );
+                    // after creating a new playlist
+                    // playlist created callback will always come before this
+                    // iPlaylistId should have already been set, check to see if
+                    // we're in playlist view
+                    if ( iPlaylistId != 0 &&
+                        containerType == EMPXGroup && containerCategory == EMPXPlaylist )
+                        {
+                        const CMPXMediaArray& mediaArray = array->MediaArray();
+                        TInt arrayCount( mediaArray.Count() );
+                        for ( TInt i = 0; i < arrayCount; i++ )
+                            {
+                            CMPXMedia* origMedia( mediaArray.AtL( i ) );
+                            TMPXItemId plId = origMedia->ValueTObjectL<TMPXItemId>(
+                                KMPXMediaGeneralId );
+                            if ( plId == iPlaylistId )
+                                {
+                                MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleOpenL Playlist match found 0x%x", iPlaylistId.iId1 );
+                                iCurrentPlaylistOp = EMPXOpPlOpening;
+                                iContainer->SetLbxCurrentItemIndex( i );
+                                HandleListBoxEventL( NULL, // not used
+                                    EEventEnterKeyPressed );
+                                break;
+                                }
+
+                            // Stay in Creating state as every OpenL()
+                            // will be called back with a HandleOpenL()
+                            // During playlist creation, there is a race condition
+                            // between HandleCollectionMessage() -> Collection change -> OpenL()
+                            // and playlist added's  OpenL()
+                            }
+                        }
+                    break;
+                    }
+                case EMPXOpPlOpening:
+                    {
+                    // check how many songs are stored in collection
+                    iCurrentMediaLOp = EMPXOpMediaLNewPlaylistCollectionSongCount;
+                    CMPXCollectionPath* path = iCollectionUtility->Collection().PathL();
+                    CleanupStack::PushL( path );
+                    path->Back();
+                    RArray<TMPXAttribute> attrs;
+                    CleanupClosePushL( attrs );
+                    attrs.Append( KMPXMediaColDetailNumberOfItems );
+                    iCollectionUtility->Collection().MediaL( *path, attrs.Array() );
+                    CleanupStack::PopAndDestroy( &attrs );
+                    CleanupStack::PopAndDestroy( path );
+                    iCurrentPlaylistOp = EMPXOpPLIdle;
+                    break;
+                    }
+                case EMPXOpPLIdle: // fall through
+                default:
+                    {
+                    // Update Duration
+                    //
+                    if ( !iContainer->IsInReorderMode() && !iAddingSong )
+                        {
+                        GetDurationL();
+                        }
+                    break;
+                    }
+                }
+            iPlaylistId = 0;
+            }
+        }
+    else
+        {
+        if ( iContainer )
+            {
+#ifdef __ENABLE_PODCAST_IN_MUSIC_MENU
+            CMPXCollectionPath* cpath( iCollectionUtility->Collection().PathL() );
+            CleanupStack::PushL( cpath );
+
+            // media is not valid until the first HandleOpenL call
+            CEikButtonGroupContainer* cba = Cba();
+            if ( cba )
+                {
+                cba->SetCommandSetL(
+                    ( cpath->Levels() == 2 && !iIsEmbedded ) ?
+                    R_AVKON_SOFTKEYS_OPTIONS_BACK : R_AVKON_SOFTKEYS_OPTIONS_BACK );
+                cba->DrawDeferred();
+                }
+
+            CleanupStack::PopAndDestroy(cpath);
+#else
+            CEikButtonGroupContainer* cba = Cba();
+            if ( cba )
+                {
+                cba->SetCommandSetL(
+                    ( iViewUtility->ViewHistoryDepth() == 1 && !iIsEmbedded ) ?
+                    R_AVKON_SOFTKEYS_OPTIONS_EXIT : R_AVKON_SOFTKEYS_OPTIONS_BACK );
+                cba->DrawDeferred();
+                }
+
+#endif
+            }
+        if (aError == KErrNotFound)
+            {
+            HandleCommandL(EAknSoftkeyBack);
+            }
+        else
+            {
+            HandleError( aError );
+            }
+        }
+    if ( iIsDeleting )
+        {
+        // nothing else to delete
+        iIsDeleting = EFalse;
+        if ( iProgressDialog )
+            {
+            iProgressDialog->ProcessFinishedL();
+            }
+        HandleCommandL( EMPXCmdHandleExternalCommand );
+        }
+    if ( iPlayIndex > KErrNotFound )
+        {
+        CMPXCollectionPath* cpath( iCollectionUtility->Collection().PathL() );
+        CleanupStack::PushL( cpath );
+        cpath->Set( iPlayIndex );
+        iPlayIndex = KErrNotFound;
+        iCollectionUtility->Collection().OpenL( *cpath, EMPXOpenPlaylistOnly );
+        iFirstIncrementalBatch = ETrue;
+        CleanupStack::PopAndDestroy( cpath );
+        }
+    if ( ( iCachedCommand != KErrNotFound ) && iCollectionReady )
+        {
+        if((iCachedCommand != EMPXCmdRemove) && (iCachedCommand != EMPXCmdCommonDelete) && (iCachedCommand != EMPXCmdDelete) )
+            {
+        iCommonUiHelper->DismissWaitNoteL();
+        HandleCommandL( EMPXCmdHandleExternalCommand );
+            }
+        else
+            {
+            iCachedCommand = EMPXCmdRemove;
+            }
+        if( iContainer )
+            {
+            iContainer->SetCurrentSelectionIndicesL( iCachedSelectionIndex );
+            }
+        HandleCommandL( iCachedCommand );
+        iCachedSelectionIndex->Reset();
+        iCachedCommand = KErrNotFound;
+        }
+
+    // Close the opening wait note, if the current item is valid or all open completes
+    if ( iContainer && !aComplete )
+        {
+        // if the list is empty, it shouldn't go in this path as aComplete should be ETrue
+        CMPXCommonListBoxArrayBase* listboxArray(
+            iContainer->ListBoxArray() );
+        const CMPXMedia& currentMedia( listboxArray->MediaL( aIndex ) );
+        }
+    else
+        {
+        if ( EMPXOpeningNote == iNoteType || EMPXImmediatelyOpeningNote == iNoteType )
+            {
+            CloseWaitNoteL();
+            }
+        }
+
+    MPX_PERF_CHECKPT("Collection View opened");
+    }
+
+// ---------------------------------------------------------------------------
+// From MMPXCollectionObserver
+// Handles the collection entries being opened.
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandleOpenL(
+    const CMPXCollectionPlaylist& /*aPlaylist*/,
+    TInt /*aError*/ )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::HandleOpenL 2" );
+    iHandlingKeyEvent = EFalse;
+    // Do Nothing: playback/fetch client should handle this stage
+    }
+
+// ---------------------------------------------------------------------------
+// From MMPXCollectionObserver
+// Handle media properties
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandleCollectionMediaL(
+    const CMPXMedia& aMedia,
+    TInt aError)
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::HandleCollectionMediaL" );
+
+    TInt nextMediaLOp( EMPXOpMediaLIdle );
+    if ( aError == KErrNone )
+        {
+        switch ( iCurrentMediaLOp )
+            {
+            case EMPXOpMediaLGetContainerInfo:
+                {
+                delete iDuration;
+                iDuration = NULL;
+                if ( aMedia.IsSupported( KMPXMediaGeneralDuration ) )
+                    {
+                    TInt duration(
+                        aMedia.ValueTObjectL<TInt>( KMPXMediaGeneralDuration ) );
+                    if ( duration > 0 )
+                        {
+                        // only display duration when the list contains something
+                        iDuration = iCommonUiHelper->DisplayableDurationInTextL( duration/KMilliSecondsToSeconds );
+                        }
+                    }
+                UpdateNaviPaneL();
+                break;
+                }
+            case EMPXOpMediaLSend:
+                {
+                DoHandleSendL( aMedia );
+                if ( !iContainer->FindBoxVisibility() )
+                    {
+                    iContainer->RestoreFindBoxPopupCBA();
+                    }
+                break;
+                }
+            case EMPXOpMediaLSongDetailsFileCheck:
+                {
+                if ( iContainer )
+                    {
+                    DoHandleFileCheckResultL(
+                        TUid::Uid( KMPXPluginTypeMetadataEditorUid ), aMedia );
+                    if ( !iContainer->FindBoxVisibility() )
+                        {
+                        iContainer->RestoreFindBoxPopupCBA();
+                        }
+                    }
+                break;
+                }
+            case EMPXOpMediaLAlbumArtFileCheck:
+                {
+                if ( iContainer )
+                    {
+                    DoHandleFileCheckResultL(
+                        TUid::Uid( KMPXPluginTypeAlbumArtEditorUid ), aMedia );
+
+                    if ( !iContainer->FindBoxVisibility() )
+                        {
+                        iContainer->RestoreFindBoxPopupCBA();
+                        }
+                    }
+                break;
+                }
+            case EMPXOpMediaLCollectionDetails:
+                {
+                DoShowCollectionDetailsL( aMedia );
+                break;
+                }
+            case EMPXOpMediaLPlaylistDetails:
+                {
+                DoShowPlaylistDetailsL( aMedia );
+                break;
+                }
+            case EMPXOpMediaLRenamePlaylist:
+                {
+                DoHandleRenamePlaylistL( aMedia );
+                break;
+                }
+            case EMPXOpMediaLNewPlaylistCollectionSongCount:
+                {
+                TInt songsCount( 0 );
+                if ( aMedia.IsSupported( KMPXMediaColDetailNumberOfItems ) )
+                    {
+                    songsCount =
+                        aMedia.ValueTObjectL<TInt>( KMPXMediaColDetailNumberOfItems );
+                    }
+                if ( songsCount > 0 )
+                    {
+                    // show add songs prompt only if collection contains
+                    // at least one song
+                    MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleCollectionMediaL openning add songs view, collection contains %d songs", songsCount );
+                    CAknQueryDialog* confirmationDlg = CAknQueryDialog::NewL(
+                        CAknQueryDialog::EConfirmationTone );
+                    CleanupStack::PushL( confirmationDlg );
+                    HBufC* promptTxt = StringLoader::LoadLC(
+                        R_MPX_QTN_NMP_QUERY_ADD_SONGS );
+                    confirmationDlg->SetPromptL( *promptTxt );
+                    CleanupStack::PopAndDestroy( promptTxt );
+                    confirmationDlg->PublishDialogL(
+                        EMPlayerQueryAddSongsToPlaylist,
+                        KMPlayerNoteCategory);
+                    CleanupStack::Pop( confirmationDlg );
+                    AppUi()->StopDisplayingMenuBar();
+                    if ( confirmationDlg->ExecuteLD( R_MPX_CUI_ADD_SONGS_CONFIRMATION_QUERY ) )
+                        {
+                        HandleCommandL( EMPXCmdAddSongs );
+                        iCurrentMediaLOp = EMPXOpMediaLNewPlaylistCollectionSongCount;
+                        }
+                    }
+#ifdef _DEBUG
+                else
+                    {
+                    MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleCollectionMediaL collection empty, not opening add songs view" );
+                    }
+#endif // _DEBUG
+                break;
+                }
+            case EMPXOpMediaLCopyToRemote:
+                {
+                if ( iUpnpFrameworkSupport )
+                    {
+                    DoHandleCopyToRemoteL( aMedia );
+                    }
+                break;
+                }
+
+            case EMPXOpMediaLFindInMusicShopSongDetails:
+                {
+                const TDesC& location = aMedia.ValueText( KMPXMediaGeneralUri );
+                if ( location != KNullDesC && ConeUtils::FileExists( location ) )
+                    {
+                    HBufC* buf = HBufC::NewLC( 5 ); // magic number to hold index value
+                    buf->Des().AppendNum(
+                        iContainer->CurrentLbxItemIndex() );
+                    // set current list box index
+                    SetParamL( buf );
+                    CleanupStack::PopAndDestroy( buf );
+
+                    DoGetSongMediaPropertyL();
+                    // Set the next operation to handle MediaL completed.
+                    nextMediaLOp = EMPXOpMediaLFindInMusicShopMediaLCompleted;
+                    }
+                else
+                    {
+                    CMPXCollectionPath* cpath = iCollectionUtility->Collection().PathL();
+                    CleanupStack::PushL( cpath );
+                    TInt currentDepth( cpath->Levels() );
+                    CleanupStack::PopAndDestroy( cpath );
+                    CMPXCommonListBoxArrayBase* listboxArray =
+                        iContainer->ListBoxArray();
+                    TInt currentIndex =
+                        iContainer->CurrentLbxItemIndex();
+                    const CMPXMedia& currentMedia = listboxArray->MediaL( currentIndex );
+                    TMPXGeneralCategory category(
+                        currentMedia.ValueTObjectL<TMPXGeneralCategory>( KMPXMediaGeneralCategory ) );
+                    const CMPXMediaArray& mediaAry( listboxArray->MediaArray() );
+                    CMPXMedia* origMedia( mediaAry.AtL( currentIndex ) );
+                    const TDesC& title( origMedia->ValueText( KMPXMediaGeneralTitle ) );
+                    if ( ( title.Length() > 0 ) && ( title.Length() < KMaxFileName ) )
+                        {
+                        switch ( category )
+                            {
+                            case EMPXAlbum:
+                                {
+                                const CMPXMedia& containerMedia = listboxArray->ContainerMedia();
+                                // The Artist/Album View Title shows the Artist name
+                                const TDesC& titleArtist =
+                                        containerMedia.ValueText( KMPXMediaGeneralTitle );
+                                HBufC* unknownArtistText =
+                                        StringLoader::LoadLC( R_MPX_QTN_NMP_UNKNOWN_ARTIST );
+                                // 4 is the level of Artist and Album View
+                                if ( currentDepth == 4 && titleArtist != unknownArtistText->Des() )
+                                    {
+                                    DoFindInMusicShopL(KCategoryEmpty, titleArtist, title); // Artist and Album View
+                                    }
+                                else
+                                    {
+                                    DoFindInMusicShopL(KCategoryEmpty, KCategoryEmpty, title); // Album View
+                                    }
+                                CleanupStack::PopAndDestroy( unknownArtistText );
+                                break;
+                                }
+                            case EMPXArtist:
+                                {
+                                DoFindInMusicShopL(KCategoryEmpty, title, KCategoryEmpty);  // Artist only
+                                break;
+                                }
+                            case EMPXSong:
+                                {
+                                DoFindInMusicShopL(title, KCategoryEmpty, KCategoryEmpty);  // Song only
+                                break;
+                                }
+                            default:
+                                {
+                                break;
+                                }
+                            } // switch
+                        } // if
+                    }  // else
+                break;
+                }
+            case EMPXOpMediaLFindInMusicShopMediaLCompleted:
+                {
+                // call DoFindInMusicShop when SongName, AlbumName, and ArtistName are
+                // available at this point
+                DoFindInMusicShopL(
+                    aMedia.ValueText( KMPXMediaGeneralTitle ),
+                    aMedia.ValueText( KMPXMediaMusicArtist ),
+                    aMedia.ValueText( KMPXMediaMusicAlbum ) );
+                break;
+                }
+
+            default:
+                {
+                break;
+                }
+            }
+        }
+    else
+        {
+        /* If a Composer,Artist or Album consists single song.
+         * On changing the song details(composer+genre or album name+genre)
+         * No more record exist corresponding to previous data.
+         * In this case no need to show Error Message. */
+        if( aError != KErrNotFound)
+            {
+            HandleError( aError );
+            }
+        else
+            {
+            MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleCollectionMediaL ERROR: %d",aError);
+            }
+        }
+    if ( iCurrentMediaLOp == EMPXOpMediaLNewPlaylistCollectionSongCount )
+        {
+        iCurrentMediaLOp = EMPXOpMediaLGetContainerInfo;
+        }
+    else
+        {
+        iCurrentMediaLOp = nextMediaLOp;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From MMPXCollectionHelperObserver
+// Callback function after executing a command
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandleCommandComplete(CMPXCommand* /*aCommandResult*/,
+                                                  TInt /*aError*/)
+    {
+    // Make sure we are doing the right operation
+    if( iSetMediaLCount )
+        {
+        iSetMediaLCount--;
+        if ( iSetMediaLCount < 1 )
+            {
+            TRAP_IGNORE( HandleRenameOpCompleteL() );
+            }
+        }
+    }
+// ---------------------------------------------------------------------------
+// From MMPXCollectionHelperObserver
+// Callback function to signal that adding a file is complete
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandleAddFileCompleteL( TInt aErr )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::HandleAddFileCompleteL" );
+    if ( aErr != KErrNone )
+        {
+        HandleError( aErr );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From MMPXCHelperObserver
+// Handles the completion of helper events
+// ---------------------------------------------------------------------------
+//
+
+void CMPXCollectionViewHgImp::HandleOperationCompleteL( TCHelperOperation aOperation,
+                                           TInt aErr,
+                                           void* aArgument )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::HandleOperationCompleteL" );
+    MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleOperationCompleteL aErr = %d", aErr );
+    switch( aOperation )
+        {
+        case EDeleteOp:
+            {
+            MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleOperationCompleteL Delete operation" );
+            // do not dismiss the wait note until HandleOpenL is called,
+            // unless it's error case
+            delete iCurrentCba;
+            iCurrentCba = NULL;
+            if( aErr == KErrInUse )
+                {
+                if ( !iIsWaitNoteCanceled )
+                    {
+                    // only dismiss wait note if the wait note is not
+                    // canceled
+                    if ( iProgressDialog )
+                        {
+                        iProgressDialog->ProcessFinishedL();
+                        }
+                    HandleCommandL( EMPXCmdHandleExternalCommand );
+                    iIsWaitNoteCanceled = EFalse;
+                    }
+                if ( iIsDeleting )
+                    {
+                    HBufC* text = StringLoader::LoadLC(
+                        ( iContainer->CurrentSelectionIndicesL()->Count() == 0 ) ?
+                        R_MPX_COLLECTION_NOTE_DELETE_FAIL : // Single selection
+                        R_MPX_COLLECTION_NOTE_DELETE_FAIL_MULTI_SELECTION ); // Multi selection
+
+                    CAknErrorNote* dlg = new ( ELeave ) CAknErrorNote( ETrue );
+                    dlg->ExecuteLD( *text );
+                    CleanupStack::PopAndDestroy( text );
+                    }
+                iIsDeleting = EFalse;
+                }
+            else if ( aErr != KErrNone )
+                {
+                iIsDeleting = EFalse;
+                if ( !iIsWaitNoteCanceled )
+                    {
+                    if ( iProgressDialog )
+                    	{
+						iProgressDialog->ProcessFinishedL();
+						}
+                    HandleCommandL( EMPXCmdHandleExternalCommand );
+                    iIsWaitNoteCanceled = EFalse;
+                    }
+                HandleError( aErr );
+                }
+            if ( iContainer )
+                {
+                iContainer->ClearLbxSelection();
+                }
+            MPX_PERF_END_EX( MPX_PERF_SHOW_WAITNOTE );
+            // reopen collection
+            DoIncrementalOpenL( !iIsDeleting );
+            break;
+            }
+        case EExportPlaylistOp:
+            {
+            MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleOperationCompleteL Export playlist operation" );
+            if ( aErr == KErrNone )
+                {
+                HBufC* uri = static_cast<HBufC*>( aArgument );
+                CleanupStack::PushL(uri);
+                MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleOperationCompleteL playlist exported as %S", uri );
+
+                CMessageData* messageData = CMessageData::NewLC();
+                messageData->AppendAttachmentL( *uri );
+                RFs& fileSession = iCoeEnv->FsSession();
+                TEntry pl;
+                TInt err( fileSession.Entry( *uri, pl ) );
+                if ( err == KErrNone )
+                    {
+                    MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleOperationCompleteL playlist size = %d", pl.iSize );
+                    if ( !iSendUi )
+                        {
+                        iSendUi = CSendUi::NewL();
+                        }
+                    TSendingCapabilities capabilities(
+                        0,
+                        pl.iSize,
+                        TSendingCapabilities::ESupportsAttachments );
+
+                    // sendui leaves with error code 0 when canceling sending
+                    // via bluetooth, this should be trapped
+                    MPX_TRAP( err, iSendUi->ShowQueryAndSendL( messageData, capabilities ) );
+                    if ( err != KErrNone )
+                        {
+                        HandleError( err );
+                        }
+                    // remove the file then remove the directory
+                    err = fileSession.Delete( *uri );
+                    if ( err != KErrNone )
+                        {
+                        HandleError( err );
+                        }
+                    err = fileSession.RmDir( *uri );
+                    if ( err != KErrNone )
+                        {
+                        HandleError( err );
+                        }
+                    }
+                else
+                    {
+                    HandleError( err );
+                    }
+                CleanupStack::PopAndDestroy( 2, uri ); // messageData & uri
+                aArgument = NULL;
+                }
+            else
+                {
+                HandleError( aErr );
+                }
+            break;
+            }
+        case EAddOp:
+            {
+            HandleAddCompletedL( (CMPXMedia*)aArgument, aErr );
+            aArgument = NULL; // ownership transferred
+            iIsAddingToPlaylist = EFalse;  // reset flag once incremental adding is finished
+            break;
+            }
+        case ESetOp:
+            {
+            if ( iAddingToNewPlaylist )
+                {
+                // if user selects overwrite existing playlist,
+                // the OP will be set, and is handled here
+                HandleAddCompletedL( (CMPXMedia*)aArgument, aErr );
+                }
+            else
+                {
+                HandleSetCompletedL( (CMPXMedia*)aArgument, aErr );
+                }
+            aArgument = NULL; // ownership transferred
+            break;
+            }
+        case EReorderPlaylistOp:
+            {
+            HandleSetCompletedL( (CMPXMedia*)aArgument, aErr );
+            aArgument = NULL; // ownership transferred
+            break;
+            }
+        case ERenameOp:
+            {
+            if ( aErr != KErrNone )
+                {
+                iCommonUiHelper->HandleErrorL( aErr );
+                }
+            break;
+            }
+        case EDeleteStatusOp:
+            {
+            if ( aArgument )
+                {
+                CMPXMedia* media = (CMPXMedia*)aArgument;
+                CleanupStack::PushL( media );
+                if ( media->IsSupported( KMPXMediaGeneralCount ) )
+                    {
+                    TInt deletePercent = media->ValueTObjectL<TInt>( KMPXMediaGeneralCount );
+                    MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleOperationCompleteL % Files Deleted: %d", deletePercent );
+                    // update WaitNote dialog.
+                    HBufC* string = StringLoader::LoadLC(R_MPX_QTN_NMP_DEL_BATCH_SONGS_WAIT_NOTE, deletePercent);
+                    TPtr buf = string->Des();
+                    UpdateProcessL(deletePercent, buf);
+                    CleanupStack::PopAndDestroy( string );
+                    }
+                CleanupStack::PopAndDestroy( media );
+                aArgument = NULL;
+                }
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+
+    if( aArgument )
+        {
+        delete ( CBase* )aArgument;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From MMPXPlaybackObserver
+// Handle playback message.
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandlePlaybackMessage(
+    CMPXMessage* aMessage, TInt aError )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::HandlePlaybackMessage" );
+    if ( aError == KErrNone && aMessage )
+        {
+        TRAP_IGNORE( DoHandlePlaybackMessageL( *aMessage ) );
+        }
+    // Fix EBLI-7CFE4D press select key very quick cause System Error KErrArgument
+    else
+        {
+        // Fix for EJDI-77WCRF Low memory cause MP not resp.
+        iHandlingKeyEvent = EFalse;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From MMPXPlaybackCallback
+// Handle playback property.
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandlePropertyL(
+    TMPXPlaybackProperty /*aProperty*/,
+    TInt /*aValue*/,
+    TInt /*aError*/ )
+    {
+    // do nothing
+    }
+
+// ---------------------------------------------------------------------------
+// From MMPXPlaybackCallback
+// Method is called continously until aComplete=ETrue, signifying that
+// it is done and there will be no more callbacks
+// Only new items are passed each time
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandleSubPlayerNamesL(
+    TUid /* aPlayer */,
+    const MDesCArray* /* aSubPlayers */,
+    TBool /* aComplete */,
+    TInt /* aError */ )
+    {
+    // do nothing
+    }
+
+// ---------------------------------------------------------------------------
+// From MMPXPlaybackCallback
+// Handle media event.
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandleMediaL(
+    const CMPXMedia& /*aMedia*/,
+    TInt /*aError*/ )
+    {
+    // do nothing
+    }
+
+// ---------------------------------------------------------------------------
+// From CAknView
+// Returns views id.
+// ---------------------------------------------------------------------------
+//
+TUid CMPXCollectionViewHgImp::Id() const
+    {
+    return TUid::Uid( KMPXCollectionViewHgId );
+    }
+
+// ---------------------------------------------------------------------------
+// From CAknView
+// Command handling function.
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandleCommandL( TInt aCommand )
+    {
+    MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleCommandL(0x%x) entering", aCommand );
+
+    switch (aCommand)
+        {
+        case EAknCmdMark:
+        case EAknCmdUnmark:
+        case EAknMarkAll:
+        case EAknUnmarkAll:
+            {
+            // Custom handling of markable lists
+            iContainer->HandleMarkableListProcessCommandL(
+                aCommand );
+#ifdef __ENABLE_MSK
+            // Determine middle soft key labeling
+            UpdateMiddleSoftKeyDisplayL( iCurrentMskId );
+#endif // __ENABLE_MSK
+            if (aCommand == EAknMarkAll && !iCollectionReady)
+                {
+                iMarkedAll = ETrue;
+                }
+            if (aCommand == EAknUnmarkAll || aCommand == EAknCmdUnmark)
+                {
+                iMarkedAll = EFalse;
+                }
+            break;
+            }
+        case EMPXCmdGoToNowPlaying:
+            {
+            AppUi()->HandleCommandL( aCommand );
+            break;
+            }
+        case EMPXCmdGoToAllSongs:
+            {
+            OpenAllSongsL();
+            break;
+            }
+        case EMPXCmdGoToArtistAlbums:
+            {
+            OpenArtistAlbumsL();
+            break;
+            }
+        case EMPXCmdGoToPlaylists:
+            {
+            OpenPlaylistsL();
+            break;
+            }
+        case EMPXCmdGoToGenre:
+            {
+            OpenGenreL();
+            break;
+            }
+        case EMPXCmdGoToPodcasts:
+            {
+            OpenPodcastsL();
+            break;
+            }
+#ifdef SINGLE_CLICK_INCLUDED
+        case EMPXCmdPlayItem:
+            {
+            iContainer->HandleItemCommandL(EMPXCmdPlay);
+            break;
+            }
+#endif
+        case EMPXCmdCreatePlaylist:
+            {
+            iCurrentPlaylistOp = EMPXOpPLCreating;
+            CMPXMediaArray* mediaArray = CMPXMediaArray::NewL();
+            CleanupStack::PushL( mediaArray );
+            CMPXMedia* media = CMPXMedia::NewL();
+            CleanupStack::PushL( media );
+            media->SetCObjectValueL( KMPXMediaArrayContents, mediaArray );
+            media->SetTObjectValueL( KMPXMediaArrayCount, 0 );
+            TInt ret( iCommonUiHelper->CreatePlaylistL( *media, this, this ) );
+            if ( !ret )
+                {
+                // create playlist failed,
+                iCurrentPlaylistOp = EMPXOpPLIdle;
+                }
+            CleanupStack::PopAndDestroy( media );
+            CleanupStack::PopAndDestroy( mediaArray );
+            break;
+            }
+        case EMPXCmdAddToNewPlaylist:
+        case EMPXCmdAddToSavedPlaylist:
+            {
+            // flag used only in the case when songs are added incrementally
+            iIsAddingToPlaylist = ETrue;
+            iNumSongAddedToPlaylist = -1;
+            TMPXGeneralCategory category( EMPXNoCategory );
+            CMPXCommonListBoxArrayBase* array(
+                iContainer->ListBoxArray() );
+            const CMPXMedia& media = array->MediaL(
+                iContainer->CurrentLbxItemIndex() );
+            category = media.ValueTObjectL<TMPXGeneralCategory>(
+                KMPXMediaGeneralCategory );
+            if ( category == EMPXSong )
+                {
+                CMPXMedia* tracks = CMPXMedia::NewL();
+                CleanupStack::PushL( tracks );
+
+                MPX_TRAPD( err, PrepareMediaForSelectedItemsL( *tracks ) );
+                if ( err == KErrNone )
+                    {
+                    TBool ret = EFalse;
+                    if ( aCommand == EMPXCmdAddToNewPlaylist )
+                        {
+                        iAddingToNewPlaylist = ETrue;
+                        MPX_TRAP( err,ret = iCommonUiHelper->CreatePlaylistL(
+                                *tracks, this, this ) );
+                        if ( err != KErrNone )
+                            {
+                            HandleError( err );
+                            }
+                        if ( !ret )
+                            {
+                            iAddingToNewPlaylist = EFalse;
+                            }
+                        }
+                    else
+                        {
+                        MPX_TRAP( err, ret = iCommonUiHelper->AddToSavedPlaylistL(
+                            *iUserPlaylists, *tracks, this, this ) );
+                        if ( err != KErrNone )
+                            {
+                            HandleError( err );
+                            }
+                        }
+#ifdef __ENABLE_MSK
+                     // If Save play list or create play list return True (OK)
+                     //  1 - Unselect marks
+                     //  2 - Force to refresh the MSK with title "Play"
+                     // If Save play list or create play list return False (Cancel)
+                     //  1 - let the marks
+                     //  2 - let the MSK with the "context menu"
+                     if (ret)
+                       {
+                       iContainer->ClearLbxSelection();
+                       UpdateMiddleSoftKeyDisplayL( iCurrentMskId );
+                       }
+#endif // __ENABLE_MSK
+                    }
+                else if ( err == KMPXErrDataNotReadyCacheCommand )
+                    {
+                    // cache this command
+                    HBufC* text = StringLoader::LoadLC(
+                        R_MPX_QTN_MUS_NOTE_ADDING_TRACKS );
+                    StartDelayedActionL( aCommand, *text );
+                    CleanupStack::PopAndDestroy( text );
+                    }
+                else if ( err != KMPXErrDataNotReady )
+                    {
+                    HandleError( err );
+                    }
+                else
+                    {
+                    // KMPXErrDataNotReady, ignore
+                    }
+                CleanupStack::PopAndDestroy( tracks );
+                }
+            else
+                {
+                // on artist/album level
+                if ( aCommand == EMPXCmdAddToNewPlaylist )
+                    {
+                    iAddingToNewPlaylist = ETrue;
+                    iCurrentFindAllLOp = EMPXOpFindAllLAlbumArtistAddToNewPlaylist;
+                    }
+                else
+                    {
+                    iCurrentFindAllLOp = EMPXOpFindAllLAlbumArtistAddToSavedPlaylist;
+                    }
+                RArray<TMPXAttribute> attrs;
+                CleanupClosePushL( attrs );
+                attrs.Append(
+                    TMPXAttribute( KMPXMediaIdGeneral,
+                    EMPXMediaGeneralTitle | EMPXMediaGeneralId |
+                    EMPXMediaGeneralType | EMPXMediaGeneralCategory ) );
+                CMPXMedia* criteria = CMPXMedia::NewL();
+                CleanupStack::PushL( criteria );
+                CMPXCommonListBoxArrayBase* listboxArray =
+                    iContainer->ListBoxArray();
+                const CMPXMedia& containerMedia =
+                    listboxArray->ContainerMedia();
+                TMPXGeneralCategory containerCategory(
+                    containerMedia.ValueTObjectL<TMPXGeneralCategory>(
+                    KMPXMediaGeneralCategory ) );
+                if ( containerCategory == EMPXArtist )
+                    {
+                    // artist/album level, need to specify artist ID in container ID
+                    TMPXItemId containerId(
+                        containerMedia.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
+                    criteria->SetTObjectValueL<TMPXItemId>(
+                        KMPXMediaGeneralContainerId, containerId );
+                    }
+                const CMPXMedia& currentMedia = listboxArray->MediaL(
+                    iContainer->CurrentLbxItemIndex() );
+                TMPXItemId id(
+                    currentMedia.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
+                criteria->SetTObjectValueL<TMPXGeneralType>(
+                    KMPXMediaGeneralType, EMPXGroup );
+                criteria->SetTObjectValueL<TMPXGeneralCategory>(
+                    KMPXMediaGeneralCategory, EMPXSong );
+                criteria->SetTObjectValueL<TMPXItemId>( KMPXMediaGeneralId, id );
+                iCollectionUtility->Collection().FindAllL(
+                    *criteria, attrs.Array(), *this );
+                CleanupStack::PopAndDestroy( criteria );
+                CleanupStack::PopAndDestroy( &attrs );
+                }
+            break;
+            }
+        case EMPXCmdAddSongs:
+            {
+            iAddingSong = ETrue;
+            iViewUtility->ActivateViewL(
+                TUid::Uid( KMPXPluginTypeAddSongsEditorUid ) );
+            break;
+            }
+        case EMPXCmdReorder:
+            {
+            ActivateReorderGrabbedModeL();
+            break;
+            }
+        case EMPXCmdDelete: // fall through
+        case EMPXCmdRemove:
+            {
+            StoreListboxItemIndexL();
+            DeleteSelectedItemsL(aCommand);
+            break;
+            }
+        case EMPXCmdSend:
+            {
+            const CMPXMedia& media =
+                iContainer->ListBoxArray()->MediaL(
+                    iContainer->CurrentLbxItemIndex() );
+
+            TMPXGeneralType type(
+                media.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType ) );
+            TMPXGeneralCategory category(
+                media.ValueTObjectL<TMPXGeneralCategory>( KMPXMediaGeneralCategory ) );
+
+            if ( iContainer->CurrentSelectionIndicesL()->Count() == 0 &&
+                type == EMPXItem &&
+                category == EMPXPlaylist )
+                {
+                // sending a playlist
+                DoSendPlaylistL( media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
+                }
+            else
+                {
+                DoSendL();
+                }
+            break;
+            }
+        case EMPXCmdSongDetails: // fall through
+        case EMPXCmdAlbumArt: // fall through
+        case EMPXCmdFindInMusicShop:
+            {
+            StoreListboxItemIndexL();
+
+            CMPXCommonListBoxArrayBase* listboxArray(
+                iContainer->ListBoxArray() );
+            const CMPXMedia& media( listboxArray->MediaL(
+                iContainer->CurrentLbxItemIndex() ) );
+            if ( media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) == KMPXInvalidItemId )
+                {
+                // highlighted item is not yet available
+                MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleCommandL item not yet fetched" );
+                }
+            else
+                {
+                // need to check if the file exists.  if the file doesn't exist
+                // and mediaL is called with drm status, it'll leave
+                if ( aCommand == EMPXCmdSongDetails )
+                    {
+                    iCurrentMediaLOp = EMPXOpMediaLSongDetailsFileCheck;
+                    iInSongDetails = ETrue;
+                    }
+                else if ( aCommand == EMPXCmdAlbumArt )
+                    {
+                    iInAlbumArtDialog = ETrue;
+                    iCurrentMediaLOp = EMPXOpMediaLAlbumArtFileCheck;
+                    }
+                else if ( aCommand == EMPXCmdFindInMusicShop )
+                    {
+                    iCurrentMediaLOp = EMPXOpMediaLFindInMusicShopSongDetails;
+                    }
+                CMPXCollectionPath* path = iCollectionUtility->Collection().PathL();
+                CleanupStack::PushL( path );
+                path->Set( iContainer->CurrentLbxItemIndex() );
+                RArray<TMPXAttribute> attrs;
+                CleanupClosePushL( attrs );
+                attrs.Append(
+                    TMPXAttribute( KMPXMediaIdGeneral,
+                        EMPXMediaGeneralUri | EMPXMediaGeneralCollectionId ) );
+                iCollectionUtility->Collection().MediaL( *path, attrs.Array() );
+                CleanupStack::PopAndDestroy( &attrs );
+                CleanupStack::PopAndDestroy( path );
+                }
+            break;
+            }
+        case EMPXCmdGoToMusicShop:
+            {
+            LaunchMusicShopL();
+            break;
+            }
+        case EMPXCmdGoToNokiaMusicShop:
+            {
+            LaunchMusicShopL();
+            break;
+            }
+        case EMPXCmdGoToOperatorMusicShop:
+            {
+            if(iMusicStoreWebPage)
+                {
+                LaunchOperatorURLMusicShopL();
+                }
+            else
+                {
+                if(iOperatorMusicStoreType)
+                {
+                LaunchOperatorJavaMusicShopL(iOperatorMusicStoreUID);
+                }
+            else
+                {
+                LaunchOperatorNativeMusicShopL();
+                }
+                }
+            break;
+            }
+        case EMPXCmdMusicLibraryDetails:
+            {
+            iCurrentMediaLOp = EMPXOpMediaLCollectionDetails;
+            CMPXCollectionPath* path = iCollectionUtility->Collection().PathL();
+            CleanupStack::PushL( path );
+            RArray<TMPXAttribute> attrs;
+            CleanupClosePushL( attrs );
+            attrs.Append( KMPXMediaColDetailAll );
+            iCollectionUtility->Collection().MediaL( *path, attrs.Array() );
+            CleanupStack::PopAndDestroy( &attrs );
+            CleanupStack::PopAndDestroy( path );
+            break;
+            }
+        case EMPXCmdRename:
+            {
+            DoHandleRenameL();
+            break;
+            }
+        case EMPXCmdPlaylistDetails:
+            {
+            iCurrentMediaLOp = EMPXOpMediaLPlaylistDetails;
+            CMPXCollectionPath* path = iCollectionUtility->Collection().PathL();
+            CleanupStack::PushL( path );
+            path->Set( iContainer->CurrentLbxItemIndex() );
+            RArray<TMPXAttribute> attrs;
+            CleanupClosePushL( attrs );
+            attrs.Append( TMPXAttribute( KMPXMediaIdGeneral,
+                EMPXMediaGeneralCount | EMPXMediaGeneralTitle |
+                EMPXMediaGeneralUri | EMPXMediaGeneralDate |
+                EMPXMediaGeneralDuration | EMPXMediaGeneralFlags ) );
+            iCollectionUtility->Collection().MediaL( *path, attrs.Array() );
+            CleanupStack::PopAndDestroy( &attrs );
+            CleanupStack::PopAndDestroy( path );
+            break;
+            }
+        case EAknSoftkeyBack:
+            {
+            iMarkedAll = EFalse;
+            if( iIsDeleting )
+            	{
+            	break;
+            	}
+
+            if ( iIsEmbedded )
+                {
+                AppUi()->HandleCommandL(
+                    ( MPXTlsHelper::NeedSave() && iCommonUiHelper->IsHostMessagingBrowserL() )
+                    ? EMPXCmdSaveAndExit : EEikCmdExit );
+                }
+            else
+                {
+                if ( !iHandlingKeyEvent )
+                    {
+                    CMPXCollectionPath* cpath = iCollectionUtility->Collection().PathL();
+                    CleanupStack::PushL( cpath );
+                    TInt currentDepth( cpath->Levels() );
+                    if ( currentDepth == 2 ) // 2 is the level of music main view
+                        {
+                        // let Back Stepping Service handle the event
+                        TInt statusInfo( KMPXBackSteppingNotConsumed );
+                        if( iViewUtility &&
+                            ( iViewUtility->ActiveViewImplementationUid() != KNullUid ) )
+                            {
+                            TInt viewId( iViewUtility->ActiveViewType().iUid );
+                            TBuf8<KMVPrefixLen + KMaxIntLen> buf;
+                            buf.Copy( KMVPrefix );
+                            buf.AppendNum( viewId );
+                            statusInfo = iBackSteppingUtility->HandleBackCommandL( buf );
+                            MPX_DEBUG3("CMPXCollectionViewHgImp::HandleCommandL - viewid=0x%x, statusInfo=%d",
+                                 viewId, statusInfo );
+                            }
+                        if ( statusInfo == KMPXBackSteppingNotConsumed )
+                            // event not consumed by Back Stepping utility, handle here
+                            //
+                            {
+                            AppUi()->HandleCommandL( aCommand );
+                            }
+                        }
+                    else
+                        {
+                        if ( currentDepth > 2 && !iBackOneLevel )
+                            {
+                            iContainer->ClearLbxSelection();
+                            iCollectionUtility->Collection().BackL();
+                            iFirstIncrementalBatch = ETrue;
+                            MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleCommandL Getting container media, currentDepth = %d", currentDepth );
+                            cpath->Back();
+                            cpath->Back();
+                            RArray<TMPXAttribute> attrs;
+                            CleanupClosePushL(attrs);
+                            iCurrentMediaLOp = EMPXOpMediaLGetContainerInfo;
+                            attrs.Append( KMPXMediaGeneralDuration );
+                            iCollectionUtility->Collection().MediaL( *cpath, attrs.Array() );
+                            CleanupStack::PopAndDestroy( &attrs );
+                            iBackOneLevel = ETrue;
+                            }
+                        else
+                            {
+                            MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleCommandL Not getting container media" );
+                            }
+
+                        iHandlingKeyEvent = ETrue;
+                        }
+                    CleanupStack::PopAndDestroy( cpath );
+                    }
+                else
+                    {
+                    MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleCommandL Busy, ignoring command" );
+                    }
+                }
+            break;
+            }
+        case EMPXCmdSavePlaylist:
+            {
+            AppUi()->HandleCommandL( EMPXCmdSaveAndReopen );
+            break;
+            }
+        case EAknCmdExit:
+        case EAknSoftkeyExit:
+            {
+            AppUi()->HandleCommandL( aCommand );
+            break;
+            }
+        case EMPXCmdCancelReorder:
+            {
+            if ( iContainer && iContainer->IsInReorderMode() )
+                {
+                TRAP_IGNORE( ProcessCommandL( EMPXCmdReorderCancel ) );
+                iCurrentHighlightedIndex = KErrNotFound;
+                }
+            break;
+            }
+        case EMPXCmdUpnpPlayViaLocal:
+            {
+            if ( iUpnpFrameworkSupport )
+                {
+                SelectNewPlayerL( aCommand );
+                }
+            break;
+            }
+        case EMPXCmdUPnPAiwCmdCopyToExternalCriteria:
+            {
+            if ( iUpnpFrameworkSupport )
+                {
+                CopySelectedItemsToRemoteL();
+                }
+            break;
+            }
+
+        case EMPXCmdPlay:
+        case EMPXCmdForcePlay:
+        case EMPXCmdPlayPause:
+            {
+            TBool isReady( ETrue );
+            TMPXPlaybackState state( iPlaybackUtility->StateL() );
+
+            // if it's in paused state, resume playback, no need
+            // to check if current highlight is a playlist
+            if ( iContainer &&
+                aCommand != EMPXCmdForcePlay &&
+                state != EPbStatePaused && state != EPbStatePlaying )
+                {
+                CMPXCommonListBoxArrayBase* listboxArray =
+                    iContainer->ListBoxArray();
+                if ( iContainer->CurrentListItemCount() > 0 )
+                    {
+                    TInt currentItem(
+                        iContainer->CurrentLbxItemIndex() );
+                    const CMPXMedia& media = listboxArray->MediaL( currentItem );
+                    TMPXGeneralType type(
+                        media.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType ) );
+                    TMPXGeneralCategory category(
+                        media.ValueTObjectL<TMPXGeneralCategory>( KMPXMediaGeneralCategory ) );
+                    if ( category == EMPXPlaylist && type == EMPXItem )
+                        {
+                        MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleCommandL checking item count in playlist" );
+                        isReady = EFalse;
+                        TMPXItemId id(
+                            media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
+                        CMPXMedia* entry = CMPXMedia::NewL();
+                        CleanupStack::PushL( entry );
+                        entry->SetTObjectValueL<TMPXGeneralType>(
+                            KMPXMediaGeneralType, EMPXGroup );
+                        entry->SetTObjectValueL<TMPXGeneralCategory>(
+                            KMPXMediaGeneralCategory, EMPXSong );
+                        entry->SetTObjectValueL<TMPXItemId>(
+                            KMPXMediaGeneralId, id );
+                        iCurrentFindAllLOp = EMPXOpFindAllLPlaylistTracksCount;
+                        RArray<TMPXAttribute> attrs;
+                        CleanupClosePushL( attrs );
+                        attrs.Append( KMPXMediaGeneralId );
+                        iCollectionUtility->Collection().FindAllL(
+                            *entry, attrs.Array(), *this );
+                        CleanupStack::PopAndDestroy( &attrs );
+                        CleanupStack::PopAndDestroy( entry );
+                        }
+                    }
+                else
+                    {
+                    // current list view is empty, and no song currently playing
+                    // ignore the command
+                    isReady = EFalse;
+                    }
+                }
+            if ( isReady )
+                {
+                if ( aCommand == EMPXCmdForcePlay )
+                    {
+                    aCommand = EMPXCmdPlay;
+                    }
+                if ( EPbStateNotInitialised == state ||
+                     EPbStateStopped == state )
+                    {
+                    // Needed to reset the status of iPreservedState
+                    if ( EPbStateStopped == state )
+                        {
+                        iPlaybackUtility->CommandL(EPbCmdResetPreserveState);
+                        }
+                    TInt currentItem(
+                        iContainer->CurrentLbxItemIndex() );
+                    MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleCommandL playing index %d", currentItem );
+                    if ( iContainer->IsInReorderMode() )
+                        {
+                        // if in reorder mode, and in not playing state
+                        // drop the reorder target and start playing
+                        if ( iIsGrabbed )
+                            {
+                            ProcessCommandL( EMPXCmdReorderDrop );
+                            }
+                        ProcessCommandL( EMPXCmdReorderDone );
+                        iPlayIndex = currentItem;
+                        }
+                    else if ( currentItem != KErrNotFound )
+                        {
+                        if ( iContainer && !AppUi()->IsDisplayingDialog() )
+                            {
+                            StopDisplayingMenuBar();
+                            }
+                        iPlayIndex = KErrNotFound;
+                        if(iCollectionCacheReady)
+                            {
+                            iCollectionUtility->Collection().OpenL( currentItem, EMPXOpenPlaylistOnly );
+                            iFirstIncrementalBatch = ETrue;
+                            }
+                        }
+                    }
+                else
+                    {
+                    AppUi()->HandleCommandL( aCommand );
+                    }
+                }
+            break;
+            }
+        case EMPXCmdSaveComplete:
+            {
+            MPXTlsHelper::SetNeedSave( EFalse );
+            break;
+            }
+#ifdef __ENABLE_PODCAST_IN_MUSIC_MENU
+        case EMPXCmdRefreshLibrary:
+            {
+            MPX_PERF_CHECKPT("Refresh collection library");
+            // Package the argument from 8bit to 16bit then activate view
+            //
+            StartWaitNoteL( EMPXRefreshingNote );
+            iPlaybackUtility->CommandL( EPbCmdStop );
+            break;
+            }
+#endif
+        default:
+            {
+            MPX_PERF_CHECKPT("Handle Collection view unknown command");
+            if ( iUpnpFrameworkSupport )
+                {
+                if ( aCommand >= EMPXCmdUpnpPlayViaRemotePlayer  &&
+                     aCommand < EMPXCmdUpnpLastCommandId )
+                    {
+                    SelectNewPlayerL( aCommand );
+                    }
+                else
+                    {
+                    if ( iServiceHandler->ServiceCmdByMenuCmd(aCommand) != KAiwCmdNone )
+                        {
+                        CAiwGenericParamList& paramList = iServiceHandler->InParamListL();
+                        FillAiwParametersL(paramList);
+                        iServiceHandler->ExecuteMenuCmdL(aCommand, paramList,
+                            iServiceHandler->OutParamListL());
+                        }
+                    AppUi()->HandleCommandL( aCommand );
+                    }
+                }
+            else
+                {
+                if ( iServiceHandler->ServiceCmdByMenuCmd(aCommand) != KAiwCmdNone )
+                    {
+                    CAiwGenericParamList& paramList = iServiceHandler->InParamListL();
+                    FillAiwParametersL(paramList);
+                    iServiceHandler->ExecuteMenuCmdL(aCommand, paramList,
+                        iServiceHandler->OutParamListL());
+                    }
+                AppUi()->HandleCommandL( aCommand );
+                }
+            break;
+            }
+        }
+    MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleCommandL() exiting" );
+    }
+
+// ---------------------------------------------------------------------------
+// From CAknView
+// Handles a view activation.
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::DoActivateL(
+    const TVwsViewId& /* aPrevViewId */,
+    TUid /* aCustomMessageId */,
+    const TDesC8& /* aCustomMessage */ )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::DoActivateL()" );
+
+    // Add view deactivation observer
+    AppUi()->AddViewDeactivationObserverL( this );
+
+    // Set status pane layout if switched here directly from another view,
+    // such as when using the AnyKey
+    StatusPane()->MakeVisible( ETrue );
+    StatusPane()->SwitchLayoutL(R_AVKON_STATUS_PANE_LAYOUT_USUAL_FLAT);
+
+    if ( !iContainer )
+        {
+        iContainer = CMPXCollectionViewHgContainer::NewL( this, this, iIsEmbedded );
+        iContainer->SetCbaHandler( this );
+        }
+    iContainer->SetMopParent( this );
+    AppUi()->AddToStackL( *this, iContainer );
+    iContainer->SetRect( ClientRect() );
+
+    CMPXCollectionPath* cpath( iCollectionUtility->Collection().PathL() );
+    CleanupStack::PushL( cpath );
+
+#ifdef __ENABLE_PODCAST_IN_MUSIC_MENU
+    // media is not valid until the first HandleOpenL call
+    CEikButtonGroupContainer* cba = Cba();
+    if ( cba )
+        {
+        cba->SetCommandSetL(
+            ( cpath->Levels() == 2 && !iIsEmbedded ) ?
+            R_MPX_OPTIONS_BACK_CBA_NO_ACTION : R_MPX_OPTIONS_BACK_CBA_NO_ACTION );
+        cba->DrawDeferred();
+        }
+#else
+    // media is not valid until the first HandleOpenL call
+    CEikButtonGroupContainer* cba = Cba();
+    if ( cba )
+        {
+        cba->SetCommandSetL(
+            ( iViewUtility->ViewHistoryDepth() == 1 && !iIsEmbedded ) ?
+            R_MPX_OPTIONS_EXIT_CBA_NO_ACTION : R_MPX_OPTIONS_BACK_CBA_NO_ACTION );
+        cba->DrawDeferred();
+        }
+#endif
+
+	UpdateTitlePaneL();
+    UpdateNaviPaneL();
+
+
+    if ( iViewUtility->PreviousViewType().iUid == KMPXPluginTypePlaybackUid )
+        {
+#ifdef __ENABLE_PODCAST_IN_MUSIC_MENU
+        // If previous view is Playback view, it can only be normal playback view
+        // Podcast shouldn't be highlighted in any case.
+        iPodcast = EFalse;
+#endif
+
+        // return back from playback view and in songs level,
+        // highlight the new playing song
+        MMPXSource* source( iPlaybackUtility->Source() );
+
+        if ( source )
+            {
+            CMPXCollectionPlaylist* playlist( source->PlaylistL() );
+            if ( playlist )
+                {
+                // Going from Now Playing View -> Collection, same collection level
+                iPossibleJump = ( playlist->Path().Levels() == cpath->Levels() );
+                delete playlist;
+                }
+            }
+
+        if ( cpath->Levels() > 1 )
+            {
+            // valid path in collection
+            GetDurationL();
+            MPX_DEBUG_PATH(*cpath);
+
+            DoIncrementalOpenL();
+            }
+        else
+            {
+            TUid defaultView( iViewUtility->DefaultViewUid() );
+            iViewUtility->ActivateViewL( ( defaultView != KNullUid ) ?
+                defaultView : TUid::Uid( KMPXPluginTypeMainUid ) );
+            }
+        }
+    else
+        {
+#ifdef __ENABLE_PODCAST_IN_MUSIC_MENU
+        // If previous view is Collection view, it can only be podcast view
+        if ( iViewUtility->PreviousViewType().iUid == KMPXPluginTypeCollectionUid )
+            {
+            iPodcast = ETrue;
+            }
+        // don't bother getting duration if at plugin list
+        if ( cpath->Levels() > 1 )
+#endif
+            {
+            GetDurationL();
+            }
+        MPX_DEBUG_PATH(*cpath);
+
+        DoIncrementalOpenL( cpath->Levels()>KMusicCollectionMenuLevel ? ETrue:EFalse );
+
+        iUpCount = 0;
+        iDownCount = 0;
+        }
+    CleanupStack::PopAndDestroy( cpath );
+    }
+
+// ---------------------------------------------------------------------------
+// From CAknView
+// View deactivation function.
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::DoDeactivate()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::DoDeactivate" );
+    if ( iContainer && iContainer->IsInReorderMode() )
+        {
+        TRAP_IGNORE( ProcessCommandL( EMPXCmdReorderDone ) );
+        iCurrentHighlightedIndex = KErrNotFound;
+        }
+
+    if ( iContainer )
+        {
+        iContainer->ContentIsReady( EFalse );
+        AppUi()->RemoveFromStack( iContainer );
+        delete iContainer;
+        iContainer = NULL;
+        }
+
+    if (iDuration)
+        {
+        delete iDuration;
+        iDuration = NULL;
+        TRAP_IGNORE(UpdateNaviPaneL());
+        }
+
+    // Cleanup view deactivation observer
+    AppUi()->RemoveViewDeactivationObserver( this );
+    }
+
+// ---------------------------------------------------------------------------
+// From CAknView
+// Foreground event handling function.
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandleForegroundEventL( TBool aForeground )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::HandleForegroundEventL" );
+    if ( aForeground && iOpeningNote )
+    	{
+        CloseWaitNoteL();
+        iOpeningNote = EFalse;
+    	}
+    iActivateBackStepping = EFalse;
+    MPX_DEBUG3("CMPXCollectionViewHgImp::HandleForegroundEventL - is in foreground=%d, this view=0x%x",
+        aForeground, Id().iUid );
+    if( aForeground &&
+        iViewUtility &&
+        ( iViewUtility->ActiveViewImplementationUid() != KNullUid ) )
+        {
+        iActivateBackStepping = ETrue;
+        }
+        {
+        CAknView::HandleForegroundEventL( aForeground );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::HandleBacksteppingActivation
+// Handle backstepping activation
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandleBacksteppingActivation()
+    {
+    TInt viewId( iViewUtility->ActiveViewType().iUid );
+    TBuf8<KMVPrefixLen + KMaxIntLen> buf;
+    buf.Copy( KMVPrefix );
+    buf.AppendNum( viewId );
+    TInt statusInfo( KMPXBackSteppingNotConsumed );
+    TRAP_IGNORE(
+       statusInfo =
+        iBackSteppingUtility->ForwardActivationEventL( buf, ETrue );
+         );
+    MPX_DEBUG3("CMPXCollectionViewHgImp::HandleBacksteppingActivation - viewId=0x%x, statusInfo=%d", viewId, statusInfo );
+    iActivateBackStepping = EFalse;
+   }
+
+// ---------------------------------------------------------------------------
+// Handle initialing a music menu pane.
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandleInitMusicMenuPaneL(
+    CEikMenuPane* aMenuPane )
+    {
+    CMPXCollectionViewListBoxArray* array =
+        static_cast<CMPXCollectionViewListBoxArray*>(
+        iContainer->ListBoxArray() );
+	const CMPXMedia& containerMedia = array->ContainerMedia();
+
+	TMPXGeneralCategory containerCategory(
+		containerMedia.ValueTObjectL<TMPXGeneralCategory>(
+			KMPXMediaGeneralCategory ) );
+
+	switch ( containerCategory )
+		{
+		case EMPXPlaylist:
+			{
+			// playlist view
+			aMenuPane->SetItemDimmed( EMPXCmdGoToPlaylists, ETrue );
+			aMenuPane->SetItemDimmed( EMPXCmdGoToGenre, ETrue );
+			aMenuPane->SetItemDimmed( EMPXCmdRefreshLibrary, ETrue );
+			break;
+			}
+		case EMPXAlbum:
+		case EMPXArtist:
+			{
+			// Album & Artist view
+			aMenuPane->SetItemDimmed( EMPXCmdGoToArtistAlbums, ETrue );
+			aMenuPane->SetItemDimmed( EMPXCmdGoToGenre, ETrue );
+			break;
+			}
+		case EMPXGenre:
+			{
+			// Genre view
+			aMenuPane->SetItemDimmed( EMPXCmdGoToGenre, ETrue );
+			aMenuPane->SetItemDimmed( EMPXCmdRefreshLibrary, ETrue );
+			break;
+			}
+		case EMPXSong:
+			{
+			aMenuPane->SetItemDimmed( EMPXCmdGoToAllSongs, ETrue );
+			aMenuPane->SetItemDimmed( EMPXCmdRefreshLibrary, ETrue );
+			break;
+			}
+		default:
+			{
+			break;
+			}
+		}
+   	}
+// ---------------------------------------------------------------------------
+// From MEikMenuObserver
+// Dynamically initialises a menu pane.
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::DynInitMenuPaneL(
+    TInt aResourceId,
+    CEikMenuPane* aMenuPane )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::DynInitMenuPaneL" );
+    CMPXCollectionViewListBoxArray* array =
+        static_cast<CMPXCollectionViewListBoxArray*>(
+        iContainer->ListBoxArray() );
+    TInt currentItem( iContainer->CurrentLbxItemIndex() );
+    TBool isListEmpty( currentItem < 0 );
+    TInt selectionCount( 0 );
+    if ( iSelectionIndexCache)
+        {
+        selectionCount = iSelectionIndexCache->Count();
+        }
+
+    TInt usbUnblockingStatus;
+    RProperty::Get( KMPXViewPSUid,
+                    KMPXUSBUnblockingPSStatus,
+                    usbUnblockingStatus);
+
+    switch ( aResourceId )
+        {
+        case R_MPX_COLLECTION_VIEW_MENU_1:
+            {
+            const CMPXMedia& containerMedia = array->ContainerMedia();
+            TMPXGeneralType containerType(
+                containerMedia.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType ) );
+            TMPXGeneralCategory containerCategory(
+                containerMedia.ValueTObjectL<TMPXGeneralCategory>(
+                    KMPXMediaGeneralCategory ) );
+
+            HandleInitMusicMenuPaneL(aMenuPane);
+
+            MPX_DEBUG3( "CMPXCollectionViewHgImp::DynInitMenuPaneL container type = %d, category = %d", containerType, containerCategory );
+
+            // Always dim the find in hg implementation
+            aMenuPane->SetItemDimmed( EMPXCmdFind, ETrue );
+            MMPXPlaybackUtility* pdPlaybackUtility;
+            pdPlaybackUtility = MMPXPlaybackUtility::UtilityL( TUid::Uid( KProgressDownloadUid ) );
+            MMPXSource* pdsource( pdPlaybackUtility->Source() );
+            MMPXSource* source( iPlaybackUtility->Source() );
+            TBool hideNowPlaying;
+            hideNowPlaying = ( (pdsource == 0)
+                           &&  (source == 0));
+            pdPlaybackUtility->Close();
+            if ( hideNowPlaying )
+                {
+                aMenuPane->SetItemDimmed( EMPXCmdGoToNowPlaying, ETrue );
+                }
+            if ( !isListEmpty )
+                {
+                const CMPXMedia& media = array->MediaL( currentItem );
+                TMPXGeneralType type(
+                    media.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType ) );
+                TMPXGeneralCategory category(
+                    media.ValueTObjectL<TMPXGeneralCategory>(
+                        KMPXMediaGeneralCategory ) );
+                MPX_DEBUG3( "CMPXCollectionViewHgImp::DynInitMenuPaneL item type = %d, category = %d", type, category );
+#ifdef SINGLE_CLICK_INCLUDED
+                if ( containerType == EMPXGroup && containerCategory == EMPXAlbum )
+                    {
+                    // album view
+                    switch ( category )
+                        {
+                        case EMPXAlbum:
+                            {
+                            if ( usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive )
+                                {
+                                aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdPlayItem, EFalse );
+                                }
+                            else
+                                {
+                                aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, EFalse );
+                                aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdDelete, EFalse );
+                                aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdPlayItem, EFalse );
+                                }
+                            break;
+                            }
+                        case EMPXCommand:
+                            {
+                            aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
+                            aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
+                            aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
+                            aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
+                            aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue );
+                            aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
+                            aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
+                            aMenuPane->SetItemDimmed( EMPXCmdPlayItem, ETrue );
+                            break;
+                            }
+                        }
+                    }
+                else
+#endif
+                if ( containerType == EMPXItem && containerCategory == EMPXPlaylist )
+                    {
+                    // in playlist tracks view
+                    // enable reordering and add songs in playlist view
+                    aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
+                    aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
+                    if ( usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive )
+                        {
+                        aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
+                        aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
+                        aMenuPane->SetItemDimmed( EMPXCmdSend, SendOptionVisibilityL() );
+                        aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
+                        aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
+#ifdef SINGLE_CLICK_INCLUDED
+                        aMenuPane->SetItemDimmed( EMPXCmdPlayItem, ETrue );
+#endif
+
+                        }
+                    else
+                        {
+                        // do not display add songs option when marking is on
+                        aMenuPane->SetItemDimmed( EMPXCmdAddSongs, selectionCount > 0 );
+                        TInt totalItemCount( iContainer->TotalListItemCount() );
+                        // display reorder option only when more than 1 item is visible
+                        // do not display reorder option when marking is on
+#ifdef SINGLE_CLICK_INCLUDED
+                        aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
+#else
+                        aMenuPane->SetItemDimmed( EMPXCmdReorder,
+                            ( totalItemCount > 1 && selectionCount == 0 ) ?
+                            EFalse : ETrue );
+#endif
+                        aMenuPane->SetItemDimmed( EMPXCmdSend, SendOptionVisibilityL() );
+                        aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
+                        aMenuPane->SetItemDimmed( EMPXCmdRemove, EFalse );
+#ifdef SINGLE_CLICK_INCLUDED
+                        aMenuPane->SetItemDimmed( EMPXCmdPlayItem, ETrue );
+#endif
+						}
+
+                    if ( containerMedia.IsSupported(
+                        KMPXMediaGeneralNonPermissibleActions ) )
+                        {
+                        // check for auto playlist, disable add, remove and reorder
+                        TMPXGeneralNonPermissibleActions attr(
+                            containerMedia.ValueTObjectL<TMPXGeneralNonPermissibleActions>(
+                                KMPXMediaGeneralNonPermissibleActions ) );
+                        if ( attr & EMPXWrite )
+                            {
+                            aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
+                            aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
+                            aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
+                            }
+                        }
+                    }
+                else if ( type == EMPXItem )
+                    {
+                    switch ( category )
+                        {
+                        case EMPXPlaylist:
+                            {
+                            // playlist view
+                            if ( usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive )
+                                {
+                                aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdSend, SendOptionVisibilityL() );
+                                aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
+                                }
+                            else
+                                {
+                                aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, EFalse );
+                                aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdSend, SendOptionVisibilityL() );
+                                aMenuPane->SetItemDimmed( EMPXCmdDelete, EFalse );
+                                }
+                            if ( media.IsSupported(
+                                KMPXMediaGeneralNonPermissibleActions ) )
+                                {
+                                // check for auto playlist, disable delete
+                                TMPXGeneralNonPermissibleActions attr(
+                                    media.ValueTObjectL<TMPXGeneralNonPermissibleActions>(
+                                        KMPXMediaGeneralNonPermissibleActions ) );
+                                if ( attr & EMPXWrite )
+                                    {
+                                    aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
+                                    }
+                                }
+                            aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
+                            break;
+                            }
+#ifdef SINGLE_CLICK_INCLUDED
+                        case EMPXAlbum:
+                            {
+                            // album contents view
+                            if ( iContainer->IsSelectedItemASong() )
+                                {                            
+                                if ( usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive )
+                                    {
+                                    aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
+                                    aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
+                                    aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
+                                    aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
+                                    aMenuPane->SetItemDimmed( EMPXCmdSend, SendOptionVisibilityL() );
+                                    aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
+                                    aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
+                                    aMenuPane->SetItemDimmed( EMPXCmdPlayItem, ETrue );
+                                    }
+                                else
+                                    {
+                                    aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
+                                    aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, EFalse );
+                                    aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
+                                    aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
+                                    aMenuPane->SetItemDimmed( EMPXCmdSend, SendOptionVisibilityL() );
+                                    aMenuPane->SetItemDimmed( EMPXCmdDelete, EFalse );
+                                    aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
+                                    aMenuPane->SetItemDimmed( EMPXCmdPlayItem, ETrue );
+                                    }
+                                }
+                            else
+                                {
+                                aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdPlayItem, ETrue );                                
+                                }
+                            break;
+                            }
+                        case EMPXGenre:
+                            {
+                            // genre view
+                            if ( usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive )
+                                {
+                                aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
+                                }
+                            else
+                                {
+                                aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, EFalse );
+                                aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdDelete, EFalse );
+                                aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
+                                }
+                            break;
+                            }
+#endif
+                            
+#ifdef SINGLE_CLICK_INCLUDED
+                        case EMPXArtist:  
+                        case EMPXComposer:
+#else
+                        case EMPXAlbum:
+                        case EMPXArtist:
+                        case EMPXGenre:
+                        case EMPXComposer:
+#endif
+                            {
+                            // artist, album, genre, composer view
+                            if ( usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive )
+                                {
+                                aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
+                                }
+                            else
+                                {
+                                aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, EFalse );
+                                aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdDelete, EFalse );
+                                aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
+                                }
+                            break;
+                            }
+                        case EMPXSong:
+                            {
+                            // any tracks view except playlist tracks
+                            if ( usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive )
+                                {
+                                aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdSend, SendOptionVisibilityL() );
+                                aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
+#ifdef SINGLE_CLICK_INCLUDED
+                                aMenuPane->SetItemDimmed( EMPXCmdPlayItem, ETrue );
+#endif
+                                }
+                            else
+                                {
+                                aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, EFalse );
+                                aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdSend, SendOptionVisibilityL() );
+                                aMenuPane->SetItemDimmed( EMPXCmdDelete, EFalse );
+                                aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
+#ifdef SINGLE_CLICK_INCLUDED
+                                aMenuPane->SetItemDimmed( EMPXCmdPlayItem, ETrue );
+#endif
+                                }
+                            break;
+                            }
+                        case EMPXCommand:
+                            {
+							aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
+							aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
+							aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
+							aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
+							aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue );
+							aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
+							aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
+#ifdef SINGLE_CLICK_INCLUDED
+                            aMenuPane->SetItemDimmed( EMPXCmdPlayItem, ETrue );
+#endif
+							
+                            }
+                            break;
+                        default:
+                            {
+                            ASSERT( 0 );
+                            break;
+                            }
+                        }
+                    }
+
+                if ( iUpnpFrameworkSupport )
+                    {
+                    HandleDynInitUpnpL( aResourceId, *aMenuPane );
+                    }
+                else
+                    {
+                    aMenuPane->SetItemDimmed( EMPXCmdUpnpPlayVia, ETrue );
+                    aMenuPane->SetItemDimmed( EMPXCmdUPnPAiwCmdCopyToExternalCriteria, ETrue );
+                    }
+                }
+            else
+                {
+                // list empty
+
+                aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist,
+                    ( containerType == EMPXGroup && containerCategory == EMPXPlaylist) ? // in playlist view?
+                    EFalse : ETrue );
+                if ( containerType == EMPXItem && containerCategory == EMPXPlaylist)
+                    {
+                    // in playlist tracks view
+                    if ( containerMedia.IsSupported(
+                        KMPXMediaGeneralNonPermissibleActions ) )
+                        {
+                        // check for auto playlist, disable add songs
+                        TMPXGeneralNonPermissibleActions attr(
+                            containerMedia.ValueTObjectL<TMPXGeneralNonPermissibleActions>(
+                                KMPXMediaGeneralNonPermissibleActions ) );
+                        if ( attr & EMPXWrite )
+                            {
+                            aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
+                            }
+                        }
+                    }
+                else
+                    {
+                    aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
+                    }
+                aMenuPane->SetItemDimmed( EMPXCmdUpnpPlayVia, ETrue );
+                aMenuPane->SetItemDimmed( EMPXCmdUPnPAiwCmdCopyToExternalCriteria, ETrue );
+                aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
+                aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
+                aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue );
+                aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
+                aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
+                }
+            break;
+            }
+        case R_MPX_COLLECTION_VIEW_MENU_2:
+            {
+            if ( !isListEmpty )
+                {
+                const CMPXMedia& media = array->MediaL( currentItem );
+                TMPXGeneralType type(
+                    media.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType ) );
+                TMPXGeneralCategory category(
+                    media.ValueTObjectL<TMPXGeneralCategory>(
+                        KMPXMediaGeneralCategory ) );
+                const CMPXMedia& containerMedia = array->ContainerMedia();
+                TMPXGeneralType containerType(
+                    containerMedia.ValueTObjectL<TMPXGeneralType>(
+                        KMPXMediaGeneralType ) );
+                TMPXGeneralCategory containerCategory(
+                    containerMedia.ValueTObjectL<TMPXGeneralCategory>(
+                        KMPXMediaGeneralCategory ) );
+                MPX_DEBUG3( "CMPXCollectionViewHgImp::DynInitMenuPaneL container type = %d, category = %d", containerType, containerCategory );
+                MPX_DEBUG3( "CMPXCollectionViewHgImp::DynInitMenuPaneL item type = %d, category = %d", type, category );
+                if ( type == EMPXItem)
+                    {
+                    switch ( category )
+                        {
+                        case EMPXPlaylist:
+                            {
+                            // playlist view
+                            aMenuPane->SetItemDimmed( EMPXCmdUseAsCascade, ETrue );
+                            aMenuPane->SetItemDimmed( EMPXCmdSongDetails, ETrue );
+                            if ( usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive )
+                                {
+                                aMenuPane->SetItemDimmed( EMPXCmdRename, ETrue );
+                                }
+                            else
+                                {
+                                aMenuPane->SetItemDimmed( EMPXCmdRename, EFalse );
+                                }
+                            aMenuPane->SetItemDimmed( EMPXCmdAlbumArt, ETrue );
+                            aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, ETrue );
+                            aMenuPane->SetItemDimmed( EMPXCmdPlaylistDetails, EFalse );
+                            if ( media.IsSupported(
+                                KMPXMediaGeneralNonPermissibleActions ) )
+                                {
+                                // check for auto playlist, disable delete
+                                TMPXGeneralNonPermissibleActions attr(
+                                    media.ValueTObjectL<TMPXGeneralNonPermissibleActions>(
+                                        KMPXMediaGeneralNonPermissibleActions ) );
+                                if ( attr & EMPXWrite )
+                                    {
+                                    aMenuPane->SetItemDimmed( EMPXCmdRename, ETrue );
+                                    aMenuPane->SetItemDimmed( EMPXCmdPlaylistDetails, ETrue );
+                                    }
+                                }
+                            if ( array->IsItemBrokenLinkL( currentItem ) ||
+                                array->IsItemCorruptedL( currentItem ) )
+                                {
+                                aMenuPane->SetItemDimmed( EMPXCmdRename, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdPlaylistDetails, ETrue );
+                                }
+                            break;
+                            }
+                        case EMPXAlbum:
+                        case EMPXArtist:
+                        case EMPXGenre:
+                        case EMPXComposer:
+                            {
+                            // artist, album, genre, composer view
+                            aMenuPane->SetItemDimmed( EMPXCmdUseAsCascade, ETrue );
+                            aMenuPane->SetItemDimmed( EMPXCmdSongDetails, ETrue );
+                            if ( usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive )
+                                {
+                                aMenuPane->SetItemDimmed( EMPXCmdRename, ETrue );
+                                }
+                            else
+                                {
+#ifdef SINGLE_CLICK_INCLUDED
+                                aMenuPane->SetItemDimmed( EMPXCmdRename, ETrue );
+#else
+                                aMenuPane->SetItemDimmed( EMPXCmdRename, EFalse );                              
+#endif
+                                }
+#ifndef SINGLE_CLICK_INCLUDED
+                            if ( category == EMPXAlbum )
+                                {
+                                aMenuPane->SetItemDimmed( EMPXCmdAlbumArt, EFalse );
+                                // if unknown entry exist in album level, disable album art
+                                // for last item, if unknown exist it'll be at this
+                                // location
+                                if ( array->IsCategoryUnknownExist() &&
+                                    category == EMPXAlbum &&
+                                    currentItem == iContainer->TotalListItemCount() - 1 )
+                                    {
+                                    aMenuPane->SetItemDimmed( EMPXCmdAlbumArt, ETrue );
+                                    }
+                                if ( containerCategory == EMPXArtist )
+                                    {
+                                    // in artist/album view, do not display album art/rename
+                                    // option on All ( first item in list )
+                                    if ( currentItem == 0 )
+                                        {
+                                        aMenuPane->SetItemDimmed( EMPXCmdRename, ETrue );
+                                        aMenuPane->SetItemDimmed( EMPXCmdAlbumArt, ETrue );
+                                        }
+                                    }
+                                }
+                            else
+#endif
+                                {
+                                aMenuPane->SetItemDimmed( EMPXCmdAlbumArt, ETrue );
+                                }
+#ifdef SINGLE_CLICK_INCLUDED
+                            if ( category == EMPXComposer )
+#else
+                            if ( ( category == EMPXGenre ) || ( category == EMPXComposer ) )
+#endif
+                                {
+                                aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, ETrue );
+                                }
+#ifdef SINGLE_CLICK_INCLUDED
+                            else if ( category == EMPXGenre )
+                                {
+                                aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, EFalse );
+                                }
+#endif
+                            else
+                                {
+                                if ( array->IsCategoryUnknownExist() &&
+                                    ( category == EMPXAlbum || category == EMPXArtist ) &&
+                                    currentItem == iContainer->TotalListItemCount() - 1 )
+                                    {
+                                    // if unknown entry exist in artist or album level
+                                    aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, ETrue );
+                                    }
+                                else
+                                    {
+#ifdef SINGLE_CLICK_INCLUDED
+                                    aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, ETrue );
+#else
+                                    aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, EFalse );
+#endif
+                                    }
+                                }
+                            aMenuPane->SetItemDimmed( EMPXCmdPlaylistDetails, ETrue );
+
+                            if ( !iUsingNokiaService )
+                                {
+                                aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, ETrue );
+                                }
+                            break;
+                            }
+                        case EMPXSong:
+                            {
+                            // any tracks view
+#ifdef __ENABLE_MSK
+                            // show context menu if MSK selected and there are
+                            // multiple selections; otherwise, show options menu
+                            if ( ( selectionCount > 0 ) && iShowContextMenu )
+                                {
+                                MenuBar()->SetMenuType(CEikMenuBar::EMenuContext);
+                                iShowContextMenu = EFalse;
+                                }
+                            else
+                                {
+                                MenuBar()->SetMenuType(CEikMenuBar::EMenuOptions);
+                                }
+#endif //__ENABLE_MSK
+
+                            if ( selectionCount > 0 )
+                                {
+                                // multiple selection
+                                aMenuPane->SetItemDimmed( EMPXCmdUseAsCascade, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdSongDetails, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdAlbumArt, ETrue );
+                                aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, ETrue );
+                                }
+                            else
+                                {
+                                TBool fileDetailVisibility( FileDetailsOptionVisibilityL() );
+                                // use the same criteria for showing/hiding song details
+                                // and album art
+                                aMenuPane->SetItemDimmed( EMPXCmdSongDetails,
+                                    fileDetailVisibility );
+                                aMenuPane->SetItemDimmed( EMPXCmdAlbumArt,
+                                    fileDetailVisibility );
+#ifdef SINGLE_CLICK_INCLUDED
+                                aMenuPane->SetItemDimmed( EMPXCmdUseAsCascade, ETrue );  
+#else
+                                TBool vis = ETrue;
+                                TRAPD( err, vis = SetAsRingToneOptionVisibilityL() );
+
+                                if ( err )
+                                    {
+                                    aMenuPane->SetItemDimmed( EMPXCmdUseAsCascade,
+                                        ETrue); // dim the option if any sql error.
+                                    }
+                                else
+                                    {
+                                    aMenuPane->SetItemDimmed( EMPXCmdUseAsCascade,
+                                        vis);
+                                    }
+#endif
+                                
+                                if ( array->IsItemBrokenLinkL( currentItem ) ||
+                                    array->IsItemCorruptedL( currentItem ) )
+                                    {
+                                aMenuPane->SetItemDimmed( EMPXCmdUseAsCascade, ETrue );
+                                    aMenuPane->SetItemDimmed( EMPXCmdSongDetails, ETrue );
+                                    aMenuPane->SetItemDimmed( EMPXCmdAlbumArt, ETrue );
+                                    }
+                                else // Show this option even when song is DRM protected
+                                    {
+#ifdef SINGLE_CLICK_INCLUDED
+                                    aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, ETrue );
+#else                                    
+                                    aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, EFalse );
+#endif
+                                    }
+                                }
+                            aMenuPane->SetItemDimmed( EMPXCmdRename, ETrue );
+                            aMenuPane->SetItemDimmed( EMPXCmdPlaylistDetails, ETrue );
+                            if ( !iUsingNokiaService )
+                                {
+                                aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, ETrue );
+                                }
+                            if (iServiceHandler->HandleSubmenuL(*aMenuPane))
+                                {
+                                return;
+                                }
+                            break;
+                            }
+                        case EMPXCommand:
+                            {
+                            aMenuPane->SetItemDimmed( EMPXCmdUseAsCascade, ETrue );
+                            aMenuPane->SetItemDimmed( EMPXCmdSongDetails, ETrue );
+                            aMenuPane->SetItemDimmed( EMPXCmdRename, ETrue );
+                            aMenuPane->SetItemDimmed( EMPXCmdAlbumArt, ETrue );
+                            aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, ETrue );
+                            aMenuPane->SetItemDimmed( EMPXCmdPlaylistDetails, ETrue );
+
+                            }
+                            break;
+                        default:
+                            {
+                            // other types, not handled
+                            break;
+                            }
+                        }
+                    }
+                }
+            else
+                {
+                // list empty
+                aMenuPane->SetItemDimmed( EMPXCmdUseAsCascade, ETrue );
+                aMenuPane->SetItemDimmed( EMPXCmdSongDetails, ETrue );
+                aMenuPane->SetItemDimmed( EMPXCmdRename, ETrue );
+                aMenuPane->SetItemDimmed( EMPXCmdAlbumArt, ETrue );
+                aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, ETrue );
+                aMenuPane->SetItemDimmed( EMPXCmdPlaylistDetails, ETrue );
+                }
+            aMenuPane->SetItemDimmed( EAknCmdExit, iExitOptionHidden );
+            break;
+            }
+        case R_MPX_ADD_TO_PL_SUB_MENU:
+            {
+            aMenuPane->SetItemDimmed( EMPXCmdAddToSavedPlaylist, !FindPlaylistsL() );
+            break;
+            }
+        case R_MPX_COLLECTION_PLAY_VIA_SUB_MENU:
+            {
+            if ( iUpnpFrameworkSupport )
+                {
+                AddPlayersNamesToMenuL( *aMenuPane );
+                }
+            break;
+            }
+        case R_MPX_COLLECTION_VIEW_MUSIC_MENU:
+            {
+            MMPXPlaybackUtility* pdPlaybackUtility;
+            pdPlaybackUtility = MMPXPlaybackUtility::UtilityL( TUid::Uid( KProgressDownloadUid ) );
+            MMPXSource* pdsource( pdPlaybackUtility->Source() );
+            MMPXSource* source( iPlaybackUtility->Source() );
+            TBool hideNowPlaying;
+            hideNowPlaying = ( (pdsource == 0)
+                           &&  (source == 0));
+            pdPlaybackUtility->Close();
+            if ( hideNowPlaying )
+                {
+                aMenuPane->SetItemDimmed( EMPXCmdGoToNowPlaying, ETrue );
+                }
+            if (usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive)
+                {
+                aMenuPane->SetItemDimmed( EMPXCmdRefreshLibrary, ETrue );
+                }
+            aMenuPane->SetItemDimmed( EAknCmdExit, iExitOptionHidden );
+            aMenuPane->SetItemDimmed(
+                EMPXCmdGoToMusicShop, iGoToMusicShopOptionHidden );
+            if (iOperatorMusicStore)
+            	{
+            	aMenuPane->SetItemDimmed(EMPXCmdGoToMusicShop, ETrue);
+            	}
+            else
+            	{
+            	aMenuPane->SetItemDimmed(EMPXCmdGoToMultipleMusicShop, ETrue);
+          		}
+            break;
+            }
+        case R_MPX_COLLECTION_VIEW_EMBEDDED_PLAYLIST_VIEW:
+            {
+            // if it's from browser/messaging, display save option if
+            // it has not been saved
+            aMenuPane->SetItemDimmed( EMPXCmdSavePlaylist,
+                ( !iCommonUiHelper->IsHostMessagingBrowserL() || !MPXTlsHelper::NeedSave() ) );
+            aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, isListEmpty );
+
+            break;
+            }
+        case R_MPX_PLAYBACK_COLLECTION_MUSICSHOP_SUB_MENU:
+        	{
+        	aMenuPane->SetItemTextL(EMPXCmdGoToOperatorMusicShop,  iOperatorMusicStoreName->Des() );
+        	break;
+        	}
+        case R_AVKON_MENUPANE_MARKABLE_LIST:
+            {
+            // Mark/Unmark submenu is displayed only if USB is on going
+            if (usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive)
+                {
+                MPX_DEBUG1("CMPXCollectionViewHgImp::DynInitMenuPaneL() dimmed Mark/Unmark submenu");
+                aMenuPane->SetItemDimmed(EAknCmdEditListMenu, ETrue);
+                }
+            break;
+            }
+        default:
+            {
+            // Do nothing
+            break;
+            }
+        }
+
+#ifndef SINGLE_CLICK_INCLUDED
+		if ( iServiceHandler->IsAiwMenu(aResourceId) && aResourceId == R_MPX_USE_AS_CASCADE )
+            {
+            MPX_DEBUG1( "CMPXCollectionViewHgImp::DynInitMenuPaneL(): Aiw menu for assign" );
+            CAiwGenericParamList& paramList = iServiceHandler->InParamListL();
+            FillAiwParametersL(paramList);
+            iServiceHandler->InitializeMenuPaneL(*aMenuPane,
+                                                aResourceId,
+                                                EMPXCmdAiwCmdAssign,
+                                                paramList);
+            MPX_DEBUG1( "CMPXCollectionViewHgImp::DynInitMenuPaneL(): Aiw menu for assign end" );
+            }
+#endif
+
+    if (!(aResourceId == R_AVKON_MENUPANE_MARKABLE_LIST && usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive))
+        {
+        // Custom handling of menu pane for markable lists
+        iContainer->HandleMarkableListDynInitMenuPane(
+            aResourceId,
+            aMenuPane );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From MEikListBoxObserver
+// Handles listbox events.
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandleListBoxEventL(
+    CEikListBox* /*aListBox*/,
+    TListBoxEvent aEventType)
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::HandleListBoxEventL" );
+    MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleListBoxEventL iLastDepth = %d", iLastDepth );
+    MPX_PERF_CHECKPT( "Select collection item to open" );
+    if ( iContainer )
+        {
+        //to keep/change focus on right song in rename/remove
+#ifdef SINGLE_CLICK_INCLUDED
+        if ( aEventType == EEventItemSingleClicked )         
+#else
+        if ( aEventType == EEventItemClicked )
+#endif
+            {
+            if ( !iHandlingKeyEvent && iCollectionCacheReady )
+                {
+                CMPXCommonListBoxArrayBase* listboxArray( iContainer->ListBoxArray() );
+                TInt currentIndex( iContainer->CurrentLbxItemIndex() );
+
+                CMPXCommand* command = CMPXCommand::NewL();
+                CleanupStack::PushL( command );
+                command->SetTObjectValueL<TMPXCommandId>( KMPXCommandGeneralId,
+                                                          KMPXCommandIdCollectionSelect );
+                command->SetTObjectValueL( KMPXCommandCollectionSelectIndex, currentIndex );
+                command->SetTObjectValueL<TBool>( KMPXCommandGeneralDoSync, ETrue );
+                iCollectionUtility->Collection().CommandL( *command );
+                CleanupStack::PopAndDestroy( command );
+                }
+            }
+
+        if ( aEventType == EEventEnterKeyPressed || aEventType == EEventItemDoubleClicked
+#ifdef SINGLE_CLICK_INCLUDED
+            || aEventType == EEventItemSingleClicked
+#endif
+           )
+            {
+            if ( iContainer->IsInReorderMode() )
+                {
+                ProcessCommandL( iContainer->IsInReorderMode() ?
+                    EMPXCmdReorderDrop : EMPXCmdReorderGrab );
+                iIsGrabbed = !iIsGrabbed;
+                }
+            else if ( !iHandlingKeyEvent )
+                {
+                TMPXPlaybackState pbState( iPlaybackUtility->StateL() );
+                TBool isEqual( EFalse );
+                if ( pbState == EPbStatePlaying || pbState == EPbStatePaused )
+                    {
+                    // in currently playing view, check if current item is playing
+                    if ( iContainer->CurrentLbxItemIndex() ==
+                        iContainer->PlaybackIndex() )
+                        {
+                        isEqual = ETrue;
+                        }
+                    }
+
+                if ( isEqual )
+                    {
+                    MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleListBoxEventL going to now playing view" );
+                    if ( pbState == EPbStatePaused )
+                        {
+                        MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleListBoxEventL resuming playback" );
+                        iPlaybackUtility->CommandL( EPbCmdPlay );
+                        }
+                    HandleCommandL( EMPXCmdGoToNowPlaying );
+                    }
+                else
+                    {
+                    CMPXCollectionPath* cpath = iCollectionUtility->Collection().PathL();
+                    CleanupStack::PushL( cpath );
+                    if ( cpath->Levels() == ( iLastDepth + 1 ) )
+                        {
+                        // navigated in one level
+                        iLastDepth++;
+                        iBottomIndex->AppendL(
+                            iContainer->BottomLbxItemIndex() );
+                        }
+                    else
+                        {
+                        // invalid path, rebuild with all 0
+                        iBottomIndex->Reset();
+                        iLastDepth = cpath->Levels();
+                        for ( TInt i = 0; i < iLastDepth; i++ )
+                            {
+                            iBottomIndex->AppendL( 0 );
+                            }
+                        }
+                    CleanupStack::PopAndDestroy( cpath );
+                    TInt currentItem( iContainer->CurrentLbxItemIndex() );
+                    MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleListBoxEventL Opening Item: %d", currentItem );
+
+                    iHandlingKeyEvent = ETrue;
+
+                    // Needed to reset the status of iPreservedState
+                    if ( EPbStateStopped == pbState )
+                        {
+                        iPlaybackUtility->CommandL(EPbCmdResetPreserveState);
+                        }
+
+    #ifdef __ENABLE_PODCAST_IN_MUSIC_MENU
+                    // check to see if user has selected podcast item
+                    if ( (iLastDepth == KMusicCollectionMenuLevel) &&
+                         (currentItem == KMusicMenuPodcastMenuItemIndex) &&
+                         !iDisablePodcasting )
+                        {
+                        // open the podcast collection db plugin
+                        iPodcast = ETrue;
+                        CMPXCollectionPath* mainPodcastMenu = CMPXCollectionPath::NewL();
+                        CleanupStack::PushL( mainPodcastMenu );
+                        mainPodcastMenu->AppendL(KPodcastCollectionUid);
+                        iCollectionUtility->Collection().OpenL( *mainPodcastMenu );
+						iFirstIncrementalBatch = ETrue;
+                        CleanupStack::PopAndDestroy( mainPodcastMenu );
+
+                        // activate the podcast collection view
+                        RArray<TUid> uids;
+                        CleanupClosePushL( uids );
+                        uids.AppendL( TUid::Uid( KMPXPluginTypeCollectionUid ) );
+                        uids.AppendL( TUid::Uid( KPodcastCollectionUid ));
+                        iViewUtility->ActivateViewL(uids);
+
+                        CleanupStack::PopAndDestroy( &uids );
+                        }
+                    else
+    #endif
+                        {
+                        if(iCollectionCacheReady)
+                            {
+                            CMPXCommonListBoxArrayBase* listboxArray( iContainer->ListBoxArray() );
+                            TInt currentIndex( iContainer->CurrentLbxItemIndex() );
+                            const CMPXMedia& media( listboxArray->MediaL( currentIndex ) );
+                            TMPXGeneralType type(
+                                media.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType ) );
+                            TMPXGeneralCategory category(
+                                media.ValueTObjectL<TMPXGeneralCategory>( KMPXMediaGeneralCategory ) );
+                            if ( type != EMPXItem || category != EMPXSong )
+                                {
+                                if ( type == EMPXGroup && category== EMPXSong )
+                                    {
+                                    // dismiss for HGList
+                                    //StartWaitNoteL( EMPXImmediatelyOpeningNote );
+                                    }
+                                else
+                                    {
+                                    //do not show wait note if opening a song
+                                    // dismiss for HGList
+                                    //StartWaitNoteL( EMPXOpeningNote );
+                                    }
+                                }
+                            iCollectionUtility->Collection().OpenL( currentItem );
+							iFirstIncrementalBatch = ETrue;
+                            }
+                        }
+
+                    }
+                }
+            else
+                {
+                MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleListBoxEventL Busy, ignoring command" );
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From MEikCommandObserver
+// Processes user commands.
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::ProcessCommandL(TInt aCommandId)
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::ProcessCommandL" );
+
+    switch( aCommandId )
+        {
+        case EMPXCmdReorderDrop:
+            {
+            SaveCurrentPlaylistL();
+            iContainer->ConfirmReorderL();
+            DeactivateReorderGrabbedModeL( EFalse );
+            SetNewCbaL( R_MPX_CUI_REORDER_GRAB_DONE_CBA );
+            break;
+            }
+        case EMPXCmdReorderGrab:
+            {
+            SetNewCbaL( R_MPX_CUI_REORDER_DROP_CANCEL_CBA );
+            ActivateReorderGrabbedModeL();
+            break;
+            }
+        case EMPXCmdReorderCancel:
+            {
+            iCurrentHighlightedIndex = iContainer->GetOriginalIndex();
+            MPX_DEBUG2( "CMPXCollectionViewHgImp::ProcessCommandL Setting iCurrentHighlightedIndex = %d", iCurrentHighlightedIndex );
+            iContainer->CancelReorder();
+            } // Fall through on purpose
+        case EMPXCmdReorderDone:
+            {
+            DeactivateReorderGrabbedModeL( ETrue );
+            break;
+            }
+        case EMPXCmdUpArrow:
+            {
+            iIgnoreNextFocusChangedMessage = ETrue;
+            if ( iContainer->IsInReorderMode() )
+                {
+                iContainer->MoveReorderIndex( KMPXDirectionUp );
+                }
+            else
+                {
+                iDownCount = 0;
+
+                if( iUpCount != KErrNotFound )
+                    {
+                    if( iUpCount++ > KIncrementalDirectionCount )
+                        {
+                        iIncrementalOpenUtil->SetDirection( CMPXCollectionOpenUtility::EFetchUp );
+                        iUpCount = KErrNotFound;
+                        }
+                    }
+                }
+            break;
+            }
+        case EMPXCmdDownArrow:
+            {
+            iIgnoreNextFocusChangedMessage = ETrue;
+            if ( iContainer->IsInReorderMode() )
+                {
+                iContainer->MoveReorderIndex( KMPXDirectionDown );
+                }
+            else
+                {
+                iUpCount = 0;
+
+                if( iDownCount != KErrNotFound )
+                    {
+                    if( iDownCount++ > KIncrementalDirectionCount  )
+                        {
+                        iIncrementalOpenUtil->SetDirection( CMPXCollectionOpenUtility::EFetchDown );
+                        iDownCount = KErrNotFound;
+                        }
+
+                    }
+                }
+            break;
+            }
+        case EMPXCmdCommonEnterKey:
+            {
+            // Handle list box event for enter key pressed
+            TInt index( iContainer->CurrentLbxItemIndex() );
+            if( index >= 0 )
+            	{
+                HandleListBoxEventL(
+            	    NULL, // ignore
+            	    EEventEnterKeyPressed );
+            	}
+            break;
+            }
+
+		case EMPXCmdGoToNowPlaying:
+			{
+			HandleCommandL( aCommandId );
+			break;
+			}
+        case EMPXCmdUpArrowAfterListboxHandled:
+            {
+            if ( iContainer->IsInReorderMode() )
+                {
+                TInt index( iContainer->CurrentLbxItemIndex() );
+                if ( index == iContainer->CurrentListItemCount() - 1 )
+                    {
+                    // if after up arrow is pressed, and end up at the
+                    // lowest index.  list box looped, sync with listboxarray needed
+                    iContainer->SetReorderIndex( index );
+                    iContainer->HandleLbxItemAdditionL();
+                    // need to set index and redraw
+                    iContainer->SetLbxCurrentItemIndexAndDraw( index );
+                    }
+                UpdateReorderNaviPaneL();
+                }
+            break;
+            }
+        case EMPXCmdDownArrowAfterListboxHandled:
+            {
+            if ( iContainer->IsInReorderMode() )
+                {
+                TInt index( iContainer->CurrentLbxItemIndex() );
+                if ( index == 0 )
+                    {
+                    // if after down arrow is pressed, and end up at the
+                    // top index.  list box looped, sync with listboxarray needed
+                    iContainer->SetReorderIndex( index );
+                    iContainer->HandleLbxItemAdditionL();
+                    }
+                UpdateReorderNaviPaneL();
+                }
+            break;
+            }
+        case EMPXCmdCommonDelete:
+            {
+            if ( !iIsEmbedded )
+                {
+                StoreListboxItemIndexL();
+                // embedded mode doesn't support delete key
+                DeleteSelectedItemsL(aCommandId);
+                }
+            break;
+            }
+        case EMPXCmdCommonResourceChange:
+            {
+            iContainer->SetRect( ClientRect() );
+            break;
+            }
+        case EAknSoftkeyEmpty:
+            {
+            // do nothing.  handled to avoid "unsupported" message
+            break;
+            }
+#ifdef __ENABLE_MSK
+        case EMPXCmdCommonUpdateMiddleSoftKey:
+            {
+            // Determine middle soft key labeling
+            UpdateMiddleSoftKeyDisplayL( iCurrentMskId );
+            break;
+            }
+        case EAknSoftkeyContextOptions :
+            {
+            // set context menu flag
+            iShowContextMenu = ETrue;
+            // open context menu (by processing "Options" command)
+            if ( iContainer )
+                {
+                iSelectionIndexCache = iContainer->CurrentSelectionIndicesL(); // not owned
+                MPX_DEBUG2( "CMPXCollectionViewHgImp::ProcessCommandL count = %d", iSelectionIndexCache->Count() );
+                }
+            CAknView::ProcessCommandL( EAknSoftkeyOptions );
+            break;
+            }
+#endif // __ENABLE_MSK
+        case EAknCmdExit:
+			{
+            HandleCommandL( aCommandId );
+			CAknView::ProcessCommandL( aCommandId );
+			break;
+			}
+		case EAknSoftkeyOptions:
+            {
+            if ( iContainer )
+                {
+                iSelectionIndexCache = iContainer->CurrentSelectionIndicesL(); // not owned
+                MPX_DEBUG2( "CMPXCollectionViewHgImp::ProcessCommandL count = %d", iSelectionIndexCache->Count() );
+                }
+            }
+        default:
+            {
+            CAknView::ProcessCommandL( aCommandId );
+            break;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::LaunchMusicShopL
+// Launch music shop application
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::LaunchMusicShopL()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::LaunchMusicShopL" );
+
+    if ( iMusicStoreUID != 0)
+        {
+    TApaTaskList tasList( iCoeEnv->WsSession() );
+        TApaTask task = tasList.FindApp( TUid::Uid(iMusicStoreUID) );
+
+    if ( task.Exists() )
+        {
+        task.BringToForeground();
+        }
+    else
+        {
+        RApaLsSession session;
+        if ( KErrNone == session.Connect() )
+            {
+            CleanupClosePushL( session );
+            TThreadId threadId;
+                session.CreateDocument( KNullDesC, TUid::Uid(iMusicStoreUID), threadId );
+            CleanupStack::PopAndDestroy(&session);
+                }
+            }
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMPlayerCategoryView::DoFindInMusicShopL
+// Handle find in music shop event
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::DoFindInMusicShopL( const TDesC& aSongName,
+                                                const TDesC& aArtistName,
+                                                const TDesC& aAlbumName )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::DoFindInMusicShopL" );
+    CMPXFindInMShop* finder = CMPXFindInMShop::NewL();
+    CleanupStack::PushL( finder );
+    HBufC* url = NULL;
+    url = finder->CreateSearchURLL( aSongName,
+                                     aArtistName,
+                                     aAlbumName,
+                                     KNullDesC,     // Composer - Not used
+                                     KNullDesC );   // Genre - Not used
+    CleanupStack::PushL(url);   // the pointer will be poped
+    RProperty::Set( TUid::Uid(iMusicStoreUID),
+                    KMShopCategoryId,
+                    KFindInMShopKeyValid );  // Set Key to Valid
+
+    RProperty::Set( TUid::Uid(iMusicStoreUID),
+                    KMShopCategoryName,
+                    *url );
+
+    LaunchMusicShopL();
+
+
+    if(url)
+        {
+        CleanupStack::PopAndDestroy(url);
+        }
+
+    CleanupStack::PopAndDestroy( finder ); // finder
+    REComSession::FinalClose();
+    }
+
+
+// ----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::SetParamL
+// Set the parameter passed in from viewframework to the current select index
+// ----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::SetParamL( const TDesC* aParam )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::SetParamL" );
+    delete iCurrentSelectedIndex;
+    iCurrentSelectedIndex = NULL;
+    iCurrentSelectedIndex = aParam->AllocL();    //  aParam = L"0" for 1st item
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMPlayerCategoryView::DoGetSongMediaPropertyL
+// Handle find in music shop event
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::DoGetSongMediaPropertyL()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::DoGetSongMediaPropertyL" );
+
+    if ( iCurrentSelectedIndex )
+        {
+        TLex currentSelectedIndexLex( iCurrentSelectedIndex->Des() );
+        TInt lexToInt = NULL;
+        if ( currentSelectedIndexLex.Val( lexToInt ) == KErrNone )
+            {
+            // Get media property for the current song
+            CMPXCollectionPath* cpath = iCollectionUtility->Collection().PathL();
+            CleanupStack::PushL( cpath );
+
+            cpath->Set( lexToInt );
+            RArray<TMPXAttribute> attrs;
+            CleanupClosePushL(attrs);
+            // to get EMPXMediaGeneralTitle
+            attrs.Append( KMPXMediaGeneralTitle );
+            // to get EMPXMediaMusicArtist and EMPXMediaMusicAlbum
+            attrs.Append( KMPXMediaMusicArtist );
+            attrs.Append( KMPXMediaMusicAlbum );
+
+            // Call MediaL and handle callback at HandleCollectionMediaL
+            iCollectionUtility->Collection().MediaL( *cpath, attrs.Array() );
+            CleanupStack::PopAndDestroy( &attrs );
+            CleanupStack::PopAndDestroy( cpath );
+            }
+        }
+
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::HandleFindAllL
+// Handle callback for "find" operation
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandleFindAllL(
+    const CMPXMedia& aResults,
+    TBool aComplete,
+    TInt aError )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::HandleFindAllL" );
+    if ( aError == KErrNone )
+        {
+        switch ( iCurrentFindAllLOp )
+            {
+            case EMPXOpFindAllLAlbumArtistAddToNewPlaylist:
+                {
+                iNumSongAddedToPlaylist = aResults.ValueTObjectL<TInt>(
+                    KMPXMediaArrayCount );
+                TBool ret = iCommonUiHelper->CreatePlaylistL(
+                    aResults, this, this );
+                if ( !ret )
+                    {
+                    iAddingToNewPlaylist = EFalse;
+                    }
+                break;
+                }
+            case EMPXOpFindAllLAlbumArtistAddToSavedPlaylist:
+                {
+                if ( !iUserPlaylists )
+                    {
+                    MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleFindAllL Null iUserPlaylists" );
+                    User::Leave( KErrArgument );
+                    }
+                iNumSongAddedToPlaylist = aResults.ValueTObjectL<TInt>(
+                    KMPXMediaArrayCount );
+                MPX_TRAPD( err, iCommonUiHelper->AddToSavedPlaylistL(
+                    *iUserPlaylists, aResults, this, this ) );
+                if ( err != KErrNone )
+                    {
+                    HandleError( err );
+                    }
+                break;
+                }
+            case EMPXOpFindAllLRenameAlbum:
+            case EMPXOpFindAllLRenameArtist:
+            case EMPXOpFindAllLRenameGenre:
+            case EMPXOpFindAllLRenameComposer:
+                {
+                const CMPXMediaArray* mediaArray =
+                    aResults.Value<CMPXMediaArray>( KMPXMediaArrayContents );
+                User::LeaveIfNull(const_cast<CMPXMediaArray*>(mediaArray));
+
+                iSetMediaLCount = mediaArray->Count();
+                iInvalidFileExist = EFalse;
+                TInt invalidItemCount( 0 );
+                MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleFindAllL Rename song count = %d", iSetMediaLCount );
+                iIsWaitNoteCanceled = EFalse;
+                HBufC* waitNoteString( NULL );
+                if ( iSetMediaLCount > 1 )
+                    {
+                    // multiple item
+                    waitNoteString = StringLoader::LoadLC(
+                        R_MPX_COLLECTION_NOTE_UPDATING_MULTIPLE_ITEMS,
+                        iSetMediaLCount );
+                    }
+                else
+                    {
+                    // single item
+                    waitNoteString = StringLoader::LoadLC(
+                        R_MPX_COLLECTION_NOTE_UPDATING_ITEM );
+                    }
+                HandleCommandL( EMPXCmdIgnoreExternalCommand );
+                iCommonUiHelper->ShowWaitNoteL( *waitNoteString,
+                    R_MPX_COLLECTION_WAITNOTE_SOFTKEYS_EMPTY_STOP, EFalse, this );
+                CleanupStack::PopAndDestroy( waitNoteString );
+
+                TPtrC art( KNullDesC );
+                if ( (iCurrentFindAllLOp == EMPXOpFindAllLRenameAlbum || iCurrentFindAllLOp == EMPXOpFindAllLRenameArtist )&&
+                        iContainer )
+                    {
+                    CMPXCommonListBoxArrayBase* listboxArray(
+                        iContainer->ListBoxArray() );
+                    TInt currentIndex( iContainer->CurrentLbxItemIndex() );
+                    const CMPXMedia& currentMedia( listboxArray->MediaL( currentIndex ) );
+                    if ( currentMedia.IsSupported( KMPXMediaMusicAlbumArtFileName ) )
+                        {
+                        art.Set( currentMedia.ValueText( KMPXMediaMusicAlbumArtFileName ) );
+                        }
+                    }
+
+                CMPXMediaArray* entryArray = CMPXMediaArray::NewL();
+                CleanupStack::PushL( entryArray );
+                TUid collectionId( KNullUid );
+                for ( TInt i = 0; i < iSetMediaLCount && !iIsWaitNoteCanceled; i++ )
+                    {
+                    CMPXMedia* media( mediaArray->AtL( i ) );
+                    TUint flags( 0 );
+                    if( media->IsSupported( KMPXMediaGeneralFlags ) )
+                        {
+                        flags = media->ValueTObjectL<TUint>( KMPXMediaGeneralFlags );
+                        }
+                    const TDesC& songUri =
+                        media->ValueText( KMPXMediaGeneralUri );
+                    TBool fileExist( ConeUtils::FileExists( songUri ) );
+                    if (!(flags & KMPXMediaGeneralFlagsIsInvalid)
+                     && !(flags & KMPXMediaGeneralFlagsIsCorrupted)
+                     && fileExist )
+                        {
+                        CMPXMedia* entry = CMPXMedia::NewL();
+                        CleanupStack::PushL( entry );
+                        entry->SetTextValueL( KMPXMediaGeneralUri, songUri );
+                        TMPXItemId id( media->ValueTObjectL<TMPXItemId>(
+                                        KMPXMediaGeneralId ) );
+                        collectionId = media->ValueTObjectL<TUid>(
+                                             KMPXMediaGeneralCollectionId );
+                        entry->SetTObjectValueL<TMPXItemId>(
+                            KMPXMediaGeneralId, id );
+                        entry->SetTObjectValueL<TUid>(
+                            KMPXMediaGeneralCollectionId, collectionId );
+                        entry->SetTObjectValueL<TMPXGeneralType>(
+                            KMPXMediaGeneralType, EMPXItem );
+                        entry->SetTObjectValueL<TMPXGeneralCategory>(
+                            KMPXMediaGeneralCategory, EMPXSong );
+
+                        TPtrC ptr( songUri );
+                        MPX_DEBUG3( "CMPXCollectionViewHgImp::HandleFindAllL setting item id 0x%x, uri %S", id.iId1, &ptr );
+                        switch ( iCurrentFindAllLOp )
+                            {
+                            case EMPXOpFindAllLRenameAlbum:
+                                {
+                                if ( art.Compare( KNullDesC ) != 0 &&
+                                        art.Compare(
+                                            media->ValueText( KMPXMediaMusicAlbumArtFileName ) ) == 0 )
+                                    {
+                                    entry->SetTextValueL(
+                                        KMPXMediaMusicAlbumArtFileName,
+                                        art );
+                                    }
+                                entry->SetTextValueL(
+                                    KMPXMediaMusicAlbum, *iNewName );
+                                break;
+                                }
+                            case EMPXOpFindAllLRenameArtist:
+                                {
+                                if ( art.Compare( KNullDesC ) != 0 &&
+                                        art.Compare(
+                                            media->ValueText( KMPXMediaMusicAlbumArtFileName ) ) == 0 )
+                                    {
+                                    entry->SetTextValueL(
+                                        KMPXMediaMusicAlbumArtFileName,
+                                        art );
+                                    }
+                                entry->SetTextValueL(
+                                    KMPXMediaMusicArtist, *iNewName );
+                                break;
+                                }
+                            case EMPXOpFindAllLRenameGenre:
+                                {
+                                entry->SetTextValueL(
+                                    KMPXMediaMusicGenre, *iNewName );
+                                break;
+                                }
+                            case EMPXOpFindAllLRenameComposer:
+                                {
+                                entry->SetTextValueL(
+                                    KMPXMediaMusicComposer, *iNewName );
+                                break;
+                                }
+                            default:
+                                {
+                                // should not reach here
+                                ASSERT( 0 );
+                                break;
+                                }
+                            }
+                        if ( (iCurrentFindAllLOp == EMPXOpFindAllLRenameAlbum || iCurrentFindAllLOp == EMPXOpFindAllLRenameArtist) &&
+                                art.Compare( KNullDesC ) != 0 &&
+                                art.Compare(
+                                    media->ValueText( KMPXMediaMusicAlbumArtFileName ) ) == 0 )
+                            {
+                            entryArray->InsertL( entry, 0 );  // ownership xfer
+                            }
+                        else
+                            {
+                            entryArray->AppendL( entry );  // ownership xfer
+                            }
+                        CleanupStack::Pop( entry );
+                        }
+                    else
+                        {
+                        iInvalidFileExist = ETrue;
+                        invalidItemCount++;
+                        if ( !fileExist )
+                            {
+                            UpdateDatabaseFlagL( KErrNotFound, *media,
+                                KMPXMediaGeneralFlagsIsInvalid, ETrue, EFalse );
+                            }
+                        }
+                    }
+                // Package array of items to set
+                //
+                CMPXMedia* setData = CMPXMedia::NewL();
+                CleanupStack::PushL( setData );
+                setData->SetTObjectValueL( KMPXMediaGeneralType, EMPXGroup );
+                setData->SetCObjectValueL( KMPXMediaArrayContents, entryArray );
+
+                // Generate the command
+                //
+                CMPXCommand* command = CMPXCommand::NewL();
+                CleanupStack::PushL( command );
+                command->SetTObjectValueL<TMPXCommandId>( KMPXCommandGeneralId,
+                                                          KMPXCommandIdCollectionSet );
+                command->SetTObjectValueL<TInt>( KMPXCommandGeneralCollectionId,
+                                                 collectionId.iUid);
+                command->SetCObjectValueL( KMPXCommandColSetMedia, setData );
+
+                iCollectionUtility->Collection().CommandL( *command );
+
+                // Cleanup
+                CleanupStack::PopAndDestroy( command );
+                CleanupStack::PopAndDestroy( setData );
+                CleanupStack::PopAndDestroy( entryArray );
+
+                iSetMediaLCount = 1;  // 1 async set
+                MPX_DEBUG3( "CMPXCollectionViewHgImp::HandleFindAllL valid items = %d, invalid items = %d", iSetMediaLCount, invalidItemCount );
+                if ( iSetMediaLCount == 0 )
+                    {
+                    // if all items are invalid, display note
+                    // now instead of waiting for callback
+                    HandleRenameOpCompleteL();
+                    }
+                break;
+                }
+            case EMPXOpFindAllLPlaylistTracksCount:
+                {
+                TInt trackCount = aResults.ValueTObjectL<TInt>( KMPXMediaArrayCount );
+                MPX_DEBUG2( "CMPXCollectionViewHgImp:: playlist tracks count = %d", trackCount );
+                if ( trackCount == 0 )
+                    {
+                    // empty playlist, display info note
+                    HBufC* string = StringLoader::LoadLC(
+                        R_MPX_COLLECTION_NOTE_EMPTY_PLAYLIST );
+                    iCommonUiHelper->DisplayInfoNoteL( *string );
+                    CleanupStack::PopAndDestroy( string );
+                    }
+                else
+                    {
+                    HandleCommandL( EMPXCmdForcePlay );
+                    }
+                break;
+                }
+            case EMPXOpFindAllLUpnp:
+                {
+                if ( iUpnpFrameworkSupport )
+                    {
+                    DoHandleCopyToRemoteL( aResults, aComplete );
+                    }
+                break;
+                }
+            case EMPXOpFindAllLUpnpPlayback:
+                {
+                if ( iUpnpFrameworkSupport )
+                    {
+                    TInt trackCount = aResults.ValueTObjectL<TInt>( KMPXMediaArrayCount );
+                    MPX_DEBUG2( "CMPXCollectionViewHgImp:: playlist tracks count = %d", trackCount );
+                    if ( trackCount > 0 )
+                        {
+                        TInt currentListBoxItemIndex(
+                            iContainer->CurrentLbxItemIndex() );
+                        if ( currentListBoxItemIndex >= 0 )
+                            {
+                            GetCurrentPlayerDetails();
+
+                            // Needed to reset the status of iPreservedState
+                            if ( EPbStateStopped == iPlaybackUtility->StateL() )
+                                {
+                                iPlaybackUtility->CommandL(EPbCmdResetPreserveState);
+                                }
+                            if(iCollectionCacheReady)
+                                {
+                                iCollectionUtility->Collection().OpenL(
+                                                currentListBoxItemIndex,
+                                                EMPXOpenPlaylistOnly);
+								iFirstIncrementalBatch = ETrue;
+                                }
+                            }
+                        }
+                    else
+                        {
+                        // empty playlist, display info note
+                        HBufC* string = StringLoader::LoadLC(
+                            R_MPX_COLLECTION_NOTE_EMPTY_PLAYLIST );
+                        iCommonUiHelper->DisplayInfoNoteL( *string );
+                        CleanupStack::PopAndDestroy( string );
+                        }
+                    }
+                break;
+                }
+            default:
+                {
+                // should not reach here
+                break;
+                }
+            }
+        }
+    else
+        {
+        HandleError( aError );
+        }
+    iCurrentFindAllLOp = EMPXOpFindAllLIdle;
+
+    if ( !iUpnpFrameworkSupport )
+        {
+        // Remove compilation warnings
+        (void)aComplete;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::HandleViewActivation
+// Handle view activation
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandleViewActivation(
+    const TUid& aCurrentViewType,
+    const TUid& /*aPreviousViewType*/ )
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::HandleViewActivation" );
+
+    if ( aCurrentViewType.iUid == KMPXPluginTypeCollectionUid )
+        {
+        if( iAddingSong )
+            {
+            iAddingSong = EFalse;
+            TRAP_IGNORE( GetDurationL() );
+            TRAP_IGNORE( UpdateNaviPaneL() );
+            }
+        if( iInAlbumArtDialog )
+            {
+            iInAlbumArtDialog = EFalse;
+            TRAP_IGNORE( UpdateTitlePaneL() );
+            }
+        if( iInSongDetails )
+            {
+            iInSongDetails = EFalse;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::HandleViewUpdate
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandleViewUpdate(
+    TUid /* aViewUid */,
+    MMPXViewActivationObserver::TViewUpdateEvent /* aUpdateEvent */,
+    TBool /* aLoaded */,
+    TInt /* aData */)
+    {
+    // Do nothing, this should be handled by the AppUI
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::HandleViewActivation
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandleViewActivation(const TVwsViewId& aNewlyActivatedViewId,
+                                                 const TVwsViewId& /*aViewIdToBeDeactivated */)
+    {
+    if( aNewlyActivatedViewId.iAppUid == TUid::Uid(KMusicPlayerAppUidConstant) &&
+        aNewlyActivatedViewId.iViewUid == Id() )
+        {
+        TRAP_IGNORE( UpdateNaviPaneL() );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::HandleViewDeactivation
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::HandleViewDeactivation(const TVwsViewId& aViewIdToBeDeactivated,
+                                                   const TVwsViewId& /*aNewlyActivatedViewId*/)
+    {
+    if( aViewIdToBeDeactivated.iAppUid == TUid::Uid(KMusicPlayerAppUidConstant) &&
+        aViewIdToBeDeactivated.iViewUid == Id() )
+        {
+        if( iContainer )
+            {
+            if ( iNaviPane && iNaviDecorator )
+                {
+                if (iNaviPane->Top() == iNaviDecorator) // Only pop if it's the top, don't pop when it's behind a dialog
+                    iNaviPane->Pop( iNaviDecorator );
+                }
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::FillAiwParameters
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::FillAiwParametersL(
+    CAiwGenericParamList& aParamList )
+    {
+    CMPXCommonListBoxArrayBase* array( iContainer->ListBoxArray() );
+    const CMPXMedia& media = array->MediaL(
+        iContainer->CurrentLbxItemIndex() );
+    TPtrC location( media.ValueText(KMPXMediaGeneralUri) );
+    TPtrC mimeType( media.ValueText(KMPXMediaGeneralMimeType) );
+
+    if ( !location.Length() )
+        {
+        if ( media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) == KMPXInvalidItemId )
+            {
+            // highlighted item is not yet available
+            MPX_DEBUG1( "CMPXCollectionViewHgImp::FillAiwParametersL item not yet fetched" );
+            User::Leave( KMPXErrDataNotReady );
+            }
+        else
+            {
+            TMPXItemId id(
+                    media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
+            CMPXMedia* criteria = CMPXMedia::NewL();
+            CleanupStack::PushL( criteria );
+            criteria->SetTObjectValueL<TMPXGeneralType>(
+                KMPXMediaGeneralType, EMPXItem );
+            criteria->SetTObjectValueL<TMPXGeneralCategory>(
+                KMPXMediaGeneralCategory, EMPXSong );
+            criteria->SetTObjectValueL<TMPXItemId>( KMPXMediaGeneralId, id );
+
+            RArray<TMPXAttribute> attrs;
+            CleanupClosePushL( attrs );
+            attrs.Append( KMPXMediaGeneralUri );
+            attrs.Append( KMPXMediaGeneralMimeType );
+
+            CMPXMedia* songInfo = iCollectionUtility->Collection().FindAllL( *criteria,
+                                                             attrs.Array() );
+            CleanupStack::PopAndDestroy( &attrs );
+            CleanupStack::PushL( songInfo );
+
+            const CMPXMediaArray* mediaArray(
+                songInfo->Value<CMPXMediaArray>( KMPXMediaArrayContents ) );
+            User::LeaveIfNull(const_cast<CMPXMediaArray*>(mediaArray));
+
+            if ( mediaArray->Count() > 0 )
+                {
+                CMPXMedia* si( mediaArray->AtL( 0 ) );
+                location.Set( si->ValueText(KMPXMediaGeneralUri) );
+                mimeType.Set( si->ValueText(KMPXMediaGeneralMimeType) );
+                }
+            CleanupStack::PopAndDestroy( songInfo );
+            CleanupStack::PopAndDestroy( criteria );
+            }
+        }
+
+    TAiwVariant varMime(mimeType);
+    if ( !mimeType.Length() && ( iMediaRecognizer ) )
+        {
+        varMime.Set(iMediaRecognizer->MimeTypeL(location));
+        }
+    TAiwGenericParam paramMime(EGenericParamMIMEType, varMime);
+    aParamList.Reset();
+    aParamList.AppendL(paramMime);
+    TAiwVariant varFile(location);
+    TAiwGenericParam paramFile(EGenericParamFile, varFile);
+    aParamList.AppendL(paramFile);
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::GetUint32Presentation
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::GetUint32Presentation( TUint32& aResult,
+                                                   const TDesC8& aBuf,
+                                                   TInt aOffset )
+    {
+    aResult = 0;
+    const TInt KProEngByteLength( 8 );
+    const TInt length( aBuf.Length() );
+    const TInt maxBitShift( KProEngByteLength * ( length - 1 ) );
+
+    for( TInt i( 0 ); i<length; ++i )
+        {
+        aResult |= ( aBuf[aOffset + i] <<
+                   ( maxBitShift - ( KProEngByteLength * i ) ) );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::LaunchMusicShopL
+// Launch music shop application
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::LaunchOperatorJavaMusicShopL(TUid aUid)
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::LaunchOperatorMusicShopL" );
+    TThreadId threadId;
+    RApaLsSession apaSession;
+    User::LeaveIfError( apaSession.Connect() );
+    CleanupClosePushL( apaSession );
+    apaSession.StartDocument(_L(""), aUid, threadId);
+    CleanupStack::PopAndDestroy( &apaSession ); // close apaSession
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::LaunchMusicShopL
+// Launch music shop application
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::LaunchOperatorNativeMusicShopL()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::LaunchMusicShopL" );
+
+    TApaTaskList tasList( iCoeEnv->WsSession() );
+    TApaTask task = tasList.FindApp( TUid::Uid(iOperatorNativeMusicStoreUID) );
+
+    if ( task.Exists() )
+        {
+        task.BringToForeground();
+        }
+    else
+        {
+        RApaLsSession session;
+        if ( KErrNone == session.Connect() )
+            {
+            CleanupClosePushL( session );
+            TThreadId threadId;
+            session.CreateDocument( KNullDesC, TUid::Uid(iOperatorNativeMusicStoreUID), threadId );
+            CleanupStack::PopAndDestroy(&session);
+            }
+        }
+    }
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::LaunchOperatorURLMusicShopL
+// Launch music shop URL application
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::LaunchOperatorURLMusicShopL()
+    {
+    MPX_FUNC( "CMPXCollectionViewHgImp::LaunchOperatorURLMusicShopL" );
+    const TUid KOSSBrowserUidValue = {0x10008D39}; // 0x1020724D for S60 3rd Ed
+    TUid id(KOSSBrowserUidValue);
+    TApaTaskList taskList(CEikonEnv::Static()->WsSession());
+    TApaTask task = taskList.FindApp(id);
+
+    if ( task.Exists() )
+        {
+        task.BringToForeground();
+        if ( iOperatorMusicStoreURI->Length() != NULL )
+            {
+            TBuf8<KMPXMaxHistoryLength> tempUrl;
+            tempUrl.Copy(iOperatorMusicStoreURI->Des());
+            task.SendMessage(TUid::Uid(0), tempUrl);
+            }
+        }
+    else
+        {
+        RApaLsSession apaLsSession;
+        if ( KErrNone == apaLsSession.Connect() )
+            {
+            CleanupClosePushL( apaLsSession );
+            TThreadId threadId;
+
+ 			apaLsSession.StartDocument(*iOperatorMusicStoreURI, KOSSBrowserUidValue, threadId);
+         	CleanupStack::PopAndDestroy(&apaLsSession);
+            }
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::StoreListboxItemIndexL
+// Stores the current list box item index.
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::StoreListboxItemIndexL()
+	{
+    TInt currentIndex( iContainer->CurrentLbxItemIndex() );
+
+	CMPXCommand* command = CMPXCommand::NewL();
+	CleanupStack::PushL( command );
+	command->SetTObjectValueL<TMPXCommandId>( KMPXCommandGeneralId,
+											  KMPXCommandIdCollectionSelect );
+	command->SetTObjectValueL( KMPXCommandCollectionSelectIndex, currentIndex );
+	command->SetTObjectValueL<TBool>( KMPXCommandGeneralDoSync, ETrue );
+	iCollectionUtility->Collection().CommandL( *command );
+	CleanupStack::PopAndDestroy( command );
+	}
+
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::ChangeCbaVisibility
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::ChangeCbaVisibility( TBool aVisible )
+    {
+    CEikButtonGroupContainer* cba = Cba();
+    if( cba )
+		{
+        cba->MakeVisible( aVisible );
+		cba->DrawDeferred();
+		}
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::OpenAllSongsL
+// Open the collection at all songs level.
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::OpenAllSongsL()
+	{
+	CMPXCollectionPath* path = iCollectionUiHelper->MusicAllSongsPathL();
+	CleanupStack::PushL( path );
+	iCollectionUtility->Collection().OpenL( *path );
+	CleanupStack::PopAndDestroy( path );
+	}
+
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::OpenArtistAlbumsL
+// Open the collection at artist & albums level.
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::OpenArtistAlbumsL()
+	{
+	CMPXCollectionPath* path = iCollectionUiHelper->MusicMenuPathL();
+	CleanupStack::PushL( path );
+	path->AppendL(KMPXCollectionArtistAlbum);
+	iCollectionUtility->Collection().OpenL( *path );
+	CleanupStack::PopAndDestroy( path );
+	}
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::OpenPlaylistsL
+// Open the collection at playlists level.
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::OpenPlaylistsL()
+	{
+	CMPXCollectionPath* path = iCollectionUiHelper->MusicPlaylistPathL();
+	CleanupStack::PushL( path );
+	iCollectionUtility->Collection().OpenL( *path );
+	CleanupStack::PopAndDestroy( path );
+	}
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::OpenGenreL
+// Open the collection at genre level.
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::OpenGenreL()
+	{
+	CMPXCollectionPath* path = iCollectionUiHelper->MusicMenuPathL();
+	CleanupStack::PushL( path );
+	path->AppendL(KMPXCollectionGenre); // Genre
+	iCollectionUtility->Collection().OpenL( *path );
+	CleanupStack::PopAndDestroy( path );
+	}
+
+// -----------------------------------------------------------------------------
+// CMPXCollectionViewHgImp::OpenPodcastsL
+// Open the collection at podcasts level.
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewHgImp::OpenPodcastsL()
+	{
+	CMPXCollectionPath* path = iCollectionUiHelper->PodCastMenuPathL();
+	CleanupStack::PushL( path );
+	iCollectionUtility->Collection().OpenL( *path );
+	CleanupStack::PopAndDestroy( path );
+	}
+
+//  End of File