2121import android .content .Intent ;
2222import android .content .IntentFilter ;
2323import android .database .ContentObserver ;
24- import static android .os .BatteryManager .BATTERY_STATUS_CHARGING ;
2524import static android .os .BatteryManager .BATTERY_STATUS_FULL ;
2625import static android .os .BatteryManager .BATTERY_STATUS_UNKNOWN ;
26+ import static android .os .BatteryManager .BATTERY_HEALTH_UNKNOWN ;
27+ import static android .os .BatteryManager .EXTRA_STATUS ;
28+ import static android .os .BatteryManager .EXTRA_PLUGGED ;
29+ import static android .os .BatteryManager .EXTRA_LEVEL ;
30+ import static android .os .BatteryManager .EXTRA_HEALTH ;
2731import android .media .AudioManager ;
28- import android .media .IRemoteControlClient ;
2932import android .os .BatteryManager ;
3033import android .os .Handler ;
3134import android .os .Message ;
@@ -72,9 +75,7 @@ public class KeyguardUpdateMonitor {
7275
7376 private boolean mDeviceProvisioned ;
7477
75- private int mBatteryLevel ;
76-
77- private int mBatteryStatus ;
78+ private BatteryStatus mBatteryStatus ;
7879
7980 private CharSequence mTelephonyPlmn ;
8081 private CharSequence mTelephonySpn ;
@@ -151,6 +152,20 @@ public String toString() {
151152 }
152153 }
153154
155+ private static class BatteryStatus {
156+ public final int status ;
157+ public final int level ;
158+ public final int plugged ;
159+ public final int health ;
160+ public BatteryStatus (int status , int level , int plugged , int health ) {
161+ this .status = status ;
162+ this .level = level ;
163+ this .plugged = plugged ;
164+ this .health = health ;
165+ }
166+
167+ }
168+
154169 public KeyguardUpdateMonitor (Context context ) {
155170 mContext = context ;
156171
@@ -162,7 +177,7 @@ public void handleMessage(Message msg) {
162177 handleTimeUpdate ();
163178 break ;
164179 case MSG_BATTERY_UPDATE :
165- handleBatteryUpdate (msg . arg1 , msg .arg2 );
180+ handleBatteryUpdate (( BatteryStatus ) msg .obj );
166181 break ;
167182 case MSG_CARRIER_INFO_UPDATE :
168183 handleCarrierInfoUpdate ();
@@ -226,8 +241,7 @@ public void onChange(boolean selfChange) {
226241
227242 // take a guess to start
228243 mSimState = IccCard .State .READY ;
229- mBatteryStatus = BATTERY_STATUS_UNKNOWN ;
230- mBatteryLevel = 100 ;
244+ mBatteryStatus = new BatteryStatus (BATTERY_STATUS_UNKNOWN , 100 , 0 , 0 );
231245
232246 mTelephonyPlmn = getDefaultPlmn ();
233247
@@ -256,13 +270,12 @@ public void onReceive(Context context, Intent intent) {
256270 mTelephonySpn = getTelephonySpnFrom (intent );
257271 mHandler .sendMessage (mHandler .obtainMessage (MSG_CARRIER_INFO_UPDATE ));
258272 } else if (Intent .ACTION_BATTERY_CHANGED .equals (action )) {
259- final int pluggedInStatus = intent
260- .getIntExtra ("status" , BATTERY_STATUS_UNKNOWN );
261- int batteryLevel = intent .getIntExtra ("level" , 0 );
273+ final int status = intent .getIntExtra (EXTRA_STATUS , BATTERY_STATUS_UNKNOWN );
274+ final int plugged = intent .getIntExtra (EXTRA_PLUGGED , 0 );
275+ final int level = intent .getIntExtra (EXTRA_LEVEL , 0 );
276+ final int health = intent .getIntExtra (EXTRA_HEALTH , BATTERY_HEALTH_UNKNOWN );
262277 final Message msg = mHandler .obtainMessage (
263- MSG_BATTERY_UPDATE ,
264- pluggedInStatus ,
265- batteryLevel );
278+ MSG_BATTERY_UPDATE , new BatteryStatus (status , level , plugged , health ));
266279 mHandler .sendMessage (msg );
267280 } else if (TelephonyIntents .ACTION_SIM_STATE_CHANGED .equals (action )) {
268281 mHandler .sendMessage (mHandler .obtainMessage (
@@ -325,15 +338,16 @@ private void handleTimeUpdate() {
325338 /**
326339 * Handle {@link #MSG_BATTERY_UPDATE}
327340 */
328- private void handleBatteryUpdate (int batteryStatus , int batteryLevel ) {
341+ private void handleBatteryUpdate (BatteryStatus batteryStatus ) {
329342 if (DEBUG ) Log .d (TAG , "handleBatteryUpdate" );
330- if ( isBatteryUpdateInteresting ( batteryStatus , batteryLevel )) {
331- mBatteryStatus = batteryStatus ;
332- mBatteryLevel = batteryLevel ;
333- final boolean pluggedIn = isPluggedIn ( batteryStatus );;
343+ final boolean batteryUpdateInteresting =
344+ isBatteryUpdateInteresting ( mBatteryStatus , batteryStatus ) ;
345+ mBatteryStatus = batteryStatus ;
346+ if ( batteryUpdateInteresting ) {
334347 for (int i = 0 ; i < mInfoCallbacks .size (); i ++) {
348+ // TODO: pass BatteryStatus object to onRefreshBatteryInfo() instead...
335349 mInfoCallbacks .get (i ).onRefreshBatteryInfo (
336- shouldShowBatteryInfo (), pluggedIn , batteryLevel );
350+ shouldShowBatteryInfo (),isPluggedIn ( batteryStatus ), batteryStatus . level );
337351 }
338352 }
339353 }
@@ -377,39 +391,40 @@ private void handleClockVisibilityChanged() {
377391 }
378392
379393 /**
380- * @param status One of the statuses of {@link android.os.BatteryManager}
381- * @return Whether the status maps to a status for being plugged in.
394+ * @param pluggedIn state from {@link android.os.BatteryManager#EXTRA_PLUGGED }
395+ * @return Whether the device is considered " plugged in."
382396 */
383- private boolean isPluggedIn (int status ) {
384- return status == BATTERY_STATUS_CHARGING || status == BATTERY_STATUS_FULL ;
397+ private static boolean isPluggedIn (BatteryStatus status ) {
398+ return status .plugged == BatteryManager .BATTERY_PLUGGED_AC
399+ || status .plugged == BatteryManager .BATTERY_PLUGGED_USB ;
385400 }
386401
387- private boolean isBatteryUpdateInteresting (int batteryStatus , int batteryLevel ) {
388- // change in plug is always interesting
389- final boolean isPluggedIn = isPluggedIn (batteryStatus );
390- final boolean wasPluggedIn = isPluggedIn (mBatteryStatus );
402+ private static boolean isBatteryUpdateInteresting (BatteryStatus old , BatteryStatus current ) {
403+ final boolean nowPluggedIn = isPluggedIn (current );
404+ final boolean wasPluggedIn = isPluggedIn (old );
391405 final boolean stateChangedWhilePluggedIn =
392- wasPluggedIn == true && isPluggedIn == true && (mBatteryStatus != batteryStatus );
393- if (wasPluggedIn != isPluggedIn || stateChangedWhilePluggedIn ) {
406+ wasPluggedIn == true && nowPluggedIn == true
407+ && (old .status != current .status );
408+
409+ // change in plug state is always interesting
410+ if (wasPluggedIn != nowPluggedIn || stateChangedWhilePluggedIn ) {
394411 return true ;
395412 }
396413
397414 // change in battery level while plugged in
398- if (isPluggedIn && mBatteryLevel != batteryLevel ) {
415+ if (nowPluggedIn && old . level != current . level ) {
399416 return true ;
400417 }
401418
402- if (!isPluggedIn ) {
403- // not plugged in and below threshold
404- if (isBatteryLow (batteryLevel ) && batteryLevel != mBatteryLevel ) {
405- return true ;
406- }
419+ // change where battery needs charging
420+ if (!nowPluggedIn && isBatteryLow (current ) && current .level != old .level ) {
421+ return true ;
407422 }
408423 return false ;
409424 }
410425
411- private boolean isBatteryLow (int batteryLevel ) {
412- return batteryLevel < LOW_BATTERY_THRESHOLD ;
426+ private static boolean isBatteryLow (BatteryStatus status ) {
427+ return status . level < LOW_BATTERY_THRESHOLD ;
413428 }
414429
415430 /**
@@ -518,8 +533,8 @@ public void registerInfoCallback(InfoCallback callback) {
518533 if (!mInfoCallbacks .contains (callback )) {
519534 mInfoCallbacks .add (callback );
520535 // Notify listener of the current state
521- callback .onRefreshBatteryInfo (shouldShowBatteryInfo (), isPluggedIn (mBatteryStatus ),
522- mBatteryLevel );
536+ callback .onRefreshBatteryInfo (shouldShowBatteryInfo (),isPluggedIn (mBatteryStatus ),
537+ mBatteryStatus . level );
523538 callback .onTimeChanged ();
524539 callback .onRingerModeChanged (mRingMode );
525540 callback .onPhoneStateChanged (mPhoneState );
@@ -573,16 +588,16 @@ public boolean isDevicePluggedIn() {
573588 }
574589
575590 public boolean isDeviceCharged () {
576- return mBatteryStatus == BatteryManager . BATTERY_STATUS_FULL
577- || mBatteryLevel >= 100 ; // in case a particular device doesn't flag it
591+ return mBatteryStatus . status == BATTERY_STATUS_FULL
592+ || mBatteryStatus . level >= 100 ; // in case particular device doesn't flag it
578593 }
579594
580595 public int getBatteryLevel () {
581- return mBatteryLevel ;
596+ return mBatteryStatus . level ;
582597 }
583598
584599 public boolean shouldShowBatteryInfo () {
585- return isPluggedIn (mBatteryStatus ) || isBatteryLow (mBatteryLevel );
600+ return isPluggedIn (mBatteryStatus ) || isBatteryLow (mBatteryStatus );
586601 }
587602
588603 public CharSequence getTelephonyPlmn () {
0 commit comments