summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Adrian Roos <roosa@google.com> 2017-02-27 20:25:09 +0100
committer Adrian Roos <roosa@google.com> 2017-03-09 14:31:24 -0800
commit5602189a6dec401bfa2e22247a23fb25dd3393f8 (patch)
treeea3917f9dce249eec0851b6905d71524184a6b24
parent22a905eef16878f7f654497c279bb1d82b7df9a9 (diff)
AOD: Show charging status on AOD1
- Change PowerManager to not turn on display when on AOD - Add charging icon to AOD1 - Add transient charging indication when plugged in Bug: 30876804 Bug: 35850304 Test: runtest systemui; enable AOD, plug in phone, verify charging indicator shows, verify charging text shows and goes away after a few seconds Change-Id: Icb80843a12c56c7e2abeca78115a366b4d508d4f
-rw-r--r--packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml30
-rw-r--r--packages/SystemUI/res/drawable/ic_aod_charging_24dp.xml24
-rw-r--r--packages/SystemUI/res/values/strings.xml3
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/ChargingView.java91
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java4
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java16
8 files changed, 173 insertions, 11 deletions
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml
index fc0b568a9acf..51adc1eccdff 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml
@@ -28,25 +28,42 @@
androidprv:layout_maxWidth="@dimen/keyguard_security_width"
androidprv:layout_maxHeight="@dimen/keyguard_security_height"
android:gravity="center_horizontal|top">
- <LinearLayout
+ <RelativeLayout
android:id="@+id/keyguard_clock_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal|top"
- android:orientation="vertical" >
+ android:layout_gravity="center_horizontal|top">
<TextClock
android:id="@+id/clock_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
+ android:layout_centerHorizontal="true"
+ android:layout_alignParentTop="true"
android:textColor="@color/clock_white"
android:singleLine="true"
style="@style/widget_big_thin"
android:format12Hour="@string/keyguard_widget_12_hours_format"
android:format24Hour="@string/keyguard_widget_24_hours_format"
android:layout_marginBottom="@dimen/bottom_text_spacing_digital" />
+ <com.android.systemui.ChargingView
+ android:id="@+id/battery_doze"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignTop="@id/clock_view"
+ android:layout_alignBottom="@id/clock_view"
+ android:layout_toEndOf="@id/clock_view"
+ android:visibility="invisible"
+ android:src="@drawable/ic_aod_charging_24dp"
+ android:contentDescription="@string/accessibility_ambient_display_charging"
+ />
+
+ <include layout="@layout/keyguard_status_area"
+ android:id="@+id/keyguard_status_area"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/clock_view" />
- <include layout="@layout/keyguard_status_area" />
<TextView
android:id="@+id/owner_info"
android:layout_marginLeft="16dp"
@@ -54,12 +71,13 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/date_owner_info_margin"
- android:layout_gravity="center_horizontal"
+ android:layout_centerHorizontal="true"
+ android:layout_below="@id/keyguard_status_area"
android:textColor="@color/clock_gray"
android:textSize="@dimen/widget_label_font_size"
android:letterSpacing="0.05"
android:ellipsize="marquee"
android:singleLine="true" />
- </LinearLayout>
+ </RelativeLayout>
</com.android.keyguard.KeyguardStatusView>
diff --git a/packages/SystemUI/res/drawable/ic_aod_charging_24dp.xml b/packages/SystemUI/res/drawable/ic_aod_charging_24dp.xml
new file mode 100644
index 000000000000..6134b8f75457
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_aod_charging_24dp.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24.0dp"
+ android:height="24.0dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:pathData="M11.0,22.98l0.0,-8.98 -4.0,0.0 6.0,-13.0 0.0,9.0 4.0,0.0z"
+ android:fillColor="#ffffff"/>
+</vector>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 93ae7634fcd5..c5bcb6e91702 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -565,6 +565,9 @@
<!-- Content description of the display brightness slider (not shown on the screen). [CHAR LIMIT=NONE] -->
<string name="accessibility_brightness">Display brightness</string>
+ <!-- Content description of the charging indicator on Ambient Display (lower-power version of the lock screen). [CHAR LIMIT=NONE] -->
+ <string name="accessibility_ambient_display_charging">Charging</string>
+
<!-- Title of dialog shown when 2G-3G data usage has exceeded limit and has been disabled. [CHAR LIMIT=48] -->
<string name="data_usage_disabled_dialog_3g_title">2G-3G data is paused</string>
<!-- Title of dialog shown when 4G data usage has exceeded limit and has been disabled. [CHAR LIMIT=48] -->
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
index f8f4f2a8b8fc..26558377c3cc 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
@@ -35,6 +35,7 @@ import android.widget.TextClock;
import android.widget.TextView;
import com.android.internal.widget.LockPatternUtils;
+import com.android.systemui.ChargingView;
import java.util.Locale;
@@ -50,6 +51,7 @@ public class KeyguardStatusView extends GridLayout {
private TextClock mClockView;
private TextView mOwnerInfo;
private ViewGroup mClockContainer;
+ private ChargingView mBatteryDoze;
private KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() {
@@ -114,6 +116,7 @@ public class KeyguardStatusView extends GridLayout {
mDateView.setShowCurrentUserTime(true);
mClockView.setShowCurrentUserTime(true);
mOwnerInfo = (TextView) findViewById(R.id.owner_info);
+ mBatteryDoze = (ChargingView) findViewById(R.id.battery_doze);
boolean shouldMarquee = KeyguardUpdateMonitor.getInstance(mContext).isDeviceInteractive();
setEnableMarquee(shouldMarquee);
@@ -273,10 +276,11 @@ public class KeyguardStatusView extends GridLayout {
final int N = mClockContainer.getChildCount();
for (int i = 0; i < N; i++) {
View child = mClockContainer.getChildAt(i);
- if (child == mClockView) {
+ if (child == mClockView || child == mBatteryDoze) {
continue;
}
child.setAlpha(dark ? 0 : 1);
}
+ mBatteryDoze.setDark(dark);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/ChargingView.java b/packages/SystemUI/src/com/android/systemui/ChargingView.java
new file mode 100644
index 000000000000..555cc740c373
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/ChargingView.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.widget.ImageView;
+
+import com.android.systemui.statusbar.policy.BatteryController;
+import com.android.systemui.statusbar.policy.ConfigurationController;
+
+/**
+ * A view that only shows its drawable while the phone is charging.
+ *
+ * Also reloads its drawable upon density changes.
+ */
+public class ChargingView extends ImageView implements
+ BatteryController.BatteryStateChangeCallback,
+ ConfigurationController.ConfigurationListener {
+
+ private BatteryController mBatteryController;
+ private int mImageResource;
+ private boolean mCharging;
+ private boolean mDark;
+
+ public ChargingView(Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+
+ TypedArray a = context.obtainStyledAttributes(attrs, new int[]{android.R.attr.src});
+ int srcResId = a.getResourceId(0, 0);
+
+ if (srcResId != 0) {
+ mImageResource = srcResId;
+ }
+
+ a.recycle();
+
+ updateVisibility();
+ }
+
+ @Override
+ public void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ mBatteryController = Dependency.get(BatteryController.class);
+ mBatteryController.addCallback(this);
+ Dependency.get(ConfigurationController.class).addCallback(this);
+ }
+
+ @Override
+ public void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ mBatteryController.removeCallback(this);
+ Dependency.get(ConfigurationController.class).removeCallback(this);
+ }
+
+ @Override
+ public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
+ mCharging = charging;
+ updateVisibility();
+ }
+
+ @Override
+ public void onDensityOrFontScaleChanged() {
+ setImageResource(mImageResource);
+ }
+
+ public void setDark(boolean dark) {
+ mDark = dark;
+ updateVisibility();
+ }
+
+ private void updateVisibility() {
+ setVisibility(mCharging && mDark ? VISIBLE : INVISIBLE);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index fb92a67c6aac..850e55e07299 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -340,17 +340,23 @@ public class KeyguardIndicationController {
}
protected class BaseKeyguardCallback extends KeyguardUpdateMonitorCallback {
+ public static final int HIDE_DELAY_MS = 5000;
private int mLastSuccessiveErrorMessage = -1;
@Override
public void onRefreshBatteryInfo(KeyguardUpdateMonitor.BatteryStatus status) {
boolean isChargingOrFull = status.status == BatteryManager.BATTERY_STATUS_CHARGING
|| status.status == BatteryManager.BATTERY_STATUS_FULL;
+ boolean wasPluggedIn = mPowerPluggedIn;
mPowerPluggedIn = status.isPluggedIn() && isChargingOrFull;
mPowerCharged = status.isCharged();
mChargingWattage = status.maxChargingWattage;
mChargingSpeed = status.getChargingSpeed(mSlowThreshold, mFastThreshold);
updateIndication();
+ if (!wasPluggedIn && mPowerPluggedIn && mDozing) {
+ showTransientIndication(computePowerIndication());
+ hideTransientIndicationDelayed(HIDE_DELAY_MS);
+ }
}
@Override
@@ -402,7 +408,7 @@ public class KeyguardIndicationController {
showTransientIndication(errString, errorColor);
// We want to keep this message around in case the screen was off
mHandler.removeMessages(MSG_HIDE_TRANSIENT);
- hideTransientIndicationDelayed(5000);
+ hideTransientIndicationDelayed(HIDE_DELAY_MS);
} else {
mMessageToShowOnScreenOn = errString;
}
@@ -416,7 +422,7 @@ public class KeyguardIndicationController {
showTransientIndication(mMessageToShowOnScreenOn, errorColor);
// We want to keep this message around in case the screen was off
mHandler.removeMessages(MSG_HIDE_TRANSIENT);
- hideTransientIndicationDelayed(5000);
+ hideTransientIndicationDelayed(HIDE_DELAY_MS);
mMessageToShowOnScreenOn = null;
}
}
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 48ff1c15252f..641fe69f2f78 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
@@ -45,7 +45,7 @@ public interface BatteryController extends DemoMode, Dumpable,
* has occurred.
*/
interface BatteryStateChangeCallback {
- void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging);
- void onPowerSaveChanged(boolean isPowerSave);
+ default void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {}
+ default void onPowerSaveChanged(boolean isPowerSave) {}
}
}
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index c58b527b7dab..24f6f896325b 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -72,6 +72,7 @@ import android.view.WindowManagerPolicy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.IAppOpsService;
import com.android.internal.app.IBatteryStats;
+import com.android.internal.hardware.AmbientDisplayConfiguration;
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.ArrayUtils;
import com.android.server.EventLogTags;
@@ -194,6 +195,7 @@ public final class PowerManagerService extends SystemService
private final Context mContext;
private final ServiceThread mHandlerThread;
private final PowerManagerHandler mHandler;
+ private final AmbientDisplayConfiguration mAmbientDisplayConfiguration;
private final BatterySaverPolicy mBatterySaverPolicy;
private LightsManager mLightsManager;
@@ -516,6 +518,9 @@ public final class PowerManagerService extends SystemService
// True if theater mode is enabled
private boolean mTheaterModeEnabled;
+ // True if always on display is enabled
+ private boolean mAlwaysOnEnabled;
+
// True if double tap to wake is enabled
private boolean mDoubleTapWakeEnabled;
@@ -608,6 +613,7 @@ public final class PowerManagerService extends SystemService
mHandlerThread.start();
mHandler = new PowerManagerHandler(mHandlerThread.getLooper());
mConstants = new Constants(mHandler);
+ mAmbientDisplayConfiguration = new AmbientDisplayConfiguration(mContext);
mBatterySaverPolicy = new BatterySaverPolicy(mHandler);
synchronized (mLock) {
@@ -640,6 +646,7 @@ public final class PowerManagerService extends SystemService
mHandlerThread.start();
mHandler = new PowerManagerHandler(mHandlerThread.getLooper());
mConstants = new Constants(mHandler);
+ mAmbientDisplayConfiguration = new AmbientDisplayConfiguration(mContext);
mDisplaySuspendBlocker = null;
mWakeLockSuspendBlocker = null;
}
@@ -766,6 +773,9 @@ public final class PowerManagerService extends SystemService
Settings.Global.THEATER_MODE_ON),
false, mSettingsObserver, UserHandle.USER_ALL);
resolver.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.DOZE_ALWAYS_ON),
+ false, mSettingsObserver, UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.DOUBLE_TAP_TO_WAKE),
false, mSettingsObserver, UserHandle.USER_ALL);
IVrManager vrManager = (IVrManager) getBinderService(Context.VR_SERVICE);
@@ -863,6 +873,7 @@ public final class PowerManagerService extends SystemService
Settings.Global.STAY_ON_WHILE_PLUGGED_IN, BatteryManager.BATTERY_PLUGGED_AC);
mTheaterModeEnabled = Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.THEATER_MODE_ON, 0) == 1;
+ mAlwaysOnEnabled = mAmbientDisplayConfiguration.alwaysOnEnabled(UserHandle.USER_CURRENT);
if (mSupportsDoubleTapWakeConfig) {
boolean doubleTapWakeEnabled = Settings.Secure.getIntForUser(resolver,
@@ -1702,6 +1713,11 @@ public final class PowerManagerService extends SystemService
return false;
}
+ // On Always On Display, SystemUI shows the charging indicator
+ if (mAlwaysOnEnabled && mWakefulness == WAKEFULNESS_DOZING) {
+ return false;
+ }
+
// Otherwise wake up!
return true;
}