diff -r 41a7f70b3818 -r 5266b1f337bd phoneapp/phoneuiview/src/cphoneaudiocontroller.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneapp/phoneuiview/src/cphoneaudiocontroller.cpp Wed Sep 01 12:30:10 2010 +0100 @@ -0,0 +1,400 @@ +/* +* Copyright (c) 2005-2007 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 CPhoneAudioController class. +* +*/ + + +// INCLUDE FILES +#include +#include + +#include + +#include +#include +#include +#include +#include "cphoneaudiocontroller.h" +#include "cphonerecoverysystem.h" +#include "cphonecenrepproxy.h" +#include "cphonestatuspane.h" +#include "cphonetimer.h" +#include "tphonecommandparam.h" +#include "tphonecmdparamboolean.h" +#include "tphonecmdparaminteger.h" +#include "phoneconstants.h" +#include "phonelogger.h" +#include "phoneui.hrh" + +// CONSTANTS + +// ================= MEMBER FUNCTIONS ======================= +// C++ default constructor can NOT contain any code, that +// might leave. +// +CPhoneAudioController::CPhoneAudioController() : + iIhfVolume( KPhoneDefaultVolume ), + iEarVolume( KPhoneDefaultVolume ) + { + } + +// --------------------------------------------------------- +// CPhoneAudioController::ConstructL() +// Construction method for CPhoneAudioController. +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CPhoneAudioController::ConstructL() + { + __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioController::ConstructL()"); + + // Start observing foreground events + CCoeEnv::Static()->AddForegroundObserverL( *this ); + + // Create the status pane singleton + iStatusPane = CPhoneStatusPane::Instance(); + + // Create volume controls + iEarVolumeControl = + iStatusPane->NaviPane().CreateVolumeIndicatorL( + R_AVKON_NAVI_PANE_EARPIECE_VOLUME_INDICATOR ); + + iIhfVolumeControl = + iStatusPane->NaviPane().CreateVolumeIndicatorL( + R_AVKON_NAVI_PANE_VOLUME_INDICATOR ); + + // To get touch input, pen check in HandleControlEventL() + iEarVolumeControl->DecoratedControl()->SetObserver( this ); + iIhfVolumeControl->DecoratedControl()->SetObserver( this ); + + iActivateRecoveryId = CPhoneRecoverySystem::Instance()->AddL( + TCallBack( DoRecoverActivateL, this ), + CTeleRecoverySystem::EPhonePriorityStandard, + CTeleRecoverySystem::EPhoneStateIdle ); + } + +// --------------------------------------------------------- +// CPhoneAudioController::NewL() +// Two-phased constructor +// (other items were commented in a header). +// --------------------------------------------------------- +CPhoneAudioController* CPhoneAudioController::NewL() + { + CPhoneAudioController* self = + new( ELeave ) CPhoneAudioController(); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// --------------------------------------------------------- +// Destructor +// --------------------------------------------------------- +// +CPhoneAudioController::~CPhoneAudioController() + { + CCoeEnv::Static()->RemoveForegroundObserver( *this ); + CPhoneRecoverySystem::Remove( iActivateRecoveryId ); + + delete iIhfVolumeControl; + delete iEarVolumeControl; + } + +// --------------------------------------------------------- +// CPhoneAudioController::ActivateVolumeControlL +// --------------------------------------------------------- +// +void CPhoneAudioController::ActivateVolumeControlL() + { + __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioController::ActivateVolumeControlL()"); + iVolumeControlCount++; + if ( iVolumeControlCount == 1 ) // First time activation + { + // Decide whether decorator should be Ear or ihf decorator + CAknNavigationDecorator& selectedVolumeDecorator =VolumeDecorator(); + PushL( selectedVolumeDecorator ); + } + } + +// --------------------------------------------------------- +// CPhoneAudioController::DoRecoverUpdateL +// +// Callback function. +// --------------------------------------------------------- +// +TInt CPhoneAudioController::DoRecoverActivateL( TAny* aAny ) + { + __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioController::DoRecoverActivateL()"); + static_cast< CPhoneAudioController* >( aAny )->ActivateL(); + return KErrNone; + } + +// --------------------------------------------------------- +// CPhoneAudioController::ActivateL +// +// Updates volume control according to current audio data. +// --------------------------------------------------------- +// +void CPhoneAudioController::ActivateL() + { + __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioController::ActivateL()"); + + if( iVolumeControlCount ) + { + // Decide whether decorator should be Ear, Ihf decorator + CAknNavigationDecorator& selectedVolumeDecorator = VolumeDecorator(); + PushL( selectedVolumeDecorator ); + TInt volumeLevel = VolumeLevel(); + SetVolumeLevel( VolumeControl(), volumeLevel ); + } + } + +// --------------------------------------------------------- +// CPhoneAudioController::DeactivateVolumeControl +// --------------------------------------------------------- +// +void CPhoneAudioController::DeactivateVolumeControl() + { + __LOGMETHODSTARTEND( EPhoneUIView,"CPhoneAudioController::DeactivateVolumeControl()" ); + if ( iOldControl ) + { + iStatusPane->NaviPane().Pop( iOldControl ); + iOldControl = NULL; + iVolumeControlCount = 0; + } + } + +// --------------------------------------------------------- +// CPhoneAudioController::HandleVolumeChangeL +// +// Updates incall indicator according to current call state. +// --------------------------------------------------------- +// +void CPhoneAudioController::HandleVolumeChangeL( + TPhoneCommandParam* aCommandParam ) + { + __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioController::HandleVolumeChangeL()"); + if( !iPhoneInForeground ) + { + // Telephony is in the background so it's not our responsibility + // to display the volume control. + __PHONELOG( EBasic, EPhoneUIView,"CPhoneAudioController::HandleVolumeChangeL - phone in the background" ); + return; + } + + TPhoneCmdParamInteger* volumeParam = + static_cast( aCommandParam ); + + if ( iIhfMode ) + { + iIhfVolume = volumeParam->Integer(); + } + else + { + iEarVolume = volumeParam->Integer(); + } + + // Activate the approriate volume control + CPhoneRecoverySystem::Instance()->RecoverNow( + iActivateRecoveryId, + CTeleRecoverySystem::EPhonePriorityStandard ); + + } + +// --------------------------------------------------------- +// CPhoneAudioController::HandleIhfChange +// +// Updates incall indicator according to current call state. +// --------------------------------------------------------- +// +void CPhoneAudioController::HandleIhfChange( + TPhoneCommandParam* aCommandParam ) + { + __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioController::HandleIhfChange()"); + TPhoneCmdParamBoolean* booleanParam = + static_cast( aCommandParam ); + + iIhfMode = booleanParam->Boolean(); + } + +// ----------------------------------------------------------------------------- +// CPhoneAudioController::PushL +// ----------------------------------------------------------------------------- +// +void CPhoneAudioController::PushL( CAknNavigationDecorator& aNew ) + { + __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioController::PushL()"); + TInt err = KErrNone; + if ( !iOldControl ) + { + __PHONELOG( EBasic, EPhoneUIView,"CPhoneAudioController::iStatusPane->NaviPane().PushL( aNew );" ); + iStatusPane->NaviPane().PushL( aNew ); + } + else if ( &aNew != iOldControl ) + { + err = iStatusPane->NaviPane().ReplaceL( *iOldControl, aNew ); + } + // otherwise iOldControl == &aNew. + + if ( err == KErrNone ) + { + iOldControl = &aNew; + } + } + +// ----------------------------------------------------------------------------- +// CPhoneAudioController::HandleControlEventL +// ----------------------------------------------------------------------------- +// +void CPhoneAudioController::HandleControlEventL( + CCoeControl* aControl, + TCoeEvent aEventType ) + { + __LOGMETHODSTARTEND( EPhoneUIView,"CPhoneAudioController::HandleControlEventL()" ); + if ( aEventType == MCoeControlObserver::EEventStateChanged && + AknLayoutUtils::PenEnabled() ) + { + if ( aControl == iEarVolumeControl->DecoratedControl() ) + { + TInt volume = static_cast< CAknVolumeControl* > + ( iEarVolumeControl->DecoratedControl() ) + ->Value(); + + if ( volume != iEarVolume ) + { + // Volume level was changed via ui control + iEarVolume = volume; + CEikonEnv::Static()->EikAppUi()->HandleCommandL( + EPhoneInCallCmdSetVolumeLevel ); + } + } + else if ( aControl == iIhfVolumeControl->DecoratedControl() ) + { + TInt volume = static_cast< CAknVolumeControl* > + ( iIhfVolumeControl->DecoratedControl() ) + ->Value(); + + if ( volume != iIhfVolume ) + { + // Volume level was changed via ui control + iIhfVolume = volume; + CEikonEnv::Static()->EikAppUi()->HandleCommandL( + EPhoneInCallCmdSetVolumeLevel ); + } + } + } + } + +// ----------------------------------------------------------------------------- +// CPhoneAudioController::VolumeLevelFromControl +// ----------------------------------------------------------------------------- +// +TInt CPhoneAudioController::VolumeLevelFromControl() + { + __LOGMETHODSTARTEND( EPhoneUIView,"CPhoneAudioController::VolumeLevelFromControl()" ); + TInt volume = VolumeControl().Value(); + + return volume; + } + +// ----------------------------------------------------------------------------- +// CPhoneAudioController::VolumeDecorator +// ----------------------------------------------------------------------------- +// +CAknNavigationDecorator& CPhoneAudioController::VolumeDecorator() + { + __LOGMETHODSTARTEND( EPhoneUIView,"CPhoneAudioController::VolumeDecorator()" ); + CAknNavigationDecorator* volumeDecorator = NULL; + if ( iIhfMode ) + { + volumeDecorator = iIhfVolumeControl; + } + else + { + volumeDecorator = iEarVolumeControl; + } + + return *volumeDecorator; + } + +// ----------------------------------------------------------------------------- +// CPhoneAudioController::VolumeControl +// ----------------------------------------------------------------------------- +// +CAknVolumeControl& CPhoneAudioController::VolumeControl() + { + __LOGMETHODSTARTEND( EPhoneUIView,"CPhoneAudioController::VolumeControl()" ); + CAknVolumeControl* volumeControl = NULL; + volumeControl = static_cast< CAknVolumeControl* >( + VolumeDecorator().DecoratedControl() ); + + return *volumeControl; + } + +// ----------------------------------------------------------------------------- +// CPhoneAudioController::VolumeLevel +// ----------------------------------------------------------------------------- +// +TInt CPhoneAudioController::VolumeLevel() + { + __LOGMETHODSTARTEND( EPhoneUIView,"CPhoneAudioController::VolumeLevel()" ); + TInt volumeLevel; + if ( iIhfMode ) + { + volumeLevel = iIhfVolume; + } + else + { + volumeLevel = iEarVolume; + } + + return volumeLevel; + } + +// ----------------------------------------------------------------------------- +// CPhoneAudioController::SetVolumeLevel +// ----------------------------------------------------------------------------- +// +void CPhoneAudioController::SetVolumeLevel( + CAknVolumeControl& aVolumeControl, + TInt aVolumeLevel) + { + __LOGMETHODSTARTEND( EPhoneUIView,"CPhoneAudioController::SetVolumeLevel()" ); + aVolumeControl.SetValue( aVolumeLevel ); + + } + +// ----------------------------------------------------------------------------- +// CPhoneAudioController::HandleGainingForeground +// ----------------------------------------------------------------------------- +// +void CPhoneAudioController::HandleGainingForeground() + { + iPhoneInForeground = ETrue; + } + +// ----------------------------------------------------------------------------- +// CPhoneAudioController::HandleLosingForeground +// ----------------------------------------------------------------------------- +// +void CPhoneAudioController::HandleLosingForeground() + { + iPhoneInForeground = EFalse; + } + +// End of file