BatteryController.java revision 0ff62e09116dd125fc36f7af5de7a0b60aaa789b
1fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato/* 2fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato * Copyright (C) 2010 The Android Open Source Project 3fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato * 4fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato * Licensed under the Apache License, Version 2.0 (the "License"); 5fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato * you may not use this file except in compliance with the License. 6fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato * You may obtain a copy of the License at 7fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato * 8fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato * http://www.apache.org/licenses/LICENSE-2.0 9fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato * 10fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato * Unless required by applicable law or agreed to in writing, software 11fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato * distributed under the License is distributed on an "AS IS" BASIS, 12fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato * See the License for the specific language governing permissions and 14fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato * limitations under the License. 15fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato */ 16fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato 17fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratopackage com.android.systemui.statusbar.policy; 18fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato 19fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratoimport android.content.BroadcastReceiver; 20fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratoimport android.content.Context; 21fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratoimport android.content.Intent; 22fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratoimport android.content.IntentFilter; 23fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratoimport android.os.BatteryManager; 240ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlockimport android.os.PowerManager; 2559a6127551650e7307fd6e6e1b72c1c2377fac80Adrian Roosimport android.util.Log; 26fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato 270ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlockimport java.io.FileDescriptor; 280ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlockimport java.io.PrintWriter; 29de84f0e77ea2bf713d15c290264059a413c2486aJohn Spurlockimport java.util.ArrayList; 30de84f0e77ea2bf713d15c290264059a413c2486aJohn Spurlock 31fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratopublic class BatteryController extends BroadcastReceiver { 320ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock private static final String TAG = "BatteryController"; 330ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); 34fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato 350ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock private final ArrayList<BatteryStateChangeCallback> mChangeCallbacks = new ArrayList<>(); 360ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock private final PowerManager mPowerManager; 3759a6127551650e7307fd6e6e1b72c1c2377fac80Adrian Roos 3859a6127551650e7307fd6e6e1b72c1c2377fac80Adrian Roos private int mLevel; 3959a6127551650e7307fd6e6e1b72c1c2377fac80Adrian Roos private boolean mPluggedIn; 4059a6127551650e7307fd6e6e1b72c1c2377fac80Adrian Roos private boolean mCharging; 4159a6127551650e7307fd6e6e1b72c1c2377fac80Adrian Roos private boolean mCharged; 420ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock private boolean mPowerSave; 43d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung 44fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato public BatteryController(Context context) { 450ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 460ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock 47fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato IntentFilter filter = new IntentFilter(); 48fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato filter.addAction(Intent.ACTION_BATTERY_CHANGED); 490ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED); 50fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato context.registerReceiver(this, filter); 510ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock 520ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock updatePowerSave(); 530ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock } 540ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock 550ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 560ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock pw.println("BatteryController state:"); 570ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock pw.print(" mLevel="); pw.println(mLevel); 580ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock pw.print(" mPluggedIn="); pw.println(mPluggedIn); 590ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock pw.print(" mCharging="); pw.println(mCharging); 600ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock pw.print(" mCharged="); pw.println(mCharged); 610ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock pw.print(" mPowerSave="); pw.println(mPowerSave); 62fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato } 63fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato 64d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung public void addStateChangedCallback(BatteryStateChangeCallback cb) { 65d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung mChangeCallbacks.add(cb); 66853b070f19801058182ac1172d7c21c7651253c8Jorim Jaggi cb.onBatteryLevelChanged(mLevel, mPluggedIn, mCharging); 67d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung } 68d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung 69853b070f19801058182ac1172d7c21c7651253c8Jorim Jaggi public void removeStateChangedCallback(BatteryStateChangeCallback cb) { 70853b070f19801058182ac1172d7c21c7651253c8Jorim Jaggi mChangeCallbacks.remove(cb); 7159a6127551650e7307fd6e6e1b72c1c2377fac80Adrian Roos } 7259a6127551650e7307fd6e6e1b72c1c2377fac80Adrian Roos 73fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato public void onReceive(Context context, Intent intent) { 74fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato final String action = intent.getAction(); 75fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato if (action.equals(Intent.ACTION_BATTERY_CHANGED)) { 76853b070f19801058182ac1172d7c21c7651253c8Jorim Jaggi mLevel = (int)(100f 77853b070f19801058182ac1172d7c21c7651253c8Jorim Jaggi * intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0) 78853b070f19801058182ac1172d7c21c7651253c8Jorim Jaggi / intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100)); 7959a6127551650e7307fd6e6e1b72c1c2377fac80Adrian Roos mPluggedIn = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) != 0; 8059a6127551650e7307fd6e6e1b72c1c2377fac80Adrian Roos 81fe0e1e445fe697d59baf5736da20356a4e548fc9Daniel Sandler final int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, 82fe0e1e445fe697d59baf5736da20356a4e548fc9Daniel Sandler BatteryManager.BATTERY_STATUS_UNKNOWN); 8359a6127551650e7307fd6e6e1b72c1c2377fac80Adrian Roos mCharged = status == BatteryManager.BATTERY_STATUS_FULL; 8459a6127551650e7307fd6e6e1b72c1c2377fac80Adrian Roos mCharging = mCharged || status == BatteryManager.BATTERY_STATUS_CHARGING; 85fe0e1e445fe697d59baf5736da20356a4e548fc9Daniel Sandler 860ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock fireBatteryLevelChanged(); 870ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock } else if (action.equals(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED)) { 880ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock updatePowerSave(); 8959a6127551650e7307fd6e6e1b72c1c2377fac80Adrian Roos } 9059a6127551650e7307fd6e6e1b72c1c2377fac80Adrian Roos } 910ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock 920ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock public boolean isPowerSave() { 930ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock return mPowerSave; 940ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock } 950ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock 960ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock private void updatePowerSave() { 970ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock final boolean powerSave = mPowerManager.isPowerSaveMode(); 980ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock if (powerSave == mPowerSave) return; 990ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock mPowerSave = powerSave; 1000ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock if (DEBUG) Log.d(TAG, "Power save is " + (mPowerSave ? "on" : "off")); 1010ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock firePowerSaveChanged(); 1020ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock } 1030ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock 1040ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock private void fireBatteryLevelChanged() { 1050ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock final int N = mChangeCallbacks.size(); 1060ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock for (int i = 0; i < N; i++) { 1070ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock mChangeCallbacks.get(i).onBatteryLevelChanged(mLevel, mPluggedIn, mCharging); 1080ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock } 1090ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock } 1100ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock 1110ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock private void firePowerSaveChanged() { 1120ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock final int N = mChangeCallbacks.size(); 1130ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock for (int i = 0; i < N; i++) { 1140ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock mChangeCallbacks.get(i).onPowerSaveChanged(); 1150ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock } 1160ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock } 1170ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock 1180ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock public interface BatteryStateChangeCallback { 1190ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging); 1200ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock void onPowerSaveChanged(); 1210ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock } 122fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato} 123