diff -r 4cc1412daed0 -r 560ce2306a17 mpviewplugins/mpcollectionviewplugin/src/mpcollectionview.cpp --- a/mpviewplugins/mpcollectionviewplugin/src/mpcollectionview.cpp Fri Aug 06 16:51:36 2010 -0500 +++ b/mpviewplugins/mpcollectionviewplugin/src/mpcollectionview.cpp Tue Aug 24 03:36:14 2010 -0500 @@ -182,7 +182,7 @@ connect( mCollectionData, SIGNAL( contextChanged( TCollectionContext ) ), this, SLOT( setContext( TCollectionContext ) ), Qt::QueuedConnection ); - mCollectionDataModel = new MpCollectionDataModel( mCollectionData ); + mCollectionDataModel = new MpCollectionDataModel( mCollectionData , mMpEngine->playbackData()); connect( mCollectionDataModel, SIGNAL( dataReloaded() ), this, SLOT( containerDataChanged() ) ); @@ -293,21 +293,6 @@ } /*! - Sets the default collection - AllSongs - */ -void MpCollectionView::setDefaultView() -{ - TX_ENTRY - if ( mCollectionContext != ECollectionContextAllSongs ) { - // Open 'All Songs' by default - mMpEngine->openCollection( ECollectionContextAllSongs ); - } - - - TX_EXIT -} - -/*! Returns view activation status. */ bool MpCollectionView::isActivated() @@ -458,14 +443,24 @@ case ECollectionContextArtistAllSongs: case ECollectionContextPlaylistSongs: doOpen = false; - songUri = mCollectionData->itemData( index, MpMpxCollectionData::Uri ); - emit songSelected( songUri ); + if (!mCollectionData->hasItemProperty(index, MpMpxCollectionData::Corrupted)) { + songUri = mCollectionData->itemData( index, MpMpxCollectionData::Uri ); + emit songSelected( songUri ); + } + else { + showCorruptedNote(); + } break; case ECollectionContextArtistAlbumsTBone: case ECollectionContextAlbumsTBone: doOpen = false; - songUri = mCollectionData->albumSongData( index, MpMpxCollectionData::Uri ); - emit songSelected( songUri ); + if (!mCollectionData->hasAlbumSongProperty(index, MpMpxCollectionData::Corrupted)) { + songUri = mCollectionData->albumSongData( index, MpMpxCollectionData::Uri ); + emit songSelected( songUri ); + } + else { + showCorruptedNote(); + } break; default: break; @@ -489,8 +484,23 @@ mCollectionData->setContext( ECollectionContextAlbumsTBone ); } else { - // Real open. Forward it to the engine. - mMpEngine->openCollectionItem( index ); + switch ( mCollectionContext ) { + case ECollectionContextAllSongs: + case ECollectionContextArtistAllSongs: + case ECollectionContextPlaylistSongs: + if (!mCollectionData->hasItemProperty(index, MpMpxCollectionData::Corrupted)) { + mMpEngine->openCollectionItem( index ); + } + else { + showCorruptedNote(); + } + break; + case ECollectionContextArtists: + case ECollectionContextPlaylists: + mMpEngine->openCollectionItem( index ); + default: + break; + } } } TX_EXIT @@ -514,7 +524,12 @@ void MpCollectionView::playAlbumSongs( int albumIndex, int songIndex ) { TX_ENTRY_ARGS( "albumIndex=" << albumIndex << "songIndex=" << songIndex ); - mMpEngine->playAlbumSongs(albumIndex, songIndex); + if (!mCollectionData->hasAlbumSongProperty(songIndex, MpMpxCollectionData::Corrupted)) { + mMpEngine->playAlbumSongs(albumIndex, songIndex); + } + else { + showCorruptedNote(); + } TX_EXIT } @@ -620,6 +635,7 @@ */ void MpCollectionView::shufflePlayAll() { + TX_ENTRY mMpEngine->setShuffle( true ); MpSettingsManager::setShuffle( true ); int index = generateShuffleIndex(); @@ -632,6 +648,7 @@ openIndex( index ); break; } + TX_EXIT } /*! @@ -795,10 +812,16 @@ } else { closeActiveDialog(); - - //Update cache, even if collection is in background. - //Library refreshing could be triggered at any point due USB/MMC events. - mMpEngine->reopenCollection(); + + // Update cache, even if collection is in background. + // Library refreshing could be triggered at any point due USB/MMC events. + if ( mCollectionContext == ECollectionContextAllSongs ) { + mMpEngine->reopenCollection(); + } + // We force to go to the all songs collection when the refresh is finished. + else{ + openSongs(); + } } TX_EXIT } @@ -1176,11 +1199,9 @@ bool ok = false; if ( visible ) { mDocumentLoader->load( MUSIC_COLLECTION_DOCML, "showBanner", &ok ); - mNowPlayingBanner->show(); } else { mDocumentLoader->load( MUSIC_COLLECTION_DOCML, "hideBanner", &ok ); - mNowPlayingBanner->hide(); } if ( !ok ) { @@ -1191,27 +1212,54 @@ /*! \internal - Generates a random index for shuffle all. + Generates a random index for shuffle all. In case of All Songs, due to incremental open + delay, the chosen index may not be available yet. In such case, narrow down the upper limit + and regenerate until a valid index is found. */ int MpCollectionView::generateShuffleIndex() { int low = 0; int high = 0; + bool tbone; switch ( mCollectionContext ) { case ECollectionContextArtistAlbumsTBone: case ECollectionContextAlbumsTBone: + tbone = true; high = mCollectionData->albumSongsCount(); break; default: + tbone = false; high = mCollectionData->count(); break; } + bool validIndex = false; + int index = 0; + int songId; time_t seconds; - time( &seconds ); - srand( ( unsigned int ) seconds ); + while ( !validIndex ) { + time( &seconds ); + srand( ( unsigned int ) seconds ); + index = rand() % ( high - low + 1 ) + low; + + if ( tbone ) { + songId = mCollectionData->albumSongId(index); + } + else { + songId = mCollectionData->itemId(index); + } - int index = rand() % ( high - low + 1 ) + low; + if ( songId != -1 ) { + // Got a valid index; exit the loop. + validIndex = true; + } + else { + // Invalid index; re-select an index, but narrow down the + // upper range to increase the change of hitting a valid index. + high = index; + } + TX_LOG_ARGS( "index=" << index << "valid=" << validIndex ); + } return index; } @@ -1279,3 +1327,16 @@ menu()->close(); } +/*! + \internal + Shows Corrupted Note in collection view + */ +void MpCollectionView::showCorruptedNote() +{ + TX_ENTRY + HbMessageBox *messageBox = new HbMessageBox( hbTrId( "txt_mus_info_file_is_corrupt" ), HbMessageBox::MessageTypeInformation ); + messageBox->setAttribute( Qt::WA_DeleteOnClose ); + messageBox->setIcon( HbIcon( QString("qtg_small_fail") ) ); + messageBox->show(); + TX_EXIT +}