--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/application/src/PodcastSettingsView.cpp Thu Feb 25 14:29:19 2010 +0000
@@ -0,0 +1,567 @@
+/*
+* 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 "PodcastSettingsView.h"
+#include "PodcastAppUi.h"
+#include "Podcast.hrh"
+#include <aknlists.h>
+#include <aknsettingitemlist.h>
+#include <aknnavide.h>
+#include <podcast.rsg>
+#include "SettingsEngine.h"
+
+#include <caknfileselectiondialog.h>
+#include <caknmemoryselectiondialog.h>
+#include <pathinfo.h>
+
+
+class CIapSetting: public CAknEnumeratedTextPopupSettingItem
+{
+public:
+ CIapSetting(TInt aResourceId, TInt& aValue, CPodcastModel &aPodcastModel) :
+ CAknEnumeratedTextPopupSettingItem(aResourceId, aValue), iPodcastModel(aPodcastModel), iIap(aValue)
+ {
+ }
+
+ ~CIapSetting()
+ {
+ }
+
+ void RefreshConnectionListL()
+ {
+ CArrayPtr< CAknEnumeratedText > * enumeratedArr = EnumeratedTextArray();
+ CArrayPtr< HBufC > * poppedUpTextArray = PoppedUpTextArray();
+ enumeratedArr->ResetAndDestroy();
+ poppedUpTextArray->ResetAndDestroy();
+
+ CDesCArrayFlat *iapArray = iPodcastModel.IAPNames();
+
+ TBool valueExists = EFalse;
+ DP2("InternalValue=%d, ExternalValue=%d", InternalValue(), ExternalValue());
+ for (int i=0;i<iapArray->Count();i++) {
+ HBufC *buf = (*iapArray)[i].AllocL();
+ poppedUpTextArray->AppendL(buf);
+
+ TInt iapId = iPodcastModel.IAPIds()[i].iIapId;
+ DP2("IAP name='%S', id=%d", buf, iapId);
+
+ if (iapId == ExternalValue()) {
+ valueExists = ETrue;
+ }
+ // both arrays destroy themselves, so we need two copies to prevent USER 44
+ HBufC *buf2 = (*iapArray)[i].AllocL();
+
+ CAknEnumeratedText *enumerated = new CAknEnumeratedText(iapId, buf2);
+ enumeratedArr->AppendL(enumerated);
+ }
+
+ DP1("valueExists=%d", valueExists);
+ if (!valueExists && iPodcastModel.IAPIds().Count() > 0 ) {
+ DP1("Setting iIap=%d", iPodcastModel.IAPIds()[0].iIapId);
+ iIap = iPodcastModel.IAPIds()[0].iIapId;
+ LoadL();
+ DP2("InternalValue=%d, ExternalValue=%d", InternalValue(), ExternalValue());
+ }
+
+ TRAPD(err, HandleTextArrayUpdateL());
+
+ if (err != KErrNone) {
+ DP1("Leave in HandleTextArrayUpdateL, err=%d", err);
+ }
+ }
+
+ void CompleteConstructionL()
+ {
+ DP("CIapSetting::CompleteConstructionL BEGIN");
+ CAknEnumeratedTextPopupSettingItem::CompleteConstructionL();
+ RefreshConnectionListL();
+ DP("CIapSetting::CompleteConstructionL END");
+ }
+
+ void EditItemL(TBool aCalledFromMenu)
+ {
+ DP("CIapSetting::EditItemL BEGIN");
+ LoadL();
+ CAknEnumeratedTextPopupSettingItem::EditItemL(aCalledFromMenu);
+ StoreL();
+ DP2("InternalValue=%d, ExternalValue=%d", InternalValue(), ExternalValue());
+ DP("CIapSetting::EditItemL END");
+ }
+
+ void HandleSettingPageEventL(CAknSettingPage* aSettingPage, TAknSettingPageEvent aEventType)
+ {
+ DP("CIapSetting::HandleSettingPageEventL BEGIN");
+ CAknSettingItem::HandleSettingPageEventL(aSettingPage, aEventType);
+ /*if (aEventType == EEventSettingOked)
+ {
+ DP2("InternalValue=%d, ExternalValue=%d", InternalValue(), ExternalValue());
+ StoreL();
+ }*/
+ DP("CIapSetting::HandleSettingPageEventL END");
+ }
+
+protected:
+ CPodcastModel& iPodcastModel;
+ TInt& iIap;
+};
+
+
+class CConnectionSetting: public CAknEnumeratedTextPopupSettingItem
+{
+public:
+ CConnectionSetting(TInt aResourceId, TInt& aValue, CPodcastModel &aPodcastModel) :
+ CAknEnumeratedTextPopupSettingItem(aResourceId, aValue), iPodcastModel(aPodcastModel)
+ {
+ }
+
+ ~CConnectionSetting()
+ {
+ }
+
+ void RefreshConnectionListL()
+ {
+ CArrayPtr< CAknEnumeratedText > * enumeratedArr = EnumeratedTextArray();
+ CArrayPtr< HBufC > * poppedUpTextArray = PoppedUpTextArray();
+
+ CDesCArrayFlat *snapArray = iPodcastModel.SNAPNames();
+
+ TBool valueExists = EFalse;
+ DP2("InternalValue=%d, ExternalValue=%d", InternalValue(), ExternalValue());
+ for (int i=0;i<snapArray->Count();i++) {
+ HBufC *buf = (*snapArray)[i].AllocL();
+ poppedUpTextArray->InsertL(EConnectionUseNetwork+i,buf);
+
+ TInt snapId = iPodcastModel.SNAPIds()[i].iIapId;
+ DP2("SNAP name='%S', id=%d", buf, snapId);
+
+ if (snapId == ExternalValue()) {
+ valueExists = ETrue;
+ }
+ // both arrays destroy themselves, so we need two copies to prevent USER 44
+ HBufC *buf2 = (*snapArray)[i].AllocL();
+
+ CAknEnumeratedText *enumerated = new CAknEnumeratedText(EConnectionUseNetwork+i, buf2);
+ enumeratedArr->InsertL(EConnectionUseNetwork+i, enumerated);
+ }
+
+ DP1("valueExists=%d", valueExists);
+ if (!valueExists && iPodcastModel.SNAPIds().Count() > 0 ) {
+ DP1("Setting i=%d", iPodcastModel.SNAPIds()[0].iIapId);
+ LoadL();
+ DP2("InternalValue=%d, ExternalValue=%d", InternalValue(), ExternalValue());
+ }
+
+ TRAPD(err, HandleTextArrayUpdateL());
+
+ if (err != KErrNone) {
+ DP1("Leave in HandleTextArrayUpdateL, err=%d", err);
+ }
+ }
+
+ void CompleteConstructionL()
+ {
+ DP("CIapSetting::CompleteConstructionL BEGIN");
+ CAknEnumeratedTextPopupSettingItem::CompleteConstructionL();
+ RefreshConnectionListL();
+ DP("CIapSetting::CompleteConstructionL END");
+ }
+
+ void EditItemL(TBool aCalledFromMenu)
+ {
+ DP("CIapSetting::EditItemL BEGIN");
+ LoadL();
+ CAknEnumeratedTextPopupSettingItem::EditItemL(aCalledFromMenu);
+ StoreL();
+ DP2("InternalValue=%d, ExternalValue=%d", InternalValue(), ExternalValue());
+ DP("CIapSetting::EditItemL END");
+ }
+
+ void HandleSettingPageEventL(CAknSettingPage* aSettingPage, TAknSettingPageEvent aEventType)
+ {
+ DP("CIapSetting::HandleSettingPageEventL BEGIN");
+ CAknSettingItem::HandleSettingPageEventL(aSettingPage, aEventType);
+ /*if (aEventType == EEventSettingOked)
+ {
+ DP2("InternalValue=%d, ExternalValue=%d", InternalValue(), ExternalValue());
+ StoreL();
+ }*/
+ DP("CIapSetting::HandleSettingPageEventL END");
+ }
+
+protected:
+ CPodcastModel& iPodcastModel;
+};
+
+class CPodcastSettingItemList:public CAknSettingItemList
+ {
+public:
+ CPodcastSettingItemList(CPodcastModel& aPodcastModel) : iPodcastModel(aPodcastModel)
+ {
+ }
+
+ ~CPodcastSettingItemList()
+ {
+ DP("CPodcastSettingItemList~");
+ }
+
+ void StoreSettings() {
+ DP("StoreSettings BEGIN");
+ StoreSettingsL();
+ CSettingsEngine &se = iPodcastModel.SettingsEngine();
+ se.SetBaseDir(iShowDir);
+ DP1("Base Dir: %S", &iShowDir);
+ se.SetUpdateAutomatically((TAutoUpdateSetting)iAutoUpdate);
+ DP1("Update automatically: %d", iAutoUpdate);
+ switch(iConnection)
+ {
+ case EConnectionDefault:
+ {
+ DP("Specific IAP: 0 Ask user");
+ se.SetSpecificIAP(0);
+ }break;
+ case EConnectionAlwaysAsk:
+ {
+ DP("Specific IAP: -1 Ask user");
+ se.SetSpecificIAP(-1);
+ }break;
+
+ case EConnectionUseIap:
+ {
+ DP1("Specific NETWORK: %d", iIap);
+ se.SetSpecificIAP((iIap|KUseIAPFlag));
+ }break;
+ default:
+ case EConnectionUseNetwork:
+ {
+ DP1("Specific IAP: %d", iIap);
+ TInt snapIndex = iConnection-EConnectionUseNetwork;
+ se.SetSpecificIAP(iPodcastModel.SNAPIds()[snapIndex].iIapId);
+ }break;
+ }
+
+ DP1("Download automatically: %d", iAutoDownload);
+ se.SetDownloadAutomatically(iAutoDownload);
+ se.SaveSettingsL();
+ DP("StoreSettings END");
+ }
+
+ void HandleListBoxEventL(CEikListBox* aListBox, TListBoxEvent aEventType)
+ {
+ DP1("CPodcastSettingItemList::HandleListBoxEventL event %d", aEventType)
+ CAknSettingItemList::HandleListBoxEventL(aListBox, aEventType);
+ }
+
+ void UpdateSettingVisibility()
+ {
+ DP("UpdateSettingVisibility BEGIN");
+ LoadSettingsL();
+ TBool dimAutoUpdate = iConnection == EConnectionAlwaysAsk;
+ TBool dimIAP = iConnection < EConnectionUseIap;
+
+ iSettingAutoUpdate->SetHidden(dimAutoUpdate);
+ iSettingIAP->SetHidden(dimIAP);
+ if(!dimIAP)
+ {
+ iSettingIAP->RefreshConnectionListL();
+ }
+ ListBox()->ScrollToMakeItemVisible(0);
+
+ TRAP_IGNORE(HandleChangeInItemArrayOrVisibilityL());
+ DP("UpdateSettingVisibility END");
+ }
+
+ void EditItemL (TInt aIndex, TBool aCalledFromMenu)
+ {
+ DP("EditItemL BEGIN");
+ if (aIndex == 0) {
+ CAknMemorySelectionDialog* memDlg =
+ CAknMemorySelectionDialog::NewL(ECFDDialogTypeNormal, ETrue);
+ CleanupStack::PushL(memDlg);
+ CAknMemorySelectionDialog::TMemory memory =
+ CAknMemorySelectionDialog::EPhoneMemory;
+
+ if (memDlg->ExecuteL(memory))
+ {
+ TFileName importName;
+
+ if (memory==CAknMemorySelectionDialog::EMemoryCard)
+ {
+ importName = PathInfo:: MemoryCardRootPath();
+ }
+ else
+ {
+ importName = PathInfo:: PhoneMemoryRootPath();
+ }
+
+ CAknFileSelectionDialog* dlg = CAknFileSelectionDialog::NewL(ECFDDialogTypeSave, R_PODCAST_SHOWDIR_SELECTOR);
+ HBufC* select = iEikonEnv->AllocReadResourceLC(R_PODCAST_SOFTKEY_SELECT);
+ dlg->SetLeftSoftkeyFileL(*select);
+ CleanupStack::PopAndDestroy(select);
+ CleanupStack::PushL(dlg);
+
+ dlg->SetDefaultFolderL(importName);
+
+ if(dlg->ExecuteL(importName))
+ {
+ importName.Append(_L("Podcasts"));
+ iShowDir.Copy(importName);
+ LoadSettingsL();
+ }
+ CleanupStack::PopAndDestroy(dlg);
+ }
+ CleanupStack::PopAndDestroy(memDlg);
+ }
+ else {
+ CAknSettingItemList::EditItemL(aIndex,aCalledFromMenu);
+ }
+ StoreSettingsL();
+ UpdateSettingVisibility();
+ DP("EditItemL END");
+ }
+
+ /**
+ * Framework method to create a setting item based upon the user id aSettingId. The
+ * client code decides what type to contruct. new (ELeave) must then be used and the resulting
+ * pointer returned. Ownership is thereafter base class's responsiblity.
+ *
+ * @param aSettingId ID to use to determine the type of the setting item
+ * @return a constructed (not 2nd-stage constructed) setting item.
+ */
+ CAknSettingItem* CreateSettingItemL( TInt aSettingId )
+ {
+ DP1("CreateSettingItemL BEGIN, aSettingId=%d", aSettingId);
+
+ CSettingsEngine &se = iPodcastModel.SettingsEngine();
+ iShowDir.Copy(se.BaseDir());
+ iAutoUpdate = se.UpdateAutomatically();
+ iIap = se.SpecificIAP();
+
+ if( iIap == 0)
+ {
+ iConnection = EConnectionDefault;
+ }
+ else if ( iIap == -1)
+ {
+ iConnection = EConnectionAlwaysAsk;
+ }
+ else if ( (iIap & KUseIAPFlag))
+ {
+ iConnection = EConnectionUseIap;
+ iIap = iIap& KUseIAPMask;
+ }
+ else
+ {
+ TInt snapIndex = 0;
+ TInt cnt = iPodcastModel.SNAPIds().Count();
+ while(snapIndex < cnt && ((TInt)iPodcastModel.SNAPIds()[snapIndex].iIapId) != iIap)
+ {
+ snapIndex++;
+ }
+
+ if(snapIndex != cnt)
+ {
+ iConnection = EConnectionUseNetwork+snapIndex;
+ }
+ else
+ {
+ iConnection = EConnectionAlwaysAsk;
+ }
+ }
+
+ iAutoDownload = se.DownloadAutomatically();
+
+ switch(aSettingId)
+ {
+ case EPodcastSettingShowDir:
+ DP("EPodcastSettingShowDir");
+ return new (ELeave) CAknTextSettingItem(aSettingId, iShowDir);
+ break;
+ case EPodcastSettingAutoUpdate:
+ DP("EPodcastSettingAutoUpdate");
+ iSettingAutoUpdate = new (ELeave) CAknEnumeratedTextPopupSettingItem(aSettingId, iAutoUpdate);
+ return iSettingAutoUpdate;
+ break;
+ case EPodcastSettingConnection:
+ DP("EPodcastSettingConnection");
+ return new (ELeave) CConnectionSetting (aSettingId, iConnection, iPodcastModel);
+ break;
+ case EPodcastSettingIAPList:
+ DP("EPodcastSettingIAPList");
+ iSettingIAP = new (ELeave) CIapSetting (aSettingId, iIap, iPodcastModel);
+ return iSettingIAP;
+ break;
+ case EPodcastSettingAutoDownload:
+ DP("EPodcastSettingAutoDownload");
+ iSettingAutoDownload = new (ELeave) CAknBinaryPopupSettingItem (aSettingId, iAutoDownload);
+ return iSettingAutoDownload;
+ break;
+ default:
+ return CAknSettingItemList::CreateSettingItemL(aSettingId);
+ break;
+ }
+ DP("CreateSettingItemL END");
+ return NULL;
+ }
+
+ TFileName iShowDir;
+
+ TInt iAutoUpdate;
+ CAknSettingItem *iSettingAutoUpdate;
+
+ TInt iAutoDownload;
+ CAknSettingItem *iSettingAutoDownload;
+
+ TInt iConnection;
+
+ TInt iIap;
+ CIapSetting *iSettingIAP;
+
+
+ CPodcastModel &iPodcastModel;
+ };
+
+
+CPodcastSettingsView* CPodcastSettingsView::NewL(CPodcastModel& aPodcastModel)
+ {
+ CPodcastSettingsView* self = CPodcastSettingsView::NewLC(aPodcastModel);
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+CPodcastSettingsView* CPodcastSettingsView::NewLC(CPodcastModel& aPodcastModel)
+ {
+ CPodcastSettingsView* self = new ( ELeave ) CPodcastSettingsView(aPodcastModel);
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+CPodcastSettingsView::CPodcastSettingsView(CPodcastModel& aPodcastModel):iPodcastModel(aPodcastModel)
+{
+}
+
+void CPodcastSettingsView::ConstructL()
+{
+ BaseConstructL(R_PODCAST_SETTINGSVIEW);
+}
+
+CPodcastSettingsView::~CPodcastSettingsView()
+ {
+ DP("CPodcastSettingsView::~CPodcastSettingsView()");
+ delete iListbox;
+ }
+
+TUid CPodcastSettingsView::Id() const
+{
+ return KUidPodcastSettingsViewID;
+}
+
+void CPodcastSettingsView::DoActivateL(const TVwsViewId& aPrevViewId,
+ TUid /*aCustomMessageId*/,
+ const TDesC8& /*aCustomMessage*/)
+{
+ DP("CPodcastSettingsView::DoActivateL BEGIN");
+ iPreviousView = aPrevViewId;
+
+ if (iListbox) {
+ delete iListbox;
+ iListbox = NULL;
+ }
+
+ DP("Creating listbox");
+ iPodcastModel.UpdateSNAPListL();
+ iPodcastModel.UpdateIAPListL();
+
+ iListbox =new (ELeave) CPodcastSettingItemList(iPodcastModel);
+ iListbox->SetMopParent( this );
+ iListbox->ConstructFromResourceL(R_PODCAST_SETTINGS);
+ iListbox->SetRect(ClientRect());
+ iListbox->ActivateL();
+
+ DP("Creating navipane");
+ iNaviPane =( CAknNavigationControlContainer * ) StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) );
+
+ HBufC *titleBuffer = iEikonEnv->AllocReadResourceL(R_SETTINGS_TITLE);
+ iNaviDecorator = iNaviPane->CreateNavigationLabelL(*titleBuffer);
+ delete titleBuffer;
+
+ DP("Updating listbox");
+ AppUi()->AddToStackL(*this, iListbox);
+ iListbox->UpdateSettingVisibility();
+ iListbox->MakeVisible(ETrue);
+ iListbox->DrawNow();
+ iListbox->SetFocus(ETrue);
+
+ if(iNaviDecorator && iNaviPane)
+ {
+ iNaviPane->PushL(*iNaviDecorator);
+ }
+ DP("CPodcastSettingsView::DoActivateL END");
+}
+
+void CPodcastSettingsView::DoDeactivate()
+ {
+ DP("CPodcastSettingsView::DoDeactivate BEGIN");
+ if (iListbox) {
+ iListbox->MakeVisible(EFalse);
+
+ AppUi()->RemoveFromViewStack( *this, iListbox );
+
+ }
+
+ if(iNaviDecorator && iNaviPane)
+ {
+ iNaviPane->Pop(iNaviDecorator);
+ delete iNaviDecorator;
+ iNaviDecorator = NULL;
+ }
+ DP("CPodcastSettingsView::DoDeactivate END");
+ }
+
+/**
+* Command handling function intended for overriding by sub classes.
+* Default implementation is empty.
+* @param aCommand ID of the command to respond to.
+*/
+void CPodcastSettingsView::HandleCommandL(TInt aCommand)
+{
+ CAknView::HandleCommandL(aCommand);
+ DP1("CPodcastListView::HandleCommandL=%d", aCommand);
+ switch(aCommand)
+ {
+ case EAknSoftkeyBack:
+ {
+ iListbox->StoreSettings();
+ AppUi()->ActivateViewL(iPreviousView);
+ }
+ break;
+ default:
+ AppUi()->HandleCommandL(aCommand);
+ break;
+ }
+}
+
+void CPodcastSettingsView::HandleStatusPaneSizeChange()
+{
+ CAknView::HandleStatusPaneSizeChange();
+
+ DP2("CPodcastSettingsView::HandleStatusPaneSizeChange() width=%d, height=%d", ClientRect().Width(), ClientRect().Height());
+ if (iListbox) {
+ iListbox->SetRect( ClientRect());
+ }
+}