coreapplicationuis/SysAp/Src/sysapbatteryinfocontroller.cpp
changeset 0 2e3d3ce01487
child 3 096dad6e50a9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/coreapplicationuis/SysAp/Src/sysapbatteryinfocontroller.cpp	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,220 @@
+/*
+* Copyright (c) 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:  CSysApBatteryInfoController implementation
+*
+*/
+
+
+#include <e32debug.h>
+#include <e32property.h>
+#include <StringLoader.h>
+#include <SysAp.rsg>
+#include "bsutil.h"
+#include <hwrmpowerstatesdkpskeys.h>
+#include <aknappui.h>
+#include <AknCapServerClient.h>
+#include <AknSgcc.h>
+#include "batterypopupcontrol.h"
+#include "sysapbatteryinfocontroller.h"
+#include "SysAp.hrh"
+
+static const TInt KDefaultThreshold = 30;
+static const TInt KNotInitialized = -1;
+static const TInt KCapacityDeltaPercentage = 10;
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CSysApBatteryInfoController::CSysApBatteryInfoController
+// ---------------------------------------------------------------------------
+//
+CSysApBatteryInfoController::CSysApBatteryInfoController( TInt aThreshold) 
+                                                        : iBsUtil( NULL ),
+                                                          iCurrentCapacity( KNotInitialized ),
+                                                          iThresholdCapacity( aThreshold  ),
+                                                          iBatteryInfoState( EBatteryInfoAboveThreshold ),
+                                                          iBatteryPopup( NULL )
+    {
+    // sanity check, fall back to hard coded default value
+    const TInt min(0);
+    const TInt max(100);
+    
+    if ( iThresholdCapacity < min || iThresholdCapacity > max )
+        {
+        iThresholdCapacity = KDefaultThreshold;
+        }
+    
+    }
+
+// ---------------------------------------------------------------------------
+// CSysApBatteryInfoController::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CSysApBatteryInfoController::ConstructL()
+    {
+    TRACES( RDebug::Print( _L("CSysApBatteryInfoController::ConstructL") ) );
+    
+    iBsUtil = CBSUtil::NewL();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSysApBatteryInfoController::NewL
+// ---------------------------------------------------------------------------
+//
+CSysApBatteryInfoController* CSysApBatteryInfoController::NewL( TInt aThreshold )
+    {
+    TRACES( RDebug::Print( _L("CSysApBatteryInfoController::NewL: aThreshold=%d"), aThreshold ) );
+    CSysApBatteryInfoController* self = new( ELeave ) CSysApBatteryInfoController( aThreshold );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSysApBatteryInfoController::~CSysApBatteryInfoController
+// ---------------------------------------------------------------------------
+//
+CSysApBatteryInfoController::~CSysApBatteryInfoController()
+    {
+    TRACES( RDebug::Print( _L("CSysApBatteryInfoController::~CSysApBatteryInfoController") ) );
+    delete iBsUtil;
+    delete iBatteryPopup;
+    }
+
+// ---------------------------------------------------------------------------
+// CSysApBatteryInfoController::PowerMenuShownL
+// ---------------------------------------------------------------------------
+//
+void CSysApBatteryInfoController::PowerMenuShownL()
+    {
+    TRACES( RDebug::Print( _L("CSysApBatteryInfoController::PowerMenuShownL") ) );
+    ShowBatteryPreviewPopupL( iBsUtil->GetBatteryCapacity() );
+    }
+     
+// ---------------------------------------------------------------------------
+// CSysApBatteryInfoController::BatteryLevelUpdatedL
+// ---------------------------------------------------------------------------
+//
+void CSysApBatteryInfoController::BatteryLevelUpdatedL()
+    {
+    TRACES( RDebug::Print( _L("CSysApBatteryInfoController::BatteryLevelUpdatedL: iCurrentCapacity=%d, iBatteryInfoState=%d"),
+            iCurrentCapacity, iBatteryInfoState ) );
+    
+    TInt prevCapacity = iCurrentCapacity;
+    iCurrentCapacity = iBsUtil->GetBatteryCapacity();
+    
+    TBool showPopup( EFalse );
+    
+    switch ( iBatteryInfoState )
+        {
+        case EBatteryInfoAboveThreshold:
+            // popup is displayed if the battery capacity is below defined threshold
+            showPopup = ( iCurrentCapacity <= iThresholdCapacity );
+            break;
+        
+        case EBatteryInfoBelowThreshold:
+            // popup is displayed if the battery capacity has decreased enough
+            if ( ( prevCapacity > iCurrentCapacity )
+                && ( prevCapacity - iCurrentCapacity >= KCapacityDeltaPercentage ) )
+                {
+                showPopup = ETrue;
+                }
+            break;
+        
+        case EBatteryInfoStatusLow: // do not show the popup
+        default:
+            break;
+        }
+    
+    if ( iBatteryInfoState != EBatteryInfoStatusLow ) // state change allowed here only if battery is not low
+        {
+        // never switch to EBatteryInfoStatusLow here, it is done only in BatteryStatusUpdated()
+        iBatteryInfoState = ( iCurrentCapacity <= iThresholdCapacity ) ?  EBatteryInfoBelowThreshold : EBatteryInfoAboveThreshold;    
+        }
+    
+    
+    if ( showPopup )
+        {
+        ShowBatteryPreviewPopupL( iCurrentCapacity );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSysApBatteryInfoController::BatteryStatusUpdated
+// ---------------------------------------------------------------------------
+//
+void CSysApBatteryInfoController::BatteryStatusUpdated( const TInt aValue )
+    {
+    TRACES( RDebug::Print( _L("CSysApBatteryInfoController::BatteryStatusUpdated: aValue=%d, iCurrentCapacity=%d, iBatteryInfoState=%d"),
+            aValue, iCurrentCapacity, iBatteryInfoState ) );
+            
+    switch ( aValue )
+        {
+        case EBatteryStatusLow:
+        case EBatteryStatusEmpty:
+            // battery is low, discontinue showing battery popup
+            iBatteryInfoState = EBatteryInfoStatusLow;
+            break;
+        
+        default:
+            // back to normal operation
+            iBatteryInfoState = ( iCurrentCapacity <= iThresholdCapacity )
+                                ? EBatteryInfoBelowThreshold
+                                : EBatteryInfoAboveThreshold;
+            break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSysApBatteryInfoController::ShowBatteryPreviewPopupL
+// ---------------------------------------------------------------------------
+//
+void CSysApBatteryInfoController::ShowBatteryPreviewPopupL( TInt aCapacity )
+    {
+    TRACES( RDebug::Print( _L("CSysApBatteryInfoController::ShowBatteryPreviewPopupL: aCapacity=%d"), aCapacity ) );
+    
+    delete iBatteryPopup;
+    iBatteryPopup = NULL;
+    HBufC* popupTextBuf = StringLoader::LoadLC( R_QTN_BATTERY_STATUS_POPUP, aCapacity ); 
+    iBatteryPopup = CBatteryPopupControl::NewL( *popupTextBuf, KNullDesC );
+    CleanupStack::PopAndDestroy( popupTextBuf );
+        
+    // switch layout for showing the battery popup
+    CAknAppUi* appUi = static_cast<CAknAppUi*>(CCoeEnv::Static()->AppUi());
+    CEikStatusPane* statusPane = appUi->StatusPane();
+    
+    TInt currLayout = statusPane->CurrentLayoutResId();
+        
+    RAknUiServer* aknSrv = CAknSgcClient::AknSrv();
+    if ( aknSrv )
+        {
+        statusPane->SwitchLayoutL( aknSrv->StatusPaneResourceId()  );	
+        }    
+    // Trap for switching layout back to current.
+    TRAPD( err, iBatteryPopup->ShowPopUpL() );
+    
+    if( err )
+        {
+        TRACES( RDebug::Print( _L("CSysApBatteryInfoController::ShowBatteryPreviewPopupL ShowPopUpL() leaved: %d"), err ) );
+        }
+        
+    // restore layout
+    statusPane->SwitchLayoutL( currLayout );
+    
+    User::LeaveIfError( err );
+    }
+