diff -r 000000000000 -r 09774dfdd46b qtinternetradio/ui/src/irstationsview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtinternetradio/ui/src/irstationsview.cpp Mon Apr 19 14:01:53 2010 +0300 @@ -0,0 +1,575 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#include +#include +#include +#include + +#include "irabstractviewmanager.h" +#include "irstationsview.h" +#include "irapplication.h" +#include "irplaycontroller.h" +#include "irqisdsclient.h" +#include "irqenums.h" +#include "irqutility.h" +#include "irchannelmodel.h" +#include "irqisdsdatastructure.h" +#include "irqnetworkcontroller.h" + +const int KBitmapSize = 59; +const uint KConnectTimeOut = 15000; //if the connecting take more than 15 seconds, we will show a pop up + +// public functions + +/* + * Description : constructor + */ +IRStationsView::IRStationsView(IRApplication* aApplication, TIRViewId aViewId) + : IrAbstractListViewBase(aApplication, aViewId), + iLogoPreset(NULL), iPreset(NULL), + iWaitDialog(NULL), + iViewParameter(EIRViewPara_InvalidId),iLastSelectitem(0), + iLastPopularItem(0) +{ + iIconIndexArray.clear(); + iChannelModel = new IrChannelModel(this); + iListView->setModel(iChannelModel); + + + iConnectTimer = new QTimer(this); + iConnectTimer->setInterval(KConnectTimeOut); + + iConvertTimer = new QTimer(this); + iConvertTimer->setInterval(10); + + connect(iChannelModel, SIGNAL(dataAvailable()), this, SLOT(dataChanged())); + connect(iNetworkController, SIGNAL(networkRequestNotified(IRQNetworkEvent)), + this, SLOT(networkRequestNotified(IRQNetworkEvent))); + connect(iConnectTimer, SIGNAL(timeout()), this, SLOT(connectTimeOut())); + connect(iConvertTimer, SIGNAL(timeout()), this, SLOT(convertAnother())); +} + +/* + * Description : destructor + */ +IRStationsView::~IRStationsView() +{ + delete iPreset; + iPreset = NULL; + + delete iLogoPreset; + iLogoPreset = NULL; + + delete iWaitDialog; + iWaitDialog = NULL; + + + +} + +void IRStationsView::setViewParameter(TIRViewParameter aParameter) +{ + iViewParameter = aParameter; +} + +TIRViewParameter IRStationsView::getViewParameter() const +{ + return iViewParameter; +} + +void IRStationsView::loadCategoryStations(int aIndex, const QString &aHeadingText) +{ + connectToIsdsClient(); + setHeadingText(aHeadingText); + setViewParameter(EIRViewPara_CategoryStations); + + bool cache = false; + iIsdsClient->isdsChannelRequest(aIndex, cache); + + if (!cache) + { + createWaitDialog(hbTrId("txt_common_info_loading")); + } +} + +void IRStationsView::loadPopularStations(bool aShowWaitDialog) +{ + connectToIsdsClient(); + setViewParameter(EIRViewPara_PopularStations); + setHeadingText(tr("Popular stations")); + bool cache = false; + iIsdsClient->isdsCategoryRequest(IRQIsdsClient::Ehotpicks, cache); + + if (!cache && aShowWaitDialog) + { + createWaitDialog(hbTrId("txt_common_info_loading")); + } +} + +void IRStationsView::loadSearchResult(const QString &aStr) +{ + connectToIsdsClient(); + setViewParameter(EIRViewPara_SearchResults); + setHeadingText(hbTrId("txt_irad_subtitle_search_result")); + iIsdsClient->isdsSearchRequest(aStr); + if( iConnectTimer->isActive() ) + { + iConnectTimer->stop(); + } + + iConnectTimer->start(); + createWaitDialog(hbTrId("txt_common_info_searching")); +} + +void IRStationsView::storeCurrentItem() +{ + switch (getViewParameter()) + { + case EIRViewPara_PopularStations: + iLastPopularItem = iListView->currentIndex().row(); + break; + case EIRViewPara_CategoryStations: + iLastSelectitem = iListView->currentIndex().row(); + break; + default: + break; + } +} + +void IRStationsView::resetCurrentItem() +{ + iLastSelectitem = 0; +} + +/* + * Description : from base class IRBaseView. + * handle view commands. + * Parameters : aCommand : see the definition of TIRViewCommand + * Return : EIR_DoDefault : caller does default handling + * EIR_NoDefault : caller doesn't do default handling + */ +TIRHandleResult IRStationsView::handleCommand(TIRViewCommand aCommand, TIRViewCommandReason aReason) +{ + TIRHandleResult ret = IrAbstractListViewBase::handleCommand(aCommand, aReason); + int leftCount = 0; + + switch (aCommand) + { + case EIR_ViewCommand_ACTIVATED: + connect(iIsdsClient, SIGNAL(presetResponse(IRQPreset *)), + this, SLOT(presetResponse(IRQPreset *))); + connect(iIsdsClient, SIGNAL(presetLogoDownloaded(IRQPreset* )), + this, SLOT(presetLogoDownload(IRQPreset* ))); + connect(iIsdsClient, SIGNAL(presetLogoDownloadError()), + this, SLOT(presetLogoDownloadError())); + + ret = EIR_NoDefault; + break; + + case EIR_ViewCommand_DEACTIVATE: + if (aReason == EIR_ViewCommandReason_Back) + { + cleanupResource(); + } + + iConnectTimer->stop(); + iConvertTimer->stop(); + iIsdsClient->isdsLogoDownCancelTransaction(); + + disconnect(iIsdsClient, SIGNAL(presetResponse(IRQPreset *)), + this, SLOT(presetResponse(IRQPreset *))); + disconnect(iIsdsClient, SIGNAL(presetLogoDownloaded(IRQPreset*)), + this, SLOT(presetLogoDownload(IRQPreset* ))); + disconnect(iIsdsClient, SIGNAL(presetLogoDownloadError()), + this, SLOT(presetLogoDownloadError())); + ret = EIR_NoDefault; + break; + + case EIR_ViewCommand_EffectFinished: + /* when the effect is finished, we start showing the logos */ + leftCount = iIconIndexArray.count(); + if( leftCount > 0 ) + { + iConvertTimer->start(); + } + break; + + default: + break; + } + + return ret; +} + +void IRStationsView::launchAction() +{ + setUseNetworkReason(EIR_UseNetwork_StartingView); + iApplication->verifyNetworkConnectivity(); +} + +// slots functions + +/* + * Description : slot function when an item in a list is clicked. + * issue a listen request to isds client + * Parameters : aItem : pointer to the clicked item. + */ +void IRStationsView::handleItemSelected() +{ + if (iListView) + { + int index = iListView->currentIndex().row(); + if (index != -1) + { + if (iIsdsClient) + { + connect(iIsdsClient, SIGNAL(operationException(IRQError)), + this, SLOT(operationException(IRQError))); + + //once an item is selected, we show a dialog to prevent user from clicking the + //item again + iPlayController->createBufferingDialog(this, SLOT(cancelRequest())); + + if (iIsdsClient->isdsIsChannelBanner()) + { + iIsdsClient->isdsListenRequest(index + 1); + } + else + { + iIsdsClient->isdsListenRequest(index); + } + } + } + } +} + +/* + * Description : data is received from isds client. Load the data to the list widget and display + * the stations view + */ +void IRStationsView::dataChanged() +{ + + int currentItem = 0; + iApplication->closeConnectingDialog(); + iConnectTimer->stop(); + if (iWaitDialog) + { + iWaitDialog->close(); + } + + disconnectIsdsClient(); + cleanupResource(); + + + switch (getViewParameter()) + { + case EIRViewPara_SearchResults: + currentItem = 0; + break; + case EIRViewPara_PopularStations: + currentItem = iLastPopularItem; + break; + case EIRViewPara_CategoryStations: + currentItem = iLastSelectitem; + break; + default: + break; + } + iListView->reset(); + iListView->setCurrentIndex(iChannelModel->index(currentItem)); + iListView->scrollTo(iChannelModel->index(currentItem)); + + //initialize the iconindices + for (int i = 0; i < iChannelModel->rowCount(); ++i) + { + if (iChannelModel->imageUrl(i) != "") + { + iIconIndexArray.append(i); + } + } + + getViewManager()->activateView(this); +} + +/* + * Description : the preset of the selected station is received from isds client. + * application is responsible for deleting old preset. + * call player controler to play the station + * Parameters : aPreset : the preset of the selected station + */ +void IRStationsView::presetResponse(IRQPreset *aPreset) +{ + disconnect(iIsdsClient, SIGNAL(operationException(IRQError)), + this, SLOT(operationException(IRQError))); + + delete iPreset; + iPreset = aPreset; + + if (iPreset) + { + iPlayController->connectToChannel(iPreset,EIRQIsds); + } +} + + +/* + * Description : slot function for operation failure. The signal is emitted by isds client + * Parameters : aError : see the definition of IRQError + */ +void IRStationsView::operationException(IRQError aError) +{ + iApplication->closeConnectingDialog(); + iPlayController->closeBufferingDialog(); + + if (iWaitDialog) + { + iWaitDialog->close(); + } + + disconnectIsdsClient(); + QString errorString = hbTrId("txt_irad_info_failed_to_connect"); + + switch (aError) + { + case EIRQErrorNotFound: + errorString = hbTrId("txt_irad_info_no_matching_stations_found"); + if (iConnectTimer->isActive()) + { + iConnectTimer->stop(); + } + break; + default: + break; + } + + popupNote(errorString, HbMessageBox::MessageTypeWarning); +} + +void IRStationsView::cancelRequest() +{ + if( iWaitDialog ) + { + iWaitDialog->close(); + } + + if( iConnectTimer->isActive()) + { + iConnectTimer->stop(); + } + iIsdsClient->isdsCancelRequest(); + disconnectIsdsClient(); +} + +void IRStationsView::startConvert(int aIndex) +{ + QString url = iChannelModel->imageUrl(aIndex); + + IRQPreset tempPreset; + tempPreset.imgUrl = url; + tempPreset.type = IRQPreset::EIsds; + + bool cached = iIsdsClient->isdsIsLogoCached(&tempPreset, KBitmapSize, KBitmapSize); + + if( !cached ) + { + bool network = iApplication->verifyNetworkConnectivity(hbTrId("txt_irad_info_downloading_logos")); + if( !network ) + { + //if user has clicked an item and the connection is being setup, we don't change the reason + if (EIR_UseNetwork_NoReason == getUseNetworkReason()) + { + setUseNetworkReason(EIR_UseNetwork_DownloadLogo); + } + iConvertTimer->stop(); + return; + } + } + + iIsdsClient->isdsLogoDownSendRequest(&tempPreset, 0, KBitmapSize, KBitmapSize); +} + + +//if the logo is downloaded ok +void IRStationsView::presetLogoDownload(IRQPreset* aPreset) +{ + if( NULL == aPreset ) + { + presetLogoDownloadError(); + return; + } + + + delete iLogoPreset; + iLogoPreset = aPreset; + + if (iLogoPreset->logoData != KNullDesC8) + { + QPixmap tempMap; + const unsigned char * logoData = iLogoPreset->logoData.Ptr(); + bool ret = tempMap.loadFromData(logoData, iLogoPreset->logoData.Length()); + QIcon convertIcon(tempMap); + + if( ret ) + { + HbIcon *hbIcon = new HbIcon(convertIcon); + int index = iIconIndexArray[0]; + iChannelModel->setLogo(hbIcon, index); + iIconIndexArray.removeAt(0); + int leftCount = iIconIndexArray.count(); + if( leftCount > 0 ) + { + iConvertTimer->start(); + } + return; + } + } + + presetLogoDownloadError(); +} + +//if the logo download fails +void IRStationsView::presetLogoDownloadError() +{ + // if the logo download fails, try to download the next + iIconIndexArray.removeAt(0); + int leftCount = iIconIndexArray.count(); + if( leftCount > 0 ) + { + iConvertTimer->start(); + } +} + +void IRStationsView::cleanupResource() +{ + iIconIndexArray.clear(); + + //destroy icons in time to save memory + iChannelModel->clearAndDestroyLogos(); +} + +void IRStationsView::networkRequestNotified(IRQNetworkEvent aEvent) +{ + if (getViewManager()->currentView() != this) + { + return; + } + + switch (aEvent) + { + case EIRQNetworkConnectionEstablished: + if (EIR_UseNetwork_StartingView == getUseNetworkReason()) + { + //when stations view is starting view(used to show popular stations), don't show wait dialog + loadPopularStations(false); + } + else if(EIR_UseNetwork_DownloadLogo == getUseNetworkReason()) + { + iApplication->closeConnectingDialog(); + int leftCount = iIconIndexArray.count(); + if(0 != leftCount) + { + iConvertTimer->start(); + } + } + else if (EIR_UseNetwork_SelectItem == getUseNetworkReason()) + { + iApplication->closeConnectingDialog(); + handleItemSelected(); + int leftCount = iIconIndexArray.count(); + if(0 != leftCount) + { + iConvertTimer->start(); + } + } + setUseNetworkReason(EIR_UseNetwork_NoReason); + + break; + + case EIRQConnectingCancelled: + case EIRQDisplayNetworkMessageNoConnectivity: + if (iListView->model()->rowCount() == 0) + { + getViewManager()->activateView(EIRView_MainView); + } + else + { + setCheckedAction(); + } + setUseNetworkReason(EIR_UseNetwork_NoReason); + break; + + default: + setCheckedAction(); + setUseNetworkReason(EIR_UseNetwork_NoReason); + break; + } +} + +void IRStationsView::connectToIsdsClient() +{ + connect(iIsdsClient, SIGNAL(channelItemsChanged(QList *)), + iChannelModel, SLOT(updateData(QList *))); + + connect(iIsdsClient, SIGNAL(operationException(IRQError)), + this, SLOT(operationException(IRQError))); +} + +void IRStationsView::disconnectIsdsClient() +{ + disconnect(iIsdsClient, SIGNAL(channelItemsChanged(QList *)), + iChannelModel, SLOT(updateData(QList *))); + + disconnect(iIsdsClient, SIGNAL(operationException(IRQError)), + this, SLOT(operationException(IRQError))); +} + +void IRStationsView::createWaitDialog(QString aStr) +{ + if (!iWaitDialog) + { + iWaitDialog = new HbMessageBox(aStr, HbMessageBox::MessageTypeInformation); + //iWaitDialog->setTimeout(HbPopupBase::NoTimeout); + iWaitDialog->setTimeout(HbPopup::NoTimeout); // JM: changed in w47 Orbit + iWaitDialog->setModal(true); + //iWaitDialog->setDismissPolicy(HbPopupBase::NoDismiss); + iWaitDialog->setDismissPolicy(HbPopup::NoDismiss); // JM: changed in w47 Orbit + HbAction *cancelAction = new HbAction(hbTrId("txt_common_button_cancel"), iWaitDialog); + iWaitDialog->setPrimaryAction(cancelAction); + connect(cancelAction, SIGNAL(triggered()), this, SLOT(cancelRequest())); + } + + iWaitDialog->exec(); +} + +void IRStationsView::convertAnother() +{ + iConvertTimer->stop(); + int leftCount = iIconIndexArray.count(); + + if(0 != leftCount) + { + startConvert(iIconIndexArray[0]); + } +} + +void IRStationsView::connectTimeOut() +{ + iConnectTimer->stop(); + cancelRequest(); + popupNote(hbTrId("txt_irad_info_connecting_timout"), HbMessageBox::MessageTypeWarning); +}