diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index dc9a26e431b89..f1ba36261ad27 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -9329,6 +9329,25 @@ public final class Settings { */ public static final String ANOMALY_DETECTION_CONSTANTS = "anomaly_detection_constants"; + /** + * Always on display(AOD) specific settings + * This is encoded as a key=value list, separated by commas. Ex: + * + * "prox_screen_off_delay=10000,screen_brightness_array=0:1:2:3:4" + * + * The following keys are supported: + * + *
+ * screen_brightness_array (string) + * dimming_scrim_array (string) + * prox_screen_off_delay (long) + * prox_cooldown_trigger (long) + * prox_cooldown_period (long) + *+ * @hide + */ + public static final String ALWAYS_ON_DISPLAY_CONSTANTS = "always_on_display_constants"; + /** * App standby (app idle) specific settings. * This is encoded as a key=value list, separated by commas. Ex: diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java index e292c9dfbe670..30f7c730afbef 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -99,6 +99,7 @@ public class SettingsBackupTest { Settings.Global.ALARM_MANAGER_CONSTANTS, Settings.Global.ALLOW_USER_SWITCHING_WHEN_SYSTEM_USER_LOCKED, Settings.Global.ALWAYS_FINISH_ACTIVITIES, + Settings.Global.ALWAYS_ON_DISPLAY_CONSTANTS, Settings.Global.ANIMATOR_DURATION_SCALE, Settings.Global.ANOMALY_DETECTION_CONSTANTS, Settings.Global.APN_DB_UPDATE_CONTENT_URL, diff --git a/packages/SystemUI/src/com/android/systemui/doze/AlwaysOnDisplayPolicy.java b/packages/SystemUI/src/com/android/systemui/doze/AlwaysOnDisplayPolicy.java new file mode 100644 index 0000000000000..d1d180819eef9 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/doze/AlwaysOnDisplayPolicy.java @@ -0,0 +1,122 @@ +/* + * 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.doze; + +import android.content.Context; +import android.content.res.Resources; +import android.provider.Settings; +import android.text.format.DateUtils; +import android.util.KeyValueListParser; +import android.util.Log; + +import com.android.systemui.R; + +import java.util.Arrays; + +/** + * Class to store the policy for AOD, which comes from + * {@link android.provider.Settings.Global} + */ +public class AlwaysOnDisplayPolicy { + public static final String TAG = "AlwaysOnDisplayPolicy"; + + static final String KEY_SCREEN_BRIGHTNESS_ARRAY = "screen_brightness_array"; + static final String KEY_DIMMING_SCRIM_ARRAY = "dimming_scrim_array"; + static final String KEY_PROX_SCREEN_OFF_DELAY_MS = "prox_screen_off_delay"; + static final String KEY_PROX_COOLDOWN_TRIGGER_MS = "prox_cooldown_trigger"; + static final String KEY_PROX_COOLDOWN_PERIOD_MS = "prox_cooldown_period"; + + /** + * Integer array to map ambient brightness type to real screen brightness. + * + * @see Settings.Global#ALWAYS_ON_DISPLAY_CONSTANTS + * @see #KEY_SCREEN_BRIGHTNESS_ARRAY + */ + public final int[] screenBrightnessArray; + + /** + * Integer array to map ambient brightness type to dimming scrim. + * + * @see Settings.Global#ALWAYS_ON_DISPLAY_CONSTANTS + * @see #KEY_DIMMING_SCRIM_ARRAY + */ + public final int[] dimmingScrimArray; + + /** + * Delay time(ms) from covering the prox to turning off the screen. + * + * @see Settings.Global#ALWAYS_ON_DISPLAY_CONSTANTS + * @see #KEY_PROX_SCREEN_OFF_DELAY_MS + */ + public final long proxScreenOffDelayMs; + + /** + * The threshold time(ms) to trigger the cooldown timer, which will + * turn off prox sensor for a period. + * + * @see Settings.Global#ALWAYS_ON_DISPLAY_CONSTANTS + * @see #KEY_PROX_COOLDOWN_TRIGGER_MS + */ + public final long proxCooldownTriggerMs; + + /** + * The period(ms) to turning off the prox sensor if + * {@link #KEY_PROX_COOLDOWN_TRIGGER_MS} is triggered. + * + * @see Settings.Global#ALWAYS_ON_DISPLAY_CONSTANTS + * @see #KEY_PROX_COOLDOWN_PERIOD_MS + */ + public final long proxCooldownPeriodMs; + + private final KeyValueListParser mParser; + + public AlwaysOnDisplayPolicy(Context context) { + final Resources resources = context.getResources(); + mParser = new KeyValueListParser(','); + + final String value = Settings.Global.getString(context.getContentResolver(), + Settings.Global.ALWAYS_ON_DISPLAY_CONSTANTS); + + try { + mParser.setString(value); + } catch (IllegalArgumentException e) { + Log.e(TAG, "Bad AOD constants"); + } + + proxScreenOffDelayMs = mParser.getLong(KEY_PROX_SCREEN_OFF_DELAY_MS, + 10 * DateUtils.MINUTE_IN_MILLIS); + proxCooldownTriggerMs = mParser.getLong(KEY_PROX_COOLDOWN_TRIGGER_MS, + 2 * DateUtils.MINUTE_IN_MILLIS); + proxCooldownPeriodMs = mParser.getLong(KEY_PROX_COOLDOWN_PERIOD_MS, + 5 * DateUtils.MINUTE_IN_MILLIS); + screenBrightnessArray = parseIntArray(KEY_SCREEN_BRIGHTNESS_ARRAY, + resources.getIntArray(R.array.config_doze_brightness_sensor_to_brightness)); + dimmingScrimArray = parseIntArray(KEY_DIMMING_SCRIM_ARRAY, + resources.getIntArray(R.array.config_doze_brightness_sensor_to_scrim_opacity)); + } + + private int[] parseIntArray(final String key, final int[] defaultArray) { + final String value = mParser.getString(key, null); + if (value != null) { + return Arrays.stream(value.split(":")).map(String::trim).mapToInt( + Integer::parseInt).toArray(); + } else { + return defaultArray; + } + } + +} diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java index d374d68a456bb..6f8bcff16a83b 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java @@ -59,7 +59,7 @@ public class DozeFactory { DozeMachine machine = new DozeMachine(wrappedService, config, wakeLock); machine.setParts(new DozeMachine.Part[]{ - new DozePauser(handler, machine, alarmManager), + new DozePauser(handler, machine, alarmManager, new AlwaysOnDisplayPolicy(context)), new DozeFalsingManagerAdapter(FalsingManager.getInstance(context)), createDozeTriggers(context, sensorManager, host, alarmManager, config, params, handler, wakeLock, machine), @@ -76,7 +76,8 @@ public class DozeFactory { Handler handler) { Sensor sensor = DozeSensors.findSensorWithType(sensorManager, context.getString(R.string.doze_brightness_sensor_type)); - return new DozeScreenBrightness(context, service, sensorManager, sensor, host, handler); + return new DozeScreenBrightness(context, service, sensorManager, sensor, host, handler, + new AlwaysOnDisplayPolicy(context)); } private DozeTriggers createDozeTriggers(Context context, SensorManager sensorManager, diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozePauser.java b/packages/SystemUI/src/com/android/systemui/doze/DozePauser.java index a33b454c6430e..76a190213ba30 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozePauser.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozePauser.java @@ -26,20 +26,22 @@ import com.android.systemui.util.AlarmTimeout; */ public class DozePauser implements DozeMachine.Part { public static final String TAG = DozePauser.class.getSimpleName(); - private static final long TIMEOUT = 10 * 1000; private final AlarmTimeout mPauseTimeout; private final DozeMachine mMachine; + private final long mTimeoutMs; - public DozePauser(Handler handler, DozeMachine machine, AlarmManager alarmManager) { + public DozePauser(Handler handler, DozeMachine machine, AlarmManager alarmManager, + AlwaysOnDisplayPolicy policy) { mMachine = machine; mPauseTimeout = new AlarmTimeout(alarmManager, this::onTimeout, TAG, handler); + mTimeoutMs = policy.proxScreenOffDelayMs; } @Override public void transitionTo(DozeMachine.State oldState, DozeMachine.State newState) { switch (newState) { case DOZE_AOD_PAUSING: - mPauseTimeout.schedule(TIMEOUT, AlarmTimeout.MODE_IGNORE_IF_SCHEDULED); + mPauseTimeout.schedule(mTimeoutMs, AlarmTimeout.MODE_IGNORE_IF_SCHEDULED); break; default: mPauseTimeout.cancel(); diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java index 30420529df56f..11b4b0ef8294f 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java @@ -42,7 +42,7 @@ public class DozeScreenBrightness implements DozeMachine.Part, SensorEventListen public DozeScreenBrightness(Context context, DozeMachine.Service service, SensorManager sensorManager, Sensor lightSensor, DozeHost host, - Handler handler) { + Handler handler, AlwaysOnDisplayPolicy policy) { mContext = context; mDozeService = service; mSensorManager = sensorManager; @@ -50,10 +50,8 @@ public class DozeScreenBrightness implements DozeMachine.Part, SensorEventListen 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); + mSensorToBrightness = policy.screenBrightnessArray; + mSensorToScrimOpacity = policy.dimmingScrimArray; } @Override diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java index 566353c74b572..91cde378c41bf 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java @@ -72,7 +72,7 @@ public class DozeSensors { public DozeSensors(Context context, AlarmManager alarmManager, SensorManager sensorManager, DozeParameters dozeParameters, AmbientDisplayConfiguration config, WakeLock wakeLock, Callback callback, - Consumer