camerauis/cameraapp/generic/src/cambatterypanecontroller.cpp
changeset 0 1ddebce53859
child 57 2c87b2808fd7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/camerauis/cameraapp/generic/src/cambatterypanecontroller.cpp	Thu Jan 07 16:18:56 2010 +0200
@@ -0,0 +1,466 @@
+/*
+* Copyright (c) 2007-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:  Implemantation for CCamBatteryPaneController class.
+*
+*  Copyright © 2007-2008 Nokia.  All rights reserved.
+*  This material, including documentation and any related computer
+*  programs, is protected by copyright controlled by Nokia.  All
+*  rights are reserved.  Copying, including reproducing, storing,
+*  adapting or translating, any or all of this material requires the
+*  prior written consent of Nokia.  This material also contains
+*  confidential information which may not be disclosed to others
+*  without the prior written consent of Nokia.
+
+*
+*
+*/
+
+
+#include "cambatterypanecontroller.h"
+
+#include <e32base.h>
+#include <e32property.h>                // RProperty
+#include <hwrmpowerstatesdkpskeys.h>    // P&S keys
+#include <eikdef.h>                     // KEikColorResourceChange
+#include <AknsConstants.h>              // KAknsMessageSkinChange 
+
+#include "cambatterypanedrawer.h"
+#include "CamPropertyWatcher.h"
+#include "CamUtility.h"
+#include "CamAppUi.h"
+
+
+// ---------------------------------------------------------------------------
+// CCamBatteryPaneController::CCamBatteryPaneController
+// ---------------------------------------------------------------------------
+//
+CCamBatteryPaneController::CCamBatteryPaneController(
+    MCamBatteryPaneObserver& aObserver, TBool aCallbackActive ) :
+    iObserver( aObserver ), iCallbackActive( aCallbackActive )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CCamBatteryPaneController::~CCamBatteryPaneController
+// ---------------------------------------------------------------------------
+//
+CCamBatteryPaneController::~CCamBatteryPaneController()
+  {
+  PRINT ( _L("Camera => ~CCamBatteryPaneController") );
+  
+  if (iTicker)
+    {
+    iTicker->Cancel();
+    }
+  delete iTicker;	
+  delete iDrawer;	 
+  delete iBatteryStrengthWatcher;    
+  delete iBatteryChargingWatcher;
+  
+  PRINT ( _L("Camera <= ~CCamBatteryPaneController") ); 	   
+  }
+
+// ---------------------------------------------------------------------------
+// CCamBatteryPaneController::NewL
+// ---------------------------------------------------------------------------
+//
+CCamBatteryPaneController* CCamBatteryPaneController::NewL(
+    MCamBatteryPaneObserver& aObserver,
+    TBool aCallbackActive )
+    {
+    PRINT ( _L("Camera => CCamBatteryPaneController::NewL") );		
+    
+    CCamBatteryPaneController* self = new (ELeave) CCamBatteryPaneController(
+            aObserver, aCallbackActive );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop(); // self
+    PRINT ( _L("Camera <= CCamBatteryPaneController::NewL") );
+    return self;    
+    }
+
+// ---------------------------------------------------------------------------
+// CCamBatteryPaneController::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CCamBatteryPaneController::ConstructL()
+    {
+    PRINT ( _L("Camera => CCamBatteryPaneController::ConstructL") );	
+    
+    iDrawer = CCamBatteryPaneDrawer::NewL();
+    iTicker = CPeriodic::NewL( CActive::EPriorityHigh );
+    
+    // Construct property watchers for battery level and charging status
+    iBatteryStrengthWatcher = CCamPropertyWatcher::NewL( *this, KPSUidHWRMPowerState, KHWRMBatteryLevel );  
+    iBatteryChargingWatcher = CCamPropertyWatcher::NewL( *this, KPSUidHWRMPowerState, KHWRMChargingStatus );
+      
+    // Subscribe to the properties 
+    iBatteryStrengthWatcher->Subscribe();
+    iBatteryChargingWatcher->Subscribe();   
+    
+    // Read initial values for battery level and charging status
+    ReadCurrentState();
+    
+    PRINT ( _L( "Camera <= CCamBatteryPaneController::ConstructL" ) );	
+    }
+
+
+// ---------------------------------------------------------------------------
+// CCamBatteryPaneController::Pause
+// ---------------------------------------------------------------------------
+//    
+void CCamBatteryPaneController::Pause( TBool aPause )
+    {
+    PRINT1 ( _L("Camera => CCamBatteryPaneController::Pause( %d)"), aPause );	
+    if( aPause )
+      {
+      // Pause battery pane controller  
+      if( !iPaused )
+        {  
+        // Prevent callbacks
+        TBool oldCbState = iCallbackActive; 
+        iCallbackActive = EFalse;
+        // Stop recharging
+        if( iRecharging )
+          {
+          StopRecharging(); 
+          }
+        // Cancel notifications of battery events      
+        iBatteryStrengthWatcher->Cancel();
+        iBatteryChargingWatcher->Cancel();  
+        iPaused = ETrue;
+        // Restore callback state
+        iCallbackActive = oldCbState;
+        } 
+      }
+    else
+      {
+      // Restart battery pane controller  
+      if( iPaused )          
+        {
+        // Re-subscribe to battery events  
+        iBatteryStrengthWatcher->Subscribe();
+        iBatteryChargingWatcher->Subscribe();
+        ReadCurrentState();
+        iPaused = EFalse;
+        }
+      }  
+    PRINT( _L("Camera <= CCamBatteryPaneController::Pause") );	  
+    }
+
+// ---------------------------------------------------------------------------
+// CCamBatteryPaneController::SetCallbackActive
+// ---------------------------------------------------------------------------
+//    
+void CCamBatteryPaneController::SetCallbackActive( TBool aActive )
+    {
+    iCallbackActive = aActive;
+    }
+
+// ---------------------------------------------------------------------------
+// CCamBatteryPaneController::SetBatteryStrength
+// ---------------------------------------------------------------------------
+//
+void CCamBatteryPaneController::SetBatteryStrength( TInt aStrength )
+    {    	
+    PRINT( _L("Camera => CCamBatteryPaneController::SetBatteryStrength") );	    	
+    
+    // Drawer uses battery strength for indexing a table, so make
+    // sure it stays within valid boundaries
+    if( aStrength > KMaxBatteryStrength )
+        {
+        iBatteryStrength = KMaxBatteryStrength;
+        }
+    else if( aStrength < KMinBatteryStrength )
+        {
+        iBatteryStrength = KMinBatteryStrength;        
+        }
+    else
+        {
+        iBatteryStrength = aStrength;    
+        }
+        
+    if( !iRecharging )
+        {        
+        iDrawer->SetBatteryStrength( iBatteryStrength );
+        NotifyObserver();
+        }
+        
+    PRINT( _L("Camera <= CCamBatteryPaneController::SetBatteryStrength") );	        
+    }    
+ 
+// ---------------------------------------------------------------------------
+// CCamBatteryPaneController::SetLocation
+// ---------------------------------------------------------------------------    
+//
+void CCamBatteryPaneController::SetLocation( TPoint aLocation )
+    {
+    iDrawer->SetLocation( aLocation );
+    }
+
+// ---------------------------------------------------------------------------
+// CCamBatteryPaneController::Rect
+// ---------------------------------------------------------------------------    
+//
+TRect CCamBatteryPaneController::Rect() const
+	{
+	return iDrawer->Rect();	
+	}
+
+// ---------------------------------------------------------------------------
+// CCamBatteryPaneController::Draw
+// ---------------------------------------------------------------------------
+//
+void CCamBatteryPaneController::Draw( CBitmapContext& aGc ) const
+//void CCamBatteryPaneController::Draw( CWindowGc& aGc ) const
+    {
+    CCamAppUi* appUi = static_cast<CCamAppUi*>(CEikonEnv::Static()->AppUi());
+    
+    // When battery recharge animation runs over, indicator needs clearing
+    // PostCap view has redraw functions of its own, so it doesn't need this
+    if ( iRechargeBatteryStrength == 0 && 
+         iRecharging &&
+         !appUi->IsBurstEnabled() &&
+		 appUi->CurrentViewState() != ECamViewStatePostCapture && 
+         !(appUi->IsSecondCameraEnabled() && appUi->IsQwerty2ndCamera() ) )
+        {    
+        iDrawer->ClearBattery( aGc );
+        }
+    
+    iDrawer->Draw( aGc );
+    }    
+
+// ---------------------------------------------------------------------------
+// CCamBatteryPaneController::StartRecharging
+// ---------------------------------------------------------------------------
+//
+void CCamBatteryPaneController::StartRecharging()
+    {
+    PRINT( _L("Camera => CCamBatteryPaneController::StartRecharging") );  	
+    
+    // Stop current timer
+    iTicker->Cancel();
+    
+    // Initialize
+    iRecharging = ETrue;
+    iRechargeBatteryStrength = KMinBatteryStrength; 
+      
+    // Give initial strength value to drawer and notify observer
+    iDrawer->SetBatteryStrength( iRechargeBatteryStrength );
+    NotifyObserver();
+    
+    // Start the animation
+    iTicker->Start( KBatteryRechargeTick, KBatteryRechargeTick, TCallBack(TickerCallback, this) );
+    
+    PRINT( _L("Camera => CCamBatteryPaneController::StartRecharging") );  
+    }
+
+// ---------------------------------------------------------------------------
+// CCamBatteryPaneController::StopRecharging
+// ---------------------------------------------------------------------------
+//
+void CCamBatteryPaneController::StopRecharging()
+    {
+    PRINT( _L("Camera => CCamBatteryPaneController::StopRecharging") ); 	
+    
+    // Stop the timer and give the original battery
+    // strength to drawer class
+    iTicker->Cancel();
+    iRecharging = EFalse;
+    iDrawer->SetBatteryStrength( iBatteryStrength );
+    NotifyObserver();
+    
+    PRINT( _L("Camera <= CCamBatteryPaneController::StopRecharging") ); 
+    }
+
+// ---------------------------------------------------------------------------
+// CCamBatteryPaneController::NotifyObserver
+// ---------------------------------------------------------------------------    
+//
+void CCamBatteryPaneController::NotifyObserver()
+    {
+    if( iCallbackActive )
+        {
+        iObserver.BatteryPaneUpdated();
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// CCamBatteryPaneController::UpdateRechargeBatteryStrength
+// ---------------------------------------------------------------------------    
+//
+void CCamBatteryPaneController::UpdateRechargeBatteryStrength()
+    {    
+    PRINT( _L("Camera => CCamBatteryPaneController::UpdateRechargeBatteryStrength") );	
+    
+    iRechargeBatteryStrength++;
+    if( iRechargeBatteryStrength > KMaxBatteryStrength )
+        {
+        iRechargeBatteryStrength = KMinBatteryStrength;        
+        }
+    iDrawer->SetBatteryStrength( iRechargeBatteryStrength );
+    
+    NotifyObserver();   
+    
+    PRINT( _L("Camera <= CCamBatteryPaneController::UpdateRechargeBatteryStrength") );	     
+    }
+
+// ---------------------------------------------------------------------------
+// CCamBatteryPaneController::TickerCallback
+// ---------------------------------------------------------------------------    
+//
+TInt CCamBatteryPaneController::TickerCallback( TAny* aThis )
+    {    	
+	CCamBatteryPaneController* self = static_cast<CCamBatteryPaneController*>( aThis );
+	if( self )
+		{
+		self->UpdateRechargeBatteryStrength();		
+		}    
+    return ETrue;    
+    }
+
+// ---------------------------------------------------------------------------
+// CCamBatteryPaneController::ReadCurrentState
+// ---------------------------------------------------------------------------
+//
+void CCamBatteryPaneController::ReadCurrentState()
+    {
+    PRINT( _L("Camera => CCamBatteryPaneController::ReadCurrentState") ); 	
+    
+    TInt batteryStrength = 0;
+    TInt chargingStatus = 0;
+    TInt err = KErrNone;
+
+    // Disable callbacks to avoid two separate callbacks for charging
+    // status and battery level
+    TBool callbackActive = iCallbackActive;
+    iCallbackActive = EFalse;
+    
+    // Get the battery strength    
+    err = iBatteryStrengthWatcher->Get( batteryStrength );
+    if( KErrNone == err && -1 != batteryStrength )
+        {
+        // We got an acceptable value
+        SetBatteryStrength( batteryStrength );
+        }
+    else
+        {
+        // Default to lowest value
+        SetBatteryStrength( KMinBatteryStrength );
+        }    
+    
+    // Get current recharging state       
+    err = iBatteryChargingWatcher->Get( chargingStatus );
+    if ( KErrNone == err )
+        {
+        HandleChargingStatusChange( chargingStatus );
+        }
+    else
+        {        
+        StopRecharging();                
+        }        
+    
+    // Restore callbacks and notify the observer
+    iCallbackActive = callbackActive;
+    NotifyObserver();                
+    
+    PRINT( _L("Camera <= CCamBatteryPaneController::ReadCurrentState") ); 	
+    }
+    
+
+// ---------------------------------------------------------------------------
+// CCamBatteryPaneController::HandleChargingStatusChange
+// ---------------------------------------------------------------------------
+//
+void CCamBatteryPaneController::HandleChargingStatusChange( TInt aStatus )
+    {
+    PRINT( _L("Camera => CCamBatteryPaneController::HandleChargingStatusChange") );	    	
+    	
+    if( EChargingStatusCharging == aStatus || 
+        EChargingStatusAlmostComplete == aStatus ||
+        EChargingStatusChargingContinued == aStatus )
+        {
+        // The battery is being recharged
+        
+        if( !iRecharging )
+            {
+            // Start the recharging animation
+            StartRecharging();
+            }
+        }
+    else
+        {
+        // The battery is currently not being recharged
+        if( iRecharging )
+            {
+            // Stop the recharging animation
+            StopRecharging();
+            }        
+        }    
+        
+    PRINT( _L("Camera <= CCamBatteryPaneController::HandleChargingStatusChange") );	        
+    }
+    
+// ---------------------------------------------------------------------------
+// CCamBatteryPaneController::HandlePropertyChangedL
+// ---------------------------------------------------------------------------    
+//
+void CCamBatteryPaneController::HandlePropertyChangedL( const TUid& aCategory, const TUint aKey )
+    {
+    PRINT( _L("Camera => CCamBatteryPaneController::HandlePropertyChangedL") ); 	    	
+    
+    TInt value;
+    if( KPSUidHWRMPowerState == aCategory && KHWRMBatteryLevel == aKey )
+        {
+        TInt err = iBatteryStrengthWatcher->Get( value );
+        if( KErrNone == err && -1 != value )
+            {
+            SetBatteryStrength( value );
+            }
+        }
+    else if( KPSUidHWRMPowerState == aCategory && KHWRMChargingStatus == aKey )
+        {
+        TInt err = iBatteryChargingWatcher->Get( value );
+        if( KErrNone == err && -1 != value )
+            {
+            HandleChargingStatusChange( value );
+            }
+        }
+    else
+        {
+        // Do nothing. For Lint.
+        }
+
+    PRINT( _L("Camera <= CCamBatteryPaneController::HandlePropertyChangedL") );
+    }
+    
+// ---------------------------------------------------------------------------
+// CCamBatteryPaneController::HandleResourceChange
+// ---------------------------------------------------------------------------    
+//   
+void CCamBatteryPaneController::HandleResourceChange( TInt aType )
+    {
+    PRINT( _L("Camera => CCamBatteryPaneController::HandleResourceChange") );	
+    
+    if( KAknsMessageSkinChange == aType ||
+        KEikColorResourceChange == aType )
+        {
+        iDrawer->HandleResourceChange( aType );
+        }
+        
+		PRINT( _L("Camera <= CCamBatteryPaneController::HandleResourceChange") );	        
+    }
+
+// End of file
+