diff -r 6df133bd92e1 -r 075425b8d9a4 hswidgetplugin/fmradiohswidgetplugin/src/fmradiohswidget.cpp --- a/hswidgetplugin/fmradiohswidgetplugin/src/fmradiohswidget.cpp Fri Jun 04 10:21:36 2010 +0100 +++ b/hswidgetplugin/fmradiohswidgetplugin/src/fmradiohswidget.cpp Fri Jun 11 13:38:32 2010 +0300 @@ -25,62 +25,52 @@ #include #include #include -#include -#include #include #include #include +#include // User includes #include "fmradiohswidget.h" -#include "fmradiohswidgetprocesshandler.h" #include "fmradiohswidgetprofilereader.h" #include "fmradiohswidgetradioserviceclient.h" #include "radioservicedef.h" #include "radio_global.h" +#include "radiologger.h" /*! \ingroup group_fmradiohs_widget \class FmRadioHsWidget \brief Example implementation for home screen widget. - FmRadioHsWidget derived from the HbWidget and implements - needed functions for the home screen widget. + FmRadioHsWidget implements needed functions for the FM Radio home screen + widget. */ // ======== MEMBER FUNCTIONS ======== /*! Constructs a widget which is a child of \a parent, with widget flags set to \a flags. + + Constructor should be empty and all the actual construction should be + done in onInitialize(). */ FmRadioHsWidget::FmRadioHsWidget(QGraphicsItem* parent, Qt::WindowFlags flags) : HbWidget(parent, flags), - mRadioPushButton(0), - mPreviousPushButton(0), - mPlayPushButton(0), - mNextPushButton(0), - mInformationFirstRowLabel(0), - mInformationSecondRowLabel(0), + mTunerBackgroundPushButton(NULL), + mPowerToggleButton(NULL), + mPreviousPushButton(NULL), + mNextPushButton(NULL), + mInformationFirstRowLabel(NULL), + mInformationSecondRowLabel(NULL), mFmRadioState(Undefined), - mPlayButtonState(PlayEnabled), - mIsFavoriteChannels(false), + mFavoriteStations(false), mRadioInformation(QHash()), - mProcessHandler(0), - mProfileMonitor(new FmRadioHsWidgetProfileReader(this)), - mRadioServiceClient(new FmRadioHsWidgetRadioServiceClient(this)) + mProfileMonitor(NULL), + mRadioServiceClient(NULL), + mRadioStartingCancelTimer(NULL) { - connect(mRadioServiceClient, SIGNAL(radioInformationChanged(int, QVariant)), this, - SLOT(handleRadioInformationChange(int, QVariant))); - connect(mRadioServiceClient, SIGNAL(radioStateChanged(QVariant)), this, - SLOT(handleRadioStateChange(QVariant))); - connect(mProfileMonitor, SIGNAL(radioRunning(QVariant)), this, - SLOT(handleRadioStateChange(QVariant))); - - load(KDocml); - - handleRadioStateChange(mProfileMonitor->radioStatus()); - - //mRadioServiceClient->init(); + LOG_METHOD_ENTER; } /*! @@ -88,6 +78,47 @@ */ FmRadioHsWidget::~FmRadioHsWidget() { + LOG_METHOD; +} + +/*! + Getter for /r mRootPath property. +*/ +QString FmRadioHsWidget::rootPath()const +{ + LOG_METHOD_ENTER; + return mRootPath; +} + +/*! + Sets the mRoothPath propertry to /a roothPath. +*/ +void FmRadioHsWidget::setRootPath(const QString &rootPath) +{ + LOG_METHOD_ENTER; + mRootPath = rootPath; +} + +/*! + Called when widget is initialized. Constructs objects and connects them. +*/ +void FmRadioHsWidget::onInitialize() +{ + LOG_METHOD_ENTER; + mProfileMonitor = new FmRadioHsWidgetProfileReader(this); + mRadioServiceClient = new FmRadioHsWidgetRadioServiceClient(this); + mRadioStartingCancelTimer = new QTimer(this); + + connect(mRadioServiceClient, SIGNAL(radioInformationChanged(int, QVariant)), this, + SLOT(handleRadioInformationChange(int, QVariant))); + connect(mRadioServiceClient, SIGNAL(radioStateChanged(QVariant)), this, + SLOT(handleRadioStateChange(QVariant))); + connect(mProfileMonitor, SIGNAL(radioRunning(QVariant)), this, + SLOT(handleRadioStateChange(QVariant))); + + load(KDocml); + + mProfileMonitor->startMonitoringRadioRunningStatus(); } /*! @@ -95,6 +126,7 @@ */ void FmRadioHsWidget::onShow() { + LOG_METHOD_ENTER; } /*! @@ -102,255 +134,222 @@ */ void FmRadioHsWidget::onHide() { + LOG_METHOD_ENTER; } /*! Loads docml files. */ -void FmRadioHsWidget::load(const QString docml) +void FmRadioHsWidget::load(const QString &docml) { - bool loaded = false; + LOG_METHOD_ENTER; HbDocumentLoader *documentLoader = new HbDocumentLoader(); documentLoader->reset(); + bool loaded = false; documentLoader->load(docml, &loaded); if (loaded) { - HbWidget *widget = qobject_cast (documentLoader->findWidget( + // Find mainLayout + HbWidget *mainLayout = qobject_cast (documentLoader->findWidget( KDocmlObjectNameMainLayout)); - + // For drawing frame backgrounds HbFrameItem *frameItem = NULL; - if (widget) { - //HbWidget *view = qobject_cast (widget); + if (mainLayout) { QGraphicsLinearLayout *mWidgetLayout = new QGraphicsLinearLayout(Qt::Vertical, this); - - HbFrameDrawer *drawer = new HbFrameDrawer("qtg_fr_hswidget_normal", - HbFrameDrawer::NinePieces); - frameItem = new HbFrameItem(drawer, widget); - frameItem->setPreferredSize(widget->preferredSize()); - - mWidgetLayout->addItem(widget); - setLayout(mWidgetLayout); - } - - mRadioPushButton = qobject_cast (documentLoader->findWidget( - KDocmlObjectNameRadioIconPushButton)); - if (mRadioPushButton) { - if (frameItem) { - frameItem->stackBefore(mRadioPushButton); - } - mRadioPushButton->setBackground(HbIcon("qtg_large_radio")); - mRadioPushButton->icon().setSize(mRadioPushButton->preferredSize()); - QObject::connect(mRadioPushButton, SIGNAL(clicked()), this, SLOT(radioToForeground())); - } + + // Temporarily use graphics from resources. Change to the system + // graphics when they are available. + HbFrameDrawer *drawer = new HbFrameDrawer( + ":/ui/resource/qtg_graf_hsradio_bg.png", + HbFrameDrawer::OnePiece); + //HbFrameDrawer *drawer = new HbFrameDrawer("qtg_fr_hswidget_normal", + // HbFrameDrawer::NinePieces); + frameItem = new HbFrameItem(drawer, mainLayout); + frameItem->setPreferredSize(mainLayout->preferredSize()); - mVerticalSeparatorLabel = qobject_cast (documentLoader->findWidget( - KDocmlObjectNameVerticalSeparatorLabel)); - if (mVerticalSeparatorLabel) { - mVerticalSeparatorLabel->setIcon(HbIcon("qtg_graf_divider_v_thin")); - } - - HbWidget *controlAreaLayoutWidget = qobject_cast (documentLoader->findWidget( - KDocmlObjectNameControlAreaLayout)); - if (controlAreaLayoutWidget) { - } - - mPreviousPushButton = qobject_cast (documentLoader->findWidget( - KDocmlObjectNamePreviousPushButton)); - if (mPreviousPushButton) { - changeControlButtonFrameBackground(false, Left, mPreviousPushButton); -/* - HbFrameDrawer *previousButtonFrameDrawer = new HbFrameDrawer("qtg_fr_hsbutton_disabled", - HbFrameDrawer::ThreePiecesHorizontal); - previousButtonFrameDrawer->setFileNameSuffixList(QStringList() << "_l" << "_c" << "_cr"); - mPreviousPushButton->setFrameBackground(previousButtonFrameDrawer); -*/ QObject::connect(mPreviousPushButton, SIGNAL(clicked()), this, SLOT(previousChannel())); - } - - mPlayPushButton = qobject_cast (documentLoader->findWidget( - KDocmlObjectNamePlayPushButton)); - if (mPlayPushButton) { - changeControlButtonFrameBackground(false, Center, mPlayPushButton); -/* HbFrameDrawer *playButtonFrameDrawer = new HbFrameDrawer("qtg_fr_hsbutton_disabled", - HbFrameDrawer::ThreePiecesHorizontal); - playButtonFrameDrawer->setFileNameSuffixList(QStringList() << "_cl" << "_c" << "_cr"); - mPlayPushButton->setFrameBackground(playButtonFrameDrawer); -*/ QObject::connect(mPlayPushButton, SIGNAL(clicked()), this, SLOT(radioToBackground())); - } - - mNextPushButton = qobject_cast (documentLoader->findWidget( - KDocmlObjectNameNextPushButton)); - if (mNextPushButton) { - changeControlButtonFrameBackground(false, Right, mNextPushButton); -/* HbFrameDrawer *nextButtonFrameDrawer = new HbFrameDrawer("qtg_fr_hsbutton_disabled", - HbFrameDrawer::ThreePiecesHorizontal); - nextButtonFrameDrawer->setFileNameSuffixList(QStringList() << "_cl" << "_c" << "_r"); - mNextPushButton->setFrameBackground(nextButtonFrameDrawer); -*/ QObject::connect(mNextPushButton, SIGNAL(clicked()), this, SLOT(nextChannel())); + mWidgetLayout->addItem(mainLayout); + setLayout(mWidgetLayout); } - //bool b = QFile::exists(KCss); - bool a = HbStyleLoader::registerFilePath(KCss); + // Find stacked layout for tuner area. + HbWidget *tunerStackedLayout = qobject_cast (documentLoader->findWidget( + KDocmlObjectNameTunerStackedLayout)); + if (tunerStackedLayout) { + + // Find stacked layout for information area. + HbWidget *tunerInformationStackedLayout = qobject_cast (documentLoader->findWidget( + KDocmlObjectNameTunerInformationStackedLayout)); + if (tunerInformationStackedLayout) { + + // MarqueeItem tests. + /* + QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical, mInformationAreaOneRowLayout); + mInformationLonelyRowMarquee = new HbMarqueeItem(); + mInformationLonelyRowMarquee->setObjectName("marquee3"); + HbStyle::setItemName(mInformationLonelyRowMarquee, "marquee3"); + mInformationLonelyRowMarquee->setText( + "Long text"); + mInformationLonelyRowMarquee->setLoopCount(-1); + mInformationLonelyRowMarquee->startAnimation(); + HbFontSpec fs(HbFontSpec::Secondary); + mInformationLonelyRowMarquee->setFontSpec(fs); + mInformationLonelyRowMarquee->setTextColor(HbColorScheme::color("qtc_hs_list_item_title")); + mInformationLonelyRowMarquee->setPreferredSize(layout->preferredSize()); + layout->addItem(mInformationLonelyRowMarquee); + */ + /* + } + */ + + // Find lonely label + mInformationLonelyRowLabel = qobject_cast (documentLoader->findWidget( + KDocmlObjectNameLonelyRowLabel)); + if (mInformationLonelyRowLabel) { + QColor color = HbColorScheme::color("qtc_radio_tuner_normal"); + if (color.isValid()) { + mInformationLonelyRowLabel->setTextColor(color); + } + } + + // Find layout for two rows + mInformationAreaTwoRowsLayout = qobject_cast ( + documentLoader->findObject(KDocmlObjectNameTwoRowsLayout)); + if (mInformationAreaTwoRowsLayout) { + // Find first row + mInformationFirstRowLabel = qobject_cast (documentLoader->findWidget( + KDocmlObjectNameFirstRowLabel)); + if (mInformationFirstRowLabel) { + QColor color = HbColorScheme::color("qtc_radio_tuner_normal"); + if (color.isValid()) { + mInformationFirstRowLabel->setTextColor(color); + } + } - mInformationAreaTwoRowsLayout = qobject_cast ( - documentLoader->findObject(KDocmlObjectNameTwoRowsLayout)); - if (mInformationAreaTwoRowsLayout) { - /* - QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical, mInformationAreaTwoRowsLayout); - mInformationFirstRowMarquee = new HbMarqueeItem(); - HbStyle::setItemName(mInformationFirstRowMarquee, "marquee1"); - mInformationFirstRowMarquee->setObjectName("marquee1"); - mInformationFirstRowMarquee->setText( - "Long text"); - mInformationFirstRowMarquee->setLoopCount(-1); - mInformationFirstRowMarquee->startAnimation(); - HbFontSpec fs(HbFontSpec::Secondary); - mInformationFirstRowMarquee->setFontSpec(fs); - mInformationFirstRowMarquee->setTextColor(HbColorScheme::color("qtc_hs_list_item_title")); - mInformationFirstRowMarquee->setPreferredSize(layout->preferredSize()); - layout->addItem(mInformationFirstRowMarquee); - - mInformationSecondRowMarquee = new HbMarqueeItem(); - mInformationSecondRowMarquee->setObjectName("marquee2"); - mInformationSecondRowMarquee->setText( - "Long text to test marquee, Long text to test marquee"); - mInformationSecondRowMarquee->setLoopCount(-1); - mInformationSecondRowMarquee->startAnimation(); - mInformationSecondRowMarquee->setFontSpec(fs); - mInformationSecondRowMarquee->setTextColor(HbColorScheme::color("qtc_hs_list_item_title")); - mInformationSecondRowMarquee->setPreferredSize(layout->preferredSize()); - layout->addItem(mInformationSecondRowMarquee); - */ + // Find second row + mInformationSecondRowLabel = qobject_cast (documentLoader->findWidget( + KDocmlObjectNameSecondRowLabel)); + if (mInformationSecondRowLabel) { + QColor color = HbColorScheme::color("qtc_radio_tuner_normal"); + if (color.isValid()) { + mInformationSecondRowLabel->setTextColor(color); + } + } + + } + + + mAnimationIcon = qobject_cast (documentLoader->findWidget( + KDocmlObjectNameAnimationIcon)); + if (mAnimationIcon) { + // Use animation manager to define the frame-by-frame animation. + HbIconAnimationManager *animationManager = HbIconAnimationManager::global(); + + // Create animation definition. + HbIconAnimationDefinition animationDefinition; + QList animationFrameList; + + // This should be probably done by loading axml instead. + HbIconAnimationDefinition::AnimationFrame animationFrame; + QString animationFrameIconName; + QString animationFrameIconNamePrefix = "qtg_anim_loading_"; + for (int i = 1; i < 11; i++) { + animationFrame.duration = 100; + animationFrameIconName.clear(); + animationFrameIconName.append(animationFrameIconNamePrefix); + animationFrameIconName.append(animationFrameIconName.number(i)); + animationFrame.iconName = animationFrameIconName; + animationFrameList.append(animationFrame); + } + animationDefinition.setPlayMode(HbIconAnimationDefinition::Loop); + animationDefinition.setFrameList(animationFrameList); + animationManager->addDefinition("animation", animationDefinition); + + // Construct an icon using the animation definition. + HbIcon icon("animation"); + + mAnimationIcon->setIcon(icon); + } + + } + + // Find push button for tuner area. + mTunerBackgroundPushButton = qobject_cast (documentLoader->findWidget( + KDocmlObjectNameTunerBackgroundPushButton)); + if (mTunerBackgroundPushButton) { + // Test different states. + //bool p = mTunerBackgroundPushButton->setProperty("state", "normal"); + // Try css for controlling the appearance. + //bool b = QFile::exists(KCss); + //bool cssLoaded = HbStyleLoader::registerFilePath(KCss); + //HbStyle::setItemName(mTunerBackgroundPushButton, KDocmlObjectNameTunerBackgroundPushButton); + // Use the frame background. + HbFrameDrawer *tunerBackgroundButtonFrameDrawer = new HbFrameDrawer( + "qtg_fr_tuner", HbFrameDrawer::ThreePiecesHorizontal); + tunerBackgroundButtonFrameDrawer->setFillWholeRect(true); + mTunerBackgroundPushButton->setFrameBackground(tunerBackgroundButtonFrameDrawer); + + // Connect the button's clicked signal. + connect(mTunerBackgroundPushButton, SIGNAL(clicked()), this, SLOT(radioToForeground())); + } + } - mInformationAreaOneRowLayout = qobject_cast (documentLoader->findObject( - KDocmlObjectNameOneRowLayout)); - if (mInformationAreaOneRowLayout) { - /* - QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical, mInformationAreaOneRowLayout); - mInformationLonelyRowMarquee = new HbMarqueeItem(); - mInformationLonelyRowMarquee->setObjectName("marquee3"); - HbStyle::setItemName(mInformationLonelyRowMarquee, "marquee3"); - mInformationLonelyRowMarquee->setText( - "Long text"); - mInformationLonelyRowMarquee->setLoopCount(-1); - mInformationLonelyRowMarquee->startAnimation(); - HbFontSpec fs(HbFontSpec::Secondary); - mInformationLonelyRowMarquee->setFontSpec(fs); - mInformationLonelyRowMarquee->setTextColor(HbColorScheme::color("qtc_hs_list_item_title")); - mInformationLonelyRowMarquee->setPreferredSize(layout->preferredSize()); - layout->addItem(mInformationLonelyRowMarquee); - */ - } - - mInformationAreaAnimationLayout = qobject_cast ( - documentLoader->findObject(QString(KDocmlObjectNameAnimationLayout))); - if (mInformationAreaAnimationLayout) { - } - - mInformationFirstRowLabel = qobject_cast (documentLoader->findWidget( - KDocmlObjectNameFirstRowLabel)); - if (mInformationFirstRowLabel) { - mInformationFirstRowLabel->setTextColor(HbColorScheme::color("qtc_hs_list_item_title")); - } + // Find layout for control buttons. + HbWidget *controlButtonsLayout = qobject_cast (documentLoader->findWidget( + KDocmlObjectNameContolButtonsLayout)); + if (controlButtonsLayout) { + if (frameItem) { + // Stack widget's background behind it. + frameItem->stackBefore(controlButtonsLayout); + } + + // Find power button. + mPowerToggleButton = qobject_cast (documentLoader->findWidget( + KDocmlObjectNameowerToggleButton)); + if (mPowerToggleButton) { + // If power button is lathced type, use this. + //mPowerToggleButton->setCheckable(true); + changeControlButtonFrameBackground(false, Left, mPowerToggleButton); + + // Use the graphics from resources until release contains proper graphics. + mPowerToggleButton->setIcon(HbIcon(":/ui/resource/mono_power.png")); + // Connect the button's clicked signal. + connect(mPowerToggleButton, SIGNAL(clicked()), this, SLOT(radioToBackground())); + } + + // Find previous button. + mPreviousPushButton = qobject_cast (documentLoader->findWidget( + KDocmlObjectNamePreviousPushButton)); + if (mPreviousPushButton) { + changeControlButtonFrameBackground(false, Center, mPreviousPushButton); + // Connect the button's clicked signal. + connect(mPreviousPushButton, SIGNAL(clicked()), this, SLOT(previousChannel())); + } - mInformationSecondRowLabel = qobject_cast (documentLoader->findWidget( - KDocmlObjectNameSecondRowLabel)); - if (mInformationSecondRowLabel) { - mInformationSecondRowLabel->setTextColor(HbColorScheme::color("qtc_hs_list_item_content")); - } - - mInformationLonelyRowLabel = qobject_cast (documentLoader->findWidget( - KDocmlObjectNameLonelyRowLabel)); - if (mInformationLonelyRowLabel) { - mInformationLonelyRowLabel->setTextColor(HbColorScheme::color("qtc_hs_list_item_content")); - } - - mAnimationIcon = qobject_cast (documentLoader->findWidget( - KDocmlObjectNameAnimationIcon)); - if (mAnimationIcon) { - // Use animation manager to define the frame-by-frame animation. - HbIconAnimationManager *animationManager = HbIconAnimationManager::global(); - - // Create animation definition. - HbIconAnimationDefinition animationDefinition; - QList animationFrameList; - - HbIconAnimationDefinition::AnimationFrame animationFrame; - QString animationFrameIconName; - QString animationFrameIconNamePrefix = "qtg_anim_loading_"; - for (int i = 1; i < 11; i++) { - animationFrame.duration = 100; - animationFrameIconName.clear(); - animationFrameIconName.append(animationFrameIconNamePrefix); - animationFrameIconName.append(animationFrameIconName.number(i)); - animationFrame.iconName = animationFrameIconName; - animationFrameList.append(animationFrame); + // Find next button. + mNextPushButton = qobject_cast (documentLoader->findWidget( + KDocmlObjectNameNextPushButton)); + if (mNextPushButton) { + changeControlButtonFrameBackground(false, Right, mNextPushButton); + // Connect the button's clicked signal. + connect(mNextPushButton, SIGNAL(clicked()), this, SLOT(nextChannel())); } - animationDefinition.setPlayMode(HbIconAnimationDefinition::Loop); - animationDefinition.setFrameList(animationFrameList); - animationManager->addDefinition("animation", animationDefinition); - - // Construct an icon using the animation definition. - HbIcon icon("animation"); - - mAnimationIcon->setIcon(icon); } } + // Loader is not needed anymore so it is deleted. delete documentLoader; } /*! - Slot for grouping events. + Slot for closing FM Radio application from power button. */ -bool FmRadioHsWidget::eventFilter(QObject */*target*/, QEvent */*event*/) - { -// This event filter is used to get events from information area layout and from it's components. -// Not yet implemented. -/* - if (target == mFrequencyLabel) { - if (event->type() == QEvent::MouseButtonRelease) { - qDebug() << "MouseButtonRelease"; - return true; - } - else if (event->type() == QEvent::MouseButtonPress) { - qDebug() << "MouseButtonPress"; - return true; - } - else if (event->type() == QEvent::KeyPress) { - qDebug() << "KeyPress"; - return true; - } - else { - return false; - } - } - else { - // pass the event on to the parent class - return HbWidget::eventFilter(target, event); - } -*/ - return false; -} - -/*! - Mute FM Radio audio. - */ -void FmRadioHsWidget::mute() +void FmRadioHsWidget::closeRadio() { - mRadioServiceClient->doControlFmRadioAudio(FmRadioHsWidgetRadioServiceClient::Mute); - //handleRadioStateChange(QVariant(NotControllingAudio)); -} - -/*! - Unmute FM Radio audio. - */ -void FmRadioHsWidget::unMute() -{ - mRadioServiceClient->doControlFmRadioAudio(FmRadioHsWidgetRadioServiceClient::Unmute); - //handleRadioStateChange(QVariant(ControllingAudio)); + LOG_SLOT_CALLER; + mRadioServiceClient->doCloseFmRadio(); } /*! @@ -358,7 +357,9 @@ */ void FmRadioHsWidget::previousChannel() { - mRadioServiceClient->doChangeFmRadioChannel(FmRadioHsWidgetRadioServiceClient::PreviousFavouriteChannel); + LOG_SLOT_CALLER; + clearRadioInformation(); + mRadioServiceClient->doChangeFmRadioStation(FmRadioHsWidgetRadioServiceClient::PreviousFavouriteStation); } /*! @@ -366,253 +367,303 @@ */ void FmRadioHsWidget::nextChannel() { - mRadioServiceClient->doChangeFmRadioChannel(FmRadioHsWidgetRadioServiceClient::NextFavouriteChannel); + LOG_SLOT_CALLER; + clearRadioInformation(); + mRadioServiceClient->doChangeFmRadioStation(FmRadioHsWidgetRadioServiceClient::NextFavouriteStation); } /*! - Slot for radio button clicked. + Slot for bringing the radio application to foreground. */ void FmRadioHsWidget::radioToForeground() { + LOG_SLOT_CALLER; + // If radio is not running start it to foreground by monitor request. if (mFmRadioState == NotRunning) { handleRadioStateChange(QVariant(Starting)); + //mRadioServiceClient->doPowerOnFmRadio(FmRadioHsWidgetRadioServiceClient::ToForeground); mRadioServiceClient->startMonitoring(FmRadioHsWidgetRadioServiceClient::ToForeground); } else { + if (mFmRadioState == Closing) { + // Radio is closing but user wants to power it up again. + mRadioServiceClient->doPowerOnFmRadio(); + mRadioServiceClient->stopMonitoring(); + mRadioServiceClient->startMonitoring(FmRadioHsWidgetRadioServiceClient::ToBackground); + handleRadioStateChange(QVariant(Running)); + } + // If radio is running, bring it to the foreground. mRadioServiceClient->doChangeFmRadioVisibility( FmRadioHsWidgetRadioServiceClient::ToForeground); } } /*! - Slot for radio button clicked. + Slot for putting the radio application to the background. */ void FmRadioHsWidget::radioToBackground() { + LOG_SLOT_CALLER; + // If radio is not running start it to background by monitor request. if (mFmRadioState == NotRunning) { handleRadioStateChange(QVariant(Starting)); mRadioServiceClient->startMonitoring(FmRadioHsWidgetRadioServiceClient::ToBackground); } else if (mFmRadioState == Starting) { - + // Do nothing if radio is starting. + } + else if (mFmRadioState == Closing) { + // Radio is closing but user wants to power it up again. + mRadioServiceClient->doPowerOnFmRadio(); + mRadioServiceClient->stopMonitoring(); + mRadioServiceClient->startMonitoring(FmRadioHsWidgetRadioServiceClient::ToBackground); + handleRadioStateChange(QVariant(Running)); } else { + // If radio is running, put it to the background. + // This is little bit useless because the radio is in background if + // user is able to click the widget. mRadioServiceClient->doChangeFmRadioVisibility( FmRadioHsWidgetRadioServiceClient::ToBackground); } } /*! - Opening of url to the browser. - - /param url Url to be opened. - */ -bool FmRadioHsWidget::openUrl(QUrl url) -{ - return QDesktopServices::openUrl(url); -} + Handles changes in FM Radio information. -/*! - Handles changes in FM Radio information. - /param type Type of changed information. /param value Information content. */ -void FmRadioHsWidget::handleRadioInformationChange( - int notificationId, QVariant value) +void FmRadioHsWidget::handleRadioInformationChange(const int notificationId, + const QVariant &value) { + LOG_METHOD; + LEVEL2(LOG_SLOT_CALLER); if (!value.isValid()) { + // Value is not valid so return. return; } switch ( notificationId ) { case RadioServiceNotification::FavoriteCount: + LEVEL2(LOG("FavoriteCount")); if (value.canConvert(QVariant::Int)) { int favoriteCount = value.toInt(); - mIsFavoriteChannels = favoriteCount > 0 ? true : false; - changeChannelButtonsEnabledState(mIsFavoriteChannels); + // If there are favorite stations, enable the next/previous + // buttons. + mFavoriteStations = favoriteCount > 0 ? true : false; + LEVEL2(LOG_FORMAT("favoriteCount: %d, mFavoriteStations: %d", + favoriteCount, mFavoriteStations)); + changeStationButtonsEnabledState(mFavoriteStations); + } + break; + + case RadioServiceNotification::CurrentIsFavorite: + LEVEL2(LOG("CurrentIsFavorite")); + if (value.canConvert(QVariant::Bool)) { + bool currentIsFavorite = value.toBool(); + LEVEL2(LOG_FORMAT("currentIsFavorite: %d", currentIsFavorite)); + // If favorite count is 1 and current station is favorite + // disable next/prev buttons. + if (currentIsFavorite) { + changeStationButtonsEnabledState(false); + } else { + // Else eneble them. + changeStationButtonsEnabledState(true); + } } break; case RadioServiceNotification::RadioStatus: + LEVEL2(LOG("RadioStatus")); if (value.canConvert(QVariant::Int)) { int status = value.toInt(); switch (status) { case RadioStatus::Playing: + LEVEL2(LOG("Playing")); handleRadioStateChange(QVariant(ControllingAudio)); break; case RadioStatus::Muted: + LEVEL2(LOG("Muted")); handleRadioStateChange(QVariant(NotControllingAudio)); break; case RadioStatus::Seeking: + LEVEL2(LOG("Seeking")); handleRadioStateChange(QVariant(Seeking)); break; case RadioStatus::NoAntenna: + LEVEL2(LOG("NoAntenna")); handleRadioStateChange(QVariant(AntennaNotConnected)); break; + case RadioStatus::PoweringOff: + LEVEL2(LOG("PoweringOff")); + handleRadioStateChange(QVariant(Closing)); + break; default: + LEVEL2(LOG("default")); break; } } break; case RadioServiceNotification::Frequency: + LEVEL2(LOG("Frequency")); if (value.canConvert(QVariant::UInt)) { const uint frequency = value.toUInt(); - QString freqString; - freqString.sprintf("%.1f", qreal(frequency) / KFrequencyMultiplier); + QString frequencyString; + // Format the frequency to human readable text. + frequencyString.sprintf("%.1f", qreal(frequency) / FREQUENCY_MULTIPLIER); + LEVEL2(LOG_FORMAT("frequency: %s", GETSTRING(frequencyString))); + // TODO: Remove comment when localisation is working on device. + //frequencyString = hbTrId("txt_rad_list_l1_mhz").arg(freqString); bool frequencyCleared = false; + // If widget has some frequency information and new frequency + // differs from that if (mRadioInformation.contains(KRadioInformationFrequency) - && mRadioInformation[KRadioInformationFrequency].compare(freqString) != 0) { + && mRadioInformation[KRadioInformationFrequency].compare(frequencyString) != 0) { + // Clear all infromation from widget because station has changed. clearRadioInformation(); frequencyCleared = true; } - bool frequencyUpdated = updateRadioInformation(KRadioInformationFrequency, freqString); + // If widget do not have any frquency information, update it. + bool frequencyUpdated = updateRadioInformation(KRadioInformationFrequency, frequencyString); if (frequencyCleared || frequencyUpdated) { + // Information changed, update the UI. radioInformationChanged(); } } break; case RadioServiceNotification::Name: + LEVEL2(LOG("Name")); if (value.canConvert(QVariant::String)) { if (updateRadioInformation(KRadioInformationStationName, value.toString())) { + LEVEL2(LOG_FORMAT("name: %s", GETSTRING(value.toString()))); radioInformationChanged(); } } break; case RadioServiceNotification::Genre: + LEVEL2(LOG("Genre")); if (value.canConvert(QVariant::String)) { if (updateRadioInformation(KRadioInformationPty, value.toString())) { + LEVEL2(LOG_FORMAT("genre: %s", GETSTRING(value.toString()))); radioInformationChanged(); } } break; case RadioServiceNotification::RadioText: + LEVEL2(LOG("RadioText")); if (value.canConvert(QVariant::String)) { if (updateRadioInformation(KRadioInformationRt, value.toString())) { - radioInformationChanged(); - } - } - break; - - case RadioServiceNotification::HomePage: - if (value.canConvert(QVariant::String)) { - if (updateRadioInformation(KRadioInformationHomePage, value.toString())) { + LEVEL2(LOG_FORMAT("radio text: %s", GETSTRING(value.toString()))); radioInformationChanged(); } } break; - case RadioServiceNotification::Song: + case RadioServiceNotification::DynamicPS: + LOG("DynamicPS"); if (value.canConvert(QVariant::String)) { - if (updateRadioInformation(KRadioInformationSong, value.toString())) { + if (updateRadioInformation(KRadioInformationDynamicPsName, value.toString())) { + LEVEL2(LOG_FORMAT("dynamicPS: %s", GETSTRING(value.toString()))); radioInformationChanged(); } } break; - -/* case FmRadioHsWidgetRadioServiceClient::InformationTypeCallSign: - if (updateRadioInformation(KRadioInformationCallSign, informationText)) { - - } - break; -*/ -/* case FmRadioHsWidgetRadioServiceClient::InformationTypeDynamicPsName: - if (updateRadioInformation(KRadioInformationDynamicPsName, - informationText)) { - - } - break; - */ - default: + LOG("default"); break; } } /*! Check if the the radio information is changed. If it is changed update it. - - /param informationType Type of the information. + + /param informationType Type of the information. /param information Information text. - + /return bool If information is updated, return true. Return false otherwise. */ -bool FmRadioHsWidget::updateRadioInformation(const QString informationType, QString information) +bool FmRadioHsWidget::updateRadioInformation(const QString &informationType, + const QString &information) { - // If hash contains this type + LOG_METHOD_RET("%d"); + // If hash contains this type of information. if (mRadioInformation.contains(informationType)) { - // If new information is empty + // If new information is empty. if (information.isEmpty()) { - // Remove it from the hash + // Remove old information from the hash. + LEVEL2(LOG_FORMAT("informationType: %s removed", GETSTRING(informationType))); mRadioInformation.remove(informationType); - // Return true to indicate the change + // Return true to indicate the change. return true; } - // If new information differs from the old one + // If new information differs from the old one. if (mRadioInformation[informationType].compare(information) != 0) { - // Update the information + // Update the information. + LEVEL2(LOG_FORMAT("informationType: %s = %s", GETSTRING(informationType), GETSTRING(information))); mRadioInformation[informationType] = information; - // And return true to indicate the change + // And return true to indicate the change. return true; } - } else { // Hash do not contain the information - // If new information is not empty + } else { // Hash do not contain this type of information. + // If new information is not empty. if (!information.isEmpty()) { - // Add it to the hash + // Add it to the hash. + LEVEL2(LOG_FORMAT("informationType: %s = %s", GETSTRING(informationType), GETSTRING(information))); mRadioInformation[informationType] = information; - // Return true to indicate the change + // Return true to indicate the change. return true; } } - // Return false to indicate that nothing changed + // Return false to indicate that nothing changed. return false; } /*! - Formatting radio information texts after change. + Formatting radio information texts after a change. */ void FmRadioHsWidget::radioInformationChanged() { - mRadioInformationFirstRow = ""; - mRadioInformationSecondRow = ""; + LOG_METHOD_ENTER; + // Clear the rows. + mRadioInformationFirstRow.clear(); + mRadioInformationSecondRow.clear(); - // Lets formulate the first row, first station name + // First row contains station name. if (mRadioInformation.contains(KRadioInformationStationName)) { mRadioInformationFirstRow.append(mRadioInformation.value(KRadioInformationStationName)); - } - // Second call sign - if (mRadioInformation.contains(KRadioInformationCallSign)) { - mRadioInformationFirstRow.append(" " + mRadioInformation.value(KRadioInformationCallSign)); + } else if (mRadioInformation.contains(KRadioInformationFrequency)) { + // Or frequency. + mRadioInformationFirstRow.append(mRadioInformation.value(KRadioInformationFrequency)); } - // Third frequency - if (mRadioInformation.contains(KRadioInformationFrequency)) { - mRadioInformationFirstRow.append(" " + mRadioInformation.value(KRadioInformationFrequency) - + " " + KMhzText); - } - // Second row of information contains first rt + LEVEL2(LOG_FORMAT("mRadioInformationFirstRow: %s", GETSTRING(mRadioInformationFirstRow))); + + // Second row of information contains radio text. if (mRadioInformation.contains(KRadioInformationRt)) { mRadioInformationSecondRow.append(mRadioInformation.value(KRadioInformationRt)); - } - // Second is dynamic ps name - if (mRadioInformation.contains(KRadioInformationDynamicPsName)) { - mRadioInformationSecondRow.append(" " + mRadioInformation.value( + } else if (mRadioInformation.contains(KRadioInformationDynamicPsName)) { + // Or Dynamic PS name. + mRadioInformationSecondRow.append(mRadioInformation.value( KRadioInformationDynamicPsName)); + } else if (mRadioInformation.contains(KRadioInformationPty)) { + // Or PTY. + mRadioInformationSecondRow.append(mRadioInformation.value(KRadioInformationPty)); } - // Third is pty - if (mRadioInformation.contains(KRadioInformationPty)) { - mRadioInformationSecondRow.append(" " + mRadioInformation.value(KRadioInformationPty)); - } - + LEVEL2(LOG_FORMAT("mRadioInformationSecondRow: %s", GETSTRING(mRadioInformationSecondRow))); + + // If second row is empty. if (mRadioInformationSecondRow.isEmpty()) { + // Show only the lonely row. mInformationLonelyRowLabel->setPlainText(mRadioInformationFirstRow); changeInformationAreaLayout(OneRow); } else { + // Else display both rows. mInformationFirstRowLabel->setPlainText(mRadioInformationFirstRow); mInformationSecondRowLabel->setPlainText(mRadioInformationSecondRow); changeInformationAreaLayout(TwoRows); @@ -620,306 +671,267 @@ } /*! - Clears the radio station information. For example, when the channel is + Clears the radio station information. For example, when the station is changed, old information should be cleared. */ void FmRadioHsWidget::clearRadioInformation() { + LOG_METHOD_ENTER; if (!mRadioInformation.isEmpty()) { + LEVEL2(LOG("clear radioInformation")); mRadioInformation.clear(); } } /*! Handles changes in FM Radio state. - - /param value Information content. + + /param value New state of the radio application. */ -void FmRadioHsWidget::handleRadioStateChange(QVariant value) +void FmRadioHsWidget::handleRadioStateChange(const QVariant &value) { + LOG_METHOD; int state; if (value.canConvert(QVariant::Int)) { state = value.toInt(); } else { return; } - + if (state == mFmRadioState) { // State did not change, so return. return; } - + switch (state) { case Undefined: - // TODO: Some error occured because we do not have the state information. Handle this. + LEVEL2(LOG("Undefined")); + // Something went wrong. Widget should not be in this state after onInitialize(). mFmRadioState = Undefined; break; case NotRunning: + LEVEL2(LOG("NotRunning")); mFmRadioState = NotRunning; mRadioServiceClient->stopMonitoring(); - //changeControlButtonState(ChannelsDisabledPlay); - QObject::disconnect(mPlayPushButton, SIGNAL(clicked()), this, - SLOT(unMute())); - QObject::disconnect(mPlayPushButton, SIGNAL(clicked()), this, - SLOT(mute())); - QObject::connect(mPlayPushButton, SIGNAL(clicked()), this, - SLOT(radioToBackground())); - changePlayButtonState(PlayEnabled); - mIsFavoriteChannels = false; - changeChannelButtonsEnabledState(false); + changePowerButtonOn(false); + mFavoriteStations = false; + changeStationButtonsEnabledState(false); + clearRadioInformation(); mInformationFirstRowLabel->setPlainText(""); mInformationSecondRowLabel->setPlainText(""); - mInformationLonelyRowLabel->setPlainText(KFmRadioText); + mInformationLonelyRowLabel->setPlainText(hbTrId("txt_rad_list_fm_radio")); changeInformationAreaLayout(OneRow); break; case Starting: + LEVEL2(LOG("Starting")); mFmRadioState = Starting; - //changeControlButtonState(ChannelsDisabledStop); - changePlayButtonState(StopDisabled); - // TODO: What should the stop button do? Should it close the radio? - changeChannelButtonsEnabledState(false); + changePowerButtonOn(true); + changeStationButtonsEnabledState(false); changeInformationAreaLayout(Animation); + // This timer is workaround to recover from situation where radio is + // started from widget but user answers no to the offline start dialog. + // Stop timer if it is running. + stopRadioStartingCancelTimer(); + // Set timer as single shot. + mRadioStartingCancelTimer->setSingleShot(true); + // Connect timeout. + connect(mRadioStartingCancelTimer, SIGNAL(timeout()), this, + SLOT(cancelRadioStartingState())); + // Start to timeout after delay. + mRadioStartingCancelTimer->start(KRadioStartingStateCancelDelay); break; case Running: + LEVEL2(LOG("Running")); mFmRadioState = Running; - mRadioServiceClient->startMonitoring(FmRadioHsWidgetRadioServiceClient::DoNotChange); - //changeControlButtonState(ChannelsEnabledStop); - QObject::disconnect(mPlayPushButton, SIGNAL(clicked()), this, - SLOT(radioToBackground())); - QObject::disconnect(mPlayPushButton, SIGNAL(clicked()), this, - SLOT(unMute())); - QObject::connect(mPlayPushButton, SIGNAL(clicked()), this, - SLOT(mute())); - changePlayButtonState(StopEnabled); - changeChannelButtonsEnabledState(mIsFavoriteChannels); + // Stop timer if it is running because radio is now running. + stopRadioStartingCancelTimer(); + mRadioServiceClient->startMonitoring( + FmRadioHsWidgetRadioServiceClient::DoNotChange); + changePowerButtonOn(true); + changeStationButtonsEnabledState(mFavoriteStations); changeInformationAreaLayout(OneRow); break; case ControllingAudio: + LEVEL2(LOG("ControllingAudio")); mFmRadioState = ControllingAudio; - //changeControlButtonState(ChannelsEnabledStop); - QObject::disconnect(mPlayPushButton, SIGNAL(clicked()), this, - SLOT(radioToBackground())); - QObject::disconnect(mPlayPushButton, SIGNAL(clicked()), this, - SLOT(unMute())); - QObject::connect(mPlayPushButton, SIGNAL(clicked()), this, - SLOT(mute())); - changePlayButtonState(StopEnabled); - changeChannelButtonsEnabledState(mIsFavoriteChannels); + changeStationButtonsEnabledState(mFavoriteStations); radioInformationChanged(); break; case NotControllingAudio: + LEVEL2(LOG("NotControllingAudio")); mFmRadioState = NotControllingAudio; - //changeControlButtonState(ChannelsEnabledPlay); - QObject::disconnect(mPlayPushButton, SIGNAL(clicked()), this, - SLOT(radioToBackground())); - QObject::disconnect(mPlayPushButton, SIGNAL(clicked()), this, - SLOT(mute())); - QObject::connect(mPlayPushButton, SIGNAL(clicked()), this, - SLOT(unMute())); - changePlayButtonState(PlayEnabled); - changeChannelButtonsEnabledState(mIsFavoriteChannels); + changeStationButtonsEnabledState(mFavoriteStations); radioInformationChanged(); break; case Seeking: + LEVEL2(LOG("Seeking")); mFmRadioState = Seeking; - //changeControlButtonState(AllDisabledStop); - changePlayButtonState(StopDisabled); - changeChannelButtonsEnabledState(false); + changeStationButtonsEnabledState(false); changeInformationAreaLayout(Animation); break; case AntennaNotConnected: + LEVEL2(LOG("AntennaNotConnected")); mFmRadioState = AntennaNotConnected; - //changeControlButtonState(AllDisabledPlay); - changePlayButtonState(StopDisabled); - changeChannelButtonsEnabledState(false); + changeStationButtonsEnabledState(false); mInformationFirstRowLabel->setPlainText(""); mInformationSecondRowLabel->setPlainText(""); - mInformationLonelyRowLabel->setPlainText(KConnectHeadsetText); + mInformationLonelyRowLabel->setPlainText(hbTrId("txt_rad_info_connect_wired_headset")); + changeInformationAreaLayout(OneRow); + break; + case Closing: + LEVEL2(LOG("Closing")); + mFmRadioState = Closing; + changePowerButtonOn(false); + changeStationButtonsEnabledState(false); + clearRadioInformation(); + mInformationFirstRowLabel->setPlainText(""); + mInformationSecondRowLabel->setPlainText(""); + mInformationLonelyRowLabel->setPlainText(hbTrId("txt_rad_list_fm_radio")); changeInformationAreaLayout(OneRow); break; default: - break; - } -} - -/*! - Changes visible layout of information area. - - /param InformationAreaLayout The layout to switch visible. - */ -void FmRadioHsWidget::changeInformationAreaLayout(InformationAreaLayout layout) -{ - switch (layout) { - case OneRow: - mInformationAreaOneRowLayout->show(); - ((QGraphicsWidget*) mInformationAreaTwoRowsLayout)->hide(); - mInformationAreaAnimationLayout->hide(); - break; - case TwoRows: - mInformationAreaOneRowLayout->hide(); - ((QGraphicsWidget*) mInformationAreaTwoRowsLayout)->show(); - mInformationAreaAnimationLayout->hide(); - break; - case Animation: - mInformationAreaOneRowLayout->hide(); - ((QGraphicsWidget*) mInformationAreaTwoRowsLayout)->hide(); - mInformationAreaAnimationLayout->show(); - break; - default: + LOG("default"); break; } } /*! - Changes state of the control buttons. - - /param ControlButtonState State of the control buttons. + Changes visible widgets of information area stacked layout. + + /param InformationAreaLayout The layout to switch visible. */ -void FmRadioHsWidget::changeControlButtonState(ControlButtonState buttonState) +void FmRadioHsWidget::changeInformationAreaLayout(const InformationAreaLayout layout) { - QString iconName; - switch (buttonState) { - case AllDisabledPlay: - changeControlButtonFrameBackground(false, Left, mPreviousPushButton); - iconName.append("qtg_mono_play"); - mPlayPushButton->setIcon(HbIcon(iconName)); - changeControlButtonFrameBackground(false, Center, mPlayPushButton); - changeControlButtonFrameBackground(false, Right, mNextPushButton); - break; - case AllDisabledStop: - changeControlButtonFrameBackground(false, Left, mPreviousPushButton); - iconName.append("qtg_mono_stop"); - mPlayPushButton->setIcon(HbIcon(iconName)); - changeControlButtonFrameBackground(false, Center, mPlayPushButton); - changeControlButtonFrameBackground(false, Right, mNextPushButton); + LOG_METHOD; + switch (layout) { + case OneRow: + LEVEL2(LOG("OneRow")); + mInformationLonelyRowLabel->show(); + mInformationAreaTwoRowsLayout->hide(); + mAnimationIcon->hide(); break; - case ChannelsDisabledPlay: - changeControlButtonFrameBackground(false, Left, mPreviousPushButton); - QObject::disconnect(mPlayPushButton, SIGNAL(clicked()), this, - SLOT(unMute())); - QObject::disconnect(mPlayPushButton, SIGNAL(clicked()), this, - SLOT(mute())); - QObject::connect(mPlayPushButton, SIGNAL(clicked()), this, - SLOT(radioToBackground())); - iconName.append("qtg_mono_play"); - mPlayPushButton->setIcon(HbIcon(iconName)); - changeControlButtonFrameBackground(true, Center, mPlayPushButton); - changeControlButtonFrameBackground(false, Right, mNextPushButton); - break; - case ChannelsDisabledStop: - changeControlButtonFrameBackground(false, Left, mPreviousPushButton); - iconName.append("qtg_mono_stop"); - mPlayPushButton->setIcon(HbIcon(iconName)); - changeControlButtonFrameBackground(true, Center, mPlayPushButton); - changeControlButtonFrameBackground(false, Right, mNextPushButton); + case TwoRows: + LEVEL2(LOG("TwoRows")); + mInformationLonelyRowLabel->hide(); + mInformationAreaTwoRowsLayout->show(); + mAnimationIcon->hide(); break; - case ChannelsEnabledPlay: - changeControlButtonFrameBackground(true, Left, mPreviousPushButton); - QObject::disconnect(mPlayPushButton, SIGNAL(clicked()), this, - SLOT(radioToBackground())); - QObject::disconnect(mPlayPushButton, SIGNAL(clicked()), this, - SLOT(mute())); - QObject::connect(mPlayPushButton, SIGNAL(clicked()), this, - SLOT(unMute())); - iconName.append("qtg_mono_play"); - mPlayPushButton->setIcon(HbIcon(iconName)); - changeControlButtonFrameBackground(true, Center, mPlayPushButton); - changeControlButtonFrameBackground(true, Right, mNextPushButton); - break; - case ChannelsEnabledStop: - changeControlButtonFrameBackground(true, Left, mPreviousPushButton); - QObject::disconnect(mPlayPushButton, SIGNAL(clicked()), this, - SLOT(radioToBackground())); - QObject::disconnect(mPlayPushButton, SIGNAL(clicked()), this, - SLOT(unMute())); - QObject::connect(mPlayPushButton, SIGNAL(clicked()), this, - SLOT(mute())); - iconName.append("qtg_mono_stop"); - mPlayPushButton->setIcon(HbIcon(iconName)); - changeControlButtonFrameBackground(true, Center, mPlayPushButton); - changeControlButtonFrameBackground(true, Right, mNextPushButton); + case Animation: + LEVEL2(LOG("Animation")); + mInformationLonelyRowLabel->hide(); + mInformationAreaTwoRowsLayout->hide(); + mAnimationIcon->show(); break; default: + LOG("default"); break; } } /*! - Changes enabled state of channel buttons. - + Changes state of power button. + */ -void FmRadioHsWidget::changePlayButtonState(PlayButtonState buttonState) +void FmRadioHsWidget::changePowerButtonOn(const bool isPowerOn) { + LOG_METHOD; QString iconName; - bool enabled = false; - switch (buttonState) { - case PlayDisabled: - iconName.append("qtg_mono_play"); - mPlayPushButton->setIcon(HbIcon(iconName)); - enabled = false; - break; - case PlayEnabled: - iconName.append("qtg_mono_play"); - mPlayPushButton->setIcon(HbIcon(iconName)); - enabled = true; - break; - case StopDisabled: - iconName.append("qtg_mono_stop"); - mPlayPushButton->setIcon(HbIcon(iconName)); - enabled = false; - break; - case StopEnabled: - iconName.append("qtg_mono_stop"); - mPlayPushButton->setIcon(HbIcon(iconName)); - enabled = true; - break; - default: - break; + if (isPowerOn) { + LEVEL2(LOG("Power on")); + // Change icon to reflect power on state. + iconName.append("qtg_mono_power"); + mPowerToggleButton->setIcon(HbIcon(":/ui/resource/mono_power.png")); + mPowerToggleButton->setText("Off"); + // Connect clicked to closeRadio slot. + disconnect(mPowerToggleButton, SIGNAL(clicked()), this, + SLOT(radioToBackground())); + connect(mPowerToggleButton, SIGNAL(clicked()), this, + SLOT(closeRadio())); + } else { + LEVEL2(LOG("Power off")); + // Change icon to reflect power off state. + iconName.append("qtg_mono_power"); + mPowerToggleButton->setIcon(HbIcon(":/ui/resource/mono_power.png")); + mPowerToggleButton->setText("On"); + // Connect clicked to radioToBackground slot. + disconnect(mPowerToggleButton, SIGNAL(clicked()), this, + SLOT(closeRadio())); + connect(mPowerToggleButton, SIGNAL(clicked()), this, + SLOT(radioToBackground())); } - changeControlButtonFrameBackground(enabled, Center, mPlayPushButton); + changeControlButtonFrameBackground(true, Left, mPowerToggleButton); } /*! - Changes enabled state of channel buttons. - + Changes enabled state of station buttons. + */ -void FmRadioHsWidget::changeChannelButtonsEnabledState(bool enabled) +void FmRadioHsWidget::changeStationButtonsEnabledState(const bool enabled) { - changeControlButtonFrameBackground(enabled, Left, mPreviousPushButton); + LOG_METHOD_ENTER; + changeControlButtonFrameBackground(enabled, Center, mPreviousPushButton); changeControlButtonFrameBackground(enabled, Right, mNextPushButton); } /*! Changes background of control button. - + /param enabled Is button enabled or disabled. /param position Position of the control button in button group. /param button The button to change the background. */ -void FmRadioHsWidget::changeControlButtonFrameBackground(bool enabled, - ControlButtonPosition position, HbPushButton *button) +void FmRadioHsWidget::changeControlButtonFrameBackground(const bool enabled, + const ControlButtonPosition position, HbPushButton *button) { + LOG_METHOD_ENTER; QString frameGraphicsName("qtg_fr_hsbutton_"); if (enabled) { frameGraphicsName.append("normal"); } else { frameGraphicsName.append("disabled"); } + LEVEL2(LOG_FORMAT("frameGraphicsName: %s", GETSTRING(frameGraphicsName))); HbFrameDrawer *frameDrawer = new HbFrameDrawer(frameGraphicsName, HbFrameDrawer::ThreePiecesHorizontal); switch (position) { case Left: + LEVEL2(LOG("Left")); frameDrawer->setFileNameSuffixList(QStringList() << "_l" << "_c" << "_cr"); break; case Center: + LEVEL2(LOG("Center")); frameDrawer->setFileNameSuffixList(QStringList() << "_cl" << "_c" << "_cr"); break; case Right: + LEVEL2(LOG("Right")); frameDrawer->setFileNameSuffixList(QStringList() << "_cl" << "_c" << "_r"); break; default: + LOG("default"); break; } button->setFrameBackground(frameDrawer); button->setEnabled(enabled); } + +/*! + Radio did not start on time. Let's reset the widget's state. + + */ +void FmRadioHsWidget::cancelRadioStartingState() +{ + LOG_SLOT_CALLER; + handleRadioStateChange(QVariant(NotRunning)); +} + +/*! + Stop the timer canceling radio starting state. + + */ +void FmRadioHsWidget::stopRadioStartingCancelTimer() +{ + LOG_METHOD_ENTER; + if (mRadioStartingCancelTimer->isActive()) { + mRadioStartingCancelTimer->stop(); + } +}