# HG changeset patch # User teknolog # Date 1277118243 -3600 # Node ID 17da6d3a5a4bb25846656b5f24d08fcc8da9fbac # Parent b4be6bc78573896998320228ccdc9206ae68e7a2 Merge of fix for bug 2737 from Symbian1 branch diff -r b4be6bc78573 -r 17da6d3a5a4b application/data/PodcastClient_english.rls --- a/application/data/PodcastClient_english.rls Thu Jun 03 16:44:35 2010 +0100 +++ b/application/data/PodcastClient_english.rls Mon Jun 21 12:04:03 2010 +0100 @@ -143,6 +143,8 @@ rls_string STRING_r_view_remove_all_downloads_cmd "Clear download queue" rls_string STRING_r_clear_query "Clear download queue?" rls_string STRING_r_view_remove_download_short_cmd "Remove" +rls_string STRING_r_view_move_up_short_cmd "Move up" +rls_string STRING_r_view_move_down_short_cmd "Move down" rls_string STRING_r_view_remove_download_cmd "Remove download" rls_string STRING_r_error_notfound "Error: Not found on server" diff -r b4be6bc78573 -r 17da6d3a5a4b application/data/PodcastQueueView.ra --- a/application/data/PodcastQueueView.ra Thu Jun 03 16:44:35 2010 +0100 +++ b/application/data/PodcastQueueView.ra Mon Jun 21 12:04:03 2010 +0100 @@ -124,6 +124,16 @@ { txt = STRING_r_view_remove_download_short_cmd; command = EPodcastRemoveDownload; + }, + STYLUS_POPUP_MENU_ITEM + { + txt = STRING_r_view_move_up_short_cmd; + command = EPodcastMoveDownloadUp; + }, + STYLUS_POPUP_MENU_ITEM + { + txt = STRING_r_view_move_down_short_cmd; + command = EPodcastMoveDownloadDown; } }; } diff -r b4be6bc78573 -r 17da6d3a5a4b application/inc/Podcast.hrh --- a/application/inc/Podcast.hrh Thu Jun 03 16:44:35 2010 +0100 +++ b/application/inc/Podcast.hrh Mon Jun 21 12:04:03 2010 +0100 @@ -44,6 +44,8 @@ EPodcastDownloadShow, EPodcastDeleteShow, EPodcastRemoveDownload, + EPodcastMoveDownloadUp, + EPodcastMoveDownloadDown, EPodcastRemoveAllDownloads, EPodcastSuspendDownloads, EPodcastResumeDownloads, diff -r b4be6bc78573 -r 17da6d3a5a4b application/inc/PodcastQueueView.h --- a/application/inc/PodcastQueueView.h Thu Jun 03 16:44:35 2010 +0100 +++ b/application/inc/PodcastQueueView.h Mon Jun 21 12:04:03 2010 +0100 @@ -78,6 +78,8 @@ void HandleCommandL(TInt aCommand); TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType); void DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane); + + virtual void HandleLongTapEventL( const TPoint& aPenEventLocation, const TPoint& aPenEventScreenLocation); }; #endif diff -r b4be6bc78573 -r 17da6d3a5a4b application/inc/PodcastShowsView.h --- a/application/inc/PodcastShowsView.h Thu Jun 03 16:44:35 2010 +0100 +++ b/application/inc/PodcastShowsView.h Mon Jun 21 12:04:03 2010 +0100 @@ -96,7 +96,7 @@ void DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane); void FormatShowInfoListBoxItemL(CShowInfo& aShowInfo, TInt aSizeDownloaded = 0); - void HandleLongTapEventL( const TPoint& aPenEventLocation, const TPoint& aPenEventScreenLocation); + virtual void HandleLongTapEventL( const TPoint& aPenEventLocation, const TPoint& aPenEventScreenLocation); void GetShowIcons(CShowInfo* aShowInfo, TInt& aIconIndex); void CreateIconsL(); diff -r b4be6bc78573 -r 17da6d3a5a4b application/src/PodcastQueueView.cpp --- a/application/src/PodcastQueueView.cpp Thu Jun 03 16:44:35 2010 +0100 +++ b/application/src/PodcastQueueView.cpp Mon Jun 21 12:04:03 2010 +0100 @@ -255,6 +255,52 @@ } } break; + case EPodcastMoveDownloadUp: + { + TInt index = iListContainer->Listbox()->CurrentItemIndex(); + TBool resumeAfterMove = EFalse; + if (index == 1 && !iPodcastModel.SettingsEngine().DownloadSuspended()) + { + iPodcastModel.ShowEngine().SuspendDownloads(); + resumeAfterMove = ETrue; + } + + if (index >= 0 && index < iPodcastModel.ActiveShowList().Count()) + { + TRAP_IGNORE(iPodcastModel.ShowEngine().MoveDownloadUpL(iPodcastModel.ActiveShowList()[index]->Uid())); + } + + if(resumeAfterMove) + { + iPodcastModel.ShowEngine().ResumeDownloadsL(); + } + + UpdateListboxItemsL(); + } + break; + case EPodcastMoveDownloadDown: + { + TInt index = iListContainer->Listbox()->CurrentItemIndex(); + TBool resumeAfterMove = EFalse; + if (index == 0 && !iPodcastModel.SettingsEngine().DownloadSuspended()) + { + iPodcastModel.ShowEngine().SuspendDownloads(); + resumeAfterMove = ETrue; + } + + if (index >= 0 && index < iPodcastModel.ActiveShowList().Count()) + { + TRAP_IGNORE(iPodcastModel.ShowEngine().MoveDownloadDownL(iPodcastModel.ActiveShowList()[index]->Uid())); + } + + if(resumeAfterMove) + { + iPodcastModel.ShowEngine().ResumeDownloadsL(); + } + + UpdateListboxItemsL(); + } + break; case EPodcastSuspendDownloads: { iPodcastModel.ShowEngine().SuspendDownloads(); @@ -300,3 +346,29 @@ toolbar->SetItemDimmed(EPodcastRemoveDownload, itemCnt == 0, ETrue); } } + +void CPodcastQueueView::HandleLongTapEventL( const TPoint& aPenEventLocation, const TPoint& /* aPenEventScreenLocation */) +{ + DP("CPodcastQueueView::HandleLongTapEventL BEGIN"); + iListContainer->SetLongTapDetectedL(ETrue); + + const TInt KListboxDefaultHeight = 19; // for some reason it returns 19 for an empty listbox in S^1 + TInt lbHeight = iListContainer->Listbox()->CalcHeightBasedOnNumOfItems( + iListContainer->Listbox()->Model()->NumberOfItems()) - KListboxDefaultHeight; + + if(iStylusPopupMenu && aPenEventLocation.iY < lbHeight) + { + TBool dimDown = (iListContainer->Listbox()->CurrentItemIndex() >= iPodcastModel.ActiveShowList().Count() - 1 ? + ETrue : EFalse); + TBool dimUp = (iListContainer->Listbox()->CurrentItemIndex() <= 0 ? + ETrue : EFalse); + + iStylusPopupMenu->SetItemDimmed(EPodcastMoveDownloadDown, dimDown); + iStylusPopupMenu->SetItemDimmed(EPodcastMoveDownloadUp, dimUp); + + iStylusPopupMenu->ShowMenu(); + iStylusPopupMenu->SetPosition(aPenEventLocation); + } + + DP("CPodcastQueueView::HandleLongTapEventL END"); +} diff -r b4be6bc78573 -r 17da6d3a5a4b engine/BWINS/podcastengineu.def --- a/engine/BWINS/podcastengineu.def Thu Jun 03 16:44:35 2010 +0100 +++ b/engine/BWINS/podcastengineu.def Mon Jun 21 12:04:03 2010 +0100 @@ -163,4 +163,6 @@ ?DropDB@CPodcastModel@@QAEXXZ @ 162 NONAME ; void CPodcastModel::DropDB(void) ?CheckForDeletedShows@CShowEngine@@QAEXI@Z @ 163 NONAME ; void CShowEngine::CheckForDeletedShows(unsigned int) ?IsVideoShow@PodcastUtils@@SAHAAVTDesC16@@@Z @ 164 NONAME ; int PodcastUtils::IsVideoShow(class TDesC16 &) + ?MoveDownloadUpL@CShowEngine@@QAEXI@Z @ 165 NONAME ; void CShowEngine::MoveDownloadUpL(unsigned int) + ?MoveDownloadDownL@CShowEngine@@QAEXI@Z @ 166 NONAME ; void CShowEngine::MoveDownloadDownL(unsigned int) diff -r b4be6bc78573 -r 17da6d3a5a4b engine/eabi/podcastengineu.def --- a/engine/eabi/podcastengineu.def Thu Jun 03 16:44:35 2010 +0100 +++ b/engine/eabi/podcastengineu.def Mon Jun 21 12:04:03 2010 +0100 @@ -199,4 +199,6 @@ _ZTV9CShowInfo @ 198 NONAME _ZN11CShowEngine20CheckForDeletedShowsEj @ 199 NONAME _ZN12PodcastUtils11IsVideoShowER7TDesC16 @ 200 NONAME + _ZN11CShowEngine15MoveDownloadUpLEj @ 201 NONAME + _ZN11CShowEngine17MoveDownloadDownLEj @ 202 NONAME diff -r b4be6bc78573 -r 17da6d3a5a4b engine/inc/ShowEngine.h --- a/engine/inc/ShowEngine.h Thu Jun 03 16:44:35 2010 +0100 +++ b/engine/inc/ShowEngine.h Mon Jun 21 12:04:03 2010 +0100 @@ -31,6 +31,12 @@ #include "mpxcollectionhelper.h" #include "mpxcollectionhelperobserver.h" +struct TDownload + { + TUint iIndex; + TUint iUid; + }; + class CShowEngine : public CBase, public MHttpClientObserver, public MMetaDataReaderObserver, public MMPXCollectionHelperObserver { @@ -75,6 +81,8 @@ IMPORT_C void CheckForDeletedShows(TUint aFeedUid); IMPORT_C CMetaDataReader& MetaDataReader(); + IMPORT_C void MoveDownloadUpL(TUint aUid); + IMPORT_C void MoveDownloadDownL(TUint aUid); private: // from HttpClientObserver, dont have to be public @@ -127,6 +135,7 @@ TUint DBGetDownloadsCountL(); void DBAddDownloadL(TUint aUid); CShowInfo* DBGetNextDownloadL(); + void DBSwapDownloadsL(TDownload aFirstDL, TDownload aSecondDL); private: CHttpClient* iShowClient; diff -r b4be6bc78573 -r 17da6d3a5a4b engine/src/ShowEngine.cpp --- a/engine/src/ShowEngine.cpp Thu Jun 03 16:44:35 2010 +0100 +++ b/engine/src/ShowEngine.cpp Mon Jun 21 12:04:03 2010 +0100 @@ -1020,6 +1020,52 @@ } } +void CShowEngine::DBSwapDownloadsL(TDownload aFirstDL, TDownload aSecondDL) + { + DP("CShowEngine::DBSwapDownloadsL"); + _LIT(KSqlStatement, "update downloads set uid=%u where dl_index=%d"); + + iSqlBuffer.Format(KSqlStatement, aFirstDL.iUid, aSecondDL.iIndex); + sqlite3_stmt *st; + int rc = sqlite3_prepare16_v2(&iDB, (const void*) iSqlBuffer.PtrZ(), -1, + &st, (const void**) NULL); + + if (rc == SQLITE_OK) + { + Cleanup_sqlite3_finalize_PushL(st); + rc = sqlite3_step(st); + if (rc != SQLITE_DONE) + { + User::Leave(KErrUnknown); + } + CleanupStack::PopAndDestroy(); // st + } + else + { + User::Leave(KErrCorrupt); + } + + iSqlBuffer.Format(KSqlStatement, aSecondDL.iUid, aFirstDL.iIndex); + + rc = sqlite3_prepare16_v2(&iDB, (const void*) iSqlBuffer.PtrZ(), -1, + &st, (const void**) NULL); + + if (rc == SQLITE_OK) + { + Cleanup_sqlite3_finalize_PushL(st); + rc = sqlite3_step(st); + if (rc != SQLITE_DONE) + { + User::Leave(KErrUnknown); + } + CleanupStack::PopAndDestroy(); // st + } + else + { + User::Leave(KErrCorrupt); + } + } + EXPORT_C CShowInfo* CShowEngine::GetNextShowByTrackL(CShowInfo* aShowInfo) { CShowInfo* nextShow = NULL; @@ -1382,3 +1428,128 @@ } } +EXPORT_C void CShowEngine::MoveDownloadUpL(TUint aUid) + { + DP("CShowEngine::MoveDownLoadUpL"); + _LIT(KSqlStatement, "select * from downloads"); + iSqlBuffer.Format(KSqlStatement); + + sqlite3_stmt *st; + + int rc = sqlite3_prepare16_v2(&iDB, (const void*) iSqlBuffer.PtrZ(), -1, + &st, (const void**) NULL); + + if (rc == SQLITE_OK) + { + RArray downloads; + CleanupClosePushL(downloads); + + rc = sqlite3_step(st); + Cleanup_sqlite3_finalize_PushL(st); + + TInt selectedIdx = -1; + while (rc == SQLITE_ROW && selectedIdx == -1) + { + TDownload download; + + download.iIndex = sqlite3_column_int(st, 0); + download.iUid = sqlite3_column_int(st, 1); + + downloads.Append(download); + + if (download.iUid == aUid) + { + selectedIdx = downloads.Count()-1; + } + + rc = sqlite3_step(st); + } + CleanupStack::PopAndDestroy();//st, downloads + + // If the selected download was found in the database + if (selectedIdx != -1) + { + // Swap the specified download with the one above it + TDownload selectedDownload = downloads[selectedIdx]; + TDownload previousDownload = downloads[selectedIdx - 1]; + + // SQL - Update index (with index of selected download) where uid is of previous download + // and update index (with index of previous download) where uid if of selected download + DBSwapDownloadsL(selectedDownload, previousDownload); + } + else + { + User::Leave(KErrNotFound); + } + + CleanupStack::PopAndDestroy(); // downloads + } + else + { + User::Leave(KErrCorrupt); + } + } + +EXPORT_C void CShowEngine::MoveDownloadDownL(TUint aUid) + { + DP("CShowEngine::MoveDownLoadDownL"); + + // An upside-down list will result in the download moving down + _LIT(KSqlStatement, "select * from downloads order by dl_index desc"); + iSqlBuffer.Format(KSqlStatement); + + sqlite3_stmt *st; + + int rc = sqlite3_prepare16_v2(&iDB, (const void*) iSqlBuffer.PtrZ(), -1, + &st, (const void**) NULL); + + if (rc == SQLITE_OK) + { + RArray downloads; + CleanupClosePushL(downloads); + + rc = sqlite3_step(st); + Cleanup_sqlite3_finalize_PushL(st); + + TInt selectedIdx = -1; + while (rc == SQLITE_ROW && selectedIdx == -1) + { + TDownload download; + + download.iIndex = sqlite3_column_int(st, 0); + download.iUid = sqlite3_column_int(st, 1); + + downloads.Append(download); + + if (download.iUid == aUid) + { + selectedIdx = downloads.Count()-1; + } + + rc = sqlite3_step(st); + } + CleanupStack::PopAndDestroy();//st, downloads + + // If the selected download was found in the database + if (selectedIdx != -1) + { + // Swap the specified download with the one above it + TDownload selectedDownload = downloads[selectedIdx]; + TDownload previousDownload = downloads[selectedIdx - 1]; + + // SQL - Update index (with index of selected download) where uid is of previous download + // and update index (with index of previous download) where uid if of selected download + DBSwapDownloadsL(selectedDownload, previousDownload); + } + else + { + User::Leave(KErrNotFound); + } + + CleanupStack::PopAndDestroy(); // downloads + } + else + { + User::Leave(KErrCorrupt); + } + } \ No newline at end of file