# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1277123839 -10800 # Node ID cb96c29156b2209a2815d520cfcdca526ee590ae # Parent a12246c97fcc07088fd16096c1c0cf9cd900a4e6 Revision: 201023 Kit: 2010125 diff -r a12246c97fcc -r cb96c29156b2 mpxmusicplayer/app/inc/mpxcontroller.h --- a/mpxmusicplayer/app/inc/mpxcontroller.h Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxmusicplayer/app/inc/mpxcontroller.h Mon Jun 21 15:37:19 2010 +0300 @@ -220,6 +220,7 @@ CAknQueryDialog* iQueryDialog; // not owned, only for dismissal TInt iCurSystemEvent; TInt iCurPlugin; + RArray iCurAtts; TBool iOutOfDisk; TBool iDiskDismountDuringFormat; TBool iRestartWaitDialog; diff -r a12246c97fcc -r cb96c29156b2 mpxmusicplayer/app/src/mpxcontroller.cpp --- a/mpxmusicplayer/app/src/mpxcontroller.cpp Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxmusicplayer/app/src/mpxcontroller.cpp Mon Jun 21 15:37:19 2010 +0300 @@ -151,6 +151,7 @@ delete iCurPath; delete iIdle; + iCurAtts.Close(); } @@ -378,14 +379,7 @@ // if( (iCurSystemEvent == KErrNotFound) && !iOutOfDisk ) { - // Fetch the extra data - RArray atts; - CleanupClosePushL( atts ); - atts.Append(KMPXMediaColDetailDBCreated); - atts.Append(KMPXMediaColDetailDBCorrupted); - - iCollectionUtility->Collection().MediaL(*iCurPath, atts.Array() ); - CleanupStack::PopAndDestroy( &atts ); + iCollectionUtility->Collection().MediaL(*iCurPath, iCurAtts.Array() ); } else { @@ -507,16 +501,14 @@ // Do a MediaL to re-retrieve details // - RArray atts; - CleanupClosePushL( atts ); + iCurAtts.Reset(); if(!aSkipAttribute) { - atts.Append(KMPXMediaColDetailDBCreated); - atts.Append(KMPXMediaColDetailDBCorrupted); + iCurAtts.Append(KMPXMediaColDetailDBCreated); + iCurAtts.Append(KMPXMediaColDetailDBCorrupted); } - iCollectionUtility->Collection().MediaL(*iCurPath, atts.Array() ); - CleanupStack::PopAndDestroy( &atts ); + iCollectionUtility->Collection().MediaL(*iCurPath, iCurAtts.Array() ); } } } @@ -549,7 +541,7 @@ iInitDBNeeded = EFalse; iInitDBCorrupted = EFalse; - DoRetrieveDetailsL(iOutOfDisk); + DoRetrieveDetailsL(data != KErrNone); } else if(event == TMPXCollectionMessage::EBroadcastEvent && op == EMcMsgRefreshStart) diff -r a12246c97fcc -r cb96c29156b2 mpxmusicplayer/mediakeyhandler/inc/mpxremconkeyresponse.h --- a/mpxmusicplayer/mediakeyhandler/inc/mpxremconkeyresponse.h Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxmusicplayer/mediakeyhandler/inc/mpxremconkeyresponse.h Mon Jun 21 15:37:19 2010 +0300 @@ -97,6 +97,8 @@ * Not own. */ CRemConCoreApiTarget& iRemConCoreApiTarget; +public: + TInt iCountOfVolumeCommands; }; #endif // C_CMPXREMCONKEYRESPONSE_H diff -r a12246c97fcc -r cb96c29156b2 mpxmusicplayer/mediakeyhandler/src/mpxmediakeyhandlerimp.cpp --- a/mpxmusicplayer/mediakeyhandler/src/mpxmediakeyhandlerimp.cpp Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxmusicplayer/mediakeyhandler/src/mpxmediakeyhandlerimp.cpp Mon Jun 21 15:37:19 2010 +0300 @@ -501,8 +501,9 @@ } else if ( aValue != iCurrentVol ) { - if ( aValue != 0 ) + if ( aValue != 0 && ( iResponseHandler->iCountOfVolumeCommands == 0 ) ) { + // if we are processing remcon events we shouldn't change the current volume value iCurrentVol = aValue; } } @@ -1124,6 +1125,7 @@ case ERemConCoreApiVolumeUp: case ERemConCoreApiVolumeDown: { + iResponseHandler->iCountOfVolumeCommands++; iTimer->Cancel(); MMPXPlaybackUtility* pbUtil( NULL ); MPX_TRAPD( err, pbUtil = MMPXPlaybackUtility::UtilityL( KPbModeActivePlayer )); diff -r a12246c97fcc -r cb96c29156b2 mpxmusicplayer/mediakeyhandler/src/mpxremconkeyresponse.cpp --- a/mpxmusicplayer/mediakeyhandler/src/mpxremconkeyresponse.cpp Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxmusicplayer/mediakeyhandler/src/mpxremconkeyresponse.cpp Mon Jun 21 15:37:19 2010 +0300 @@ -32,7 +32,8 @@ CMPXRemConKeyResponse::CMPXRemConKeyResponse( CRemConCoreApiTarget& aRemConCoreApiTarget ) : CActive( CActive::EPriorityStandard ), - iRemConCoreApiTarget( aRemConCoreApiTarget ) + iRemConCoreApiTarget( aRemConCoreApiTarget ), + iCountOfVolumeCommands( 0 ) { CActiveScheduler::Add( this ); } @@ -75,12 +76,14 @@ { iRemConCoreApiTarget.VolumeUpResponse( iStatus, KErrNone ); SetActive(); + iCountOfVolumeCommands--; break; } case ERemConCoreApiVolumeDown: { iRemConCoreApiTarget.VolumeDownResponse( iStatus, KErrNone ); SetActive(); + iCountOfVolumeCommands--; break; } default: diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbcommon/src/mpxdbmanager.cpp --- a/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbcommon/src/mpxdbmanager.cpp Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbcommon/src/mpxdbmanager.cpp Mon Jun 21 15:37:19 2010 +0300 @@ -269,16 +269,20 @@ } TInt count(iDatabaseHandles.Count()); - TBool ret = EFalse; for ( TInt i = 0; i < count ; ++i ) { + if ( ! iDatabaseHandles[i].iOpen ) + { + MPX_DEBUG1("CMPXDbManager::CopyDBsToRamL DB not open (assuming drive is not present)"); + continue; + } if ( iDatabaseHandles[i].iUseRAMdb ) { // already used MPX_DEBUG1("CMPXDbManager::CopyDBsToRamL iUseRAMdb already ETrue"); continue; } - CloseDatabaseAtIndexL( i ); // let leave: not much we can't do if we can't close the original DB + CloseDatabaseAtIndexL( i ); // let leave: not much we can do if we can't close the original DB DoCopyDBToRam( i, aIsMTPInUse ); // copies if it can TRAPD( err, OpenDatabaseAtIndexL( i ) ); if ( err != KErrNone ) @@ -861,30 +865,27 @@ { MPX_FUNC("CMPXDbManager::CloseAllDatabases"); - if (iInitialized) - { - // Close all prepared statements if a db is closed - // - ResetPreparedQueries(); + // Close all prepared statements if a db is closed + // + ResetPreparedQueries(); - TInt count(iDatabaseHandles.Count()); - for (TInt i = 0; i < count; ++i) - { - delete iDatabaseHandles[i].iAliasname; - iDatabaseHandles[i].iAliasname = 0; + TInt count(iDatabaseHandles.Count()); + for (TInt i = 0; i < count; ++i) + { + delete iDatabaseHandles[i].iAliasname; + iDatabaseHandles[i].iAliasname = 0; #ifdef __RAMDISK_PERF_ENABLE - RemoveDummyFile(i); - delete iDatabaseHandles[i].iOrigFullFilePath; - iDatabaseHandles[i].iOrigFullFilePath = 0; - delete iDatabaseHandles[i].iTargetFullFilePath; - iDatabaseHandles[i].iTargetFullFilePath = 0; + RemoveDummyFile(i); + delete iDatabaseHandles[i].iOrigFullFilePath; + iDatabaseHandles[i].iOrigFullFilePath = 0; + delete iDatabaseHandles[i].iTargetFullFilePath; + iDatabaseHandles[i].iTargetFullFilePath = 0; #endif //__RAMDISK_PERF_ENABLE - } + } - iDatabaseHandles.Reset(); - iDatabase.Close(); - iInitialized = EFalse; - } + iDatabaseHandles.Reset(); + iDatabase.Close(); + iInitialized = EFalse; } // ---------------------------------------------------------------------------- @@ -1726,6 +1727,16 @@ } // ---------------------------------------------------------------------------- +// CleanupTransaction: close transaction when creating DB +// ---------------------------------------------------------------------------- +// +static void CleanupTransaction(TAny * aDatabase) + { + TInt err = ((RSqlDatabase*)aDatabase)->Exec(KRollbackTransaction); + MPX_DEBUG2("CMPXDbManager CleanupTransaction rollback, error %d", err); + } + +// ---------------------------------------------------------------------------- // CMPXDbManager::CreateTablesL // ---------------------------------------------------------------------------- // @@ -1733,11 +1744,26 @@ RSqlDatabase& aDatabase, TBool aCorrupt) { + MPX_FUNC("CMPXDbManager::CreateTablesL"); + TInt err = aDatabase.Exec(KBeginTransaction); + if (err < 0) + { + MPX_DEBUG2("SQL BEGIN TRANSACTION error %d", err); + User::Leave (err); + } + CleanupStack::PushL(TCleanupItem(&CleanupTransaction, &aDatabase)); TInt count(iTables.Count()); for (TInt i = 0; i < count; ++i) { iTables[i]->CreateTableL(aDatabase, aCorrupt); } + err = aDatabase.Exec(KCommitTransaction); + if (err < 0) + { + MPX_DEBUG2("SQL COMMIT TRANSACTION error %d", err); + User::Leave (err); + } + CleanupStack::Pop(); } // ---------------------------------------------------------------------------- @@ -2017,12 +2043,7 @@ User::Leave(KErrNotReady); } -#ifndef __RAMDISK_PERF_ENABLE - EnsureDiskSpaceL(aDrive); - -#endif //__RAMDISK_PERF_ENABLE - } // ---------------------------------------------------------------------------- @@ -2862,19 +2883,24 @@ TInt count(iDatabaseHandles.Count()); for (TInt i = 0; i < count; ++i) { + DatabaseHandle& database = iDatabaseHandles[i]; if (((KDbManagerAllDrives == aDrive) || - (aDrive == iDatabaseHandles[i].iDrive)) && - iDatabaseHandles[i].iOpen) + (aDrive == database.iDrive)) && + database.iOpen +#ifdef __RAMDISK_PERF_ENABLE + && !database.iUseRAMdb +#endif + ) { if (SysUtil::DiskSpaceBelowCriticalLevelL(&iFs, 0, - iDatabaseHandles[i].iDrive)) + database.iDrive)) { MPX_DEBUG1("CMPXDbManager::EnsureDiskSpaceL Error diskspace full"); User::Leave(KErrDiskFull); } } - if (aDrive == iDatabaseHandles[i].iDrive) + if (aDrive == database.iDrive) { // exit if just one drive to check break; diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/inc/mpxcollectiondbdef.h --- a/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/inc/mpxcollectiondbdef.h Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/inc/mpxcollectiondbdef.h Mon Jun 21 15:37:19 2010 +0300 @@ -28,9 +28,11 @@ // Db filename #ifdef ABSTRACTAUDIOALBUM_INCLUDED -_LIT(KMCDbFile, "mpxv2_6.db"); +_LIT(KMCDbFile, "mpxv3_0.db"); +_LIT(KMCDbFileEMMC, "mpxv3_0i.db"); #else -_LIT(KMCDbFile, "mpxv2_5.db"); +_LIT(KMCDbFile, "mpxv3_0n.db"); +_LIT(KMCDbFileEMMC, "mpxv3_0in.db"); #endif // ABSTRACTAUDIOALBUM_INCLUDED // Collection Db resource file _LIT(KMPXCollectionDbResourceFile, "mpxcollectiondbhgres.rsc"); @@ -133,6 +135,8 @@ _LIT(KMCPlaylistSongInfoVolumeId, "VolumeId"); _LIT(KMCPlaylistSongInfoDbFlag, "DbFlag"); +// == Album TABLE FIELDS ============================================== +_LIT(KMCAlbumArtistName, "ArtistName"); // == Auxiliary TABLE FIELDS ================================================== // Version of database // The version integer looks like: diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/inc/mpxdbabstractalbum.h --- a/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/inc/mpxdbabstractalbum.h Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/inc/mpxdbabstractalbum.h Mon Jun 21 15:37:19 2010 +0300 @@ -156,6 +156,25 @@ */ void GetAllItemsWithNoSongL(RArray& aItemsIds); + /** + * Create Thumbnail Manager session. + * Create Thumbnail Manager session when needed: rename/delete entries in Thumbnail table. + */ + void CreateTNMSessionL(); + + /** + * Remove all abstractalbum items with no songs associated, + * TN entry and .alb files also removed. + * + */ + void RemoveAbstractAlbumsWithNoSongL(); + + /** + /* When refresh library, Remove .alb entry from AbstractAlnum table, TN table if .alb files already deleted + /* from file system via file manager. + */ + void AbstractAlbumCleanUpL(); + private: diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/inc/mpxdbalbum.h --- a/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/inc/mpxdbalbum.h Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/inc/mpxdbalbum.h Mon Jun 21 15:37:19 2010 +0300 @@ -30,7 +30,7 @@ { public: virtual TInt HandleIsUnknownArtistL(TUint32 aId) = 0; - virtual TUint32 HandleArtistForAlbumL( const TUint32 aId ) = 0; + virtual HBufC* HandleArtistForAlbumL( const TUint32 aId ) = 0; /** * HandleAlbumartForAlbumL. * @param aId, The album ID. @@ -86,7 +86,7 @@ * into consideration when generating the unique row id * @return The unique id of the row added. */ - TUint32 AddItemL(const TDesC& aName, TUint32 aArtist, const TDesC& aArt, TInt aDriveId, TBool& aNewRecord, + TUint32 AddItemL(const TDesC& aName, const TDesC& aArtistName, const TDesC& aArt, TInt aDriveId, TBool& aNewRecord, TBool aCaseSensitive = ETrue); /** @@ -163,7 +163,12 @@ TBool IsUnknownArtistL(TUint32 aId); - TUint32 ArtistForAlbumL(const TUint32 aId); + /** + * Get the ArtistName of song which belongs to the specified Album. + * @param aId The ID of the album + * @returns alternative artistname retrieved in the specified Album. + */ + HBufC* ArtistForAlbumL(const TUint32 aId); /** * Get the Albumart of song which belongs to the specified Album. * @param aId The ID of the album @@ -206,11 +211,10 @@ enum TAlbumColumns { EAlbumUniqueId = KMPXTableDefaultIndex, + EAlbumArtistName, EAlbumName, - EAlbumSongCount, - EAlbumArtist, + EAlbumSongCount, EAlbumArt, - EAlbumArtistName, EAlbumFieldCount }; diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/inc/mpxdbhandler.h --- a/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/inc/mpxdbhandler.h Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/inc/mpxdbhandler.h Mon Jun 21 15:37:19 2010 +0300 @@ -905,21 +905,7 @@ void DoRemoveSongFromPlaylistL(TUint32 aPlaylistId, const TMPXItemId& aSongId, TInt aOrdinal, CMPXMessageArray& aItemChangedMessages); -#ifdef ABSTRACTAUDIOALBUM_INCLUDED - /** - * Remove all abstractalbum items with no songs associated, - * TN and .alb files also removed. - * - */ - void RemoveAbstractAlbumsWithNoSongL(); - - /** - /* When refresh library, Remove .alb entry from AbstractAlnum table, TN table if .alb files deleted - /* from file manager - */ - void AbstractAlbumCleanUpL(); - -#endif // ABSTRACTAUDIOALBUM_INCLUDED + /** * Deletes all song records marked as deleted. @@ -1044,7 +1030,7 @@ #endif // ABSTRACTAUDIOALBUM_INCLUDED virtual TUint32 AddCategoryItemL(TMPXGeneralCategory aCategory, const TDesC& aName, - TUint32 aArtist, const TDesC& aArt, + const TDesC& aArtistName, const TDesC& aArt, TInt aDrive, CMPXMessageArray* aItemChangedMessages, TBool& aItemExist); virtual void UpdateCategoryItemL(TMPXGeneralCategory aCategory, TUint32 aCategoryId, @@ -1083,7 +1069,12 @@ * @see MMPXDbAlbumObserver */ virtual TBool HandleIsUnknownArtistL(TUint32 aArtistId); - virtual TUint32 HandleArtistForAlbumL(const TUint32 aAlbumId); + /** + * Get the Artistname of song which belongs to the specified Album. + * @param aId, The Album ID. + * @returns alternative artistname retrieved in the specified Album. + */ + virtual HBufC* HandleArtistForAlbumL(const TUint32 aAlbumId); /** * Get the Albumart of song which belongs to the specified Album. diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/inc/mpxdbmusic.h --- a/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/inc/mpxdbmusic.h Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/inc/mpxdbmusic.h Mon Jun 21 15:37:19 2010 +0300 @@ -80,7 +80,7 @@ #endif // ABSTRACTAUDIOALBUM_INCLUDED // for Album and Artist table virtual TUint32 AddCategoryItemL(TMPXGeneralCategory aCategory, const TDesC& aName, - TUint32 aArtistId, const TDesC& aArt, + const TDesC& aArtistName, const TDesC& aArt, TInt aDrive, CMPXMessageArray* aItemChangedMessages, TBool& aItemExist) = 0; /** * Called when the ID of a category item changed for a Music record, for example when @@ -528,7 +528,7 @@ * Get the ID of Artist which belongs to the specified Album * @param aId, the ID of Album */ - TUint32 CMPXDbMusic::ArtistForAlbumL(const TUint32 aId); + TUint32 ArtistForAlbumL(const TUint32 aId); /** * Get the Albumart of song which belongs to the specified Album @@ -688,9 +688,6 @@ const TMPXAttribute& aAttribute, TUint32 aOldId, TInt aDriveId, CMPXMessageArray* aItemChangedMessages, TUint32& aItemId); - TBool UpdateCategoryFieldL(TMPXGeneralCategory aCategory, const CMPXMedia& aMedia, - const TMPXAttribute& aAttribute, TUint32 aOldId, TInt aDriveId, - CMPXMessageArray* aItemChangedMessages, TUint32& aItemId, TUint32 aArtistId); /** * Checks if extra attributes are required. The "standard attribute set includes: * EMPXMediaGeneralId, EMPXMediaGeneralType, EMPXMediaGeneralCategory, @@ -707,6 +704,12 @@ * otherwise EFalse. */ TBool IsSupported(const CMPXMedia& aMedia); + + /** + * Query all songs from the database and add results to the + * iAllSongsQueryResult cache array. + */ + void ExecuteQueryAllSongsL(const TArray& aAttrs); private: // from MMPXTable @@ -809,6 +812,7 @@ #ifdef ABSTRACTAUDIOALBUM_INCLUDED TBool iArtNeedUpdated; #endif // ABSTRACTAUDIOALBUM_INCLUDED + RPointerArray iAllSongsQueryResult; }; #endif // MPXDBMUSIC_H diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/inc/mpxdbpluginqueries.h --- a/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/inc/mpxdbpluginqueries.h Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/inc/mpxdbpluginqueries.h Mon Jun 21 15:37:19 2010 +0300 @@ -270,9 +270,9 @@ _LIT(KAuxiliaryDropTable,"DROP TABLE Auxiliary"); _LIT(KAuxiliaryCheckTable, "SELECT Id,Version,TimeRefreshed,TimeSynced,Corrupt,SaveDeletedRecordCount FROM AUXILIARY"); #ifdef ABSTRACTAUDIOALBUM_INCLUDED -_LIT(KQueryAuxiliaryInsert, "INSERT INTO Auxiliary(Id,Version,Corrupt) VALUES(0,'6.5.0',%u)"); +_LIT(KQueryAuxiliaryInsert, "INSERT INTO Auxiliary(Id,Version,Corrupt) VALUES(0,'6.6.0',%u)"); #else -_LIT(KQueryAuxiliaryInsert, "INSERT INTO Auxiliary(Id,Version,Corrupt) VALUES(0,'6.4.0',%u)"); +_LIT(KQueryAuxiliaryInsert, "INSERT INTO Auxiliary(Id,Version,Corrupt) VALUES(0,'6.6.1',%u)"); #endif // ABSTRACTAUDIOALBUM_INCLUDED _LIT(KQueryAuxiliarySetTime, "UPDATE :dbname.Auxiliary SET TimeRefreshed='%S', Corrupt=0"); _LIT(KQueryAuxiliaryGetTime, "SELECT TimeRefreshed FROM :dbname.Auxiliary"); @@ -427,18 +427,20 @@ // _LIT(KAlbumCreateTable,"CREATE TABLE Album(" L"UniqueId INTEGER PRIMARY KEY," + L"ArtistName TEXT COLLATE NOCASE," L"Name TEXT COLLATE NOCASE," L"SongCount INTEGER," - L"Artist INTEGER," - L"Art TEXT)"); + L"Art TEXT)"); -_LIT(KAlbumCheckTable,"SELECT UniqueId,Name,SongCount,Artist,Art FROM Album"); +_LIT(KAlbumCheckTable,"SELECT UniqueId,ArtistName,Name,SongCount,Art FROM Album"); -_LIT(KQueryAlbumInsert, "INSERT INTO :dbname.Album(UniqueId,Name,SongCount,Artist,Art) VALUES(%u,'%S',%u,%u,'%S')"); +_LIT(KQueryAlbumInsert, "INSERT INTO :dbname.Album(UniqueId,ArtistName,Name,SongCount,Art) VALUES(%u,'%S','%S',%u,'%S')"); _LIT(KQueryAlbumUpdate, "UPDATE :dbname.Album SET %S WHERE UniqueId=%u"); _LIT(KQueryAlbumItem, "SELECT Album.*,Artist.Name FROM :dbname.Album,:dbname.Artist WHERE Album.Artist=Artist.UniqueId AND UniqueId=%u"); -_LIT(KQueryAlbumAll, "SELECT Album.*,Artist.Name FROM :dbname.Album,:dbname.Artist WHERE Album.Artist=Artist.UniqueId ORDER BY 6, 2"); +_LIT(KQueryAlbumAll, "SELECT Album.* FROM :dbname.Album ORDER BY ArtistName, Name"); +_LIT(KCriterionArtistName, "ArtistName='%S'"); +_LIT(KCriterionArt, "Art='%S'"); // == Artist table queries ========================================== // diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/src/mpxcollectiondbmanager.cpp --- a/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/src/mpxcollectiondbmanager.cpp Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/src/mpxcollectiondbmanager.cpp Mon Jun 21 15:37:19 2010 +0300 @@ -80,7 +80,26 @@ void CMPXCollectionDbManager::ConstructL() { MPX_FUNC("CMPXCollectionDbManager::ConstructL"); - CMPXDbManager::ConstructL(TFileName(KMCDbFile)); + //Find out if the system has an internal drive (eMMC) + TBool eMMC( EFalse ); + TDriveInfo driveInfo; + if( Fs().Drive( driveInfo, EDriveE ) == KErrNone ) + { + if ( driveInfo.iDriveAtt & KDriveAttInternal ) + eMMC = ETrue; + } + + //Use different name for Dbs if the system has an internal drive vs. MMC-only. + //Since hard-coded drive letters in the Thumbnail URIs + //So Dbs are not interchangeable between an internal drive system and MMC-only system. + if ( eMMC ) + { + CMPXDbManager::ConstructL(TFileName( KMCDbFileEMMC )); + } + else + { + CMPXDbManager::ConstructL(TFileName( KMCDbFile )); + } } // End of File diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/src/mpxdbabstractalbum.cpp --- a/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/src/mpxdbabstractalbum.cpp Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/src/mpxdbabstractalbum.cpp Mon Jun 21 15:37:19 2010 +0300 @@ -78,7 +78,8 @@ { MPX_FUNC("CMPXDbAbstractAlbum::~CMPXDbAbstractAlbum"); #ifdef RD_MPX_TNM_INTEGRATION - delete iTNManager; + if (iTNManager) + delete iTNManager; #endif //RD_MPX_TNM_INTEGRATION } @@ -222,6 +223,81 @@ } // ---------------------------------------------------------------------------- +// Remove abstractalbums which have no songs associated. +// ---------------------------------------------------------------------------- +// +void CMPXDbAbstractAlbum::RemoveAbstractAlbumsWithNoSongL() + { + MPX_FUNC("CMPXDbAbstractAlbum::RemoveAbstractAlbumsWithNoSongL"); + + RArray iItemsIds; + CleanupClosePushL(iItemsIds); + + //get all abstractalbum with no songs associated. + GetAllItemsWithNoSongL(iItemsIds); + TInt count = iItemsIds.Count(); + TInt err = KErrNone; + if (count) + { + MPX_DEBUG2("CMPXDbAbstractAlbum::RemoveAbstractAlbumsWithNoSongL, abstractalbum count[%d] ", iItemsIds.Count()); + CMPXMessageArray* itemChangedMessages = CMPXMediaArray::NewL(); + CleanupStack::PushL(itemChangedMessages); + + //go through each one to delete + for (TInt i=0; i< count; i++) + { + TRAP(err, RemoveAbstractAlbumL(iItemsIds[i], *itemChangedMessages, EFalse)); + if (err != KErrNone) + { + MPX_DEBUG2("CMPXDbAbstractAlbum::RemoveAbstractAlbumsWithNoSongL, error happens when delete abstractalbum, err ", err); + } + } + CleanupStack::PopAndDestroy(itemChangedMessages); + } + CleanupStack::PopAndDestroy(&iItemsIds); + } + +// ---------------------------------------------------------------------------- +// Remove .alb entry from AbstractAlnum table, TN table if .alb files deleted +// from file manager when refresh library +// ---------------------------------------------------------------------------- +// +void CMPXDbAbstractAlbum::AbstractAlbumCleanUpL() + { + MPX_FUNC("CMPXDbAbstractAlbum::AbstractAlbumCleanUpL"); + RArray attributes; + CleanupClosePushL(attributes); + attributes.AppendL(KMPXMediaGeneralUri); + CMPXMediaArray* mediaArray = CMPXMediaArray::NewL(); + CleanupStack::PushL(mediaArray); + + GetAllCategoryItemsL(attributes.Array(), *mediaArray); + + TInt count(mediaArray->Count()); + if (count) + { + CMPXMessageArray* itemChangedMessages = CMPXMediaArray::NewL(); + CleanupStack::PushL(itemChangedMessages); + for (TInt i = 0; i < count; i++) + { + CMPXMedia* element = mediaArray->AtL(i); + const TDesC& uri = element->ValueText(KMPXMediaGeneralUri); + + //check if the file exists in file system + if (!(BaflUtils::FileExists(iFs, uri))) + { + //generate abstractalbum UID with the Uri + TUint32 abstractAlbumId(MPXDbCommonUtil::GenerateUniqueIdL(iFs, EMPXAbstractAlbum, uri, EFalse)); + RemoveAbstractAlbumL(abstractAlbumId, *itemChangedMessages, ETrue); + } + } + CleanupStack::PopAndDestroy(itemChangedMessages); + } + CleanupStack::PopAndDestroy(mediaArray); + CleanupStack::PopAndDestroy(&attributes); + } + +// ---------------------------------------------------------------------------- // CMPXDbAbstractAlbum::RemoveAbstractAlbumL // ---------------------------------------------------------------------------- // @@ -255,7 +331,10 @@ const TDesC& aNewPath, TInt aPriority ) { MPX_FUNC("CMPXDbAbstractAlbum::HandleTNL"); - + if (!iTNManager) + { + CreateTNMSessionL(); + } if (aNewPath.Compare(KNullDesC)==0 && aOldPath.Compare(KNullDesC)!=0) { // remove from thumbnail database table @@ -263,13 +342,15 @@ CThumbnailObjectSource* source = CThumbnailObjectSource::NewLC( aOldPath, KImageFileType ); iTNManager->DeleteThumbnails( *source ); + CleanupStack::PopAndDestroy( source ); } else if (aNewPath.Compare(KNullDesC)!=0) { //rename thumbnail - MPX_DEBUG1("CMPXDbAbstractAlbum::HandleTNL, rename TN"); - iTNManager->RenameThumbnailsL( aOldPath, aNewPath, aPriority ); + MPX_DEBUG1("CMPXDbAbstractAlbum::HandleTNL, rename Thumbnail entry in Thumbnail table"); + + iTNManager->RenameThumbnailsL( aOldPath, aNewPath, aPriority ); //after rename, reset flag iRenameTN = EFalse; } @@ -531,6 +612,7 @@ CMPXDbManager& aDbManager, TMPXGeneralCategory aCategory, RFs& aFs) : CMPXDbCategory(aDbManager, aCategory), + iTNManager(NULL), iFs(aFs) { MPX_FUNC("CMPXDbAbstractAlbum::CMPXDbAbstractAlbum"); @@ -545,11 +627,7 @@ MPX_FUNC("CMPXDbAbstractAlbum::ConstructL"); BaseConstructL(); -#ifdef RD_MPX_TNM_INTEGRATION - // Create Thumbnail Manager instance. This object is the observer. - iTNManager = CThumbnailManager::NewL( *this ); iRenameTN = EFalse; -#endif //RD_MPX_TNM_INTEGRATION } @@ -572,4 +650,16 @@ MThumbnailData& /*aThumbnail*/, TThumbnailRequestId /*aId*/ ) { } + +// --------------------------------------------------------------------------- +// CMPXDbAbstractAlbum::CreateTNMSessionL +// Create thumbnail session +// --------------------------------------------------------------------------- +void CMPXDbAbstractAlbum::CreateTNMSessionL() + { + if(!iTNManager) + { + iTNManager = CThumbnailManager::NewL( *this ); + } + } // End of File diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/src/mpxdbalbum.cpp --- a/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/src/mpxdbalbum.cpp Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/src/mpxdbalbum.cpp Mon Jun 21 15:37:19 2010 +0300 @@ -112,7 +112,7 @@ // TUint32 CMPXDbAlbum::AddItemL( const TDesC& aName, - TUint32 aArtist, + const TDesC& aArtistName, const TDesC& aArt, TInt aDriveId, TBool& aNewRecord, @@ -130,11 +130,13 @@ // insert new HBufC* query = PreProcessStringLC(KQueryAlbumInsert); HBufC* name = MPXDbCommonUtil::ProcessSingleQuotesLC(aName); + HBufC* artistname = MPXDbCommonUtil::ProcessSingleQuotesLC(aArtistName); HBufC* art = MPXDbCommonUtil::ProcessSingleQuotesLC(aArt); - iDbManager.ExecuteQueryL(aDriveId, *query, rowId, name, 1, aArtist, art); + iDbManager.ExecuteQueryL(aDriveId, *query, rowId, artistname, name, 1, art); CleanupStack::PopAndDestroy(art); + CleanupStack::PopAndDestroy(artistname); CleanupStack::PopAndDestroy(name); CleanupStack::PopAndDestroy(query); } @@ -154,17 +156,23 @@ } // Artist - TUint32 artistId = recordset.ColumnInt64(EAlbumArtist); + TPtrC artistname(KNullDesC); + artistname.Set(MPXDbCommonUtil::GetColumnTextL(recordset, EAlbumArtistName)); + // the current one is Unknown and the new one is Not Unknown. - if ( IsUnknownArtistL( artistId ) && !IsUnknownArtistL( aArtist ) ) + if ( artistname == KNullDesC && aArtistName!= KNullDesC ) { - _LIT( KFormatArtistId, "Artist=%d" ); - HBufC* setStr = HBufC::NewLC(KFormatArtistId().Length() + KMCIntegerLen); - setStr->Des().Format( KFormatArtistId, aArtist ); - + HBufC* artistnameReplaceSingleQuote = + MPXDbCommonUtil::ProcessSingleQuotesLC( aArtistName ); + TPtrC criteria(KCriterionArtistName); + HBufC* setStr = HBufC::NewLC(criteria.Length() + artistnameReplaceSingleQuote->Length()); + setStr->Des().Format( KCriterionArtistName, artistnameReplaceSingleQuote ); + iDbManager.ExecuteQueryL(aDriveId, KQueryAlbumUpdate, setStr, rowId); CleanupStack::PopAndDestroy(setStr); + CleanupStack::PopAndDestroy(artistnameReplaceSingleQuote); + } // Album Art @@ -176,9 +184,10 @@ { HBufC* artReplaceSingleQuote = MPXDbCommonUtil::ProcessSingleQuotesLC( aArt ); - _LIT( KFormatArt, "Art=\'%S\'" ); - HBufC* setStr = HBufC::NewLC(256); - setStr->Des().Format( KFormatArt, artReplaceSingleQuote ); + + TPtrC criteria(KCriterionArt); + HBufC* setStr = HBufC::NewLC(criteria.Length() + artReplaceSingleQuote->Length()); + setStr->Des().Format( KCriterionArt, artReplaceSingleQuote ); iDbManager.ExecuteQueryL(aDriveId, KQueryAlbumUpdate, setStr, rowId); CleanupStack::PopAndDestroy(setStr); @@ -240,24 +249,31 @@ User::Leave(KErrNotFound); } - TUint32 artistId = recordset.ColumnInt64(EAlbumArtist); TBool itemModified = EFalse; + TPtrC artistname(MPXDbCommonUtil::GetColumnTextL(recordset, EAlbumArtistName)); + TUint32 artistId = MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), EMPXArtist, + artistname, ETrue); // the current artist is equal to deleted song's artist if ( artistId == aArtist ) { - TUint32 newArtistId = ArtistForAlbumL(aId); - if ( artistId != newArtistId ) - { - _LIT( KFormatArtistId, "Artist=%d" ); - HBufC* setStr = HBufC::NewLC(KFormatArtistId().Length() + KMCIntegerLen); - setStr->Des().Format(KFormatArtistId, newArtistId); + HBufC* newArtistname = ArtistForAlbumL(aId); + + CleanupStack::PushL(newArtistname); + if (newArtistname && newArtistname->CompareF(artistname)!=0) + { + HBufC* artistnameReplaceSingleQuote = MPXDbCommonUtil::ProcessSingleQuotesLC( *newArtistname ); + TPtrC criteria(KCriterionArtistName); + HBufC* setStr = HBufC::NewLC(criteria.Length() + artistnameReplaceSingleQuote->Length()); + setStr->Des().Format( KCriterionArtistName, artistnameReplaceSingleQuote ); iDbManager.ExecuteQueryL(aDriveId, KQueryAlbumUpdate, setStr, aId); CleanupStack::PopAndDestroy(setStr); + CleanupStack::PopAndDestroy(artistnameReplaceSingleQuote); itemModified = ETrue; } - } + CleanupStack::PopAndDestroy(newArtistname); + } #ifdef ABSTRACTAUDIOALBUM_INCLUDED TBool nonEmbeddedArt = EFalse; @@ -290,9 +306,9 @@ { MPX_DEBUG1("CMPXDbAlbum::DecrementSongsForCategoryL, get newArt"); HBufC* artReplaceSingleQuote = MPXDbCommonUtil::ProcessSingleQuotesLC( *newArt ); - _LIT( KFormatArt, "Art=\'%S\'" ); - HBufC* setStr = HBufC::NewLC(256); - setStr->Des().Format( KFormatArt, artReplaceSingleQuote ); + TPtrC criteria(KCriterionArt); + HBufC* setStr = HBufC::NewLC(criteria.Length() + artReplaceSingleQuote->Length()); + setStr->Des().Format( KCriterionArt, artReplaceSingleQuote ); iDbManager.ExecuteQueryL(aDriveId, KQueryAlbumUpdate, setStr, aId); CleanupStack::PopAndDestroy(setStr); @@ -535,9 +551,7 @@ if (aMedia.IsSupported(KMPXMediaMusicArtist)) { const TDesC& artistName = aMedia.ValueText(KMPXMediaMusicArtist).Left(KMCMaxTextLen); - TUint32 artistId = MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), EMPXArtist, - artistName, ETrue); - MPXDbCommonUtil::AppendValueL(aFields, aValues, KMCMusicArtist, artistId); + MPXDbCommonUtil::AppendValueL(aFields, aValues, KMCAlbumArtistName, artistName); } } @@ -554,7 +568,7 @@ // CMPXDbAlbum::ArtistForAlbumL // ---------------------------------------------------------------------------- // -TUint32 CMPXDbAlbum::ArtistForAlbumL(const TUint32 aId) +HBufC* CMPXDbAlbum::ArtistForAlbumL(const TUint32 aId) { return iObserver.HandleArtistForAlbumL(aId); } diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/src/mpxdbhandler.cpp --- a/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/src/mpxdbhandler.cpp Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/src/mpxdbhandler.cpp Mon Jun 21 15:37:19 2010 +0300 @@ -1537,6 +1537,8 @@ iOutOfDisk = ETrue; } + User::LeaveIfError( err ); + if(!iOutOfDisk) { MPX_TRAP(err,CheckDiskSpaceOnDrivesL()); @@ -1561,26 +1563,28 @@ void CMPXDbHandler::RefreshEndL() { MPX_FUNC("CMPXDbHandler::RefreshEndL"); - iRefresh = EFalse; - EndTransactionL(KErrNone); - if (!iOutOfDisk) - { - // Write last refreshed time as current time - // This also sets corrupt = 0 - TTime curTime; - curTime.HomeTime(); - SetLastRefreshedTimeL(curTime); - } + if ( iRefresh ) + { + iRefresh = EFalse; + EndTransactionL(KErrNone); + if (!iOutOfDisk) + { + // Write last refreshed time as current time + // This also sets corrupt = 0 + TTime curTime; + curTime.HomeTime(); + SetLastRefreshedTimeL(curTime); + } #ifdef ABSTRACTAUDIOALBUM_INCLUDED //for AbstractAlbum garbage collection - //can not leave - TRAP_IGNORE( AbstractAlbumCleanUpL() ); + TRAP_IGNORE( iDbAbstractAlbum->AbstractAlbumCleanUpL() ); #endif #ifdef __RAMDISK_PERF_ENABLE - iDbManager->CopyDBsFromRamL(); + iDbManager->CopyDBsFromRamL(); #endif //__RAMDISK_PERF_ENABLE + } } // ---------------------------------------------------------------------------- @@ -1605,6 +1609,12 @@ iDbManager->BeginL(); } +//create Thumbnail manager session for cleanup for abstractalbum when MTP end. +//because when MTP end comes, in case of mode switching, we need to do it as fast as possible, +//hence we don’t want the delay happens on that time. +#ifdef RD_MPX_TNM_INTEGRATION + iDbAbstractAlbum->CreateTNMSessionL(); +#endif //RD_MPX_TNM_INTEGRATION MPX_DEBUG1("<--CMPXDbHandler::MtpStartL"); } @@ -1630,11 +1640,13 @@ #endif //__RAMDISK_PERF_ENABLE #ifdef ABSTRACTAUDIOALBUM_INCLUDED - TRAP(err, RemoveAbstractAlbumsWithNoSongL()); + BeginTransactionL(); + TRAP(err, iDbAbstractAlbum->RemoveAbstractAlbumsWithNoSongL()); if ( err != KErrNone ) { MPX_DEBUG2("CMPXDbHandler::MtpEndL error happened when cleanup albstractalbum with no songs association[%d]", err); } + EndTransactionL(err); #endif MPX_DEBUG1("<--CMPXDbHandler::MtpEndL"); } @@ -2366,83 +2378,6 @@ EMPXSong, KDBPluginUid); } -#ifdef ABSTRACTAUDIOALBUM_INCLUDED -// ---------------------------------------------------------------------------- -// Remove abstractalbums which have no songs associated. -// ---------------------------------------------------------------------------- -// -void CMPXDbHandler::RemoveAbstractAlbumsWithNoSongL() - { - MPX_FUNC("CMPXDbHandler::RemoveAbstractAlbumsWithNoSongL"); - - BeginTransactionL(); - RArray iItemsIds; - CleanupClosePushL(iItemsIds); - //get all abstractalbum with no songs associated. - iDbAbstractAlbum->GetAllItemsWithNoSongL(iItemsIds); - TInt count = iItemsIds.Count(); - TInt err = KErrNone; - if (count) - { - MPX_DEBUG2("CMPXDbHandler::RemoveAbstractAlbumsWithNoSongL, abstractalbum count[%d] ", iItemsIds.Count()); - CMPXMessageArray* itemChangedMessages = CMPXMediaArray::NewL(); - CleanupStack::PushL(itemChangedMessages); - - //go through each one to delete - for (TInt i=0; i< count; i++) - { - TRAP(err, RemoveAbstractAlbumL(iItemsIds[i], *itemChangedMessages, EFalse)); - if (err != KErrNone) - { - MPX_DEBUG2("CMPXDbHandler::RemoveAbstractAlbumsWithNoSongL, error happens when delete abstractalbum, err ", err); - } - } - CleanupStack::PopAndDestroy(itemChangedMessages); - } - CleanupStack::PopAndDestroy(&iItemsIds); - EndTransactionL(err); - } - -// ---------------------------------------------------------------------------- -// Remove .alb entry from AbstractAlnum table, TN table if .alb files deleted -// from file manager when refresh library -// ---------------------------------------------------------------------------- -// -void CMPXDbHandler::AbstractAlbumCleanUpL() - { - MPX_FUNC("CMPXDbHandler::AbstractAlbumCleanUpL"); - RArray attributes; - CleanupClosePushL(attributes); - attributes.AppendL(KMPXMediaGeneralUri); - CMPXMediaArray* mediaArray = CMPXMediaArray::NewL(); - CleanupStack::PushL(mediaArray); - - iDbAbstractAlbum->GetAllCategoryItemsL(attributes.Array(), *mediaArray); - - TInt count(mediaArray->Count()); - if (count) - { - CMPXMessageArray* itemChangedMessages = CMPXMediaArray::NewL(); - CleanupStack::PushL(itemChangedMessages); - for (TInt i = 0; i < count; i++) - { - CMPXMedia* element = mediaArray->AtL(i); - const TDesC& uri = element->ValueText(KMPXMediaGeneralUri); - - //check if the file exists in file system - if (!(BaflUtils::FileExists(iFs, uri))) - { - //generate abstractalbum UID with the Uri - TUint32 abstractAlbumId(MPXDbCommonUtil::GenerateUniqueIdL(iFs, EMPXAbstractAlbum, uri, EFalse)); - RemoveAbstractAlbumL(abstractAlbumId, *itemChangedMessages, ETrue); - } - } - CleanupStack::PopAndDestroy(itemChangedMessages); - } - CleanupStack::PopAndDestroy(mediaArray); - CleanupStack::PopAndDestroy(&attributes); - } -#endif //ABSTRACTAUDIOALBUM_INCLUDED // ---------------------------------------------------------------------------- // CMPXDbHandler::DoCleanupDeletedRecordsL @@ -2894,22 +2829,6 @@ // append the drive to the drive list iDbDrives.AppendL(driveUnit); - - // make sure the folder is created - TVolumeInfo info; - if (iFs.Volume(info, driveUnit) == KErrNone) - { - if (!BaflUtils::PathExists(iFs, folder)) - { - // create music folder if necessary - TInt err(iFs.MkDirAll(folder)); - MPX_DEBUG3("Try to create music folder %S return code %d", &folder, err); - if (err != KErrAlreadyExists) - { - User::LeaveIfError(err); - } - } - } } } @@ -3185,7 +3104,7 @@ TUint32 CMPXDbHandler::AddCategoryItemL( TMPXGeneralCategory aCategory, const TDesC& aName, - TUint32 aArtist, + const TDesC& aArtistName, const TDesC& aArt, TInt aDriveId, CMPXMessageArray* aItemChangedMessages, @@ -3198,9 +3117,9 @@ TBool newRecord(EFalse); TUint32 id = 0; - if ( aArtist ) + if(aCategory == EMPXAlbum) { - id = iDbAlbum->AddItemL(aName, aArtist, aArt, aDriveId, newRecord, (aCategory != EMPXGenre)); + id = iDbAlbum->AddItemL(aName, aArtistName, aArt, aDriveId, newRecord, (aCategory != EMPXGenre)); } else { @@ -3362,9 +3281,12 @@ // CMPXDbHandler::HandleArtistForAlbumL // --------------------------------------------------------------------------- // -TUint32 CMPXDbHandler::HandleArtistForAlbumL(const TUint32 aAlbumId) +HBufC* CMPXDbHandler::HandleArtistForAlbumL(const TUint32 aAlbumId) { - return iDbMusic->ArtistForAlbumL(aAlbumId); + + TUint32 artistId = iDbMusic->ArtistForAlbumL(aAlbumId); + HBufC* artistname = GetNameMatchingIdL(artistId); + return artistname; } // --------------------------------------------------------------------------- diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/src/mpxdbmusic.cpp --- a/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/src/mpxdbmusic.cpp Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/src/mpxdbmusic.cpp Mon Jun 21 15:37:19 2010 +0300 @@ -56,6 +56,7 @@ _LIT( KAbstractAlbumExt, ".alb" ); #endif // ABSTRACTAUDIOALBUM_INCLUDED +const TInt KAllSongsQueryResultGranularity = 250; // ============================ MEMBER FUNCTIONS ============================== @@ -99,6 +100,7 @@ { MPX_FUNC("CMPXDbMusic::~CMPXDbMusic"); delete iExtensionsDrm; + iAllSongsQueryResult.ResetAndDestroy(); } // ---------------------------------------------------------------------------- @@ -113,6 +115,7 @@ #ifdef ABSTRACTAUDIOALBUM_INCLUDED ,iArtNeedUpdated(ETrue) #endif + ,iAllSongsQueryResult(KAllSongsQueryResultGranularity) { MPX_FUNC("CMPXDbMusic::CMPXDbMusic"); } @@ -682,14 +685,55 @@ { MPX_FUNC("CMPXDbMusic::GetAllSongsLimitedL"); - // Gets a subset of the data from all songs ordered by title - HBufC* query = HBufC::NewLC( KQueryMusicGetSongsLimited().Length() + KMCIntegerLen ); - query->Des().Format( KQueryMusicGetSongsLimited, aLimit ); - ExecuteMediaQueryL(aAttrs, aMediaArray, *query); - CleanupStack::PopAndDestroy( query ); + // Reset and create a cache for the query results. + if (iAllSongsQueryResult.Count()) + { + iAllSongsQueryResult.ResetAndDestroy(); + } + + ExecuteQueryAllSongsL(aAttrs); + + TInt limit = aLimit > iAllSongsQueryResult.Count() ? + iAllSongsQueryResult.Count() : aLimit; + + for ( TInt i=0; i < limit; i++ ) + { + CMPXMedia* m = iAllSongsQueryResult[i]; + aMediaArray.AppendL(*m); + } } // ---------------------------------------------------------------------------- +// CMPXDbMusic::ExecuteQueryAllSongsL +// ---------------------------------------------------------------------------- +// +void CMPXDbMusic::ExecuteQueryAllSongsL(const TArray& aAttrs) + { + // Run query and add result media objects to the cache array. + MPX_FUNC("CMPXDbMusic::ExecuteQueryAllSongsL"); + + RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(KQueryMusicGetAllSongs)); + CleanupClosePushL(recordset); + + TInt err(KErrNone); + while ((err = recordset.Next()) == KSqlAtRow) + { + CMPXMedia* media = CMPXMedia::NewL(); + CleanupStack::PushL(media); + UpdateMediaL(recordset, aAttrs, *media); + iAllSongsQueryResult.AppendL(media); + CleanupStack::Pop(media); + } + + CleanupStack::PopAndDestroy(&recordset); + if (err!= KSqlAtEnd) + { + User::Leave(KErrCorrupt); + } + } + + +// ---------------------------------------------------------------------------- // CMPXDbMusic::GetSongsInBlockL // ---------------------------------------------------------------------------- // @@ -723,12 +767,23 @@ TInt aOffset, TInt aCount ) { - MPX_DEBUG1("CMPXDbMusic::GetSongsAtOffsetL <--"); + MPX_DEBUG3("CMPXDbMusic::GetSongsAtOffsetL offset[%d], count[%d]", aOffset, aCount); + + if ( !iAllSongsQueryResult.Count() ) + { + // If there's no cache, create a cache for the query results. + ExecuteQueryAllSongsL(aAttrs); + } - ExecuteMediaQueryL(aAttrs, aMediaArray, KQueryMusicGetSongsAtOffset, - aCount, aOffset, EOffSetQuery ); - - MPX_DEBUG1("CMPXDbMusic::GetSongsAtOffsetL() -->"); + TInt limit = aOffset + aCount > iAllSongsQueryResult.Count() ? + iAllSongsQueryResult.Count() : aOffset + aCount; + for ( TInt i = aOffset; i < limit; i++ ) + { + CMPXMedia* m = iAllSongsQueryResult[i]; + aMediaArray.AppendL(*m); + } + + MPX_DEBUG1("CMPXDbMusic::GetSongsAtOffsetL() -->"); } // ---------------------------------------------------------------------------- @@ -2078,7 +2133,7 @@ TUint32 id(0); TUint32 artistIdForAlbum(artistId); if (UpdateCategoryFieldL(EMPXArtist, aMedia, KMPXMediaMusicArtist, artistId, - aDrive, aItemChangedMessages, id, 0)) + aDrive, aItemChangedMessages, id)) { MPXDbCommonUtil::AppendValueL(aFields, aValues, KMCMusicArtist, id); metaDataModified = (aMusicTable != NULL); @@ -2088,7 +2143,7 @@ // update the album field if (UpdateCategoryFieldL(EMPXAlbum, aMedia, KMPXMediaMusicAlbum, albumId, - aDrive, aItemChangedMessages, id, artistIdForAlbum)) + aDrive, aItemChangedMessages, id)) { MPXDbCommonUtil::AppendValueL(aFields, aValues, KMCMusicAlbum, id); metaDataModified = (aMusicTable != NULL); @@ -2478,6 +2533,25 @@ } else #endif // ABSTRACTAUDIOALBUM_INCLUDED + if (aCategory == EMPXArtist || aCategory == EMPXAlbum) + { + TPtrC art(KNullDesC); + TPtrC artistname(KNullDesC); + + if (aMedia.IsSupported(KMPXMediaMusicAlbumArtFileName)) + { + art.Set(aMedia.ValueText(KMPXMediaMusicAlbumArtFileName).Left(KMCMaxTextLen)); + } + if (aCategory == EMPXAlbum) + { + if (aMedia.IsSupported(KMPXMediaMusicArtist)) + { + artistname.Set(aMedia.ValueText(KMPXMediaMusicArtist).Left(KMCMaxTextLen)); + } + } + iObserver.AddCategoryItemL(aCategory, name, artistname, art, aDriveId, aItemChangedMessages, itemAdded); + } + else { // ignore the return value iObserver.AddCategoryItemL(aCategory, name, aDriveId, @@ -2513,8 +2587,27 @@ } else #endif // ABSTRACTAUDIOALBUM_INCLUDED - { - // ignore the return value + if (aCategory == EMPXArtist || aCategory == EMPXAlbum) + { + TPtrC art(KNullDesC); + TPtrC artistname(KNullDesC); + if (aMedia.IsSupported(KMPXMediaMusicAlbumArtFileName)) + { + art.Set(aMedia.ValueText(KMPXMediaMusicAlbumArtFileName).Left(KMCMaxTextLen)); + } + if (aCategory == EMPXAlbum) + { + if (aMedia.IsSupported(KMPXMediaMusicArtist)) + { + artistname.Set(aMedia.ValueText(KMPXMediaMusicArtist).Left(KMCMaxTextLen)); + } + } + iObserver.AddCategoryItemL(aCategory, KNullDesC, artistname, art, aDriveId, + aItemChangedMessages, itemAdded); + } + else + { + // ignore the return value iObserver.AddCategoryItemL(aCategory, KNullDesC, aDriveId, aItemChangedMessages, itemAdded); } @@ -2585,132 +2678,7 @@ return updated; } -TBool CMPXDbMusic::UpdateCategoryFieldL( - TMPXGeneralCategory aCategory, - const CMPXMedia& aMedia, - const TMPXAttribute& aAttribute, - TUint32 aOldId, - TInt aDriveId, - CMPXMessageArray* aItemChangedMessages, - TUint32& aItemId, - TUint32 aArtistId) - { - TBool updated(EFalse); - TBool itemNotRemoved( EFalse ); - TBool itemAdded( EFalse ); - // update category table and add category Id to the music table - if (!aOldId || aMedia.IsSupported(aAttribute)) - { - TInt changeMsgCount( 0 ); - if( aItemChangedMessages ) - { - changeMsgCount = aItemChangedMessages->Count(); - } - - if (aMedia.IsSupported(aAttribute)) - { - TPtrC name(aMedia.ValueText(aAttribute).Left(KMCMaxTextLen)); - - // construct the new ID for the category record - // only genre is not case sensitive - aItemId = MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), aCategory, - name, (aCategory != EMPXGenre)); - if (!aOldId || (aOldId != aItemId)) - { - // only add if the ID changed, - // otherwise the song was updated but the artist name was not - TPtrC art(KNullDesC); - if (aMedia.IsSupported(KMPXMediaMusicAlbumArtFileName)) - { - art.Set(aMedia.ValueText(KMPXMediaMusicAlbumArtFileName).Left(KMCMaxTextLen)); - } - - iObserver.AddCategoryItemL(aCategory, name, aArtistId, art, aDriveId, aItemChangedMessages, itemAdded); - updated = ETrue; - } - } - else - { - // only genre is not case sensitive - aItemId = MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), aCategory, KNullDesC, - (aCategory != EMPXGenre)); - if (!aOldId || (aOldId != aItemId)) - { - TPtrC art(KNullDesC); - if (aMedia.IsSupported(KMPXMediaMusicAlbumArtFileName)) - { - art.Set(aMedia.ValueText(KMPXMediaMusicAlbumArtFileName).Left(KMCMaxTextLen)); - } - - iObserver.AddCategoryItemL(aCategory, KNullDesC, aArtistId, art, aDriveId, - aItemChangedMessages, itemAdded); - updated = ETrue; - } - } - - if (aOldId && (aOldId != aItemId)) - { - iObserver.DeleteSongForCategoryL(aCategory, aOldId, aDriveId, - aItemChangedMessages, itemNotRemoved); - updated = ETrue; - } - - // Special case where the item(s) has been renamed. - // In this case, a new category is created +1 change msg - // a old category is removed +1 change msg - // We merge these 2 change messages into one using the deprecated ID - // - if( aItemChangedMessages ) - { - TInt newChangeMsgCount( aItemChangedMessages->Count() ); - if( newChangeMsgCount - changeMsgCount > 0 ) - { - TInt oldId = KErrNotFound; - TInt newId = KErrNotFound; - for( TInt i=0; i(KMPXMessageMediaGeneralId); - TMPXChangeEventType changeType = msg.ValueTObjectL(KMPXMessageChangeEventType); - - // Look for the added and deleted category IDs - // - if( id == aOldId && changeType == EMPXItemDeleted ) - { - oldId = i; - } - else if( id == aItemId && changeType == EMPXItemInserted ) - { - newId = i; - } - } - - if( oldId != KErrNotFound && - newId != KErrNotFound ) - { - aItemChangedMessages->Remove(oldId); // category removed - aItemChangedMessages->Remove(newId); // category added - MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, aItemId, EMPXItemModified, - aCategory, KDBPluginUid, aOldId ); - } - else if ( oldId !=KErrNotFound && itemAdded ) // old item removed, new item already exist - { - MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, aItemId, EMPXItemModified, - aCategory, KDBPluginUid, aOldId ); - } - else if ( newId !=KErrNotFound && itemNotRemoved ) // new item added, old item still exist - { - MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, aOldId, EMPXItemModified, - aCategory, KDBPluginUid, aItemId ); - } - } - } - } - - return updated; - } // ---------------------------------------------------------------------------- // CMPXDbMusic::ExtraFieldsRequired // ---------------------------------------------------------------------------- diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/src/mpxdbplugin.cpp --- a/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/src/mpxdbplugin.cpp Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/src/mpxdbplugin.cpp Mon Jun 21 15:37:19 2010 +0300 @@ -412,7 +412,6 @@ case EMcRefreshEnded: { MPX_DEBUG1("CMPXDbPlugin::CommandL - EMcRefreshEnded"); - iDbHandler->CheckDiskSpaceOnDrivesL(); // ask the handler to finalize the transaction iDbHandler->RefreshEndL(); iRefreshing=EFalse; @@ -444,7 +443,6 @@ iDbHandler->MtpStartL(); break; case EMcCmdMtpEnd: - iDbHandler->CheckDiskSpaceOnDrivesL(); iMtpInUse = EFalse; iDbHandler->MtpEndL(); break; @@ -4059,12 +4057,13 @@ TInt numItems = aCmd.ValueTObjectL( KMPXCollectionCommandIdIncOpenLNumItems ); TReadDirection direction(EReadUnknown); +/* Ascending and Decending reads are currently not used. We optimized for offset reads. if( aCmd.IsSupported(KMPXCollectionCommandIdIncOpenLAscDsc) && aCmd.IsSupported(KMPXCollectionCommandIdIncOpenLKeyItem) ) { direction = aCmd.ValueTObjectL(KMPXCollectionCommandIdIncOpenLAscDsc); } - +*/ CMPXCollectionPath* path = aCmd.ValueCObjectL(KMPXCollectionCommandIdIncOpenLPath); CleanupStack::PushL( path ); MPX_DEBUG_PATH( *path ); diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/serviceplugins/collectionplugins/mpxsqlitepodcastdbplugin/inc/mpxpodcastcollectiondbdef.h --- a/mpxplugins/serviceplugins/collectionplugins/mpxsqlitepodcastdbplugin/inc/mpxpodcastcollectiondbdef.h Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/serviceplugins/collectionplugins/mpxsqlitepodcastdbplugin/inc/mpxpodcastcollectiondbdef.h Mon Jun 21 15:37:19 2010 +0300 @@ -27,7 +27,7 @@ // Db filename _LIT(KMCDbFile, "pcv6_1.db"); - +_LIT(KMCDbFileEMMC, "pcv6_1i.db"); // Collection Db resource file _LIT(KMPXCollectionDbResourceFile, "PCRes.rsc"); diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/serviceplugins/collectionplugins/mpxsqlitepodcastdbplugin/src/mpxpodcastdbhandler.cpp --- a/mpxplugins/serviceplugins/collectionplugins/mpxsqlitepodcastdbplugin/src/mpxpodcastdbhandler.cpp Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/serviceplugins/collectionplugins/mpxsqlitepodcastdbplugin/src/mpxpodcastdbhandler.cpp Mon Jun 21 15:37:19 2010 +0300 @@ -1319,22 +1319,6 @@ // append the drive to the drive list iDbDrives.AppendL(driveUnit); - - // make sure the folder is created - TVolumeInfo info; - if (iFs.Volume(info, driveUnit) == KErrNone) - { - if (!BaflUtils::PathExists(iFs, folder)) - { - // create music folder if necessary - TInt err(iFs.MkDirAll(folder)); - MPX_DEBUG3("Try to create podcast folder %S return code %d", &folder, err); - if (err != KErrAlreadyExists) - { - User::LeaveIfError(err); - } - } - } } } diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/serviceplugins/collectionplugins/mpxsqlitepodcastdbplugin/src/mpxpodcastdbmanager.cpp --- a/mpxplugins/serviceplugins/collectionplugins/mpxsqlitepodcastdbplugin/src/mpxpodcastdbmanager.cpp Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/serviceplugins/collectionplugins/mpxsqlitepodcastdbplugin/src/mpxpodcastdbmanager.cpp Mon Jun 21 15:37:19 2010 +0300 @@ -80,7 +80,26 @@ void CMPXPodcastDbManager::ConstructL() { MPX_FUNC("CMPXPodcastDbManager::ConstructL"); - CMPXDbManager::ConstructL(TFileName(KMCDbFile)); + //Find out if the system has an internal drive (eMMC) + TBool eMMC( EFalse ); + TDriveInfo driveInfo; + if( Fs().Drive( driveInfo, EDriveE ) == KErrNone ) + { + if ( driveInfo.iDriveAtt & KDriveAttInternal ) + eMMC = ETrue; + } + + //Use different name for Dbs if the system has an internal drive vs. MMC-only. + //Since hard-coded drive letters in the Thumbnail URIs + //So Dbs are not interchangeable between an internal drive system and MMC-only system. + if( eMMC ) + { + CMPXDbManager::ConstructL(TFileName( KMCDbFileEMMC )); + } + else + { + CMPXDbManager::ConstructL(TFileName( KMCDbFile )); + } } // End of File diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/viewplugins/views/addtracksdialog/data/mpxaddtracksdialog.rss --- a/mpxplugins/viewplugins/views/addtracksdialog/data/mpxaddtracksdialog.rss Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/viewplugins/views/addtracksdialog/data/mpxaddtracksdialog.rss Mon Jun 21 15:37:19 2010 +0300 @@ -288,7 +288,7 @@ // RESOURCE TBUF r_mpx_qtn_mp_unknown { - buf = qtn_mp_list_unknown; + buf = qtn_mp_single_list_unknown; } // ----------------------------------------------------------------------------- diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/viewplugins/views/addtracksdialog/loc/mpxaddtracksdialog.loc --- a/mpxplugins/viewplugins/views/addtracksdialog/loc/mpxaddtracksdialog.loc Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/viewplugins/views/addtracksdialog/loc/mpxaddtracksdialog.loc Mon Jun 21 15:37:19 2010 +0300 @@ -108,11 +108,11 @@ // #define qtn_nmp_addsongs_num_songs "Songs (%N)" -// d:Unknown in listbox. +// d:Unknown in Song selection view // l:list_single_graphic_pane_t1 -// r:3.1 +// r:5.2 // -#define qtn_mp_list_unknown "Unknown" +#define qtn_mp_single_list_unknown "Unknown" // d:Text for wait note for opening // l:popup_note_wait_window diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/viewplugins/views/audioeffectsview/inc/mpxaudioeffectsviewimp.h --- a/mpxplugins/viewplugins/views/audioeffectsview/inc/mpxaudioeffectsviewimp.h Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/viewplugins/views/audioeffectsview/inc/mpxaudioeffectsviewimp.h Mon Jun 21 15:37:19 2010 +0300 @@ -23,7 +23,7 @@ //INCLUDES #include - +#include #include "mpxaudioeffectsview.h" @@ -41,7 +41,7 @@ * @lib mpxaudioeffectsview.dll * @since Series 60 3.0 */ -NONSHARABLE_CLASS( CMPXAudioEffectsViewImp ) : public CMPXAudioEffectsView +NONSHARABLE_CLASS( CMPXAudioEffectsViewImp ) : public CMPXAudioEffectsView, public MMPXViewActivationObserver { public: @@ -116,6 +116,27 @@ * From CAknView */ void DoDeactivate(); + + // from MMPXViewActivationObserver + + /** + * From MMPXViewActivationObserver + * Handle view activation. + * + * @param aCurrentViewType Current view type Uid. + * @param aPreviousViewType Previous view type Uid. + */ + void HandleViewActivation( + const TUid& aCurrentViewType, + const TUid& aPreviousViewType ); + /** + * @see MMPXViewActivationObserver + */ + void HandleViewUpdate( + TUid aViewUid, + MMPXViewActivationObserver::TViewUpdateEvent aUpdateEvent, + TBool aLoaded, + TInt aData); private: // data @@ -126,6 +147,7 @@ TVwsViewId iPreviousView; TInt iResourceOffset; MMPXViewUtility* iViewUtility; + TBool iGoPreviousView; }; #endif // C_CMPXAUDIOEFFECTSVIEWIMP_H diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/viewplugins/views/audioeffectsview/src/mpxaudioeffectsviewimp.cpp --- a/mpxplugins/viewplugins/views/audioeffectsview/src/mpxaudioeffectsviewimp.cpp Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/viewplugins/views/audioeffectsview/src/mpxaudioeffectsviewimp.cpp Mon Jun 21 15:37:19 2010 +0300 @@ -24,7 +24,9 @@ #include #include #include +#include #include +#include #include #include @@ -39,7 +41,7 @@ // CONSTANTS _LIT( KMPXAudioEffectsRscPath, "mpxaudioeffectsview.rsc" ); - +_LIT(KEmptyTitle, " "); // ======== MEMBER FUNCTIONS ======== @@ -74,6 +76,8 @@ iModel = CMPXAudioEffectsModel::NewL( *iPlaybackUtility ); iViewUtility = MMPXViewUtility::UtilityL(); + iViewUtility->AddObserverL(this); + iGoPreviousView = EFalse; } // --------------------------------------------------------------------------- @@ -119,6 +123,7 @@ if ( iViewUtility ) { + iViewUtility->RemoveObserver( this ); iViewUtility->Close(); } @@ -170,6 +175,7 @@ } case EAknSoftkeyBack: { + iGoPreviousView = ETrue; iViewUtility->ActivatePreviousViewL(); break; } @@ -205,6 +211,51 @@ } // ----------------------------------------------------------------------------- +// CMPXAudioEffectsViewImp::HandleViewActivation +// Handle view activation +// ----------------------------------------------------------------------------- +// +void CMPXAudioEffectsViewImp::HandleViewActivation( + const TUid& aCurrentViewType, + const TUid& /*aPreviousViewType*/ ) + { + MPX_FUNC( "CMPXAudioEffectsViewImp::HandleViewActivation" ); + if ( ( aCurrentViewType.iUid == KMPXPluginTypePlaybackUid ) && ( iGoPreviousView == EFalse ) ) + { + // It is view switching when launched from other applications + // deactivate this view to avoid flickering + // since this view is the current active view, it receives this event + + if ( iContainer ) + { + // set title to blank to avoid title flickering + CAknTitlePane* title( static_cast + ( StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle )))); + if ( title ) + { + title->SetTextL(KEmptyTitle); + title->DrawNow(); + } + } + + DoDeactivate(); + } + } + +// ----------------------------------------------------------------------------- +// CMPXAudioEffectsViewImp::HandleViewUpdate +// ----------------------------------------------------------------------------- +// +void CMPXAudioEffectsViewImp::HandleViewUpdate( + TUid /* aViewUid */, + MMPXViewActivationObserver::TViewUpdateEvent /* aUpdateEvent */, + TBool /* aLoaded */, + TInt /* aData */) + { + // Do nothing, this should be handled by the AppUI + } + +// ----------------------------------------------------------------------------- // CMPXAudioEffectsViewImp::DoDeactivate // (other items were commented in a header). // ----------------------------------------------------------------------------- @@ -216,6 +267,7 @@ AppUi()->RemoveFromStack( iContainer ); delete iContainer; iContainer = NULL; + iGoPreviousView = EFalse; } } diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/viewplugins/views/collectionview/loc/mpxcollectionview.loc --- a/mpxplugins/viewplugins/views/collectionview/loc/mpxcollectionview.loc Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/viewplugins/views/collectionview/loc/mpxcollectionview.loc Mon Jun 21 15:37:19 2010 +0300 @@ -74,7 +74,7 @@ // l:list_single_pane_t1_cp2/opt1 // r:5.0 // -#define qtn_nmp_options_reorder_list "Reorder list" +#define qtn_nmp_options_reorder_list "Move song" // d:Options menu item for removing from playlist. // l:list_single_pane_t1_cp2/opt1 @@ -372,9 +372,8 @@ #define qtn_nmp_prmpt_new_name "New name:" // d:Text for an item with unknown description -// d:Part of text for wait note -// l:popup_note_wait_window -// r:5.0 +// l:list_double_large_graphic_pane_t1 +// r:5.2 // #define qtn_mp_list_unknown "Unknown" diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/viewplugins/views/collectionviewhg/data/mpxcollectionviewhg.rss --- a/mpxplugins/viewplugins/views/collectionviewhg/data/mpxcollectionviewhg.rss Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/viewplugins/views/collectionviewhg/data/mpxcollectionviewhg.rss Mon Jun 21 15:37:19 2010 +0300 @@ -242,6 +242,7 @@ { command = EMPXCmdReorder; txt = qtn_nmp_options_reorder_list; + flags = EEikMenuItemSpecific; }, MENU_ITEM { @@ -630,6 +631,26 @@ }; } +// --------------------------------------------------------------------------- +// r_mpx_cui_reorder_cancel_cba +// --------------------------------------------------------------------------- +// +RESOURCE CBA r_mpx_cui_reorder_cancel_cba + { + buttons = + { + CBA_BUTTON + { + txt = text_softkey_empty; + }, + CBA_BUTTON + { + id = EMPXCmdReorderCancel; + txt = text_softkey_cancel; + } + }; + } + #ifdef __ENABLE_MSK // --------------------------------------------------------------------------- // r_mpx_cui_reorder_drop_cancel_cba @@ -1850,4 +1871,24 @@ buf = qtn_vmp_no_genres; } +// --------------------------------------------------------------------------- +// r_mpx_qtn_mus_query_conf_delete_all +// Text for Unknown album deletion wait note. +// --------------------------------------------------------------------------- +// +RESOURCE TBUF r_mpx_qtn_mus_query_conf_delete_all_unknown + { + buf = qtn_mus_query_conf_delete_all_unknown; + } + +// --------------------------------------------------------------------------- +// r_mpx_qtn_nmp_query_conf_delete_group +// Text for Unknown album deletion confirmation query. +// --------------------------------------------------------------------------- +// +RESOURCE TBUF r_mpx_qtn_nmp_query_conf_delete_group_unknown + { + buf = qtn_nmp_query_conf_delete_group_unknown; + } + // End of File diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/viewplugins/views/collectionviewhg/inc/mpxcollectionviewhgcontainer.h --- a/mpxplugins/viewplugins/views/collectionviewhg/inc/mpxcollectionviewhgcontainer.h Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/viewplugins/views/collectionviewhg/inc/mpxcollectionviewhgcontainer.h Mon Jun 21 15:37:19 2010 +0300 @@ -224,6 +224,11 @@ * @since 3.1 */ TInt CurrentLbxItemIndex() const; + + /* + * Mark the grabbed item for reordering the playlist. + */ + void MarkGrabedItemL( TInt aIndex ); /** * Get current selected listbox items indices (relative to the original @@ -566,7 +571,11 @@ */ void SetPreviousViewId(TUid aViewUid); - + /** + * Hides container window controls. + */ + void HideContainerWindow(); + private: /** @@ -1012,6 +1021,7 @@ TRect iPopupListRect; TUid iPreviousViewId; TBool iPreviousOrientation; + TBool iDrawBackGround; }; #endif // CMPXCOLLECTIONVIEWHGCONTAINER_H diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/viewplugins/views/collectionviewhg/inc/mpxcollectionviewhgimp.h --- a/mpxplugins/viewplugins/views/collectionviewhg/inc/mpxcollectionviewhgimp.h Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/viewplugins/views/collectionviewhg/inc/mpxcollectionviewhgimp.h Mon Jun 21 15:37:19 2010 +0300 @@ -1015,6 +1015,7 @@ TBool iDialogDismissed; HBufC* iTitleWait; // Owned + TBool iGoToNowPlaying; }; #endif // C_CMPXCOLLECTIONVIEWHGIMP_H diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/viewplugins/views/collectionviewhg/loc/mpxcollectionviewhg.loc --- a/mpxplugins/viewplugins/views/collectionviewhg/loc/mpxcollectionviewhg.loc Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/viewplugins/views/collectionviewhg/loc/mpxcollectionviewhg.loc Mon Jun 21 15:37:19 2010 +0300 @@ -74,7 +74,7 @@ // l:list_single_pane_t1_cp2/opt1 // r:5.0 // -#define qtn_nmp_options_reorder_list "Reorder list" +#define qtn_nmp_options_reorder_list "Move song" // d:Options menu item for removing from playlist. // l:list_single_pane_t1_cp2/opt1 @@ -387,9 +387,8 @@ #define qtn_nmp_prmpt_new_name "New name:" // d:Text for an item with unknown description -// d:Part of text for wait note -// l:popup_note_wait_window -// r:5.0 +// l:list_double_large_graphic_pane_t1 +// r:5.2 // #define qtn_mp_list_unknown "Unknown" @@ -712,4 +711,17 @@ // #define qtn_vmp_no_genres "(no genres)" +// d:Text for wait note for deleting a unknown album +// l:popup_note_wait_window +// r:5.2 +// +#define qtn_mus_query_conf_delete_all_unknown "Deleting songs from 'Unknown'" + +// d:Text for a confirmation query shown when user attempts to delete +// d:all tracks belonging to a unknown album. +// l:popup_note_window/opt1 +// r:5.2 +// +#define qtn_nmp_query_conf_delete_group_unknown "Delete all songs from 'Unknown'?" + // End of File diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/viewplugins/views/collectionviewhg/src/mpxcollectionviewhgcontainer.cpp --- a/mpxplugins/viewplugins/views/collectionviewhg/src/mpxcollectionviewhgcontainer.cpp Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/viewplugins/views/collectionviewhg/src/mpxcollectionviewhgcontainer.cpp Mon Jun 21 15:37:19 2010 +0300 @@ -162,7 +162,8 @@ iShuffleItem(0), iSetEmptyTextNeeded(EFalse), iPopupListRect(TRect(0,0,0,0)), - iPreviousViewId(TUid::Uid(0)) + iPreviousViewId(TUid::Uid(0)), + iDrawBackGround(EFalse) { } @@ -818,7 +819,7 @@ // void CMPXCollectionViewHgContainer::Draw(const TRect& /*aRect*/) const { - if ( iContext == EContextUnknown ) + if ( iContext == EContextUnknown || iDrawBackGround != EFalse ) { MAknsSkinInstance* skin = AknsUtils::SkinInstance(); MAknsControlContext* cc = AknsDrawUtils::ControlContext( this ); @@ -1502,10 +1503,15 @@ if( iListWidget ) { TRect clientRect = ((CAknView*)iView)->ClientRect(); - TInt mediaIndex = MediaIndex(iListWidget->SelectedIndex()); + TInt index = MediaIndex(iListWidget->SelectedIndex()); + TInt mediaIndex (index); mediaIndex = ( KErrNotFound == mediaIndex ) ? iListWidget->FirstIndexOnScreen() : mediaIndex; mediaIndex = ( mediaIndex >= 0 && (mediaIndex < (mediaCount)) ) ? mediaIndex : (mediaCount - 1); - + // No need to modify index of first item, if reorder is activated + if ( IsInReorderMode() && index == KErrNotFound ) + { + mediaIndex = KErrNotFound; + } TInt prevItemCount = iListWidget->ItemCount(); iListWidget->InitScreenL( clientRect ); @@ -1520,6 +1526,19 @@ iListWidget->ResizeL( aCount ); ProvideDataWithoutThumbnailsL(aMediaArray); iListWidget->SetSelectedIndex( mediaIndex + iShuffleItem ); + // Reserve mark icon for playlist in reorder mode + if ( IsInReorderMode() ) + { + MarkGrabedItemL( CurrentLbxItemIndex() + 1 ); + } + + // To remove flicker of default albumart in playlist track level + if ( iContext == EContextItemPlaylist ) + { + iDefaultIconSet = EFalse; + // Setting an empty icon to the list as default icon. + iListWidget->SetDefaultIconL(CGulIcon::NewL(new CFbsBitmap())); + } } else { @@ -1890,7 +1909,7 @@ { ResolvePopupListSizeL(); } - + iMediaWall->SetOpenedItemRect( iPopupListRect ); iMediaWall->SetOpeningAnimationType( CHgVgMediaWall::EHgVgOpeningAnimationZoomToFront ); @@ -2221,6 +2240,11 @@ // ganes list components still uses this version of the HandleOpen if ( iContext == EContextItemAlbum ) { + if( iCurrentViewType == EMPXViewTBone ) + { + iMediaWall->SetFlags( CHgVgMediaWall::EHgVgMediaWallDrawToWindowGC ); + iMediaWall->DrawNow(); + } SaveSelectedAlbumItemL(iSelectedAlbumIndex); UpdatePathAndOpenL(index); // Start animation now as next view activated is @@ -2242,15 +2266,28 @@ else if ( iContext == EContextGroupSong || iContext == EContextItemPlaylist || iContext == EContextItemGenre ) { // Check if shuffle play all was selected. - if (!ShufflePlayAllL(index)) + TBool inReorderMode ( IsInReorderMode() ); + if ( inReorderMode && index == KErrNotFound ) + { + // If Shuffle is selected in reorder mode than Grabbed item should move + // to first position in the playlist, just after shuffle item. + SetLbxCurrentItemIndex(1); + iView->ProcessCommandL( EMPXCmdCommonEnterKey ); + } + else if ( !ShufflePlayAllL(index) ) { // To open the selected album. iView->ProcessCommandL( EMPXCmdCommonEnterKey ); } - // Start animation now as next view activated is - // now playing view. We will end animation in now playing view. - SetupTransitionType(KMPXInterviewTransition); - BeginFullScreenAnimation(); + + // Disable transition in reorder mode + if( !inReorderMode ) + { + // Start animation now as next view activated is + // now playing view. We will end animation in now playing view. + SetupTransitionType(KMPXInterviewTransition); + BeginFullScreenAnimation(); + } } else { @@ -5083,6 +5120,25 @@ } // --------------------------------------------------------------------------- +// Hides container window controls +// --------------------------------------------------------------------------- +// +void CMPXCollectionViewHgContainer::HideContainerWindow() + { + if( iMediaWall ) + iMediaWall->MakeVisible(EFalse); + if( iListWidget ) + iListWidget->MakeVisible(EFalse); + if( iMwListWidget ) + iMwListWidget->MakeVisible(EFalse); + + // draw background application rectangle + iDrawBackGround = ETrue; + DrawNow(); + iDrawBackGround = EFalse; + } + +// --------------------------------------------------------------------------- // Prepare and begin fullscreen animation effects // --------------------------------------------------------------------------- // @@ -5171,7 +5227,7 @@ CleanupStack::PushL( dialog ); listBox->ConstructL( dialog, EAknListBoxViewerFlags ); - + // title can be hardcoded because it is not shown to user. Just for the calculations. dialog->SetTitleL(_L("Foo")); iPopupListRect = dialog->LayoutRect(); @@ -5179,4 +5235,15 @@ CleanupStack::PopAndDestroy( dialog ); CleanupStack::PopAndDestroy( listBox ); } + +// --------------------------------------------------------------------------- +// Marked the grabbed item for reordering +// --------------------------------------------------------------------------- +// +void CMPXCollectionViewHgContainer::MarkGrabedItemL(TInt aIndex) + { + MPX_DEBUG2( "CMPXCollectionViewHgContainer::MarkGrabedItemL item %d", aIndex + iShuffleItem ); + iListWidget->Mark( aIndex + iShuffleItem ); + } + // End of File diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/viewplugins/views/collectionviewhg/src/mpxcollectionviewhgimp.cpp --- a/mpxplugins/viewplugins/views/collectionviewhg/src/mpxcollectionviewhgimp.cpp Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/viewplugins/views/collectionviewhg/src/mpxcollectionviewhgimp.cpp Mon Jun 21 15:37:19 2010 +0300 @@ -131,7 +131,7 @@ _LIT( KCategoryEmpty, "" ); const TInt KIncrementalDelayNone = 0; -const TInt KIncrementalDelayHalfSecond = 1000000; +const TInt KIncrementalDelayHalfSecond = 500000; const TInt KIncrementalFetchBlockSize = 400; const TInt KIncrementalDirectionCount = 8; const TInt KWaitNoteImpUid = 0x101FFC6C; // refresh wait note UID @@ -167,6 +167,7 @@ const TInt KMPXCollectionArtistAlbum( 3 ); const TInt KMPXCollectionGenre( 5 ); +_LIT(KEmptyTitle, " "); // ======== MEMBER FUNCTIONS ======== @@ -357,6 +358,7 @@ // grab the current process priority RProcess proc; iPriority = proc.Priority(); + iGoToNowPlaying = EFalse; } void CMPXCollectionViewHgImp::HandleStatusPaneSizeChange() @@ -986,15 +988,10 @@ // 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 ); + R_MPX_QTN_MUS_QUERY_CONF_DELETE_ALL_UNKNOWN); + promptTxt = StringLoader::LoadLC( + R_MPX_QTN_NMP_QUERY_CONF_DELETE_GROUP_UNKNOWN); } else { @@ -1517,6 +1514,8 @@ TInt currentItem( iContainer->CurrentLbxItemIndex() ); iContainer->EnableFindBox( EFalse ); iContainer->SetReorderGrabbedMode( ETrue, currentItem ); + // mark the grabbed item + iContainer->MarkGrabedItemL( currentItem ); if ( !iContainer->IsInReorderMode() ) { iContainer->UpdateReorderTitleIconL(); @@ -1541,7 +1540,7 @@ iDuration = NULL; } iContainer->ActivateReorderMode( ETrue ); - SetNewCbaL( R_MPX_CUI_REORDER_DROP_CANCEL_CBA ); + SetNewCbaL( R_MPX_CUI_REORDER_CANCEL_CBA ); } iContainer->SetLbxCurrentItemIndexAndDraw( currentItem ); UpdateReorderNaviPaneL(); @@ -1596,6 +1595,7 @@ iContainer->ActivateReorderMode( EFalse ); iContainer->EnableFindBox( ETrue ); } + iHandlingKeyEvent = ETrue; iContainer->HandleLbxItemAdditionPreserveIndexL(); } @@ -4136,7 +4136,7 @@ TArray ary = attrs.Array(); iIncrementalOpenUtil->SetDelay( KIncrementalDelayNone ); iIncrementalOpenUtil->StartL( ary, KIncrementalFetchBlockSize, - KErrNotFound, CMPXCollectionOpenUtility::EFetchNormal ); + KErrNotFound, CMPXCollectionOpenUtility::EFetchDown ); iIncrementalOpenUtil->SetDelay( KIncrementalDelayHalfSecond ); CleanupStack::PopAndDestroy( &attrs ); @@ -5240,6 +5240,7 @@ } case EMPXCmdGoToNowPlaying: { + iGoToNowPlaying = ETrue; AppUi()->HandleCommandL( aCommand ); break; } @@ -6069,6 +6070,8 @@ delete iTitle; iTitle = NULL; } + // for Avkon calling Deactivate, not manually hiding window contorls, reset iGoToNowPlaying + iGoToNowPlaying = EFalse; // Cleanup view deactivation observer AppUi()->RemoveViewDeactivationObserver( this ); } @@ -6813,75 +6816,57 @@ HandleInitMusicMenuPaneL(aMenuPane); aMenuPane->SetItemDimmed( EMPXCmdGoToNowPlaying, NowPlayingOptionVisibilityL() ); - if ( isListEmpty ) + aMenuPane->SetItemDimmed( EMPXCmdFind, ETrue ); + aMenuPane->SetItemDimmed( EMPXCmdUpnpPlayVia, ETrue ); + aMenuPane->SetItemDimmed( EMPXCmdUPnPAiwCmdCopyToExternalCriteria, ETrue ); + aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue ); + aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue ); + aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue ); + aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue ); + aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue ); + aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue ); + aMenuPane->SetItemDimmed( EMPXCmdPlayItem, ETrue ); + + if( iContainer->IsInReorderMode() ) + break; + + if ( usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive ) { - aMenuPane->SetItemDimmed( EMPXCmdFind, ETrue ); - aMenuPane->SetItemDimmed( EMPXCmdUpnpPlayVia, ETrue ); - aMenuPane->SetItemDimmed( EMPXCmdUPnPAiwCmdCopyToExternalCriteria, ETrue ); - aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue ); - aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue ); + aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue ); + aMenuPane->SetItemDimmed( EMPXCmdSend, SendOptionVisibilityL() ); + aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue ); aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue ); - aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue ); - aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue ); - aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue ); - aMenuPane->SetItemDimmed( EMPXCmdPlayItem, ETrue ); + } + else + { + TInt selectionCount( 0 ); + iSelectionIndexCache = iContainer->CurrentSelectionIndicesL(); // not owned + if ( iSelectionIndexCache) + { + selectionCount = iSelectionIndexCache->Count(); + } + // do not display add songs option when marking is on or USB is connected if ( usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive ) { aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue ); } - else + else + { + aMenuPane->SetItemDimmed( EMPXCmdAddSongs, selectionCount > 0 ); + } + + if ( iContainer->CurrentLbxItemIndex() > KErrNotFound ) { - aMenuPane->SetItemDimmed( EMPXCmdAddSongs, EFalse ); + aMenuPane->SetItemDimmed( EMPXCmdSend, SendOptionVisibilityL() ); + aMenuPane->SetItemDimmed( EMPXCmdRemove, EFalse ); + if ( iContainer->CurrentListItemCount() > 1 ) + { + aMenuPane->SetItemDimmed( EMPXCmdReorder, EFalse ); + } } } - else - { - aMenuPane->SetItemDimmed( EMPXCmdUpnpPlayVia, ETrue ); - aMenuPane->SetItemDimmed( EMPXCmdUPnPAiwCmdCopyToExternalCriteria, ETrue ); - aMenuPane->SetItemDimmed( EMPXCmdFind, ETrue ); - aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue ); - aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue ); - aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue ); - aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue ); - aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue ); - aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue ); - aMenuPane->SetItemDimmed( EMPXCmdPlayItem, ETrue ); - - - if ( usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive ) - { - aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue ); - aMenuPane->SetItemDimmed( EMPXCmdSend, SendOptionVisibilityL() ); - aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue ); - } - else - { - TInt selectionCount( 0 ); - iSelectionIndexCache = iContainer->CurrentSelectionIndicesL(); // not owned - if ( iSelectionIndexCache) - { - selectionCount = iSelectionIndexCache->Count(); - } - // do not display add songs option when marking is on or USB is connected - if ( usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive ) - { - aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue ); - } - else - { - aMenuPane->SetItemDimmed( EMPXCmdAddSongs, selectionCount > 0 ); - } - - if ( iContainer->CurrentLbxItemIndex() > KErrNotFound ) - { - aMenuPane->SetItemDimmed( EMPXCmdSend, SendOptionVisibilityL() ); - aMenuPane->SetItemDimmed( EMPXCmdRemove, EFalse ); - } - } - } - - CMPXCollectionViewListBoxArray* array = + CMPXCollectionViewListBoxArray* array = static_cast( iContainer->ListBoxArray() ); const CMPXMedia& containerMedia = array->ContainerMedia(); @@ -6909,7 +6894,11 @@ aMenuPane->SetItemDimmed( EMPXCmdUseAsCascade, ETrue ); aMenuPane->SetItemDimmed( EMPXCmdAlbumArt, ETrue ); aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, ETrue ); - + aMenuPane->SetItemDimmed( EMPXCmdSongDetails, ETrue ); + + if( iContainer->IsInReorderMode() ) + break; + TInt selectionCount( 0 ); iSelectionIndexCache = iContainer->CurrentSelectionIndicesL(); // not owned if ( iSelectionIndexCache) @@ -7150,9 +7139,8 @@ { ProcessCommandL( iContainer->IsInReorderMode() ? EMPXCmdReorderDrop : EMPXCmdReorderGrab ); - iIsGrabbed = !iIsGrabbed; - } - else if ( !iHandlingKeyEvent ) + } + else if ( !iHandlingKeyEvent ) { TMPXPlaybackState pbState( iPlaybackUtility->StateL() ); TBool isEqual( EFalse ); @@ -7289,8 +7277,7 @@ { SaveCurrentPlaylistL(); iContainer->ConfirmReorderL(); - DeactivateReorderGrabbedModeL( EFalse ); - SetNewCbaL( R_MPX_CUI_REORDER_GRAB_DONE_CBA ); + DeactivateReorderGrabbedModeL( ETrue ); break; } case EMPXCmdReorderGrab: @@ -7947,6 +7934,26 @@ iInSongDetails = EFalse; } } + else if ( ( aCurrentViewType.iUid == KMPXPluginTypePlaybackUid ) && ( iGoToNowPlaying == EFalse ) ) + { + // It is view switching when launched from other applications + // hide this view to avoid flickering + // since this view is the current active view, it receives this event + + if ( iContainer ) + { + iContainer->HideContainerWindow(); + + // set title to blank to avoid title flickering + CAknTitlePane* title( static_cast + ( StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle )))); + if ( title ) + { + title->SetTextL(KEmptyTitle); + title->DrawNow(); + } + } + } } // ----------------------------------------------------------------------------- diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/viewplugins/views/collectionviewhg/src/mpxcollectionviewhglistboxarray.cpp --- a/mpxplugins/viewplugins/views/collectionviewhg/src/mpxcollectionviewhglistboxarray.cpp Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/viewplugins/views/collectionviewhg/src/mpxcollectionviewhglistboxarray.cpp Mon Jun 21 15:37:19 2010 +0300 @@ -383,33 +383,27 @@ flags = entry->ValueTObjectL( KMPXMediaGeneralFlags ); } - // reorder icon - if ( ( iReorder ) && ( aIndex == iMovedIndex ) ) + + // All icons should also be visible even in reorder mode. + // playback status icon + if ( iIndex == index ) { - iconIndices.Append( GetReorderIcon() ); - } - else if ( !iReorderActivated ) - { - // playback status icon - if ( iIndex == index ) + switch ( iPbState ) { - switch ( iPbState ) + case EPbStatePlaying: { - case EPbStatePlaying: - { - iconIndices.Append( EMPXClvIconPlay ); - break; - } - case EPbStatePaused: - { - iconIndices.Append( EMPXClvIconPause ); - break; - } - default: - { - // other playback states, not handled - break; - } + iconIndices.Append( EMPXClvIconPlay ); + break; + } + case EPbStatePaused: + { + iconIndices.Append( EMPXClvIconPause ); + break; + } + default: + { + // other playback states, not handled + break; } } } @@ -1056,51 +1050,40 @@ ptr.Format( KMPXCommonListboxFormatString, iconID, &title ); iconID = EMPXClvIconNone; - // reorder icon - if ( ( iReorder ) && ( aIndex == iMovedIndex ) ) + // All icons should also be visible even in reorder mode. + // playback status icon + if ( iIndex == index ) { - iconID = GetReorderIcon(); - } - else if ( !iReorderActivated ) - { - // playback status icon - if ( iIndex == index ) + switch ( iPbState ) { - switch ( iPbState ) + case EPbStatePlaying: + { + iconID = EMPXClvIconPlay; + break; + } + case EPbStatePaused: { - case EPbStatePlaying: - { - iconID = EMPXClvIconPlay; - break; - } - case EPbStatePaused: - { - iconID = EMPXClvIconPause; - break; - } - case EPbStateSeekingForward: - { - iconID = EMPXClvIconForward; - break; - } - case EPbStateSeekingBackward: - { - iconID = EMPXClvIconRewind; - break; - } - default: - { - // other playback states, not handled - break; - } + iconID = EMPXClvIconPause; + break; + } + case EPbStateSeekingForward: + { + iconID = EMPXClvIconForward; + break; + } + case EPbStateSeekingBackward: + { + iconID = EMPXClvIconRewind; + break; + } + default: + { + // other playback states, not handled + break; } } } - else - { - // Do nothing - } - + if ( iconID != EMPXClvIconNone ) { ptr.Append( KMPXTab ); diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/viewplugins/views/commoncontainer/inc/mpxcommoncontainerhgimp.h --- a/mpxplugins/viewplugins/views/commoncontainer/inc/mpxcommoncontainerhgimp.h Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/viewplugins/views/commoncontainer/inc/mpxcommoncontainerhgimp.h Mon Jun 21 15:37:19 2010 +0300 @@ -477,6 +477,11 @@ * @param aIndex Opened item index. */ void HandleOpenL( TInt aIndex ); + + /** + * Hides container list view + */ + void HideListView(); public: // from base class MThumbnailManagerObserver diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/viewplugins/views/commoncontainer/src/mpxcommoncontainerhgimp.cpp --- a/mpxplugins/viewplugins/views/commoncontainer/src/mpxcommoncontainerhgimp.cpp Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/viewplugins/views/commoncontainer/src/mpxcommoncontainerhgimp.cpp Mon Jun 21 15:37:19 2010 +0300 @@ -296,6 +296,17 @@ return iBottomIndex; } +// ----------------------------------------------------------------------------- +// Hides listbox +// ----------------------------------------------------------------------------- +// +void CMPXCommonContainerHgImp::HideListView() + { + if ( iListWidget ) + { + iListWidget->MakeVisible(EFalse); + } + } // ----------------------------------------------------------------------------- // Gets current listbox item index (relative to the original listbox). diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/viewplugins/views/inc/mpxcommoncontainer.h --- a/mpxplugins/viewplugins/views/inc/mpxcommoncontainer.h Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/viewplugins/views/inc/mpxcommoncontainer.h Mon Jun 21 15:37:19 2010 +0300 @@ -304,6 +304,11 @@ virtual void ConstructContainerL( TMPXCommonContainerCollectionType aCollectionType ) = 0; /** + * Hides container list view + */ + virtual void HideListView() = 0; + + /** * Enable/disable find box * * @since 3.1 diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/viewplugins/views/podcastview/data/mpxpodcastcollectionview.rss --- a/mpxplugins/viewplugins/views/podcastview/data/mpxpodcastcollectionview.rss Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/viewplugins/views/podcastview/data/mpxpodcastcollectionview.rss Mon Jun 21 15:37:19 2010 +0300 @@ -363,17 +363,7 @@ { buf = qtn_mp_title_my_podcast; } - - -// ----------------------------------------------------------------------------- -// r_mpx_qtn_nmp_unknown_title -// ----------------------------------------------------------------------------- -// -RESOURCE TBUF r_mpx_qtn_nmp_unknown_title - { - buf = qtn_mp_list_unknown; - } - + // --------------------------------------------------------------------------- // r_mpx_playback_collection_via_sub_menu // Collection view UPnP Play Via sub menu items. diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/viewplugins/views/podcastview/inc/mpxpodcastcollectionviewcontainer.h --- a/mpxplugins/viewplugins/views/podcastview/inc/mpxpodcastcollectionviewcontainer.h Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/viewplugins/views/podcastview/inc/mpxpodcastcollectionviewcontainer.h Mon Jun 21 15:37:19 2010 +0300 @@ -121,6 +121,11 @@ * @return Indicator icon indices */ RArray IndicatorsL( TInt aIndex ); + + /** + * Hides container controls. + */ + void HideContainerWindow(); private: diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/viewplugins/views/podcastview/inc/mpxpodcastcollectionviewimp.h --- a/mpxplugins/viewplugins/views/podcastview/inc/mpxpodcastcollectionviewimp.h Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/viewplugins/views/podcastview/inc/mpxpodcastcollectionviewimp.h Mon Jun 21 15:37:19 2010 +0300 @@ -681,6 +681,7 @@ #ifdef UPNP_INCLUDED CUpnpCopyCommand* iUpnpCopyCommand; #endif + TBool iGoToNowPlaying; }; #endif // C_CMPXPODCASTCOLLECTIONVIEWIMP_H diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/viewplugins/views/podcastview/loc/mpxpodcastcollectionview.loc --- a/mpxplugins/viewplugins/views/podcastview/loc/mpxpodcastcollectionview.loc Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/viewplugins/views/podcastview/loc/mpxpodcastcollectionview.loc Mon Jun 21 15:37:19 2010 +0300 @@ -152,7 +152,7 @@ // d:Collection details popup label. // d:Label for collection details popup. -// l:list_single_heading_pane_t1_cp2 +// l:list_single_heading_pane_t2_cp2 // r:5.0 // #define qtn_nmp_details_phone_memory "Phone Memory" @@ -199,12 +199,6 @@ // #define qtn_nmp_memory_unavailable "Unavailable" -// d:Unknown in listbox. -// l:list_single_graphic_pane_t1 -// r:5.0 -// -#define qtn_mp_list_unknown "Unknown" - // d:Text for wait note for deleting one item // l:popup_note_wait_window // r:5.0 diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/viewplugins/views/podcastview/src/mpxpodcastcollectionviewcontainer.cpp --- a/mpxplugins/viewplugins/views/podcastview/src/mpxpodcastcollectionviewcontainer.cpp Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/viewplugins/views/podcastview/src/mpxpodcastcollectionviewcontainer.cpp Mon Jun 21 15:37:19 2010 +0300 @@ -134,6 +134,18 @@ } // --------------------------------------------------------------------------- +// Hides container list box +// --------------------------------------------------------------------------- +// +void CMPXPodcastCollectionViewContainer::HideContainerWindow() + { + if ( iCommonContainer ) + { + iCommonContainer->HideListView(); + } + } + +// --------------------------------------------------------------------------- // Sets the current view to be used to determine the correct help context // --------------------------------------------------------------------------- // diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/viewplugins/views/podcastview/src/mpxpodcastcollectionviewimp.cpp --- a/mpxplugins/viewplugins/views/podcastview/src/mpxpodcastcollectionviewimp.cpp Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/viewplugins/views/podcastview/src/mpxpodcastcollectionviewimp.cpp Mon Jun 21 15:37:19 2010 +0300 @@ -125,6 +125,8 @@ // MACROS _LIT(KMPXCollDetailsItemsFormat, "%S\t%S"); +_LIT(KEmptyTitle, " "); + #ifdef __ENABLE_PODCAST_IN_MUSIC_MENU #define KMusicCollectionUid 0x101FFC3A #endif @@ -176,6 +178,7 @@ if (iViewUtility) { + iViewUtility->RemoveObserver( this ); iViewUtility->Close(); } @@ -489,6 +492,7 @@ // status of listbox items before the list box is updated in HandleOpen iHandleOpenProcessed = EFalse; iSelectedItem = KMPXInvalidItemId; + iGoToNowPlaying = EFalse; } // --------------------------------------------------------------------------- @@ -662,7 +666,7 @@ MPX_DEBUG2("CMPXPodcastCollectionViewImp::UpdateTitlePaneL Title is %S", iTitle); if (iTitle->Length() == 0) { - HBufC* titleText = StringLoader::LoadLC(R_MPX_QTN_NMP_UNKNOWN_TITLE); + HBufC* titleText = StringLoader::LoadLC(R_MPX_TITLE_UNKNOWN_PODCAST); title->SetTextL(*titleText); CleanupStack::PopAndDestroy(titleText); } @@ -3089,6 +3093,7 @@ } case EMPXCmdGoToNowPlaying: { + iGoToNowPlaying = ETrue; AppUi()->HandleCommandL( aCommand ); break; } @@ -3554,6 +3559,8 @@ iNumEpisode = NULL; TRAP_IGNORE(UpdateNaviPaneL()); } + // for Avkon calling Deactivate, not manually hiding controls, reset iGoToNowPlaying + iGoToNowPlaying = EFalse; } // --------------------------------------------------------------------------- @@ -3938,6 +3945,11 @@ CleanupStack::PushL(cpath); MPX_DEBUG_PATH(*cpath); + + // It is in episode list view and opens now playing view + if ( cpath->Levels() == 3 ) + iGoToNowPlaying = ETrue; + if (cpath->Levels() == (iLastDepth + 1)) { // navigated in one level @@ -4239,7 +4251,23 @@ if ( aCurrentViewType.iUid == KMPXPluginTypeCollectionUid ) { TRAP_IGNORE( UpdateNaviPaneL() ); - } + } + else if ( ( aCurrentViewType.iUid == KMPXPluginTypePlaybackUid ) && ( iGoToNowPlaying == EFalse ) ) + { + if ( iContainer ) + { + iContainer->HideContainerWindow(); + + // set title to blank to avoid title flickering + CAknTitlePane* title( static_cast + ( StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle )))); + if ( title ) + { + title->SetTextL(KEmptyTitle); + title->DrawNow(); + } + } + } } // ----------------------------------------------------------------------------- diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/viewplugins/views/waitnotedialog/inc/mpxscanningdialog.h --- a/mpxplugins/viewplugins/views/waitnotedialog/inc/mpxscanningdialog.h Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/viewplugins/views/waitnotedialog/inc/mpxscanningdialog.h Mon Jun 21 15:37:19 2010 +0300 @@ -126,6 +126,7 @@ CAsyncCallBack* iAsyncCallBack; //owned TAsyncEvent iAsyncEvent; TBool iCancelScan; + TBool iRefreshEnd; }; diff -r a12246c97fcc -r cb96c29156b2 mpxplugins/viewplugins/views/waitnotedialog/src/mpxscanningdialog.cpp --- a/mpxplugins/viewplugins/views/waitnotedialog/src/mpxscanningdialog.cpp Wed Jun 09 09:38:28 2010 +0300 +++ b/mpxplugins/viewplugins/views/waitnotedialog/src/mpxscanningdialog.cpp Mon Jun 21 15:37:19 2010 +0300 @@ -55,6 +55,7 @@ iInitialCount = 0; isCollectionDBChanged = EFalse; iAsyncEvent = ECmdIdle; + iRefreshEnd = EFalse; } @@ -183,11 +184,14 @@ iCancelScan = ETrue; } - // When stop refreshing library, prompt a process waiting dialog. - // Inform user to wait for the updating library. - HBufC* waitText = StringLoader::LoadLC( R_MPX_UPDATING_LIBRARY_TXT ); - DisplayProcessWaitDialogL( R_MPX_GENERIC_WAIT_NOTE, *waitText ); - CleanupStack::PopAndDestroy( waitText ); + if (!iRefreshEnd) + { + // When stop refreshing library, prompt a process waiting dialog. + // Inform user to wait for the updating library. + HBufC* waitText = StringLoader::LoadLC( R_MPX_UPDATING_LIBRARY_TXT ); + DisplayProcessWaitDialogL( R_MPX_GENERIC_WAIT_NOTE, *waitText ); + CleanupStack::PopAndDestroy( waitText ); + } } else if( iScanningError >= KErrNone ) { @@ -354,6 +358,7 @@ } if( op == EMcMsgRefreshStart ) { + iRefreshEnd = EFalse; isCollectionDBChanged = EFalse; MPX_DEBUG1("refreshStart store the initial count"); iInitialCount = songTotal; @@ -396,6 +401,7 @@ } }; + iRefreshEnd = ETrue; // If cancel was pressed, iWaitDialog is NULL // if( iWaitDialog )