diff -r 1a6714c53019 -r cce62ebc198e radioapp/radiowidgets/src/radiomainview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/radioapp/radiowidgets/src/radiomainview.cpp Tue Aug 31 15:15:02 2010 +0300 @@ -0,0 +1,491 @@ +/* +* 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: +* +*/ + +// System includes +#include +#include +#include +#include +#include +#include +#include +#include +#include // Temporarily here until docml supports frame items + +// User includes +#include "radiowindow.h" +#include "radiomainview.h" +#include "radiofrequencystrip.h" +#include "radiouiengine.h" +#include "radiologger.h" +#include "radiostationcarousel.h" +#include "radiouiloader.h" +#include "radioutil.h" +#include "radiostationmodel.h" +#include "radiofrequencyscanner.h" + +// Constants +const QLatin1String RADIO_MAINVIEW_ACTIVITY_ID( "FMRadioMainView" ); + +/*! + * Temporary convenience function to set frame background until DOCML supports frame items + */ +static void initFrameBackground( RadioUiLoader& uiLoader, + const QString backgroundName, + HbFrameDrawer::FrameType frameType ) +{ + if ( HbLabel* backgroundLabel = uiLoader.findObject( backgroundName ) ) { + QString backgroundName = backgroundLabel->icon().iconName(); + HbFrameItem* frameItem = new HbFrameItem( backgroundName, frameType, backgroundLabel ); + backgroundLabel->setBackgroundItem( frameItem ); + } +} + + +/*! + * + */ +RadioMainView::RadioMainView() : + RadioViewBase( false ), + mCarousel( NULL ), + mFrequencyStrip( NULL ), + mSkippingAction( NULL ), + mAlternateSkipping( false ) +{ +} + +/*! + * + */ +RadioMainView::~RadioMainView() +{ +} + +/*! + * \reimp + * + */ +void RadioMainView::setScanningMode( bool scanning ) +{ + if ( scanning ) { + loadSection( DOCML::FILE_MAINVIEW, DOCML::MV_SECTION_SCANNING ); + } else { + loadSection( DOCML::FILE_MAINVIEW, DOCML::MV_SECTION_NORMAL ); + updateFavoriteButton(); + mFrequencyScanner.take(); + + const bool firsTimeStart = mUiEngine->isFirstTimeStart(); + const int rowCount = mUiEngine->stationModel().rowCount(); + if ( firsTimeStart && rowCount != 0 ) { + mUiEngine->setFirstTimeStartPerformed( true ); + } + } +} + +/*! + * \reimp + * + */ +void RadioMainView::preLazyLoadInit() +{ + initFrameBackground( *mUiLoader, DOCML::MV_NAME_FREQUENCY_BACKGROUND, HbFrameDrawer::NinePieces ); + + initFrameBackground( *mUiLoader, DOCML::MV_NAME_CAROUSEL_BACKGROUND, HbFrameDrawer::NinePieces ); +} + +/*! + * \reimp + * + */ +void RadioMainView::init() +{ + LOG_METHOD; + loadSection( DOCML::FILE_MAINVIEW, DOCML::SECTION_LAZY_LOAD ); + initFrameBackground( *mUiLoader, DOCML::MV_NAME_CAROUSEL_OVERLAY, HbFrameDrawer::NinePieces ); + + mCarousel = mUiLoader->findObject( DOCML::MV_NAME_STATION_CAROUSEL ); + mCarousel->init( *mUiLoader, mUiEngine.data() ); + mCarousel->setLandscape( mMainWindow->orientation() == Qt::Horizontal ); + + mFrequencyStrip = mUiLoader->findObject( DOCML::MV_NAME_FREQUENCY_STRIP ); + mFrequencyStrip->init( mUiEngine.data(), *mUiLoader ); + + RadioStationModel* stationModel = &mUiEngine->stationModel(); + + Radio::connect( mFrequencyStrip, SIGNAL(frequencyChanged(uint,int,int)), + this, SLOT(setFrequencyFromWidget(uint,int,int)) ); + Radio::connect( mCarousel, SIGNAL(frequencyChanged(uint,int,int)), + this, SLOT(setFrequencyFromWidget(uint,int,int)) ); + Radio::connect( mUiEngine.data(), SIGNAL(tunedToFrequency(uint,int)), + this, SLOT(setFrequencyFromEngine(uint,int)) ); + Radio::connect( mFrequencyStrip, SIGNAL(manualSeekChanged(bool)), + this, SLOT(setManualSeekMode(bool)) ); + + Radio::connect( mFrequencyStrip, SIGNAL(skipRequested(int)), + this, SLOT(skip(int)) ); + Radio::connect( mCarousel, SIGNAL(skipRequested(int)), + this, SLOT(skip(int)) ); + Radio::connect( mFrequencyStrip, SIGNAL(seekRequested(int)), + mUiEngine.data(), SLOT(seekStation(int)) ); + + Radio::connect( mUiEngine.data(), SIGNAL(seekingStarted(int)), + this, SLOT(seekingStarted()) ); + Radio::connect( mUiEngine.data(), SIGNAL(antennaStatusChanged(bool)), + this, SLOT(updateAntennaStatus(bool)) ); + Radio::connect( mUiEngine.data(), SIGNAL(audioRouteChanged(bool)), + this, SLOT(updateAudioRoute(bool)) ); + + Radio::connect( stationModel, SIGNAL(favoriteChanged(RadioStation)), + this, SLOT(handleFavoriteChange(RadioStation)) ); + + connectXmlElement( DOCML::MV_NAME_STATIONS_BUTTON, SIGNAL(clicked()), + mMainWindow, SLOT(activateStationsView()) ); + + connectXmlElement( DOCML::MV_NAME_FAVORITE_BUTTON, SIGNAL(clicked()), + this, SLOT(toggleFavorite()) ); + + connectXmlElement( DOCML::MV_NAME_SPEAKER_BUTTON, SIGNAL(clicked()), + mUiEngine.data(), SLOT(toggleAudioRoute()) ); + + connectXmlElement( DOCML::MV_NAME_SCAN_ACTION, SIGNAL(triggered()), + this, SLOT(toggleScanning()) ); + + updateFavoriteButton(); + + connectCommonMenuItem( MenuItem::Exit ); + + // "Play history" menu item + connectViewChangeMenuItem( DOCML::MV_NAME_HISTORYVIEW_ACTION, SLOT(activateHistoryView()) ); + + updateAudioRoute( mUiEngine->isUsingLoudspeaker() ); + + // Add "back" navigation action to put the application to background + HbAction* backAction = new HbAction( Hb::BackNaviAction, this ); +#ifdef BUILD_WIN32 + Radio::connect( backAction, SIGNAL(triggered()), + this, SLOT(quit()) ); +#else + Radio::connect( backAction, SIGNAL(triggered()), + mMainWindow, SLOT(lower()) ); +#endif // BUILD_WIN32 + setNavigationAction( backAction ); + + const bool firsTimeStart = mUiEngine->isFirstTimeStart(); + const int rowCount = mUiEngine->stationModel().rowCount(); + + if ( firsTimeStart && rowCount == 0 ){ + QTimer::singleShot( 4500, this, SLOT(startFirstTimeScanning()) ); + } + + + Radio::connect( static_cast( qApp ), SIGNAL(aboutToQuit()), + this, SLOT(saveActivity()) ); + + emit applicationReady(); +} + +/*! + * \reimp + * + */ +void RadioMainView::setOrientation() +{ + loadSection( DOCML::FILE_MAINVIEW, mMainWindow->orientationSection() ); + if ( mCarousel && mFrequencyStrip ) { + mCarousel->setFrequency( mFrequencyStrip->frequency(), TuneReason::Unspecified ); + mCarousel->setLandscape( mMainWindow->orientation() == Qt::Horizontal ); + } +} + +/*! + * \reimp + * + */ +void RadioMainView::userAccepted() +{ + mFrequencyScanner.reset( new RadioFrequencyScanner( *mUiEngine, this ) ); + mFrequencyScanner->startScanning(); +} + +/*! + * \reimp + * + */ +bool RadioMainView::eventFilter( QObject* watched, QEvent* event ) +{ + if ( event->type() == QEvent::ApplicationDeactivate ) { + mFrequencyStrip->cancelManualSeek(); + } + + return RadioViewBase::eventFilter( watched, event ); +} + +/*! + * Private slot + */ +void RadioMainView::setFrequencyFromWidget( uint frequency, int reason, int direction ) +{ +// LOG_FORMAT( "RadioMainView::setFrequencyFromWidget: %u, reason = %d", frequency, reason ); + if ( !RadioUtil::isScannerAlive() ) { + if ( reason == TuneReason::FrequencyStrip ) { +// mCarousel->setFrequency( frequency, reason, direction ); +// mUiEngine->tuneWithDelay( frequency, reason ); + } else if ( reason == TuneReason::ManualSeekUpdate ) { + mCarousel->setFrequency( frequency, reason, RadioUtil::scrollDirection( direction ) ); + } else if ( reason == TuneReason::ManualSeekTune ) { + LOG_FORMAT( "--------Manual seek tune: %u", frequency ); + mUiEngine->setFrequency( frequency, reason ); + } else if ( reason == TuneReason::StationCarousel ) { + mFrequencyStrip->setFrequency( frequency, reason, RadioUtil::scrollDirection( direction ) ); + mUiEngine->setFrequency( frequency, reason ); + } + } +} + +/*! + * Private slot + */ +void RadioMainView::setFrequencyFromEngine( uint frequency, int reason ) +{ + LOG_FORMAT( "RadioMainView::setFrequencyFromEngine reason: %d", reason ); + if ( RadioUtil::scanStatus() != Scan::ScanningInMainView && !mFrequencyStrip->isInManualSeekMode() ) { + mCarousel->clearInfoText(); + updateFavoriteButton(); + if ( reason != TuneReason::FrequencyStrip && + reason != TuneReason::StationCarousel && + reason != TuneReason::Skip ) { + mCarousel->setFrequency( frequency, reason, Scroll::Shortest ); + mFrequencyStrip->setFrequency( frequency, reason, Scroll::Shortest ); + } + } +} + +/*! + * Private slot + */ +void RadioMainView::skip( int skipMode ) +{ +// if ( !mAlternateSkipping && ( skipMode == StationSkip::PreviousFavorite || skipMode == StationSkip::NextFavorite ) && +// mUiEngine->stationModel().favoriteCount() == 0 ) { +// mCarousel->setInfoText( CarouselInfoText::NoFavorites ); +// } else { + const uint currentFrequency = mFrequencyStrip->frequency(); + RadioStation station; + mUiEngine->stationModel().findFrequency( currentFrequency, station ); + + if ( mAlternateSkipping ) { //TODO: Remove. Temporary test code + if ( sender() == mFrequencyStrip ) { + if ( skipMode == StationSkip::NextFavorite ) { + skipMode = StationSkip::Next; + } else if ( skipMode == StationSkip::PreviousFavorite ) { + skipMode = StationSkip::Previous; + } + } else if ( sender() == mCarousel ) { + if ( skipMode == StationSkip::Next ) { + skipMode = StationSkip::NextFavorite; + } else if ( skipMode == StationSkip::Previous ) { + skipMode = StationSkip::PreviousFavorite; + } + } + } + + const uint frequency = mUiEngine->skipStation( static_cast( skipMode ), + currentFrequency); + + if ( currentFrequency != frequency || station.isFavorite() ) { + const Scroll::Direction direction = RadioUtil::scrollDirectionFromSkipMode( skipMode ); + mCarousel->setFrequency( frequency, TuneReason::Skip, direction ); + mFrequencyStrip->setFrequency( frequency, TuneReason::Skip, direction ); + } +// } +} + +/*! + * Private slot + */ +void RadioMainView::openStationsView() +{ + mFrequencyStrip->cancelManualSeek(); + mMainWindow->activateStationsView(); +} + +/*! + * Private slot + */ +void RadioMainView::startFirstTimeScanning() +{ + if ( mUiEngine->isAntennaAttached() ){ + QTimer::singleShot( 100, this, SLOT(toggleScanning()) ); + } +} + +/*! + * Private slot + */ +void RadioMainView::toggleScanning() +{ + mFrequencyStrip->cancelManualSeek(); + if ( mFrequencyScanner ) { + mFrequencyScanner->cancelScanning(); + } else { + const int rowCount = mUiEngine->stationModel().rowCount(); + if ( rowCount > 0 ) { + askQuestion( hbTrId( "txt_rad_info_all_stations_in_stations_list_will_be" ) ); + } else { + userAccepted(); + } + } +} + +/*! + * Private slot + */ +void RadioMainView::toggleFavorite() +{ + if ( RadioUtil::isScannerAlive() ) { + toggleScanning(); + } else { + mUiEngine->stationModel().setData( QModelIndex(), mFrequencyStrip->frequency(), RadioRole::ToggleFavoriteRole ); + } +} + +/*! + * Private slot + */ +void RadioMainView::seekingStarted() +{ + if ( !RadioUtil::isScannerAlive() ) { + mCarousel->setInfoText( CarouselInfoText::Seeking ); + } +} + +/*! + * Private slot + */ +void RadioMainView::updateAntennaStatus( bool connected ) +{ + if ( !connected ) { + mFrequencyStrip->cancelManualSeek(); + } + + HbAction* scanAction = mUiLoader->findObject( DOCML::MV_NAME_SCAN_ACTION ); + scanAction->setEnabled( connected ); + mCarousel->updateAntennaStatus( connected ); + const bool firsTimeStart = mUiEngine->isFirstTimeStart(); + const int rowCount = mUiEngine->stationModel().rowCount(); + if ( firsTimeStart && rowCount == 0 && connected ){ + QTimer::singleShot( 100, this, SLOT(toggleScanning()) ); + } +} + +/*! + * Private slot + */ +void RadioMainView::updateAudioRoute( bool loudspeaker ) +{ + HbPushButton* loudspeakerButton = mUiLoader->findWidget( DOCML::MV_NAME_SPEAKER_BUTTON ); + if ( loudspeaker ) { + loudspeakerButton->setIcon( HbIcon( "qtg_mono_speaker_off" ) ); + loudspeakerButton->setText( hbTrId( "txt_rad_button_deactivate_loudspeaker" ) ); + } else { + loudspeakerButton->setIcon( HbIcon( "qtg_mono_speaker" ) ); + loudspeakerButton->setText( hbTrId( "txt_rad_button_activate_loudspeaker" ) ); + } +} + +/*! + * Private slot + */ +void RadioMainView::setManualSeekMode( bool manualSeekActive ) +{ + if ( manualSeekActive ) { + qApp->installEventFilter( this ); + + mUiLoader->findWidget( DOCML::MV_NAME_FAVORITE_BUTTON )->setText( hbTrId( "txt_rad_button_add_to_favourites" ) ); + } else { + qApp->removeEventFilter( this ); + + updateFavoriteButton(); + } + + mUiEngine->setManualSeekMode( manualSeekActive ); + + mCarousel->setManualSeekMode( manualSeekActive ); +} + +/*! + * Private slot + */ +void RadioMainView::handleFavoriteChange( const RadioStation& station ) +{ + mFrequencyStrip->updateFavorite( station.frequency() ); + updateFavoriteButton(); +} + +/*! + * Private slot + */ +void RadioMainView::saveActivity() +{ + HbActivityManager* activityManager = qobject_cast(qApp)->activityManager(); + + // Get a screenshot for saving to the activity manager + QSize screenShotSize = mCarousel->size().toSize(); + QPixmap screenShot( screenShotSize ); + QPainter painter( &screenShot ); + + // Draw the background and overlay + HbLabel* backgroundLabel = mUiLoader->findWidget( DOCML::MV_NAME_CAROUSEL_BACKGROUND ); + painter.drawPixmap( 0, 0, backgroundLabel->icon().pixmap().scaled( screenShotSize ) ); + backgroundLabel = mUiLoader->findWidget( DOCML::MV_NAME_CAROUSEL_OVERLAY ); + painter.drawPixmap( 0, 0, backgroundLabel->icon().pixmap().scaled( screenShotSize ) ); + + mCarousel->drawOffScreen( painter ); + + QVariantHash metadata; + metadata.insert( "screenshot", screenShot ); + + #ifdef __WINS__ + screenShot.save( "c:\\radio.bmp" ); + #elif defined BUILD_WIN32 + screenShot.save( "radio.bmp" ); + #endif + + // Update the activity to the activity manager + bool ok = activityManager->removeActivity( RADIO_MAINVIEW_ACTIVITY_ID ); + LOG_ASSERT( ok, LOG( "Failed to remove old activity from Activity Manager!" ) ); + ok = activityManager->addActivity( RADIO_MAINVIEW_ACTIVITY_ID, QVariant(), metadata ); + LOG_ASSERT( ok, LOG( "Failed to update activity to Activity Manager!" ) ); +} + +/*! + * + */ +void RadioMainView::updateFavoriteButton() +{ + RadioStation station; + RadioStationModel& model = mUiEngine->stationModel(); + model.findFrequency( mUiEngine->currentFrequency(), station ); + HbPushButton* favoriteButton = mUiLoader->findWidget( DOCML::MV_NAME_FAVORITE_BUTTON ); + if ( station.isFavorite() ) { + favoriteButton->setText( hbTrId( "txt_fmradio_button_remove_from_favourites" ) ); + favoriteButton->setIcon( HbIcon( "qtg_mono_favourites_remove" ) ); + } else { + favoriteButton->setText( hbTrId( "txt_rad_button_add_to_favourites" ) ); + favoriteButton->setIcon( HbIcon( "qtg_mono_add_to_favourites" ) ); + } +}