--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/application/src/PodcastShowsView.cpp Thu Feb 25 14:29:19 2010 +0000
@@ -0,0 +1,904 @@
+/*
+* 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 "PodcastShowsView.h"
+#include "PodcastAppUi.h"
+#include "ShowEngine.h"
+#include "SettingsEngine.h"
+#include "PodcastApp.h"
+#include "imagehandler.h"
+#include "constants.h"
+
+#include <akntitle.h>
+#include <podcast.rsg>
+#include <podcast.mbg>
+#include <gulicon.h>
+#include <barsread.h>
+#include <aknnotedialog.h>
+#include <aknmessagequerydialog.h>
+
+#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
+ };
+
+/**
+ * This is an interal class to display a message query dialog with an image at the bottm
+ */
+class CPodcastImageMessageQueryDialog:public CAknMessageQueryDialog
+ {
+ public:
+ /**
+ * C++ default constructor.
+ *
+ * @param aMessage Dialog box text.
+ * @param aHeader Header for the dialog.
+ * @deprecated
+ */
+ CPodcastImageMessageQueryDialog(TDesC* aMessage, TDesC* aHeader):CAknMessageQueryDialog(aMessage, aHeader)
+ {
+
+ }
+
+ ~CPodcastImageMessageQueryDialog()
+ {
+
+ }
+
+ void SetSizeAndPosition(const TSize& aSize)
+ {
+ CAknMessageQueryDialog::SetSizeAndPosition(aSize);
+
+ TPoint pos = Position();
+ TSize size = Size();
+
+ CAknDialog::SetSizeAndPosition(aSize);
+
+ pos.iY-=((aSize.iHeight-size.iHeight)-KPodcastDialogOffset);
+ SetPosition(pos);
+ SetSize(aSize);
+ }
+
+ };
+
+CPodcastShowsView* CPodcastShowsView::NewL(CPodcastModel& aPodcastModel)
+ {
+ CPodcastShowsView* self = CPodcastShowsView::NewLC(aPodcastModel);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CPodcastShowsView* CPodcastShowsView::NewLC(CPodcastModel& aPodcastModel)
+ {
+ CPodcastShowsView* self = new ( ELeave ) CPodcastShowsView(aPodcastModel);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+CPodcastShowsView::CPodcastShowsView(CPodcastModel& aPodcastModel) :
+ iPodcastModel(aPodcastModel)
+ {
+ }
+
+void CPodcastShowsView::ConstructL()
+ {
+ BaseConstructL(R_PODCAST_SHOWSVIEW);
+ CPodcastListView::ConstructL();
+
+ CreateIconsL();
+
+ 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_SHOWVIEW_POPUP_MENU);
+ iStylusPopupMenu->ConstructFromResourceL(reader);
+
+ CleanupStack::PopAndDestroy();
+ }
+
+void CPodcastShowsView::CreateIconsL()
+ {
+ 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);
+ 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
+ }
+
+TKeyResponse CPodcastShowsView::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(EPodcastDeleteShow);
+ break;
+ default:
+ break;
+ }
+ UpdateToolbar();
+ }
+ }
+ return CPodcastListView::OfferKeyEventL(aKeyEvent, aType);
+ }
+
+CPodcastShowsView::~CPodcastShowsView()
+ {
+ iPodcastModel.ShowEngine().RemoveObserver(this);
+ iPodcastModel.FeedEngine().RemoveObserver(this);
+
+ if(iStylusPopupMenu)
+ delete iStylusPopupMenu, iStylusPopupMenu = NULL;
+ }
+
+
+TUid CPodcastShowsView::Id() const
+ {
+ return KUidPodcastShowsViewID;
+ }
+
+void CPodcastShowsView::DoActivateL(const TVwsViewId& aPrevViewId,
+ TUid aCustomMessageId, const TDesC8& aCustomMessage)
+ {
+ DP("CPodcastShowsView::DoActivateL BEGIN");
+
+ UpdateViewTitleL();
+
+ CPodcastListView::DoActivateL(aPrevViewId, aCustomMessageId, aCustomMessage);
+ iPreviousView = TVwsViewId(KUidPodcast, KUidPodcastFeedViewID);
+
+ UpdateFeedUpdateStateL();
+ UpdateToolbar();
+ DP("CPodcastShowsView::DoActivateL END");
+ }
+
+void CPodcastShowsView::DoDeactivate()
+ {
+ CAknTitlePane* titlePane = static_cast<CAknTitlePane*>
+ ( StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
+
+// titlePane->SetSmallPicture(NULL, NULL, ETrue);
+ titlePane->SetPicture(NULL, NULL);
+ titlePane->SetTextToDefaultL();
+ CPodcastListView::DoDeactivate();
+ }
+
+// Engine callback when new shows are available
+void CPodcastShowsView::ShowListUpdatedL()
+ {
+ UpdateListboxItemsL();
+ }
+
+void CPodcastShowsView::ShowDownloadUpdatedL(TInt aBytesOfCurrentDownload, TInt /*aBytesTotal*/)
+ {
+ if (!iListContainer->IsVisible())
+ {
+ return;
+ }
+
+ CShowInfo *info = iPodcastModel.ShowEngine().ShowDownloading();
+ if (info)
+ {
+ UpdateShowItemL(info->Uid(), aBytesOfCurrentDownload);
+ }
+ }
+
+void CPodcastShowsView::ShowDownloadFinishedL(TUint /*aShowUid*/, TInt aError)
+ {
+ iProgressAdded = EFalse;
+
+ switch(aError)
+ {
+ case KErrCouldNotConnect:
+ {
+ TBuf<KMaxMessageLength> message;
+ iEikonEnv->ReadResourceL(message, R_PODCAST_CONNECTION_ERROR);
+ ShowErrorMessage(message);
+ }
+ break;
+ default: // Do nothing
+ break;
+ }
+ }
+
+
+void CPodcastShowsView::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 CPodcastShowsView::FeedDownloadFinishedL(TFeedState /*aState*/, TUint aFeedUid, TInt /*aError*/)
+ {
+ DP("CPodcastShowsView::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());
+ TRAP_IGNORE(UpdateViewTitleL());
+ }
+ DP("CPodcastShowsView::FeedDownloadFinishedL END");
+ }
+
+void CPodcastShowsView::HandleListBoxEventL(CEikListBox* /*aListBox*/,
+ TListBoxEvent aEventType)
+ {
+ switch (aEventType)
+ {
+ case EEventEnterKeyPressed:
+ case EEventItemActioned:
+ case EEventItemDoubleClicked:
+ {
+ RShowInfoArray &fItems = iPodcastModel.ActiveShowList();
+ TInt index = iListContainer->Listbox()->CurrentItemIndex();
+ if (index>=0 && index< fItems.Count())
+ {
+ DP2("Handle event for podcast %S, downloadState is %d", &(fItems[index]->Title()), fItems[index]->DownloadState());
+ CShowInfo *showInfo = fItems[index];
+
+ switch (showInfo->DownloadState()) {
+ case ENotDownloaded:
+ HandleCommandL(EPodcastDownloadShow);
+ break;
+ case EQueued:
+ AppUi()->ActivateLocalViewL(KUidPodcastQueueViewID, TUid::Uid(0), KNullDesC8());
+ ((CPodcastAppUi*)AppUi())->SetActiveTab(KTabIdQueue);
+ break;
+ case EDownloaded:
+ #pragma message("LAPER Replace activate playview with activate playback in mpx")
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ UpdateToolbar();
+ }
+
+void CPodcastShowsView::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 EDownloaded:
+ if (aShowInfo->PlayState() == ENeverPlayed) {
+ aIconIndex = EDownloadedNewShowIcon;
+ } else {
+ aIconIndex = EDownloadedShowIcon;
+ }
+ break;
+ case ENotDownloaded:
+ if (aShowInfo->PlayState() == ENeverPlayed) {
+ aIconIndex = ENewShowIcon;
+ } else {
+ aIconIndex = EShowIcon;
+ }
+ break;
+ case EQueued:
+ aIconIndex = dlStop ? ESuspendedShowIcon : EQuedShowIcon;
+ break;
+ case EDownloading:
+ aIconIndex = dlStop ? ESuspendedShowIcon : EDownloadingShowIcon;
+ break;
+ case EFailedDownload:
+ aIconIndex = EFailedShowIcon;
+ break;
+ }
+ }
+ }
+
+
+void CPodcastShowsView::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 CPodcastShowsView::FormatShowInfoListBoxItemL(CShowInfo& aShowInfo, TInt aSizeDownloaded)
+ {
+ TBuf<32> infoSize;
+ TInt iconIndex = 0;
+ TBuf<KMaxShortDateFormatSpec*2> 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<KSizeBufLen> errorBuffer;
+ GetShowErrorText(errorBuffer, aShowInfo.LastError());
+ iListboxFormatbuffer.Format(KShowErrorFormat(), iconIndex, &aShowInfo.Title(), &errorBuffer);
+ }
+ else
+ {
+ if (infoSize.Length() > 0) {
+ infoSize.Insert(0,_L(", "));
+ }
+
+ iListboxFormatbuffer.Format(KShowFormat(), iconIndex, &aShowInfo.Title(), &showDate, &infoSize);
+ }
+ }
+
+void CPodcastShowsView::GetShowErrorText(TDes &aErrorMessage, TInt aErrorCode)
+ {
+ iEikonEnv->GetErrorText(aErrorMessage, aErrorCode);
+ }
+
+void CPodcastShowsView::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 CPodcastShowsView::UpdateShowItemL(TUint aUid, TInt aSizeDownloaded)
+{
+ RShowInfoArray& array = iPodcastModel.ActiveShowList();
+
+ for (int i=0;i<array.Count();i++) {
+ if (array[i]->Uid() == aUid) {
+ UpdateShowItemDataL(array[i], i, aSizeDownloaded);
+ if (iListContainer->Listbox()->TopItemIndex() <= i &&
+ iListContainer->Listbox()->BottomItemIndex() >= i) {
+ iListContainer->Listbox()->DrawItem(i);
+ }
+ }
+ }
+}
+
+void CPodcastShowsView::UpdateListboxItemsL()
+ {
+ if (iListContainer->IsVisible())
+ {
+ TListItemProperties itemProps;
+ TInt len = 0;
+
+ iPodcastModel.GetShowsByFeed(iPodcastModel.ActiveFeedInfo()->Uid());
+
+ 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);
+ }
+ }
+ else
+ {
+ iListContainer->Listbox()->ItemDrawer()->ClearAllPropertiesL();
+ iListContainer->Listbox()->Reset();
+ iItemIdArray.Reset();
+ iItemArray->Reset();
+
+ if (len > 0)
+ {
+ for (TInt i=0; i<len; i++)
+ {
+ CShowInfo *si = fItems[i];
+ FormatShowInfoListBoxItemL(*si);
+ iItemIdArray.Append(si->Uid());
+ 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 CPodcastShowsView::HandleCommandL(TInt aCommand)
+ {
+ switch (aCommand)
+ {
+ case EPodcastMarkAsPlayed:
+ SetShowPlayed(ETrue);
+ break;
+ case EPodcastMarkAsUnplayed:
+ SetShowPlayed(EFalse);
+ break;
+ case EPodcastMarkAllPlayed:
+ iPodcastModel.MarkSelectionPlayed();
+ UpdateListboxItemsL();
+ break;
+ case EPodcastDeleteShow:
+ DeleteShow();
+ break;
+ case EPodcastDownloadShow:
+ {
+ TInt index = iListContainer->Listbox()->CurrentItemIndex();
+ if (index >= 0 && index < iPodcastModel.ActiveShowList().Count())
+ {
+ iPodcastModel.ShowEngine().AddDownloadL(*iPodcastModel.ActiveShowList()[index]);
+ UpdateShowItemL(iPodcastModel.ActiveShowList()[index]->Uid(),-1);
+ }
+ }
+ break;
+ case EPodcastUpdateFeed:
+ {
+
+ if (iPodcastModel.ActiveFeedInfo()->Url().Length()>0)
+ {
+ TRAPD(error, iPodcastModel.FeedEngine().UpdateFeedL(iPodcastModel.ActiveFeedInfo()->Uid()));
+
+ if (error != KErrNone)
+ {
+ HBufC
+ * str =
+ iEikonEnv->AllocReadResourceLC(R_PODCAST_FEEDS_UPDATE_ERROR);
+ User::InfoPrint(*str);
+ CleanupStack::PopAndDestroy(str);
+ }
+ }
+ }
+ break;
+ case EPodcastCancelUpdateAllFeeds:
+ iPodcastModel.FeedEngine().CancelUpdateAllFeeds();
+ break;
+ case EPodcastShowInfo:
+ {
+ DisplayShowInfoDialogL();
+ }break;
+ default:
+ CPodcastListView::HandleCommandL(aCommand);
+ break;
+ }
+ UpdateToolbar();
+ }
+
+void CPodcastShowsView::DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane)
+{
+ if(aResourceId == R_PODCAST_SHOWSVIEW_MENU)
+ {
+ TBool updatingState = iPodcastModel.FeedEngine().ClientState() != EIdle && iPodcastModel.FeedEngine().ActiveClientUid() == iPodcastModel.ActiveFeedInfo()->Uid();
+ aMenuPane->SetItemDimmed(EPodcastMarkAllPlayed, updatingState);
+ }
+}
+
+void CPodcastShowsView::ImageOperationCompleteL(TInt aError)
+ {
+ iLastImageHandlerError = aError;
+ if(iSetTitlebarImage)
+ {
+ iSetTitlebarImage = EFalse;
+ if(aError == KErrNone)
+ {
+ CAknTitlePane* titlePane = static_cast<CAknTitlePane*>
+ ( StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
+ titlePane->SetSmallPicture(iPodcastModel.ImageHandler().ScaledBitmap(), NULL, ETrue);
+ }
+ else
+ {
+ iPodcastModel.ImageHandler().ScaledBitmap();
+ }
+
+ }
+ else
+ {
+ CActiveScheduler::Stop();
+ }
+ }
+
+void CPodcastShowsView::DisplayShowInfoDialogL()
+ {
+ TInt index = iListContainer->Listbox()->CurrentItemIndex();
+ if (index >= 0 && index < iPodcastModel.ActiveShowList().Count())
+ {
+ CShowInfo* info = iPodcastModel.ActiveShowList()[index];
+ TUint32 feedUid = info->FeedUid();
+ CFeedInfo* feedInfo = iPodcastModel.FeedEngine().GetFeedInfoByUid(feedUid);
+
+ CPodcastImageMessageQueryDialog* note = new ( ELeave ) CPodcastImageMessageQueryDialog( (TDesC*)&info->Description(), (TDesC*)&info->Title() );
+
+ note->PrepareLC( R_SHOW_INFO_NOTE ); // Adds to CleanupStack
+
+ if(feedInfo && feedInfo->ImageFileName().Length()>0)
+ {
+ CFbsBitmap * bitmap = new (ELeave) CFbsBitmap;
+ CleanupStack::PushL(bitmap);
+
+ TRAPD(loaderror, iPodcastModel.ImageHandler().LoadFileAndScaleL(bitmap, feedInfo->ImageFileName(), TSize(KPodcastImageWidth, KPodcastImageHeight), *this));
+
+ if(loaderror == KErrNone)
+ {
+ CActiveScheduler::Start();
+ if(iLastImageHandlerError == KErrNone)
+ {
+ CEikImage* image = static_cast<CEikImage*>(note->ControlOrNull(EPodcastShowInfoImage));
+ image->SetBitmap(bitmap);
+ CleanupStack::Pop(bitmap);
+ bitmap = NULL;
+ }
+ else
+ {
+ CleanupStack::PopAndDestroy(bitmap);
+ bitmap = NULL;
+ }
+ }
+ else
+ {
+ CleanupStack::PopAndDestroy(bitmap);
+ bitmap = NULL;
+ }
+ }
+
+ note->RunLD();
+ }
+ }
+
+void CPodcastShowsView::UpdateToolbar()
+{
+ CAknToolbar* toolbar = Toolbar();
+
+ RShowInfoArray &fItems = iPodcastModel.ActiveShowList();
+ TInt itemCnt = fItems.Count();
+
+ TBool hideDownloadShowCmd = EFalse;
+ TBool dimDownloadShowCmd = EFalse;
+ TBool hideSetPlayed = EFalse;
+ TBool updatingState = iPodcastModel.FeedEngine().ClientState() != EIdle &&
+ iPodcastModel.FeedEngine().ActiveClientUid() == iPodcastModel.ActiveFeedInfo()->Uid();
+
+ if(iListContainer->Listbox() != NULL)
+ {
+ TInt index = iListContainer->Listbox()->CurrentItemIndex();
+
+ if(index>= 0 && index < itemCnt)
+ {
+ switch(fItems[index]->DownloadState())
+ {
+ case ENotDownloaded:
+ case EFailedDownload:
+ hideDownloadShowCmd = EFalse;
+ dimDownloadShowCmd = EFalse;
+ break;
+ case EQueued:
+ case EDownloading:
+ hideDownloadShowCmd = EFalse;
+ dimDownloadShowCmd = ETrue;
+ break;
+ case EDownloaded:
+ hideDownloadShowCmd = ETrue;
+ break;
+ }
+
+ if(fItems[index]->PlayState() == EPlayed) {
+ hideSetPlayed = ETrue;
+ }
+ }
+ }
+
+ toolbar->HideItem(EPodcastUpdateFeed, updatingState, ETrue );
+ toolbar->HideItem(EPodcastCancelUpdateAllFeeds, !updatingState, ETrue );
+
+ if (hideDownloadShowCmd) {
+ toolbar->HideItem(EPodcastDownloadShow, ETrue, ETrue );
+ toolbar->HideItem(EPodcastDeleteShow, EFalse, ETrue);
+ toolbar->SetItemDimmed(EPodcastDeleteShow, updatingState, ETrue);
+ } else {
+ toolbar->HideItem(EPodcastDownloadShow, EFalse, ETrue );
+ toolbar->HideItem(EPodcastDeleteShow, ETrue, ETrue);
+ toolbar->SetItemDimmed(EPodcastDownloadShow, updatingState || dimDownloadShowCmd, ETrue);
+ }
+
+ if (hideSetPlayed) {
+ toolbar->HideItem(EPodcastMarkAsPlayed, ETrue, ETrue );
+ toolbar->HideItem(EPodcastMarkAsUnplayed, EFalse, ETrue );
+ toolbar->SetItemDimmed(EPodcastMarkAsUnplayed, updatingState, ETrue);
+ } else {
+ toolbar->HideItem(EPodcastMarkAsPlayed, EFalse, ETrue );
+ toolbar->HideItem(EPodcastMarkAsUnplayed, ETrue, ETrue );
+ toolbar->SetItemDimmed(EPodcastMarkAsPlayed, updatingState, ETrue);
+ }
+}
+
+void CPodcastShowsView::HandleLongTapEventL( const TPoint& aPenEventLocation, const TPoint& /* aPenEventScreenLocation */)
+{
+ DP("CPodcastShowsView::HandleLongTapEventL BEGIN");
+
+ if(iStylusPopupMenu)
+ {
+ TInt index = iListContainer->Listbox()->CurrentItemIndex();
+ if (index >= 0 && index < iPodcastModel.ActiveShowList().Count())
+ {
+ CShowInfo *info = iPodcastModel.ActiveShowList()[index];
+ TBool hideDownloadShowCmd = info->DownloadState() != ENotDownloaded;
+ TBool hideDeleteShowCmd = info->DownloadState() != EDownloaded;
+ TBool hideMarkOld = info->PlayState() == EPlayed;
+
+ iStylusPopupMenu->SetItemDimmed(EPodcastMarkAsPlayed, hideMarkOld);
+ iStylusPopupMenu->SetItemDimmed(EPodcastMarkAsUnplayed, !hideMarkOld);
+
+ iStylusPopupMenu->SetItemDimmed(EPodcastDownloadShow, hideDownloadShowCmd);
+ iStylusPopupMenu->SetItemDimmed(EPodcastDeleteShow, hideDeleteShowCmd);
+ }
+
+ iStylusPopupMenu->ShowMenu();
+ iStylusPopupMenu->SetPosition(aPenEventLocation);
+ }
+ DP("CPodcastShowsView::HandleLongTapEventL END");
+}
+
+void CPodcastShowsView::SetShowPlayed(TBool aPlayed)
+ {
+
+ TInt index = iListContainer->Listbox()->CurrentItemIndex();
+
+ if (index >= 0 && index < iPodcastModel.ActiveShowList().Count())
+ {
+ CShowInfo *info = iPodcastModel.ActiveShowList()[index];
+ info->SetPlayState(aPlayed ? EPlayed : ENeverPlayed);
+ iPodcastModel.ShowEngine().UpdateShow(*info);
+ UpdateShowItemDataL(iPodcastModel.ActiveShowList()[index], index, 0);
+ iListContainer->Listbox()->DrawItem(index);
+ }
+ }
+
+void CPodcastShowsView::DeleteShow()
+ {
+ TInt index = iListContainer->Listbox()->CurrentItemIndex();
+
+ if (index >= 0 && index < iPodcastModel.ActiveShowList().Count())
+ {
+ CShowInfo *info = iPodcastModel.ActiveShowList()[index];
+ TBuf<KMaxMessageLength> msg;
+ TBuf<KMaxMessageLength> templ;
+ iEikonEnv->ReadResourceL(templ, R_PODCAST_DELETE_SHOW_PROMPT);
+ msg.Format(templ, &(info->Title()));
+ if (ShowQueryMessage(msg))
+ {
+ iPodcastModel.ShowEngine().DeleteShowL(iPodcastModel.ActiveShowList()[index]->Uid());
+
+ // and mark as played, and not downloaded
+
+ info->SetDownloadState(ENotDownloaded);
+ info->SetPlayState(EPlayed);
+ iPodcastModel.ShowEngine().UpdateShow(*info);
+
+ UpdateShowItemDataL(iPodcastModel.ActiveShowList()[index], index, 0);
+ iListContainer->Listbox()->DrawItem(index);
+ }
+ }
+ }
+
+void CPodcastShowsView::DownloadQueueUpdatedL(TInt /*aDownloadingShows*/, TInt /*aQueuedShows*/)
+ {
+ //((CPodcastAppUi*)AppUi())->UpdateQueueTab(aDownloadingShows+aQueuedShows);
+ }
+
+void CPodcastShowsView::FeedUpdateAllCompleteL(TFeedState /*aState*/)
+ {
+ UpdateListboxItemsL();
+ UpdateToolbar();
+ }
+
+void CPodcastShowsView::UpdateViewTitleL()
+ {
+ DP("CPodcastShowsView::UpdateViewTitleL BEGIN");
+ CAknTitlePane* titlePane = static_cast<CAknTitlePane*>
+ ( StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
+
+ TBool updatingState = iPodcastModel.FeedEngine().ClientState() != EIdle &&
+ iPodcastModel.FeedEngine().ActiveClientUid() == iPodcastModel.ActiveFeedInfo()->Uid();
+
+ if (updatingState) {
+ SetEmptyTextL(R_PODCAST_EMPTY_LIST_UPDATING);
+ } else {
+ SetEmptyTextL(R_PODCAST_EMPTY_LIST);
+ }
+
+ if(iPodcastModel.ActiveFeedInfo())
+ {
+ if (iPodcastModel.ActiveFeedInfo()->Title() != KNullDesC)
+ {
+ titlePane->SetTextL( iPodcastModel.ActiveFeedInfo()->Title(), ETrue );
+ }
+ }
+ else
+ {
+ titlePane->SetPicture(NULL, NULL);
+ titlePane->SetTextToDefaultL();
+ }
+
+ DP("CPodcastShowsView::UpdateViewTitleL END");
+ }