From c8e29e78863784037670f56e48464924b7f960ea Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Thu, 3 Aug 2017 18:25:42 +0200 Subject: [PATCH] AOD: Add support for dimming in software Some devices cannot dim low enough in hardware in low power states. To work around that, keep the front scrim at higher opacity when needed to simulate lower brightness. Bug: 63995944 Test: Configure scrim in config.xml; use device in very dim light at night, observe AOD is sufficiently dim. Change-Id: I92fffedeea89b9327d76dfb184c5c761364ead11 --- packages/SystemUI/res/values/config.xml | 12 ++++++++++ .../android/systemui/doze/DozeFactory.java | 7 +++--- .../com/android/systemui/doze/DozeHost.java | 1 + .../systemui/doze/DozeScreenBrightness.java | 23 +++++++++++++++++-- .../statusbar/phone/DozeScrimController.java | 23 ++++++++++++++++--- .../systemui/statusbar/phone/StatusBar.java | 5 ++++ .../doze/DozeScreenBrightnessTest.java | 6 +++-- 7 files changed, 67 insertions(+), 10 deletions(-) diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 3c86c873020a4..30b169262b7a8 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -277,6 +277,18 @@ 28 + + + -1 + 0 + 0 + 0 + 0 + + false diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java index cbdabf5de876a..302bc2d38f64e 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java @@ -65,7 +65,7 @@ public class DozeFactory { handler, wakeLock, machine), createDozeUi(context, host, wakeLock, machine, handler, alarmManager), createDozeScreenState(wrappedService), - createDozeScreenBrightness(context, wrappedService, sensorManager, handler), + createDozeScreenBrightness(context, wrappedService, sensorManager, host, handler), }); return machine; @@ -76,10 +76,11 @@ public class DozeFactory { } private DozeMachine.Part createDozeScreenBrightness(Context context, - DozeMachine.Service service, SensorManager sensorManager, Handler handler) { + DozeMachine.Service service, SensorManager sensorManager, DozeHost host, + Handler handler) { Sensor sensor = DozeSensors.findSensorWithType(sensorManager, context.getString(R.string.doze_brightness_sensor_type)); - return new DozeScreenBrightness(context, service, sensorManager, sensor, handler); + return new DozeScreenBrightness(context, service, sensorManager, sensor, host, handler); } private DozeTriggers createDozeTriggers(Context context, SensorManager sensorManager, diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java b/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java index 9b97634d74198..7db118d7fb1ca 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java @@ -42,6 +42,7 @@ public interface DozeHost { void onDoubleTap(float x, float y); + default void setAodDimmingScrim(float scrimOpacity) {} void setDozeScreenBrightness(int value); void onIgnoreTouchWhilePulsing(boolean ignore); diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java index 32baf94133143..30420529df56f 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java @@ -32,22 +32,28 @@ import com.android.systemui.R; public class DozeScreenBrightness implements DozeMachine.Part, SensorEventListener { private final Context mContext; private final DozeMachine.Service mDozeService; + private final DozeHost mDozeHost; private final Handler mHandler; private final SensorManager mSensorManager; private final Sensor mLightSensor; private final int[] mSensorToBrightness; + private final int[] mSensorToScrimOpacity; private boolean mRegistered; public DozeScreenBrightness(Context context, DozeMachine.Service service, - SensorManager sensorManager, Sensor lightSensor, Handler handler) { + SensorManager sensorManager, Sensor lightSensor, DozeHost host, + Handler handler) { mContext = context; mDozeService = service; mSensorManager = sensorManager; mLightSensor = lightSensor; + mDozeHost = host; mHandler = handler; mSensorToBrightness = context.getResources().getIntArray( R.array.config_doze_brightness_sensor_to_brightness); + mSensorToScrimOpacity = context.getResources().getIntArray( + R.array.config_doze_brightness_sensor_to_scrim_opacity); } @Override @@ -74,13 +80,26 @@ public class DozeScreenBrightness implements DozeMachine.Part, SensorEventListen @Override public void onSensorChanged(SensorEvent event) { if (mRegistered) { - int brightness = computeBrightness((int) event.values[0]); + int sensorValue = (int) event.values[0]; + int brightness = computeBrightness(sensorValue); if (brightness > 0) { mDozeService.setDozeScreenBrightness(brightness); } + + int scrimOpacity = computeScrimOpacity(sensorValue); + if (scrimOpacity >= 0) { + mDozeHost.setAodDimmingScrim(scrimOpacity / 255f); + } } } + private int computeScrimOpacity(int sensorValue) { + if (sensorValue < 0 || sensorValue >= mSensorToScrimOpacity.length) { + return -1; + } + return mSensorToScrimOpacity[sensorValue]; + } + private int computeBrightness(int sensorValue) { if (sensorValue < 0 || sensorValue >= mSensorToBrightness.length) { return -1; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java index 2283c130190c0..3794ac68b8362 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java @@ -56,6 +56,8 @@ public class DozeScrimController { private boolean mWakeAndUnlocking; private boolean mFullyPulsing; + private float mAodFrontScrimOpacity = 0; + public DozeScrimController(ScrimController scrimController, Context context) { mContext = context; mScrimController = scrimController; @@ -70,7 +72,8 @@ public class DozeScrimController { mDozingAborted = false; abortAnimations(); mScrimController.setDozeBehindAlpha(1f); - mScrimController.setDozeInFrontAlpha(mDozeParameters.getAlwaysOn() ? 0f : 1f); + mScrimController.setDozeInFrontAlpha( + mDozeParameters.getAlwaysOn() ? mAodFrontScrimOpacity : 1f); } else { cancelPulsing(); if (animate) { @@ -88,6 +91,19 @@ public class DozeScrimController { } } + /** + * Set the opacity of the front scrim when showing AOD1 + * + * Used to emulate lower brightness values than the hardware supports natively. + */ + public void setAodDimmingScrim(float scrimOpacity) { + mAodFrontScrimOpacity = scrimOpacity; + if (mDozing && !isPulsing() && !mDozingAborted && !mWakeAndUnlocking + && mDozeParameters.getAlwaysOn()) { + mScrimController.setDozeInFrontAlpha(mAodFrontScrimOpacity); + } + } + public void setWakeAndUnlocking() { // Immediately abort the doze scrims in case of wake-and-unlock // for pulsing so the Keyguard fade-out animation scrim can take over. @@ -126,7 +142,8 @@ public class DozeScrimController { if (mDozing && !mWakeAndUnlocking) { mScrimController.setDozeBehindAlpha(1f); mScrimController.setDozeInFrontAlpha( - mDozeParameters.getAlwaysOn() && !mDozingAborted ? 0f : 1f); + mDozeParameters.getAlwaysOn() && !mDozingAborted ? + mAodFrontScrimOpacity : 1f); } } @@ -337,7 +354,7 @@ public class DozeScrimController { // Signal that the pulse is all finished so we can turn the screen off now. pulseFinished(); if (mDozeParameters.getAlwaysOn()) { - mScrimController.setDozeInFrontAlpha(0); + mScrimController.setDozeInFrontAlpha(mAodFrontScrimOpacity); } } }; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index db84cff5c204c..8dc4b3800dfff 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -5555,6 +5555,11 @@ public class StatusBar extends SystemUI implements DemoMode, mStatusBarWindowManager.setDozeScreenBrightness(value); } + @Override + public void setAodDimmingScrim(float scrimOpacity) { + mDozeScrimController.setAodDimmingScrim(scrimOpacity); + } + public void dispatchDoubleTap(float viewX, float viewY) { dispatchTap(mAmbientIndicationContainer, viewX, viewY); dispatchTap(mAmbientIndicationContainer, viewX, viewY); diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java index fe3221af418c8..c2758068a4ed6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java @@ -51,14 +51,16 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { DozeScreenBrightness mScreen; FakeSensorManager.FakeGenericSensor mSensor; FakeSensorManager mSensorManager; + DozeHostFake mHostFake; @Before public void setUp() throws Exception { mServiceFake = new DozeServiceFake(); + mHostFake = new DozeHostFake(); mSensorManager = new FakeSensorManager(mContext); mSensor = mSensorManager.getFakeLightSensor(); mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager, - mSensor.getSensor(), null /* handler */); + mSensor.getSensor(), mHostFake, null /* handler */); } @Test @@ -133,7 +135,7 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { @Test public void testNullSensor() throws Exception { mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager, - null /* sensor */, null /* handler */); + null /* sensor */, mHostFake, null /* handler */); mScreen.transitionTo(UNINITIALIZED, INITIALIZED); mScreen.transitionTo(INITIALIZED, DOZE_AOD);