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