diff -r cce62ebc198e -r 93c594350b9a radioapp/radiowidgets/src/radiomainview.cpp --- a/radioapp/radiowidgets/src/radiomainview.cpp Tue Aug 31 15:15:02 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,491 +0,0 @@ -/* -* 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" ) ); - } -}