diff -r 5f8e5adbbed9 -r 29cda98b007e application/src/PodcastQueueView.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/application/src/PodcastQueueView.cpp Thu Feb 25 14:29:19 2010 +0000 @@ -0,0 +1,598 @@ +/* +* Copyright (c) 2007-2010 Sebastian Brannstrom, Lars Persson, EmbedDev AB +* +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* EmbedDev AB - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include "PodcastQueueView.h" +#include "PodcastAppUi.h" +#include "ShowEngine.h" +#include "SettingsEngine.h" +#include "PodcastApp.h" +#include "Constants.h" +#include "imagehandler.h" +#include "PodcastShowsView.h" + +#include +#include +#include +#include +#include +#include +#include +#include "Podcast.hrh" + +#define KMaxMessageLength 200 + +#define KPodcastImageWidth 160 +#define KPodcastImageHeight 120 +#define KPodcastDialogOffset 2 + +#define KOneHundredPercent 100 + +const TInt KSizeBufLen = 64; +const TInt KDefaultGran = 5; +_LIT(KSizeDownloadingOf, "%.1f/%.1f MB"); +_LIT(KShowsSizeFormatS60, "%.1f MB"); + +_LIT(KShowFormat, "%d\t%S\t%S %S\t"); +_LIT(KShowErrorFormat, "%d\t%S\t%S\t"); +_LIT(KShowQueueFormat, "%d\t%S\t%S%S\t"); + + +// these must correspond with TShowsIconIndex + +const TUint KShowIconArrayIds[] = + { + EMbmPodcastAudio, + EMbmPodcastAudio_mask, + EMbmPodcastAudio_new, + EMbmPodcastAudio_new_mask, + EMbmPodcastAudio_queued, + EMbmPodcastAudio_queued_mask, + EMbmPodcastAudio_downloading, + EMbmPodcastAudio_downloading_mask, + EMbmPodcastAudio_downloaded, + EMbmPodcastAudio_downloaded_mask, + EMbmPodcastAudio_downloaded_new, + EMbmPodcastAudio_downloaded_new_mask, + EMbmPodcastAudio_failed, + EMbmPodcastAudio_failed_mask, + EMbmPodcastAudio_suspended, + EMbmPodcastAudio_suspended_mask, + 0, + 0 + }; + +CPodcastQueueView* CPodcastQueueView::NewL(CPodcastModel& aPodcastModel) + { + CPodcastQueueView* self = CPodcastQueueView::NewLC(aPodcastModel); + CleanupStack::Pop(self); + return self; + } + +CPodcastQueueView* CPodcastQueueView::NewLC(CPodcastModel& aPodcastModel) + { + CPodcastQueueView* self = new ( ELeave ) CPodcastQueueView(aPodcastModel); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CPodcastQueueView::CPodcastQueueView(CPodcastModel& aPodcastModel) : + iPodcastModel(aPodcastModel) + { + } + +void CPodcastQueueView::ConstructL() + { + BaseConstructL(R_PODCAST_QUEUEVIEW); + CPodcastListView::ConstructL(); + CArrayPtr< CGulIcon>* icons = new(ELeave) CArrayPtrFlat< CGulIcon>(1); + CleanupStack::PushL(icons); + TInt pos = 0; + while (KShowIconArrayIds[pos] > 0) + { + // Load the bitmap for play icon + CFbsBitmap* bitmap= NULL;//iEikonEnv->CreateBitmapL( _L("*"), KIconArrayIds[pos]); + CFbsBitmap* mask= NULL;////iEikonEnv->CreateBitmapL( _L("*"), KIconArrayIds[pos+1] ); + AknIconUtils::CreateIconL(bitmap, + mask, + iEikonEnv->EikAppUi()->Application()->BitmapStoreName(), + KShowIconArrayIds[pos], + KShowIconArrayIds[pos+1]); + CleanupStack::PushL(bitmap); + // Load the mask for play icon + CleanupStack::PushL(mask); + // Append the play icon to icon array + icons->AppendL(CGulIcon::NewL(bitmap, mask) ); + CleanupStack::Pop(2); // bitmap, mask + pos+=2; + } + iListContainer->Listbox()->ItemDrawer()->FormattedCellData()->SetIconArrayL(icons); + CleanupStack::Pop(icons); // icons + iListContainer->Listbox()->SetListBoxObserver(this); + + iPodcastModel.FeedEngine().AddObserver(this); + iPodcastModel.ShowEngine().AddObserver(this); + + iStylusPopupMenu = CAknStylusPopUpMenu::NewL( this , TPoint(0,0)); + TResourceReader reader; + iCoeEnv->CreateResourceReaderLC(reader,R_QUEUEVIEW_POPUP_MENU); + iStylusPopupMenu->ConstructFromResourceL(reader); + CleanupStack::PopAndDestroy(); + SetEmptyTextL(R_PODCAST_EMPTY_QUEUE); + } + +TKeyResponse CPodcastQueueView::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType) + { + if (aType == EEventKey) + { + CShowInfo *activeShow = NULL; + + TInt index = iListContainer->Listbox()->CurrentItemIndex(); + if(index >= 0 && index < iPodcastModel.ActiveShowList().Count()) + { + activeShow = iPodcastModel.ActiveShowList()[index]; + } + + if (activeShow != NULL) { + DP1("aKeyEvent.iCode=%d", aKeyEvent.iCode); + switch (aKeyEvent.iCode) { + case 117: + case '*': + case EKeySpace: + if (activeShow->PlayState() == EPlayed) { + HandleCommandL(EPodcastMarkAsUnplayed); + } else { + HandleCommandL(EPodcastMarkAsPlayed); + } + break; + case 106: + case '#': + if (activeShow->DownloadState() == ENotDownloaded) { + HandleCommandL(EPodcastDownloadShow); + } + break; + case EKeyBackspace: + case EKeyDelete: + HandleCommandL(EPodcastRemoveDownload); + break; + default: + break; + } + UpdateToolbar(); + } + } + return CPodcastListView::OfferKeyEventL(aKeyEvent, aType); + } + +CPodcastQueueView::~CPodcastQueueView() + { + iPodcastModel.ShowEngine().RemoveObserver(this); + iPodcastModel.FeedEngine().RemoveObserver(this); + + if(iStylusPopupMenu) + delete iStylusPopupMenu, iStylusPopupMenu = NULL; + } + + +TUid CPodcastQueueView::Id() const + { + return KUidPodcastQueueViewID; + } + +void CPodcastQueueView::DoActivateL(const TVwsViewId& aPrevViewId, + TUid aCustomMessageId, const TDesC8& aCustomMessage) + { + DP("CPodcastQueueView::DoActivateL BEGIN"); + + CPodcastListView::DoActivateL(aPrevViewId, aCustomMessageId, aCustomMessage); + iPreviousView = TVwsViewId(KUidPodcast, KUidPodcastFeedViewID); + + UpdateFeedUpdateStateL(); + UpdateToolbar(); + DP("CPodcastQueueView::DoActivateL END"); + } + +void CPodcastQueueView::DoDeactivate() + { + CPodcastListView::DoDeactivate(); + } + +// Engine callback when new shows are available +void CPodcastQueueView::ShowListUpdatedL() + { + UpdateListboxItemsL(); + } + +void CPodcastQueueView::ShowDownloadUpdatedL(TInt aBytesOfCurrentDownload, TInt /*aBytesTotal*/) + { + if (!iListContainer->IsVisible()) + { + return; + } + + CShowInfo *info = iPodcastModel.ShowEngine().ShowDownloading(); + if (info) + { + UpdateShowItemL(info->Uid(), aBytesOfCurrentDownload); + } + } + +void CPodcastQueueView::ShowDownloadFinishedL(TUint /*aShowUid*/, TInt aError) + { + iProgressAdded = EFalse; + + iPodcastModel.GetShowsDownloading(); + UpdateListboxItemsL(); + UpdateToolbar(); + + switch(aError) + { + case KErrCouldNotConnect: + { + TBuf message; + iEikonEnv->ReadResourceL(message, R_PODCAST_CONNECTION_ERROR); + ShowErrorMessage(message); + } + break; + default: // Do nothing + break; + } + } + + +void CPodcastQueueView::FeedDownloadStartedL(TFeedState /*aState*/, TUint aFeedUid) + { + // TODO make use of the fact that we know that the feed download is + // started instead of checking feed engine states in UpdateFeedUpdateStateL. + if (iPodcastModel.ActiveFeedInfo() != NULL + && iPodcastModel.ActiveFeedInfo()->Uid() == aFeedUid) + { + TRAP_IGNORE(UpdateFeedUpdateStateL()); + UpdateToolbar(); + } + } + +void CPodcastQueueView::FeedDownloadFinishedL(TFeedState /*aState*/, TUint aFeedUid, TInt /*aError*/) + { + DP("CPodcastQueueView::FeedDownloadFinishedL BEGIN"); + // TODO make use of the fact that we know that the feed download is + // finished instead of checking feed engine states in UpdateFeedUpdateStateL. + if (iPodcastModel.ActiveFeedInfo() != NULL + && iPodcastModel.ActiveFeedInfo()->Uid() == aFeedUid) + { + TRAP_IGNORE(UpdateFeedUpdateStateL()); + } + DP("CPodcastQueueView::FeedDownloadFinishedL END"); + } + +void CPodcastQueueView::HandleListBoxEventL(CEikListBox* /*aListBox*/, + TListBoxEvent aEventType) + { + switch (aEventType) + { + case EEventEnterKeyPressed: + case EEventItemActioned: + case EEventItemDoubleClicked: + break; + default: + break; + } + UpdateToolbar(); + } + +void CPodcastQueueView::GetShowIcons(CShowInfo* aShowInfo, TInt& aIconIndex) + { + TBool dlStop = iPodcastModel.SettingsEngine().DownloadSuspended(); + TUint showDownloadingUid = iPodcastModel.ShowEngine().ShowDownloading() ? iPodcastModel.ShowEngine().ShowDownloading()->Uid() : 0; + + if (showDownloadingUid == aShowInfo->Uid()) + { + aIconIndex = dlStop ? ESuspendedShowIcon : EDownloadingShowIcon; + } + else + { + switch (aShowInfo->DownloadState()) + { + case EQueued: + aIconIndex = dlStop ? ESuspendedShowIcon : EQuedShowIcon; + break; + case EDownloading: + aIconIndex = dlStop ? ESuspendedShowIcon : EDownloadingShowIcon; + break; + case EFailedDownload: + aIconIndex = EFailedShowIcon; + break; + default: + DP("Wrong download state for queue view!"); + break; + } + } + } + +void CPodcastQueueView::UpdateFeedUpdateStateL() + { + TBool listboxDimmed = EFalse; + + if (iPodcastModel.FeedEngine().ClientState() != EIdle && iPodcastModel.ActiveFeedInfo() + != NULL && iPodcastModel.FeedEngine().ActiveClientUid() == iPodcastModel.ActiveFeedInfo()->Uid()) + { + listboxDimmed = ETrue; + } + + if ((iListContainer->Listbox()->IsDimmed() && !listboxDimmed) || (!iListContainer->Listbox()->IsDimmed() && listboxDimmed)) + { + iListContainer->Listbox()->SetDimmed(listboxDimmed); + } + UpdateListboxItemsL(); + UpdateToolbar(); + } + +void CPodcastQueueView::FormatShowInfoListBoxItemL(CShowInfo& aShowInfo, TInt aSizeDownloaded) + { + TBuf<32> infoSize; + TInt iconIndex = 0; + TBuf showDate; + GetShowIcons(&aShowInfo, iconIndex); + + if(aSizeDownloaded > 0) + { + if (aShowInfo.ShowSize() > 0) + { + infoSize.Format(KSizeDownloadingOf(), ((float) aSizeDownloaded / (float) KSizeMb), + ((float)aShowInfo.ShowSize() / (float)KSizeMb)); + } + else + { + infoSize.Format(KShowsSizeFormatS60(), (float)aSizeDownloaded / (float)KSizeMb); + } + } + else if (aShowInfo.ShowSize() > 0) + { + infoSize.Format(KShowsSizeFormatS60(), (float)aShowInfo.ShowSize() / (float)KSizeMb); + } + else { + infoSize = KNullDesC(); + } + + if (aShowInfo.PubDate().Int64() == 0) + { + showDate = KNullDesC(); + } + else + { + aShowInfo.PubDate().FormatL(showDate, KDateFormatShort()); + } + + if(aShowInfo.LastError() != KErrNone) + { + TBuf errorBuffer; + iEikonEnv->GetErrorText(errorBuffer, aShowInfo.LastError()); + iListboxFormatbuffer.Format(KShowErrorFormat(), iconIndex, &aShowInfo.Title(), &errorBuffer); + } + else + { + if (infoSize.Length() > 0) { + infoSize.Insert(0,_L(", ")); + } + + iListboxFormatbuffer.Format(KShowQueueFormat(), iconIndex, &aShowInfo.Title(), &showDate, &infoSize); + } + } + +void CPodcastQueueView::UpdateShowItemDataL(CShowInfo* aShowInfo,TInt aIndex, TInt aSizeDownloaded) +{ + FormatShowInfoListBoxItemL(*aShowInfo, aSizeDownloaded); + iItemArray->Delete(aIndex); + if(aIndex>= iItemArray->MdcaCount()) + { + iItemArray->AppendL(iListboxFormatbuffer); + } + else + { + iItemArray->InsertL(aIndex, iListboxFormatbuffer); + } +} + +void CPodcastQueueView::UpdateShowItemL(TUint aUid, TInt aSizeDownloaded) +{ + RShowInfoArray& array = iPodcastModel.ActiveShowList(); + + for (int i=0;iUid() == aUid) { + UpdateShowItemDataL(array[i], i, aSizeDownloaded); + if (iListContainer->Listbox()->TopItemIndex() <= i && + iListContainer->Listbox()->BottomItemIndex() >= i) { + iListContainer->Listbox()->DrawItem(i); + } + } + } +} + +void CPodcastQueueView::UpdateListboxItemsL() + { + if (iListContainer->IsVisible()) + { + TListItemProperties itemProps; + TInt len = 0; + + iPodcastModel.GetShowsDownloading(); + + RShowInfoArray &fItems = iPodcastModel.ActiveShowList(); + len = fItems.Count(); + + if (iListContainer->Listbox() != NULL) + { + TBool allUidsMatch = EFalse; + + if (len == iListContainer->Listbox()->Model()->NumberOfItems()) + { + allUidsMatch = ETrue; + TUint itemId = 0; + for (TInt loop = 0; loop< len; loop++) + { + itemId = iItemIdArray[loop]; + if (fItems[loop]->Uid() != itemId) + { + allUidsMatch = EFalse; + break; + } + } + } + + if (allUidsMatch && len > 0) + { + for (TInt loop = 0; loop< len; loop++) + { + UpdateShowItemDataL(fItems[loop], loop); + iListContainer->Listbox()->DrawItem(loop); + } + } + else + { + iListContainer->Listbox()->ItemDrawer()->ClearAllPropertiesL(); + iListContainer->Listbox()->Reset(); + iItemIdArray.Reset(); + iItemArray->Reset(); + + if (len > 0) + { + for (TInt i=0; iUid()); + iItemArray->AppendL(iListboxFormatbuffer); + } + } + else + { + iItemArray->Reset(); + iItemIdArray.Reset(); + + itemProps.SetDimmed(ETrue); + itemProps.SetHiddenSelection(ETrue); + } + iListContainer->Listbox()->HandleItemAdditionL(); + } + } + } + } + +/** + * Command handling function intended for overriding by sub classes. + * Default implementation is empty. + * @param aCommand ID of the command to respond to. + */ +void CPodcastQueueView::HandleCommandL(TInt aCommand) + { + switch (aCommand) + { + case EPodcastRemoveAllDownloads: + { + TBuf msg; + iEikonEnv->ReadResourceL(msg, R_CLEAR_QUERY); + + if(ShowQueryMessage(msg)) + { + iPodcastModel.ShowEngine().RemoveAllDownloads(); + UpdateListboxItemsL(); + } + } + break; + case EPodcastRemoveDownload: + { + TInt index = iListContainer->Listbox()->CurrentItemIndex(); + if (index >= 0 && index < iPodcastModel.ActiveShowList().Count()) + { + if (iPodcastModel.ShowEngine().RemoveDownloadL(iPodcastModel.ActiveShowList()[index]->Uid())) + { + iItemArray->Delete(index); + iItemIdArray.Remove(index); + iListContainer->Listbox()->HandleItemRemovalL(); + iListContainer->Listbox()->SetCurrentItemIndex(index - 1 > 0 ? index - 1 : 0); + iListContainer->Listbox()->DrawNow(); + + delete iPodcastModel.ActiveShowList()[index]; + iPodcastModel.ActiveShowList().Remove(index); + } + } + } + break; + case EPodcastSuspendDownloads: + { + iPodcastModel.ShowEngine().SuspendDownloads(); + UpdateListboxItemsL(); + } + break; + case EPodcastResumeDownloads: + { + iPodcastModel.ShowEngine().ResumeDownloadsL(); + UpdateListboxItemsL(); + } + break; + default: + CPodcastListView::HandleCommandL(aCommand); + break; + } + UpdateToolbar(); + } + +void CPodcastQueueView::DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane) +{ + if(aResourceId == R_PODCAST_SHOWSVIEW_MENU) + { + aMenuPane->SetItemDimmed(EPodcastMarkAllPlayed, ETrue); + } +} + +void CPodcastQueueView::UpdateToolbar() +{ + CAknToolbar* toolbar = Toolbar(); + + RShowInfoArray &fItems = iPodcastModel.ActiveShowList(); + TInt itemCnt = fItems.Count(); + + toolbar->HideItem(EPodcastRemoveDownload, EFalse, ETrue); + toolbar->HideItem(EPodcastRemoveAllDownloads, EFalse, ETrue); + toolbar->SetItemDimmed(EPodcastRemoveDownload, itemCnt == 0, ETrue); + toolbar->SetItemDimmed(EPodcastRemoveAllDownloads, itemCnt == 0, ETrue); + toolbar->HideItem(EPodcastSuspendDownloads,iPodcastModel.SettingsEngine().DownloadSuspended(), ETrue); + toolbar->HideItem(EPodcastResumeDownloads,!iPodcastModel.SettingsEngine().DownloadSuspended(), ETrue); +} + +void CPodcastQueueView::HandleLongTapEventL( const TPoint& aPenEventLocation, const TPoint& /* aPenEventScreenLocation */) +{ + DP("CPodcastQueueView::HandleLongTapEventL BEGIN"); + + if(iStylusPopupMenu) + { + iStylusPopupMenu->ShowMenu(); + iStylusPopupMenu->SetPosition(aPenEventLocation); + } + DP("CPodcastQueueView::HandleLongTapEventL END"); +} + +void CPodcastQueueView::DownloadQueueUpdatedL(TInt /*aDownloadingShows*/, TInt /*aQueuedShows*/) + { + } + +void CPodcastQueueView::FeedUpdateAllCompleteL(TFeedState /*aState*/) + { + UpdateListboxItemsL(); + UpdateToolbar(); + }