diff options
5 files changed, 96 insertions, 20 deletions
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index 627f11cfe170..e9fe09e4a064 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -23,6 +23,7 @@ <color name="system_bar_background_opaque">#ff000000</color> <color name="system_bar_background_semi_transparent">#66000000</color> <!-- 40% black --> <color name="system_bar_background_transparent">#00000000</color> + <color name="system_bar_background_warning">#fff4511e</color><!-- deep orange 600 --> <color name="notification_panel_solid_background">#ff000000</color> <drawable name="status_bar_recents_app_thumbnail_background">#88000000</drawable> <color name="status_bar_recents_app_label_color">#ffffffff</color> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java index a41ec22a6ab6..303454b246d3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java @@ -44,6 +44,7 @@ public class BarTransitions { public static final int MODE_TRANSLUCENT = 2; public static final int MODE_LIGHTS_OUT = 3; public static final int MODE_TRANSPARENT = 4; + public static final int MODE_WARNING = 5; public static final int LIGHTS_IN_DURATION = 250; public static final int LIGHTS_OUT_DURATION = 750; @@ -100,6 +101,7 @@ public class BarTransitions { if (mode == MODE_TRANSLUCENT) return "MODE_TRANSLUCENT"; if (mode == MODE_LIGHTS_OUT) return "MODE_LIGHTS_OUT"; if (mode == MODE_TRANSPARENT) return "MODE_TRANSPARENT"; + if (mode == MODE_WARNING) return "MODE_WARNING"; throw new IllegalArgumentException("Unknown mode " + mode); } @@ -115,6 +117,7 @@ public class BarTransitions { private final int mOpaque; private final int mSemiTransparent; private final int mTransparent; + private final int mWarning; private final Drawable mGradient; private final TimeInterpolator mInterpolator; @@ -135,10 +138,12 @@ public class BarTransitions { mOpaque = 0xff0000ff; mSemiTransparent = 0x7f0000ff; mTransparent = 0x2f0000ff; + mWarning = 0xffff0000; } else { mOpaque = res.getColor(R.color.system_bar_background_opaque); mSemiTransparent = res.getColor(R.color.system_bar_background_semi_transparent); mTransparent = res.getColor(R.color.system_bar_background_transparent); + mWarning = res.getColor(R.color.system_bar_background_warning); } mGradient = res.getDrawable(gradientResourceId); mInterpolator = new LinearInterpolator(); @@ -189,7 +194,9 @@ public class BarTransitions { @Override public void draw(Canvas canvas) { int targetGradientAlpha = 0, targetColor = 0; - if (mMode == MODE_TRANSLUCENT) { + if (mMode == MODE_WARNING) { + targetColor = mWarning; + } else if (mMode == MODE_TRANSLUCENT) { targetColor = mSemiTransparent; } else if (mMode == MODE_SEMI_TRANSPARENT) { targetColor = mSemiTransparent; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 59becd391d49..e4e67c951475 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -28,6 +28,8 @@ import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSLUCENT; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT; +import static com.android.systemui.statusbar.phone.BarTransitions.MODE_WARNING; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.TimeInterpolator; @@ -125,6 +127,7 @@ import com.android.systemui.statusbar.SpeedBumpView; import com.android.systemui.statusbar.StatusBarIconView; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.policy.BatteryController; +import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback; import com.android.systemui.statusbar.policy.BluetoothControllerImpl; import com.android.systemui.statusbar.policy.CastControllerImpl; import com.android.systemui.statusbar.policy.FlashlightController; @@ -705,6 +708,16 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, // Other icons mLocationController = new LocationControllerImpl(mContext); // will post a notification mBatteryController = new BatteryController(mContext); + mBatteryController.addStateChangedCallback(new BatteryStateChangeCallback() { + @Override + public void onPowerSaveChanged() { + mHandler.post(mCheckBarModes); + } + @Override + public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) { + // noop + } + }); mNetworkController = new NetworkControllerImpl(mContext); mHotspotController = new HotspotControllerImpl(mContext); mBluetoothController = new BluetoothControllerImpl(mContext); @@ -2310,7 +2323,12 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } private void checkBarMode(int mode, int windowState, BarTransitions transitions) { - final boolean anim = (mScreenOn == null || mScreenOn) && windowState != WINDOW_STATE_HIDDEN; + final boolean powerSave = mBatteryController.isPowerSave(); + final boolean anim = (mScreenOn == null || mScreenOn) && windowState != WINDOW_STATE_HIDDEN + && !powerSave; + if (powerSave && getBarState() != StatusBarState.KEYGUARD) { + mode = MODE_WARNING; + } transitions.transitionTo(mode, anim); } @@ -2325,7 +2343,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, @Override public void run() { checkBarModes(); - }}; + } + }; @Override public void setInteracting(int barWindow, boolean interacting) { @@ -2644,6 +2663,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, if (mUserSwitcherController != null) { mUserSwitcherController.dump(fd, pw, args); } + if (mBatteryController != null) { + mBatteryController.dump(fd, pw, args); + } } private String hunStateToString(Entry entry) { @@ -3111,6 +3133,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, int barMode = "opaque".equals(mode) ? MODE_OPAQUE : "translucent".equals(mode) ? MODE_TRANSLUCENT : "semi-transparent".equals(mode) ? MODE_SEMI_TRANSPARENT : + "transparent".equals(mode) ? MODE_TRANSPARENT : + "warning".equals(mode) ? MODE_WARNING : -1; if (barMode != -1) { boolean animate = true; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java index b2709bc3c852..ffb4dc1b0b95 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java @@ -363,6 +363,11 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL } } + @Override + public void onPowerSaveChanged() { + // could not care less + } + private void updateClickTargets() { setClickable(!mKeyguardShowing || mExpanded); mDateTime.setClickable(mExpanded); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java index ccfe18d3041e..1e655437ee1a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java @@ -16,41 +16,49 @@ package com.android.systemui.statusbar.policy; -import com.android.internal.app.IBatteryStats; -import com.android.systemui.R; -import com.android.systemui.statusbar.phone.StatusBarHeaderView; - import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.BatteryManager; -import android.os.BatteryStats; -import android.os.RemoteException; -import android.os.ServiceManager; -import android.text.format.Formatter; +import android.os.PowerManager; import android.util.Log; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.util.ArrayList; public class BatteryController extends BroadcastReceiver { - private static final String TAG = "StatusBar.BatteryController"; + private static final String TAG = "BatteryController"; + private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); - private ArrayList<BatteryStateChangeCallback> mChangeCallbacks = new ArrayList<>(); + private final ArrayList<BatteryStateChangeCallback> mChangeCallbacks = new ArrayList<>(); + private final PowerManager mPowerManager; private int mLevel; private boolean mPluggedIn; private boolean mCharging; private boolean mCharged; - - public interface BatteryStateChangeCallback { - public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging); - } + private boolean mPowerSave; public BatteryController(Context context) { + mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); + IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_BATTERY_CHANGED); + filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED); context.registerReceiver(this, filter); + + updatePowerSave(); + } + + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + pw.println("BatteryController state:"); + pw.print(" mLevel="); pw.println(mLevel); + pw.print(" mPluggedIn="); pw.println(mPluggedIn); + pw.print(" mCharging="); pw.println(mCharging); + pw.print(" mCharged="); pw.println(mCharged); + pw.print(" mPowerSave="); pw.println(mPowerSave); } public void addStateChangedCallback(BatteryStateChangeCallback cb) { @@ -75,9 +83,40 @@ public class BatteryController extends BroadcastReceiver { mCharged = status == BatteryManager.BATTERY_STATUS_FULL; mCharging = mCharged || status == BatteryManager.BATTERY_STATUS_CHARGING; - for (BatteryStateChangeCallback cb : mChangeCallbacks) { - cb.onBatteryLevelChanged(mLevel, mPluggedIn, mCharging); - } + fireBatteryLevelChanged(); + } else if (action.equals(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED)) { + updatePowerSave(); } } + + public boolean isPowerSave() { + return mPowerSave; + } + + private void updatePowerSave() { + final boolean powerSave = mPowerManager.isPowerSaveMode(); + if (powerSave == mPowerSave) return; + mPowerSave = powerSave; + if (DEBUG) Log.d(TAG, "Power save is " + (mPowerSave ? "on" : "off")); + firePowerSaveChanged(); + } + + private void fireBatteryLevelChanged() { + final int N = mChangeCallbacks.size(); + for (int i = 0; i < N; i++) { + mChangeCallbacks.get(i).onBatteryLevelChanged(mLevel, mPluggedIn, mCharging); + } + } + + private void firePowerSaveChanged() { + final int N = mChangeCallbacks.size(); + for (int i = 0; i < N; i++) { + mChangeCallbacks.get(i).onPowerSaveChanged(); + } + } + + public interface BatteryStateChangeCallback { + void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging); + void onPowerSaveChanged(); + } } |