diff options
| author | 2017-08-03 18:25:42 +0200 | |
|---|---|---|
| committer | 2017-08-03 20:14:31 +0200 | |
| commit | c8e29e78863784037670f56e48464924b7f960ea (patch) | |
| tree | ffcba58a4c8e598bc1fa5d71cc7f9c5956c4dc86 | |
| parent | a957c56da0b255feaef7ec1a06e399bb6a814e61 (diff) | |
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
7 files changed, 67 insertions, 10 deletions
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 3c86c873020a..30b169262b7a 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -277,6 +277,18 @@ <item>28</item> <!-- 4: SUN --> </integer-array> + <!-- Doze: Table that translates sensor values from the doze_brightness_sensor_type sensor + to an opacity value for a black scrim that is overlayed in AOD1. + Valid range is from 0 (transparent) to 255 (opaque). + -1 means keeping the current opacity. --> + <integer-array name="config_doze_brightness_sensor_to_scrim_opacity"> + <item>-1</item> <!-- 0: OFF --> + <item>0</item> <!-- 1: NIGHT --> + <item>0</item> <!-- 2: LOW --> + <item>0</item> <!-- 3: HIGH --> + <item>0</item> <!-- 4: SUN --> + </integer-array> + <!-- Doze: whether the double tap sensor reports 2D touch coordinates --> <bool name="doze_double_tap_reports_touch_coordinates">false</bool> diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java index cbdabf5de876..302bc2d38f64 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 9b97634d7419..7db118d7fb1c 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 32baf9413314..30420529df56 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,11 +80,24 @@ 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) { 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 2283c130190c..3794ac68b836 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 db84cff5c204..8dc4b3800dff 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 fe3221af418c..c2758068a4ed 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); |