--- /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
+