diff -r cce62ebc198e -r 93c594350b9a fmradio/fmradio/src/fmradiomainview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fmradio/fmradio/src/fmradiomainview.cpp Wed Sep 01 12:30:32 2010 +0100 @@ -0,0 +1,1471 @@ +/* +* Copyright (c) 2005 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: Implementation of the class CFMRadioMainView +* +*/ + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fmradiomusicstorehandler.h" +#include "fmradiobacksteppingservicewrapper.h" +#include "fmradiodocument.h" +#include "fmradiordsreceiverbase.h" +#include "fmradioalfvisualizer.h" +#include "fmradioengine.h" +#include "fmradiomainview.h" +#include "fmradiomaincontainer.h" +#include "fmradioappui.h" +#include "fmradio.hrh" +#include "fmradioengineradiosettings.h" +#include "fmradioalfmediaidle.h" +#include "fmradiopubsub.h" +#include "fmradioalfrdsviewer.h" +#include "fmradioidlecontroller.h" +#include "fmradiologo.h" +#include "debug.h" + +// A debug flag which is used for differentiating between original version and updated +// version, when set will add identifier on Main View title. Used for testing purposes +#undef __FM_UPDATE_PACKAGE__ + +// CONSTANTS + +#ifdef __FM_UPDATE_PACKAGE__ +_LIT( KFMRadioUpdated, " *" ); +#endif + +// Delay in milliseconds for fading out the RDS indicator +const TInt KFMRadioRdsSignalFadeOutDelay = 1000; + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CFMRadioMainView::NewL +// Two-phase constructor of CFMRadioMainView +// --------------------------------------------------------- +// +CFMRadioMainView* CFMRadioMainView::NewL( + CRadioEngine* aRadioEngine, CAlfEnv& aAlfEnv, MChannelListHandler& aObserver ) + { + CFMRadioMainView* self = new (ELeave) CFMRadioMainView( aRadioEngine, aAlfEnv, aObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------- +// CFMRadioMainView::ConstructL +// EPOC two-phased constructor +// --------------------------------------------------------- +// +void CFMRadioMainView::ConstructL() + { + BaseConstructL( R_FMRADIO_MAIN_VIEW ); + PrepareToolbar(); + + if ( !AknLayoutUtils::PenEnabled() ) + { + ShowToolbar( EFalse ); + } + + iRdsSignalTimer = CPeriodic::NewL(CActive::EPriorityStandard); + iMusicStoreHandler = CFMRadioMusicStoreHandler::NewL( R_FMRADIO_MAIN_OPTIONS_MENU ); + iMusicStoreHandler->EnableMusicStore( ETrue ); + + CAknToolbarExtension* toolbarExt = iToolbar->ToolbarExtension(); + CAknButton* operatorStoreButton = NULL; + operatorStoreButton = static_cast( toolbarExt->ControlOrNull( EFMRadioToolbarButtonCmdOperatorMusicStore ) ); + const TDesC& storeName = iMusicStoreHandler->OperatorMusicStoreName(); + + if ( operatorStoreButton ) + { + // set text for button tooltip + operatorStoreButton->State()->SetHelpTextL( storeName ); + } + } + +// --------------------------------------------------------- +// CFMRadioMainView::CFMRadioMainView +// default constructor +// --------------------------------------------------------- +// +CFMRadioMainView::CFMRadioMainView( + CRadioEngine* aRadioEngine, + CAlfEnv& /*aAlfEnv*/, + MChannelListHandler& aObserver) + : iRadioEngine( aRadioEngine ), + iSeeking( EFalse ), + iChangeDirection( EFMRadioStationChangeNone ), + iStartUp( ETrue ), + iObserver( aObserver ) + { + } + +// --------------------------------------------------------- +// CFMRadioMainView::~CFMRadioMainView +// Class destructor +// --------------------------------------------------------- +// +CFMRadioMainView::~CFMRadioMainView() + { + if( iRdsSignalTimer && iRdsSignalTimer->IsActive() ) + { + iRdsSignalTimer->Cancel(); + } + if ( iRdsSignalTimer ) + { + delete iRdsSignalTimer; + iRdsSignalTimer = NULL; + } + + CAlfEnv* alfEnv = CAlfEnv::Static(); + if ( alfEnv && iContainer ) + { + iContainer->RdsViewer().RemoveObserver( this ); + iContainer->Logo().RemoveObserver( this ); + } + + delete iContainer; + iContainer = NULL; + + delete iMusicStoreHandler; + } + +// --------------------------------------------------------- +// TUid CFMRadioMainView::Id +// Return the unique identifier corresponding to this view +// --------------------------------------------------------- +// +TUid CFMRadioMainView::Id() const + { + return KFMRadioMainViewId; + } + +// --------------------------------------------------------- +// CFMRadioMainView::StopSeekL +// Seek operation has completed. Update the view to reflect +// this fact. +// --------------------------------------------------------- +// +void CFMRadioMainView::StopSeekL() + { + FTRACE( FPrint( _L("CFMRadioMainView::StopSeekL Start") ) ); + if ( iContainer && iSeeking) + { + FTRACE( FPrint( _L("CFMRadioMainView::StopSeekL inside first if") ) ); + if ( !AknLayoutUtils::PenEnabled() ) + { + Cba()->SetCommandSetL( R_AVKON_SOFTKEYS_OPTIONS_BACK ); // Change softkeys + Cba()->SetCommandL( CEikButtonGroupContainer::EMiddleSoftkeyPosition, 0, KNullDesC ); + } + else + { + Cba()->SetCommandSetL( R_AVKON_SOFTKEYS_OPTIONS_BACK__SELECT ); // Change softkeys + } + + SetToolbarDimmedState( EFalse ); + iContainer->VisualControl()->StopTuningAnimation(); + iSeeking = EFalse; + Cba()->DrawDeferred(); // Redraw softkeys + } + + CFMRadioAppUi* appUi = static_cast( iCoeEnv->AppUi() ); + + TInt presetIndex = iRadioEngine->GetPresetIndex(); + TInt channelCount = iObserver.Channels().Count(); + + if ( iRadioEngine->GetRadioMode() == CRadioEngine::ERadioPresetMode && + channelCount > 0 && + presetIndex < channelCount ) + { + DisplayChannelL( presetIndex ); + FTRACE( FPrint( _L("CFMRadioMainView::StopSeekL ERadioPresetMode preset index = %d"),iRadioEngine->GetPresetIndex() ) ); + } + else + { + FTRACE( FPrint( _L("CFMRadioMainView::StopSeekL inside else") ) ); + TInt channelIndex = appUi->MatchingChannelL( iRadioEngine->GetTunedFrequency() ); //, need to get here! + if ( channelIndex != KErrNotFound ) + { + FTRACE( FPrint( _L("CFMRadioMainView::StopSeekL if channelIndex is found, channelIndex = %d"),channelIndex ) ); + iRadioEngine->TunePresetL( channelIndex ); //update engine to let it know that we've locked onto a preset. + } + else + { + FTRACE( FPrint( _L("CFMRadioMainView::StopSeekL else, get tuned freq = %d"),iRadioEngine->GetTunedFrequency() ) ); + DisplayChannelL( KErrNotFound ); + } + } + + // show default radio logo + if ( iContainer ) + { + iContainer->IdleController().ShowControl( iContainer->Logo() ); + } + } + +// --------------------------------------------------------- +// CFMRadioMainView::FadeAndShowExit +// Fade the view and all controls associated with it. Change +// the soft keys so that "Exit" is displayed +// --------------------------------------------------------- +// +void CFMRadioMainView::FadeAndShowExit( + TBool aFaded ) + { + iFaded = aFaded; + + if ( iContainer ) + { + if ( aFaded || iRadioEngine->IsInCall() ) // Needs to be faded - headset missing + { + StopDisplayingMenuBar(); // In case options menu is open when headset is disconnected + SetToolbarDimmedState( ETrue ); + TRAP_IGNORE( Cba()->SetCommandSetL( R_FMRADIO_SOFTKEYS_EXIT ) ); // Change softkeys + } + else // Unfade + { + SetToolbarDimmedState( EFalse ); + if ( !AknLayoutUtils::PenEnabled() ) + { + TRAP_IGNORE( Cba()->SetCommandSetL( R_AVKON_SOFTKEYS_OPTIONS_BACK ); // Change softkeys + Cba()->SetCommandL( CEikButtonGroupContainer::EMiddleSoftkeyPosition, 0, KNullDesC ); ) + } + else + { + TRAP_IGNORE ( Cba()->SetCommandSetL( R_AVKON_SOFTKEYS_OPTIONS_BACK__SELECT ); )// Change softkeys + } + } + iContainer->SetFaded( aFaded ); // Unfade controls inside container + Cba()->DrawDeferred(); // Redraw softkeys + } + } + +// --------------------------------------------------------- +// CFMRadioMainView::UpdateDisplayForFocusGained +// Update display to override default behavior +// Can be removed when auto resume is implemented +// --------------------------------------------------------- +// +void CFMRadioMainView::UpdateDisplayForFocusGained() + { + FTRACE( FPrint( _L("CFMRadioMainView::UpdateDisplayForFocusGained") ) ); + FadeAndShowExit( iFaded ); + DetermineActiveMediaIdleComponent(); + } + +// --------------------------------------------------------- +// CFMRadioMainView::SeekL +// Tells the window owning container to display seek note +// and updates softkeys +// --------------------------------------------------------- +// +void CFMRadioMainView::SeekL() + { + if ( iContainer ) + { + HBufC* seekString = StringLoader::LoadLC( R_QTN_FMRADIO_TUNING, iCoeEnv ); + iContainer->VisualControl()->SetStaticInfoTextL( iChangeDirection, *seekString ); + CleanupStack::PopAndDestroy( seekString ); + iContainer->RdsViewer().Reset(); + iContainer->MediaIdle().ResetMediaIdleContent(); + iContainer->ShowRTPlusInteractionIndicator( EFalse, ETrue ); + iContainer->IdleController().ShowControl( iContainer->Logo() ); + iContainer->VisualControl()->StartTuningAnimation(); + iSeeking = ETrue; + SetToolbarDimmedState( ETrue ); + // force update for toolbar extension view + iToolbar->ToolbarExtension()->SetShown( EFalse ); + } + Cba()->SetCommandSetL( R_FMRADIO_MAIN_VIEW_TUNING_STATE_SOFTKEYS ); + + Cba()->DrawDeferred(); // Redraw softkeys + } + +// --------------------------------------------------------- +// CFMRadioMainView::ShowToolbar +// Sets toolbar visibility. +// --------------------------------------------------------- +// +void CFMRadioMainView::ShowToolbar( TBool aVisible ) + { + if ( iToolbar ) + { + iToolbar->SetToolbarVisibility( aVisible ); + iToolbar->UpdateBackground(); + iToolbar->DrawDeferred(); + } + } + +// --------------------------------------------------------- +// CFMRadioMainView::HandleForegroundEventL +// --------------------------------------------------------- +// +void CFMRadioMainView::HandleForegroundEventL(TBool aForeground) + { + CAknView::HandleForegroundEventL(aForeground); + CFMRadioAppUi* appUi = static_cast( AppUi() ); + if ( aForeground ) + { + if ( iStartUp ) + { + iStartUp = EFalse; + CFMRadioRdsReceiverBase& receiver = iRadioEngine->RdsReceiver(); + TBool afEnabled = iRadioEngine->RadioSettings().IsRdsAfSearchEnabled(); + iContainer->ShowRdsInfo( receiver.SignalAvailable(), ETrue, afEnabled ); + TBool showMusicStore = IsRTPlusInterActionIndicatorNeeded(); + iContainer->ShowRTPlusInteractionIndicator(showMusicStore, ETrue); + } + } + else + { + CAlfEnv* env = CAlfEnv::Static(); + if ( iContainer && env ) + { + iContainer->IdleController().DeactivateControls(); + } + } + } + +// --------------------------------------------------------------------------- +// CFMRadioMainView::RdsDataProgrammeService +// --------------------------------------------------------------------------- +// +void CFMRadioMainView::RdsDataProgrammeService( const TDesC& aProgramService ) + { + TRAP_IGNORE( + RdsDataProgrammeServiceL( aProgramService ) + ); + } + +// --------------------------------------------------------------------------- +// CFMRadioMainView::RdsDataPsNameIsStatic +// --------------------------------------------------------------------------- +// +void CFMRadioMainView::RdsDataPsNameIsStatic( TBool aStatic ) + { + TRAP_IGNORE( HandleStaticProgrammeServiceL( aStatic ) ) + } + +// --------------------------------------------------------------------------- +// CFMRadioMainView::RdsDataProgrammeServiceL +// --------------------------------------------------------------------------- +// +void CFMRadioMainView::RdsDataProgrammeServiceL( const TDesC& aProgramService ) + { + FTRACE(FPrint(_L("CFMRadioMainView::RdsDataProgrammeServiceL('%S')"), &aProgramService)); + if( iContainer ) + { + CAlfEnv* alfEnv = CAlfEnv::Static(); + if( alfEnv ) + { + if( aProgramService.Length() > 0 ) + { + TInt presetIndexToDisplay = KErrNotFound; + TInt presetIndex = iRadioEngine->GetPresetIndex(); + // When we haven't preset name, ps name will save as preset name + if ( iRadioEngine->GetRadioMode() == CRadioEngine::ERadioPresetMode && + presetIndex < iObserver.Channels().Count() ) + { + presetIndexToDisplay = presetIndex; + } + SetStationChangeType( EFMRadioStationChangeNone ); + DisplayChannelL( presetIndexToDisplay ); + } + } + } + } + +// --------------------------------------------------------------------------- +// CFMRadioMainView::HandleStaticProgrammeServiceL +// --------------------------------------------------------------------------- +// +void CFMRadioMainView::HandleStaticProgrammeServiceL( TBool aStatic ) + { + FTRACE(FPrint(_L("CFMRadioMainView::HandleStaticProgrammeServiceL(%d)"), aStatic)); + + if( iContainer ) + { + if ( aStatic ) + { + // When we haven't got a name for preset, a static ps name will be saved + TInt channelCount = iObserver.Channels().Count(); + TInt currentPresetIx = iRadioEngine->GetPresetIndex(); + + if ( aStatic && iRadioEngine->GetRadioMode() == CRadioEngine::ERadioPresetMode && + currentPresetIx != KErrNotFound && + channelCount > 0 && + currentPresetIx < channelCount ) + { + const TDesC& stationName = iObserver.Channels()[ currentPresetIx ]->PresetName(); + TInt presetFreq = iObserver.Channels()[ currentPresetIx ]->PresetFrequency(); + + if ( stationName.Length() == 0 && + presetFreq != KErrNotFound && + iRadioEngine->RdsReceiver().ProgrammeService().Length() ) + { + iObserver.Channels()[ currentPresetIx ]->SetPresetNameL( iRadioEngine->RdsReceiver().ProgrammeService() ); + iObserver.UpdateChannelsL( EStoreIndexToRepository, currentPresetIx, 0 ); + // Update station information display + DisplayChannelL( currentPresetIx ); + } + } + iContainer->MediaIdle().AddPsNameToMediaIdleL( iRadioEngine->RdsReceiver().ProgrammeService() ); + } + } + } + +// --------------------------------------------------------- +// CFMRadioMainView::RdsDataRadioText +// --------------------------------------------------------- +// +void CFMRadioMainView::RdsDataRadioText( const TDesC& aRadioText ) + { + FTRACE(FPrint(_L("CFMRadioMainView::RdsDataRadioText('%S')"), &aRadioText)); + if ( iContainer && aRadioText.Length() > 0 ) + { + TRAP_IGNORE( iContainer->SetRdsRadioTextL( aRadioText ) ); + } + } + +// --------------------------------------------------------- +// CFMRadioMainView::RdsDataRadioTextPlus +// --------------------------------------------------------- +// +void CFMRadioMainView::RdsDataRadioTextPlus( const TInt aRadioTextPlusClass, const TDesC& aRadioText ) + { + if ( aRadioTextPlusClass == ERTplusProgramHomepage && + iRadioEngine->GetRadioMode() == CRadioEngine::ERadioPresetMode ) + { + TInt currentPresetIx = iRadioEngine->GetPresetIndex(); + + if ( currentPresetIx < iObserver.Channels().Count() ) + { + TRAP_IGNORE + ( + // save permanently + iRadioEngine->SaveUrlToPresetL( currentPresetIx, aRadioText ); + // save to ui list + iObserver.Channels()[ currentPresetIx ]->SetPresetUrlL( aRadioText ); + ) + } + } + + + if ( IsRTPlusInterActionIndicatorNeeded() ) + { + iContainer->ShowRTPlusInteractionIndicator( ETrue, ETrue ); + if ( !iRadioEngine->MusicStoreNoteDisplayed() ) + { + TRAP_IGNORE( ShowRTPlusFirstTimeDialogL() ) + } + } + } + +// --------------------------------------------------------------------------- +// CFMRadioMainView::IsRTPlusInterActionIndicatorNeeded +// --------------------------------------------------------------------------- +// +TBool CFMRadioMainView::IsRTPlusInterActionIndicatorNeeded() + { + CFMRadioRdsReceiverBase& receiver = iRadioEngine->RdsReceiver(); + TBool songInformation = receiver.RtPlusSong().Length() || + receiver.RtPlusArtist().Length() || + receiver.RtPlusAlbum().Length(); + TBool webLink = receiver.RtPlusProgramUrl().Length() && + iRadioEngine->GetRTPlusSupportLevel() == EFMRadioAllInteractions; + + return songInformation || webLink; + } + +// --------------------------------------------------------------------------- +// CFMRadioMainView::ShowRTPlusFirstTimeDialogL +// --------------------------------------------------------------------------- +// +void CFMRadioMainView::ShowRTPlusFirstTimeDialogL() + { + // to avoid further calls + iRadioEngine->SetMusicStoreNoteDisplayed(); + + HBufC* noteTxt = StringLoader::LoadLC( R_QTN_FMRADIO_RTPLUS_FIRSTTIME, iCoeEnv ); + + CAknMessageQueryDialog* rdsFirstTimeDialog = new (ELeave) CAknMessageQueryDialog; + CleanupStack::PushL( rdsFirstTimeDialog ); + rdsFirstTimeDialog->SetMessageTextL( *noteTxt ); + CleanupStack::Pop( rdsFirstTimeDialog ); + rdsFirstTimeDialog->ExecuteLD( R_FMRADIO_RTPLUS_FIRSTTIME_NOTE ); + + CleanupStack::PopAndDestroy( noteTxt ); + } + +// --------------------------------------------------------------------------- +// CFMRadioMainView::RdsAfSearchBegin +// --------------------------------------------------------------------------- +// +void CFMRadioMainView::RdsAfSearchBegin() + { + } + +// --------------------------------------------------------------------------- +// CFMRadioMainView::RdsAfSearchEnd +// --------------------------------------------------------------------------- +// +void CFMRadioMainView::RdsAfSearchEnd( TUint32 /*aFrequency*/, TInt /*aError*/ ) + { + } + +// --------------------------------------------------------------------------- +// CFMRadioMainView::RdsAfSearchStateChange +// --------------------------------------------------------------------------- +// +void CFMRadioMainView::RdsAfSearchStateChange( TBool aEnabled ) + { + CFMRadioAppUi* appUi = static_cast(AppUi()); + if( appUi->ActiveView() == KFMRadioMainViewId ) + { + CFMRadioRdsReceiverBase& receiver = iRadioEngine->RdsReceiver(); + TBool show = receiver.SignalAvailable(); + iContainer->ShowRdsInfo( show, ETrue, aEnabled ); + } + } + +// --------------------------------------------------------------------------- +// CFMRadioMainView::RdsAvailable +// --------------------------------------------------------------------------- +// +void CFMRadioMainView::RdsAvailable( TBool aAvailable ) + { + CAlfEnv* alfEnv = CAlfEnv::Static(); + if( alfEnv ) + { + CFMRadioAppUi* appUi = static_cast(AppUi()); + + if( appUi->ActiveView() == KFMRadioMainViewId ) + { + if( aAvailable ) + { + iRdsSignalTimer->Cancel(); + TBool afEnabled = iRadioEngine->RadioSettings().IsRdsAfSearchEnabled(); + iContainer->ShowRdsInfo( ETrue, ETrue, afEnabled ); + } + else + { + // Start timer only if it wasn't activated before + if( !iRdsSignalTimer->IsActive() ) + { + // Used for conversing milliseconds to format timer understand, ie. microseconds + const TInt timerMultiplier = 1000; + + // Start timer to fade rds icon after a delay + iRdsSignalTimer->Start( TTimeIntervalMicroSeconds32( KFMRadioRdsSignalFadeOutDelay * timerMultiplier ), + TTimeIntervalMicroSeconds32(0), TCallBack( StaticRdsSignalTimerCallback, this ) ); + } + } + } + } + } + +// --------------------------------------------------------- +// CFMRadioMainView::StaticRdsSignalTimerCallback +// --------------------------------------------------------- +TInt CFMRadioMainView::StaticRdsSignalTimerCallback( TAny* aSelfPtr ) + { + CFMRadioMainView* self = reinterpret_cast(aSelfPtr); + if(self) + { + self->iRdsSignalTimer->Cancel(); + if(self->iContainer) + { + self->iContainer->ShowRdsInfo(EFalse, ETrue); + } + } + return KErrNone; + } + +// --------------------------------------------------------- +// CFMRadioMainView::DisplayChannelL +// Inform the window owning container that it should display +// the frequency and name of the channel specified. +// --------------------------------------------------------- +// +void CFMRadioMainView::DisplayChannelL( TInt aChannelIndex ) + { + FTRACE(FPrint(_L("DisplayChannelL Start, index: %d "), aChannelIndex)); + + if ( iContainer ) + { + iContainer->MediaIdle().ResetMediaIdleContent(); + + if ( aChannelIndex != KErrNotFound ) + { + CRadioEngine::TStationName stationName; + TInt channelNumber = aChannelIndex + 1; + TInt channelFrequency = KErrNotFound; + + iRadioEngine->GetPresetNameAndFrequencyL( aChannelIndex, stationName, channelFrequency ); + + TFMRadioStationChangeType seekDirection = iChangeDirection; + + // Hide index number as the frequency was set by RDS AF search. + if ( iRadioEngine->FrequencySetByRdsAf() && channelFrequency != iRadioEngine->GetTunedFrequency() ) + { + channelNumber = KErrNotFound; + channelFrequency = iRadioEngine->GetTunedFrequency(); + seekDirection = EFMRadioStationChangeNone; + } + + // Update view + iContainer->DisplayChannelInfoL( channelNumber, + stationName, + seekDirection, + channelFrequency ); + + // show '+' indicator if channel exists and url is stored + if ( channelNumber && iObserver.Channels()[ aChannelIndex ]->PresetUrl().Length() ) + { + iContainer->ShowRTPlusInteractionIndicator( ETrue, ETrue ); + } + } + else + { + iContainer->DisplayChannelInfoL( aChannelIndex, + KNullDesC, + iChangeDirection, + iRadioEngine->GetTunedFrequency() ); + } + + FTRACE( FPrint(_L("DisplayChannelL End") ) ); + } + } + +// --------------------------------------------------------- +// CFMRadioMainView::HandleCommandL +// All commands are handled by the AppUi +// --------------------------------------------------------- +// +void CFMRadioMainView::HandleCommandL( TInt aCommand ) + { + CFMRadioAppUi* appUi = static_cast( AppUi() ); + switch ( aCommand ) + { + case EAknSoftkeyBack: + { + const TVwsViewId viewId( TUid::Uid( KUidFMRadioApplication ), Id() ); + if ( !appUi->BackSteppingWrapper().HandleBackCommandL( viewId ) ) + { + // Command not consumed by Back Stepping Service, handle here by going background + TApaTask task( iEikonEnv->WsSession() ); + task.SetWgId( iEikonEnv->RootWin().Identifier() ); + task.SendToBackground(); + } + break; + } + case EMPXPbvCmdInternetGoToWeb: + { + LaunchBrowserL( aCommand ); + break; + } + case EFMRadioCmdChannelList: + { + HandleSaveChannelQueryL(); + appUi->HandleCommandL( aCommand ); + break; + } + case EFMRadioRockerButtonKeyUp: + case EFMRadioRockerButtonKeyDown: + { + // NOP + break; + } + case EAknSoftkeySelect: // MSK + { + if ( !iFaded && !iSeeking ) + { + HandleSaveChannelQueryL(); + appUi->HandleCommandL( EFMRadioCmdChannelList ); + } + break; + } + case EFMRadioRockerButtonKeyLeft: + { + if ( !iFaded && !iSeeking ) + { + appUi->HandleCommandL( EFMRadioCmdPrevChannel ); + } + break; + } + case EFMRadioRockerButtonKeyLeftLong: + { + if ( !iFaded && !iSeeking ) + { + appUi->HandleCommandL( EFMRadioCmdSeekDown ); + } + break; + } + case EFMRadioRockerButtonKeyRight: + { + if ( !iFaded && !iSeeking ) + { + appUi->HandleCommandL( EFMRadioCmdNextChannel ); + } + break; + } + case EFMRadioRockerButtonKeyRightLong: + { + if ( !iFaded && !iSeeking ) + { + appUi->HandleCommandL( EFMRadioCmdSeekUp ); + } + break; + } + case EFMRadioCmdErase: + { + if ( appUi->EraseChannelL( iRadioEngine->GetPresetIndex() ) ) + { + // delete has been confirmed, update station info + if ( iContainer ) + { + if ( IsRTPlusInterActionIndicatorNeeded() ) + { + iContainer->ShowRTPlusInteractionIndicator( ETrue, ETrue ); + } + else + { + iContainer->ShowRTPlusInteractionIndicator( EFalse, ETrue ); + } + } + SetStationChangeType( EFMRadioStationChangeNone ); + iRadioEngine->SetTunerModeOn(); + DisplayChannelL( KErrNotFound ); + } + break; + } + case EFMRadioToolbarButtonCmdToggleIhf: + { + if ( iRadioEngine->GetAudioOutput() == CRadioEngine::EFMRadioOutputHeadset ) + { + appUi->HandleCommandL( EFMRadioCmdActivateIhf ); + } + else + { + appUi->HandleCommandL( EFMRadioCmdDeactivateIhf ); + } + break; + } + default: + { + if ( iMusicStoreHandler->IsMusicStoreCommandId( aCommand ) ) + { + LaunchBrowserL( aCommand ); + } + else + { + appUi->HandleCommandL( aCommand ); + } + break; + } + } + } + +// ---------------------------------------- +// Launch Browser +// ---------------------------------------- +void CFMRadioMainView::LaunchBrowserL( TInt aCommandId ) + { + FTRACE( FPrint(_L("CFMRadioMainView::LaunchBrowserL") ) ); + + CFMRadioRdsReceiverBase& receiver = iRadioEngine->RdsReceiver(); + switch ( aCommandId ) + { + case EMPXPbvCmdInternetGoToWeb: + { + RBuf webLinkToLaunch; + webLinkToLaunch.CleanupClosePushL(); + if ( receiver.RtPlusProgramUrl().Length() ) + { + webLinkToLaunch.CreateL( receiver.RtPlusProgramUrl() ); + } + else if ( iRadioEngine->GetRadioMode() == CRadioEngine::ERadioPresetMode ) + { + webLinkToLaunch.CreateL( + iObserver.Channels()[ iRadioEngine->GetPresetIndex() ]->PresetUrl() ); + } + iMusicStoreHandler->LaunchWebPageL( webLinkToLaunch ); + CleanupStack::PopAndDestroy( &webLinkToLaunch ); + break; + } + default: + iMusicStoreHandler->LaunchMusicStoreL( aCommandId, + receiver.RtPlusSong(), + receiver.RtPlusArtist(), + receiver.RtPlusAlbum() ); + break; + } + } + +// ---------------------------------------------------------------------------------------------------- +// CFMRadioMainView::NotifyRdsTextTimerCompletion() +// From MFMRadioAlfRdsViewObserver +// Called when same RT has stayed on display for 60 sec. +// ---------------------------------------------------------------------------------------------------- +// +void CFMRadioMainView::NotifyRdsTextTimerCompletion() + { + DetermineActiveMediaIdleComponent(); + } +// --------------------------------------------------------- +// CFMRadioMainView::DoActivateL +// Activate the main view +// --------------------------------------------------------- +// +void CFMRadioMainView::DoActivateL( + const TVwsViewId& /*aPrevViewId*/, + TUid /*aCustomMessageId*/, + const TDesC8& /*aCustomMessage*/) + { + CAknTitlePane* titlePane = static_cast( StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) ); + titlePane->SetTextToDefaultL(); +#ifdef __FM_UPDATE_PACKAGE__ + const TDesC* titleText = titlePane->Text(); + TBufC<2> titleAddition( KFMRadioUpdated ); + HBufC* newTitle = HBufC::NewLC( titleText->Length() + titleAddition.Length() ); + newTitle->Des().Copy( *titleText ); + newTitle->Des().Append( titleAddition ); + titlePane->SetTextL( *newTitle, ETrue ); + CleanupStack::PopAndDestroy( newTitle ); +#endif + + if ( !iContainer ) + { + CAlfEnv* alfEnv = CAlfEnv::Static(); + CFMRadioAppUi* appUi = static_cast( AppUi() ); + iContainer = CFMRadioMainContainer::NewL( ClientRect() , *alfEnv, *iRadioEngine ); + iContainer->RdsViewer().SetObserver( this ); + iContainer->Logo().SetObserver( this ); + } + if ( !AknLayoutUtils::PenEnabled() ) + { + // explicitly remove the middle softkey that shouldn't be there. + Cba()->SetCommandL( CEikButtonGroupContainer::EMiddleSoftkeyPosition, 0, KNullDesC ); + } + + SetStationChangeType( EFMRadioStationChangeNone ); + + if ( !iStartUp ) + { + StopSeekL(); //used to trigger a UI update + } + else + { + AppUi()->HandleCommandL( EFMRadioCmdUpdateVolume ); + } + + AppUi()->HandleCommandL( EFMRadioCmdMainViewActive ); + + iRadioEngine->RdsReceiver().AddObserver( this ); + + TBool afEnabled = iRadioEngine->RadioSettings().IsRdsAfSearchEnabled(); + + iContainer->ShowRdsInfo( iRadioEngine->RdsReceiver().SignalAvailable(), EFalse, afEnabled ); + FadeAndShowExit(iFaded); + } + +// --------------------------------------------------------- +// CFMRadioMainView::DoDeactivate +// Deactivate the main view +// --------------------------------------------------------- +// +void CFMRadioMainView::DoDeactivate() + { + CFMRadioAppUi* appUi = static_cast(AppUi()); + + if ( appUi->RadioEngine() ) + { + iRadioEngine->RdsReceiver().RemoveObserver( this ); + } + + if ( iContainer ) + { + CAlfEnv* alfEnv = CAlfEnv::Static(); + if ( alfEnv ) + { + iContainer->RdsViewer().RemoveObserver( this ); + iContainer->RdsViewer().Reset(); + iContainer->Logo().RemoveObserver( this ); + iContainer->IdleController().HideAllControls(); + } + delete iContainer; + iContainer = NULL; + } + } + +// --------------------------------------------------------- +// CFMRadioMainView::DynInitMenuPaneL +// Sets the state of menu items dynamically according to the +// state of application data. +// --------------------------------------------------------- +// +void CFMRadioMainView::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane ) + { + iMusicStoreHandler->InitializeMenuL( aResourceId, aMenuPane ); + + if ( aResourceId == R_FMRADIO_MAIN_OPTIONS_MENU ) // Main menu + { + if ( IsWebLinkAvailable() ) + { + aMenuPane->SetItemDimmed( EMPXPbvCmdInternetGoToWeb, EFalse ); + } + else + { + aMenuPane->SetItemDimmed( EMPXPbvCmdInternetGoToWeb, ETrue ); + } + + if ( iRadioEngine->IsAudioRoutingPossible() ) + { + if ( iRadioEngine->GetAudioOutput() == CRadioEngine::EFMRadioOutputIHF ) + { + // Delete existing menu option and add a new one + aMenuPane->DeleteMenuItem( EFMRadioCmdActivateIhf ); + if ( iRadioEngine->IsHeadsetConnected() ) + { + aMenuPane->SetItemTextL( EFMRadioCmdDeactivateIhf, R_QTN_FMRADIO_OPTIONS_DEACTIVATE ); + } + else + { + aMenuPane->DeleteMenuItem( EFMRadioCmdDeactivateIhf ); + } + } + else + { + // Delete existing menu option and add a new one + aMenuPane->DeleteMenuItem( EFMRadioCmdDeactivateIhf ); + aMenuPane->SetItemTextL( EFMRadioCmdActivateIhf,R_QTN_FMRADIO_OPTIONS_ACTIVATE ); + } + } + else + { + aMenuPane->SetItemDimmed( EFMRadioCmdDeactivateIhf, ETrue ); + aMenuPane->SetItemDimmed( EFMRadioCmdActivateIhf, ETrue ); + } + + // if help is not enabled, disable help option + if ( !FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue ); + } + CFMRadioAppUi* appUi = static_cast( iCoeEnv->AppUi() ); + if ( appUi->MatchingChannelL( iRadioEngine->GetTunedFrequency() ) == KErrNotFound || + iRadioEngine->GetRadioMode() == CRadioEngine::ERadioTunerMode ) // current frequency not saved + { + aMenuPane->SetItemDimmed( EFMRadioCmdRename, ETrue ); + aMenuPane->SetItemDimmed( EFMRadioCmdSaveChannel, EFalse ); + aMenuPane->SetItemDimmed( EFMRadioCmdErase, ETrue ); + } + else + { + aMenuPane->SetItemDimmed( EFMRadioCmdRename, EFalse ); + aMenuPane->SetItemDimmed( EFMRadioCmdSaveChannel, ETrue ); + aMenuPane->SetItemDimmed( EFMRadioCmdErase, EFalse ); + } + } + + if ( aResourceId == R_FMRADIO_OPTIONS_AF_SUB_MENU ) // Rds af search sub menu + { + TBool afEnabled = iRadioEngine->RadioSettings().IsRdsAfSearchEnabled(); + if ( afEnabled ) + { + aMenuPane->SetItemButtonState( EFMRadioCmdDisableRdsAfSearch, EEikMenuItemSymbolIndeterminate ); + aMenuPane->SetItemButtonState( EFMRadioCmdEnableRdsAfSearch, EEikMenuItemSymbolOn ); + } + else + { + aMenuPane->SetItemButtonState( EFMRadioCmdEnableRdsAfSearch, EEikMenuItemSymbolIndeterminate ); + aMenuPane->SetItemButtonState( EFMRadioCmdDisableRdsAfSearch, EEikMenuItemSymbolOn ); + } + } + + } + +// --------------------------------------------------------- +// CFMRadioMainView::LayoutChangedL +// --------------------------------------------------------- +// +void CFMRadioMainView::LayoutChangedL( TInt aType ) + { + if ( iContainer ) + { + iContainer->HandleResourceChange( aType ); + } + } + +// --------------------------------------------------------- +// CFMRadioMainView::SetStationChangeType +// --------------------------------------------------------- +// +void CFMRadioMainView::SetStationChangeType( TFMRadioStationChangeType aChangeType ) + { + iChangeDirection = aChangeType; + } + +// --------------------------------------------------------- +// CFMRadioMainView::PrepareViewForChannelChange +// --------------------------------------------------------- +// +void CFMRadioMainView::PrepareViewForChannelChange() + { + TRAP_IGNORE( PrepareViewForChannelChangeL() ); + } + +// --------------------------------------------------------- +// CFMRadioMainView::PrepareViewForChannelChangeL +// --------------------------------------------------------- +// +void CFMRadioMainView::PrepareViewForChannelChangeL() + { + switch ( iChangeDirection ) + { + case EFMRadioStationChangeNext: // fall through + case EFMRadioStationChangePrevious: + case EFMRadioStationChangeScanUp: + case EFMRadioStationChangeScanDown: + { + if( iContainer ) + { + iContainer->VisualControl()->ScrollOutCurrentStationInformationL( iChangeDirection ); + } + } + break; + default: + { + break; + } + } + if ( iContainer ) + { + iContainer->RdsViewer().Reset(); + } + + if ( iContainer ) + { + iContainer->ShowRTPlusInteractionIndicator( EFalse, ETrue); + } + // force update for toolbar extension view + iToolbar->ToolbarExtension()->SetShown( EFalse ); + } + +// -------------------------------------------------------------------------------- +// CFMRadioMainView::PrepareToolbar +// Prepare toolbar for displaying basic radio command buttons +// -------------------------------------------------------------------------------- +// +void CFMRadioMainView::PrepareToolbar() + { + // get toolbar from view + iToolbar = Toolbar(); + + // Set observer + iToolbar->SetToolbarObserver( this ); + + CAknButton* leftButton = NULL; + CAknButton* rightButton = NULL; + leftButton = static_cast( iToolbar->ControlOrNull( EFMRadioToolbarButtonCmdTuneDown ) ); + rightButton = static_cast( iToolbar->ControlOrNull( EFMRadioToolbarButtonCmdTuneUp) ); + + //set delay after buttons report long key press + if ( leftButton ) + { + leftButton->SetLongPressInterval( KLongPressDelayValueInMicroseconds ); + } + if ( rightButton ) + { + rightButton->SetLongPressInterval( KLongPressDelayValueInMicroseconds ); + } + } + +// -------------------------------------------------------------------------------- +// CFMRadioMainView::OfferToolbarEventL +// Handle commands from toolbar. +// -------------------------------------------------------------------------------- +// +void CFMRadioMainView::OfferToolbarEventL( TInt aCommandId ) + { + // Event modifiers are valid only during CAknToolbar::OfferToolbarEventL + TBool isHandled = EFalse; + if ( iToolbar->EventModifiers() == CAknToolbar::ELongPress ) + { + switch( aCommandId ) + { + case EFMRadioToolbarButtonCmdTuneDown: + { + isHandled = ETrue; + AppUi()->HandleCommandL( EFMRadioCmdSeekDown ); + break; + } + case EFMRadioToolbarButtonCmdTuneUp: + { + isHandled = ETrue; + AppUi()->HandleCommandL( EFMRadioCmdSeekUp ); + break; + } + default: + { + // fall through. + // dont break here because extension list buttons + // seem to report longpress also after the tuning buttons + // are pressed long. + } + } + } + + if ( iToolbar->EventModifiers() != CAknToolbar::ELongPress && + iToolbar->EventModifiers() != CAknToolbar::ELongPressEnded ) + { + switch( aCommandId ) + { + case EFMRadioToolbarButtonCmdTuneDown: + { + isHandled = ETrue; + AppUi()->HandleCommandL( EFMRadioCmdPrevChannel ); + break; + } + case EFMRadioToolbarButtonCmdTuneUp: + { + isHandled = ETrue; + AppUi()->HandleCommandL( EFMRadioCmdNextChannel ); + break; + } + default: + { + // fall through. + // dont break here because extension list buttons + // seem to report longpress also after the tuning buttons + // are pressed long. + } + } + } + if ( !isHandled ) + { + switch( aCommandId ) + { + case EFMRadioToolbarButtonCmdNokiaMusicStore: + { + HandleCommandL( EFMRadioMusicStoreNokiaMusicShop ); + break; + } + case EFMRadioToolbarButtonCmdOperatorMusicStore: + { + HandleCommandL( EFMRadioMusicStoreOperator ); + break; + } + case EFMRadioCmdRename: + { + iToolbar->ToolbarExtension()->SetShown( EFalse ); + HandleCommandL( aCommandId ); + break; + } + case EFMRadioCmdErase: + { + iToolbar->ToolbarExtension()->SetShown( EFalse ); + HandleCommandL( aCommandId ); + break; + } + case EFMRadioCmdChannelList: + { + iToolbar->ToolbarExtension()->SetShown( EFalse ); + HandleCommandL( aCommandId ); + break; + } + default: + { + HandleCommandL( aCommandId ); + break; + } + } + } + } + +// -------------------------------------------------------------------------------- +// CFMRadioMainView::DynInitToolbarL +// from MAknToolbarObserver +// -------------------------------------------------------------------------------- +// +void CFMRadioMainView::DynInitToolbarL( TInt /*aResourceId*/, CAknToolbar* aToolbar ) + { + if ( iToolbar == aToolbar ) + { + CFMRadioAppUi* appUi = static_cast( iCoeEnv->AppUi() ); + CAknToolbarExtension* toolbarExtension = iToolbar->ToolbarExtension(); + + if ( appUi->MatchingChannelL( iRadioEngine->GetTunedFrequency() ) == KErrNotFound || + iRadioEngine->GetRadioMode() == CRadioEngine::ERadioTunerMode ) + { + // current frequency not saved + // show save + toolbarExtension->HideItemL( EFMRadioCmdSaveChannel, EFalse ); + // hide rename + toolbarExtension->HideItemL( EFMRadioCmdRename, ETrue ); + // dim delete + toolbarExtension->SetItemDimmed( EFMRadioCmdErase, ETrue ); + } + else + { + // show rename + toolbarExtension->HideItemL( EFMRadioCmdRename, EFalse ); + // hide save + toolbarExtension->HideItemL( EFMRadioCmdSaveChannel, ETrue ); + // undim delete + toolbarExtension->SetItemDimmed( EFMRadioCmdErase, EFalse ); + } + + if ( IsWebLinkAvailable() ) + { + // show web button + toolbarExtension->HideItemL( EMPXPbvCmdInternetGoToWeb, EFalse ); + } + else + { + // hide web button + toolbarExtension->HideItemL( EMPXPbvCmdInternetGoToWeb, ETrue ); + } + + TBool musicStoreEnabled = iMusicStoreHandler->IsMusicStoreEnabled(); + + if ( iMusicStoreHandler->OperatorMusicStoreAvailable() && musicStoreEnabled ) + { + // show operator store + toolbarExtension->HideItemL( EFMRadioToolbarButtonCmdOperatorMusicStore, EFalse ); + // hide speaker button + toolbarExtension->HideItemL( EFMRadioToolbarButtonCmdToggleIhf, ETrue ); + } + else + { + // hide operator store + toolbarExtension->HideItemL( EFMRadioToolbarButtonCmdOperatorMusicStore, ETrue ); + // show and update speaker button + UpdateToolbarSpeakerButtonStatus(); + toolbarExtension->HideItemL( EFMRadioToolbarButtonCmdToggleIhf, EFalse ); + } + + if ( iMusicStoreHandler->NokiaMusicStoreAvailable() && musicStoreEnabled ) + { + // show Nokia Music Store + toolbarExtension->HideItemL( EFMRadioToolbarButtonCmdNokiaMusicStore, EFalse ); + } + else + { + // hide Nokia Music Store + toolbarExtension->HideItemL( EFMRadioToolbarButtonCmdNokiaMusicStore, ETrue ); + } + } + } + +// -------------------------------------------------------------------------------- +// CFMRadioMainView::SetToolbarDimmedState +// Set the current state of the buttons in the button group +// -------------------------------------------------------------------------------- +// +void CFMRadioMainView::SetToolbarDimmedState( TBool aState ) + { + iToolbar->SetDimmed( aState ); + iToolbar->DrawDeferred(); + } + +// --------------------------------------------------------------------------- +// CFMRadioMainView::HandleSaveChannelQueryL +// show query if the current channel is not saved +// --------------------------------------------------------------------------- +// +void CFMRadioMainView::HandleSaveChannelQueryL() + { + CFMRadioAppUi* appUi = static_cast( iCoeEnv->AppUi() ); + TInt channelIndex = appUi->MatchingChannelL( iRadioEngine->GetTunedFrequency() ); + + if ( KErrNotFound == channelIndex ) + { + TBool accepted = EFalse; // Operation accepted or discarded + CAknQueryDialog* saveQuery = CAknQueryDialog::NewL(); + accepted = saveQuery->ExecuteLD( R_FMRADIO_QUERY_SAVE_CURRENT ); + + if ( accepted ) + { + AppUi()->HandleCommandL( EFMRadioCmdSaveChannel ); + } + } + } + +// -------------------------------------------------------------------------------- +// CFMRadioMainView::SetEmphasis +// From MEikMenuObserver. +// -------------------------------------------------------------------------------- +// +void CFMRadioMainView::SetEmphasis( CCoeControl* aMenuControl, TBool aEmphasis ) + { + CAknView::SetEmphasis( aMenuControl, aEmphasis ); + + if ( iContainer ) + { + if ( aEmphasis ) // options menu opened + { + iOptionsMenuOpen = ETrue; + // deactivate controls to help improve UI performance + iContainer->IdleController().DeactivateControls(); + } + else + { + if ( iOptionsMenuOpen ) + { + // menu has been been really opened so update status + iOptionsMenuOpen = EFalse; + DetermineActiveMediaIdleComponent(); + } + } + } + } + +// -------------------------------------------------------------------------------- +// CFMRadioMainView::LogoDisplayTimeCompleted +// from MFMRadioAlfLogoObserver +// -------------------------------------------------------------------------------- +// +void CFMRadioMainView::LogoDisplayTimeCompleted() + { + DetermineActiveMediaIdleComponent(); + } + +// -------------------------------------------------------------------------------- +// CFMRadioMainView::DetermineActiveMediaIdleComponent +// -------------------------------------------------------------------------------- +// +void CFMRadioMainView::DetermineActiveMediaIdleComponent() + { + CFMRadioAppUi* appUi = static_cast (AppUi()); + TBool wizardHandled = appUi->IsStartupWizardHandled(); + + if ( iContainer && + !iOptionsMenuOpen && + wizardHandled && + IsForeground() ) + { + + if ( iContainer->RdsViewer().IsRdsTextVisibilityTimerCompleted() ) + { + // same text displayed for a while, ok to start idle + iContainer->IdleController().ShowControl( iContainer->MediaIdle() ); + } + else + { + // display the rds text until the NotifyRdsTextTimerCompletion() callback + iContainer->IdleController().ShowControl( iContainer->RdsViewer() ); + } + } + } + +// -------------------------------------------------------------------------------- +// CFMRadioMainView::IsWebLinkAvailabe +// -------------------------------------------------------------------------------- +// +TBool CFMRadioMainView::IsWebLinkAvailable() + { + TBool response = EFalse; + TBool webLinkStored = EFalse; + TInt presetIndex = iRadioEngine->GetPresetIndex(); + + if ( iRadioEngine->GetRadioMode() == CRadioEngine::ERadioPresetMode && + presetIndex < iObserver.Channels().Count() ) + { + if ( iObserver.Channels()[ presetIndex ]->PresetUrl().Length() ) + { + webLinkStored = ETrue; + } + } + + CFMRadioRdsReceiverBase& receiver = iRadioEngine->RdsReceiver(); + + if ( ( receiver.RtPlusProgramUrl().Length() || + webLinkStored ) && + iRadioEngine->GetRTPlusSupportLevel() == EFMRadioAllInteractions ) + { + response = ETrue; + } + + return response; + } + +// -------------------------------------------------------------------------------- +// CFMRadioMainView::UpdateToolbarSpeakerButtonStatus +// -------------------------------------------------------------------------------- +// +void CFMRadioMainView::UpdateToolbarSpeakerButtonStatus() + { + if ( iToolbar && iContainer ) + { + CAknToolbarExtension* toolbarExtension = iToolbar->ToolbarExtension(); + + if ( iRadioEngine->IsAudioRoutingPossible() ) + { + toolbarExtension->SetItemDimmed( EFMRadioToolbarButtonCmdToggleIhf, EFalse ); + CAknButton* speakerButton = NULL; + + speakerButton = static_cast( toolbarExtension->ControlOrNull( EFMRadioToolbarButtonCmdToggleIhf ) ); + + if ( speakerButton ) + { + if ( iRadioEngine->GetAudioOutput() == CRadioEngine::EFMRadioOutputIHF ) + { + speakerButton->SetCurrentState( 1, ETrue ); + } + else + { + speakerButton->SetCurrentState( 0, ETrue ); + } + } + } + else + { + toolbarExtension->SetItemDimmed( EFMRadioToolbarButtonCmdToggleIhf, ETrue ); + } + } + } + +// -------------------------------------------------------------------------------- +// CFMRadioMainView::ShowDefaultLogo +// -------------------------------------------------------------------------------- +// +void CFMRadioMainView::ShowDefaultLogo() + { + // show default radio logo + if ( iContainer ) + { + iContainer->IdleController().ShowControl( iContainer->Logo() ); + } + } + +// End of File