phoneapp/phoneuiview/src/cphoneaudiocontroller.cpp
branchRCL_3
changeset 62 5266b1f337bd
child 81 c26cc2a7c548
--- /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 <aknnavi.h>
+#include <aknnavide.h>
+
+#include <avkon.rsg>
+
+#include <telephonyvariant.hrh>
+#include <eikenv.h>
+#include <eikappui.h>
+#include <AknUtils.h>
+#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<TPhoneCmdParamInteger*>( 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<TPhoneCmdParamBoolean*>( 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