diff -r 61bc0f252b2b -r bac7acad7cb3 camerauis/cameraapp/generic/src/cambatterypanecontroller.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/camerauis/cameraapp/generic/src/cambatterypanecontroller.cpp Wed Sep 01 12:30:54 2010 +0100 @@ -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 +#include // RProperty +#include // P&S keys +#include // KEikColorResourceChange +#include // 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(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( 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 +