diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 5917dc56124bb..506c294d74fae 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 e95b1767ade6d..2a55e2ec22478 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -5566,6 +5566,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);