--- 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"
--- 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;
}
};
}
--- 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,
--- 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
--- 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();
--- 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");
+}
--- 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)
--- 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
--- 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;
--- 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<TDownload> 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<TDownload> 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