blob: 10b48e71005d36b035ae2388bd0aa8362e29a628 [file] [log] [blame]
John Spurlockd06aa572014-09-10 10:40:49 -04001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.systemui.statusbar.phone;
18
19import android.content.Context;
Issei Suzukica19e6e2019-02-26 12:39:11 +010020import android.hardware.display.AmbientDisplayConfiguration;
Lucas Dupin16cfe452018-02-08 13:14:50 -080021import android.os.PowerManager;
John Spurlockd06aa572014-09-10 10:40:49 -040022import android.os.SystemProperties;
Adrian Roosb7e4e102016-10-14 13:03:45 -070023import android.os.UserHandle;
Adrian Roosebea7a72016-10-26 12:51:26 -070024import android.provider.Settings;
John Spurlockd06aa572014-09-10 10:40:49 -040025import android.util.MathUtils;
26
Lucas Dupin16cfe452018-02-08 13:14:50 -080027import com.android.internal.annotations.VisibleForTesting;
Lucas Dupindff8cdf2018-01-09 13:01:01 -080028import com.android.systemui.Dependency;
John Spurlockd06aa572014-09-10 10:40:49 -040029import com.android.systemui.R;
Lucas Dupin82aa1632017-12-13 00:13:57 -080030import com.android.systemui.doze.AlwaysOnDisplayPolicy;
Lucas Dupincbe05962018-04-26 16:44:05 -070031import com.android.systemui.doze.DozeScreenState;
Lucas Dupindff8cdf2018-01-09 13:01:01 -080032import com.android.systemui.tuner.TunerService;
John Spurlockd06aa572014-09-10 10:40:49 -040033
34import java.io.PrintWriter;
John Spurlockd06aa572014-09-10 10:40:49 -040035
Beverly1488f692019-06-07 09:32:46 -040036/**
37 * Retrieve doze information
38 */
39public class DozeParameters implements TunerService.Tunable,
40 com.android.systemui.plugins.statusbar.DozeParameters {
Selim Cinekbb998c92015-09-22 10:05:29 +020041 private static final int MAX_DURATION = 60 * 1000;
Selim Cinek0dd5a6b2018-05-15 13:15:42 -070042 public static final boolean FORCE_NO_BLANKING =
43 SystemProperties.getBoolean("debug.force_no_blanking", false);
Lucas Dupinee63c372018-08-03 11:58:24 -070044 public static final boolean FORCE_BLANKING =
45 SystemProperties.getBoolean("debug.force_blanking", false);
John Spurlockd06aa572014-09-10 10:40:49 -040046
Lucas Dupin16cfe452018-02-08 13:14:50 -080047 private static DozeParameters sInstance;
48
John Spurlockd06aa572014-09-10 10:40:49 -040049 private final Context mContext;
Adrian Roos0261fb22017-03-07 20:20:35 +000050 private final AmbientDisplayConfiguration mAmbientDisplayConfiguration;
Lucas Dupin16cfe452018-02-08 13:14:50 -080051 private final PowerManager mPowerManager;
John Spurlockd06aa572014-09-10 10:40:49 -040052
Lucas Dupin82aa1632017-12-13 00:13:57 -080053 private final AlwaysOnDisplayPolicy mAlwaysOnPolicy;
Adrian Roos5753f052016-07-13 10:30:37 -070054
Lucas Dupindff8cdf2018-01-09 13:01:01 -080055 private boolean mDozeAlwaysOn;
Lucas Dupin16cfe452018-02-08 13:14:50 -080056 private boolean mControlScreenOffAnimation;
Lucas Dupindff8cdf2018-01-09 13:01:01 -080057
Lucas Dupin16cfe452018-02-08 13:14:50 -080058 public static DozeParameters getInstance(Context context) {
59 if (sInstance == null) {
60 sInstance = new DozeParameters(context);
61 }
62 return sInstance;
63 }
64
65 @VisibleForTesting
66 protected DozeParameters(Context context) {
Adrian Roos2f5a3852018-04-23 17:48:08 +020067 mContext = context.getApplicationContext();
Adrian Roos0261fb22017-03-07 20:20:35 +000068 mAmbientDisplayConfiguration = new AmbientDisplayConfiguration(mContext);
Adrian Roos2f5a3852018-04-23 17:48:08 +020069 mAlwaysOnPolicy = new AlwaysOnDisplayPolicy(mContext);
Lucas Dupindff8cdf2018-01-09 13:01:01 -080070
Lucas Dupin16cfe452018-02-08 13:14:50 -080071 mControlScreenOffAnimation = !getDisplayNeedsBlanking();
72 mPowerManager = mContext.getSystemService(PowerManager.class);
73 mPowerManager.setDozeAfterScreenOff(!mControlScreenOffAnimation);
74
Lucas Dupindff8cdf2018-01-09 13:01:01 -080075 Dependency.get(TunerService.class).addTunable(this, Settings.Secure.DOZE_ALWAYS_ON,
76 Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED);
John Spurlockd06aa572014-09-10 10:40:49 -040077 }
78
79 public void dump(PrintWriter pw) {
80 pw.println(" DozeParameters:");
John Spurlock190d0262014-09-14 15:39:13 -040081 pw.print(" getDisplayStateSupported(): "); pw.println(getDisplayStateSupported());
Lucas Dupin9e3fa102017-11-08 17:16:55 -080082 pw.print(" getPulseDuration(): "); pw.println(getPulseDuration());
83 pw.print(" getPulseInDuration(): "); pw.println(getPulseInDuration());
John Spurlockd06aa572014-09-10 10:40:49 -040084 pw.print(" getPulseInVisibleDuration(): "); pw.println(getPulseVisibleDuration());
85 pw.print(" getPulseOutDuration(): "); pw.println(getPulseOutDuration());
John Spurlock190d0262014-09-14 15:39:13 -040086 pw.print(" getPulseOnSigMotion(): "); pw.println(getPulseOnSigMotion());
87 pw.print(" getVibrateOnSigMotion(): "); pw.println(getVibrateOnSigMotion());
John Spurlock190d0262014-09-14 15:39:13 -040088 pw.print(" getVibrateOnPickup(): "); pw.println(getVibrateOnPickup());
John Spurlock686e4d52014-11-20 21:48:09 -050089 pw.print(" getProxCheckBeforePulse(): "); pw.println(getProxCheckBeforePulse());
John Spurlock50a8ea62014-09-16 09:12:03 -040090 pw.print(" getPickupVibrationThreshold(): "); pw.println(getPickupVibrationThreshold());
John Spurlock190d0262014-09-14 15:39:13 -040091 }
92
93 public boolean getDisplayStateSupported() {
94 return getBoolean("doze.display.supported", R.bool.doze_display_state_supported);
John Spurlockd06aa572014-09-10 10:40:49 -040095 }
96
Adrian Roosa1e6b312017-03-28 16:20:34 -070097 public boolean getDozeSuspendDisplayStateSupported() {
98 return mContext.getResources().getBoolean(R.bool.doze_suspend_display_state_supported);
99 }
100
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800101 public int getPulseDuration() {
102 return getPulseInDuration() + getPulseVisibleDuration() + getPulseOutDuration();
John Spurlockd06aa572014-09-10 10:40:49 -0400103 }
104
Lucas Dupin7517b5d2017-08-22 12:51:25 -0700105 public float getScreenBrightnessDoze() {
106 return mContext.getResources().getInteger(
107 com.android.internal.R.integer.config_screenBrightnessDoze) / 255f;
108 }
109
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800110 public int getPulseInDuration() {
111 return getInt("doze.pulse.duration.in", R.integer.doze_pulse_duration_in);
John Spurlockd06aa572014-09-10 10:40:49 -0400112 }
113
114 public int getPulseVisibleDuration() {
115 return getInt("doze.pulse.duration.visible", R.integer.doze_pulse_duration_visible);
116 }
117
118 public int getPulseOutDuration() {
119 return getInt("doze.pulse.duration.out", R.integer.doze_pulse_duration_out);
120 }
121
John Spurlock190d0262014-09-14 15:39:13 -0400122 public boolean getPulseOnSigMotion() {
123 return getBoolean("doze.pulse.sigmotion", R.bool.doze_pulse_on_significant_motion);
John Spurlockd06aa572014-09-10 10:40:49 -0400124 }
125
John Spurlock190d0262014-09-14 15:39:13 -0400126 public boolean getVibrateOnSigMotion() {
127 return SystemProperties.getBoolean("doze.vibrate.sigmotion", false);
128 }
129
John Spurlock190d0262014-09-14 15:39:13 -0400130 public boolean getVibrateOnPickup() {
131 return SystemProperties.getBoolean("doze.vibrate.pickup", false);
132 }
133
John Spurlock686e4d52014-11-20 21:48:09 -0500134 public boolean getProxCheckBeforePulse() {
135 return getBoolean("doze.pulse.proxcheck", R.bool.doze_proximity_check_before_pulse);
136 }
137
John Spurlock50a8ea62014-09-16 09:12:03 -0400138 public int getPickupVibrationThreshold() {
139 return getInt("doze.pickup.vibration.threshold", R.integer.doze_pickup_vibration_threshold);
140 }
141
Lucas Dupin7517b5d2017-08-22 12:51:25 -0700142 /**
Lucas Dupin82aa1632017-12-13 00:13:57 -0800143 * For how long a wallpaper can be visible in AoD before it fades aways.
144 * @return duration in millis.
145 */
146 public long getWallpaperAodDuration() {
Lucas Dupin00be88f2019-01-03 17:50:52 -0800147 if (shouldControlScreenOff()) {
Lucas Dupinde64ee02018-12-21 14:45:12 -0800148 return DozeScreenState.ENTER_DOZE_HIDE_WALLPAPER_DELAY;
149 }
150 return mAlwaysOnPolicy.wallpaperVisibilityDuration;
Lucas Dupin82aa1632017-12-13 00:13:57 -0800151 }
152
153 /**
154 * How long it takes for the wallpaper fade away (Animation duration.)
155 * @return duration in millis.
156 */
157 public long getWallpaperFadeOutDuration() {
158 return mAlwaysOnPolicy.wallpaperFadeOutDuration;
159 }
160
161 /**
Lucas Dupin7517b5d2017-08-22 12:51:25 -0700162 * Checks if always on is available and enabled for the current user.
163 * @return {@code true} if enabled and available.
164 */
Adrian Roosebea7a72016-10-26 12:51:26 -0700165 public boolean getAlwaysOn() {
Lucas Dupindff8cdf2018-01-09 13:01:01 -0800166 return mDozeAlwaysOn;
Adrian Roosebea7a72016-10-26 12:51:26 -0700167 }
168
Lucas Dupin43d0d732017-11-16 11:23:49 -0800169 /**
170 * Some screens need to be completely black before changing the display power mode,
171 * unexpected behavior might happen if this parameter isn't respected.
172 *
Lucas Dupin7517b5d2017-08-22 12:51:25 -0700173 * @return {@code true} if screen needs to be completely black before a power transition.
Lucas Dupin43d0d732017-11-16 11:23:49 -0800174 */
175 public boolean getDisplayNeedsBlanking() {
Lucas Dupinee63c372018-08-03 11:58:24 -0700176 return FORCE_BLANKING || !FORCE_NO_BLANKING && mContext.getResources().getBoolean(
Lucas Dupin43d0d732017-11-16 11:23:49 -0800177 com.android.internal.R.bool.config_displayBlanksAfterDoze);
178 }
179
Lucas Dupin16cfe452018-02-08 13:14:50 -0800180 public boolean shouldControlScreenOff() {
181 return mControlScreenOffAnimation;
182 }
183
184 public void setControlScreenOffAnimation(boolean controlScreenOffAnimation) {
185 if (mControlScreenOffAnimation == controlScreenOffAnimation) {
186 return;
187 }
188 mControlScreenOffAnimation = controlScreenOffAnimation;
189 getPowerManager().setDozeAfterScreenOff(!controlScreenOffAnimation);
190 }
191
192 @VisibleForTesting
193 protected PowerManager getPowerManager() {
194 return mPowerManager;
Lucas Dupin43d0d732017-11-16 11:23:49 -0800195 }
196
John Spurlock190d0262014-09-14 15:39:13 -0400197 private boolean getBoolean(String propName, int resId) {
198 return SystemProperties.getBoolean(propName, mContext.getResources().getBoolean(resId));
John Spurlockd06aa572014-09-10 10:40:49 -0400199 }
200
201 private int getInt(String propName, int resId) {
202 int value = SystemProperties.getInt(propName, mContext.getResources().getInteger(resId));
203 return MathUtils.constrain(value, 0, MAX_DURATION);
204 }
205
206 private String getString(String propName, int resId) {
207 return SystemProperties.get(propName, mContext.getString(resId));
208 }
209
Lucas Dupinfac2e8e2019-06-27 16:10:19 -0700210 public boolean getPickupPerformsProxCheck() {
211 return mContext.getResources().getBoolean(R.bool.doze_pickup_performs_proximity_check);
Adrian Roos5753f052016-07-13 10:30:37 -0700212 }
213
Adrian Roos67cca742017-04-13 16:52:51 -0700214 public int getPulseVisibleDurationExtended() {
215 return 2 * getPulseVisibleDuration();
216 }
217
Adrian Roos44198f52017-06-02 12:50:38 -0700218 public boolean doubleTapReportsTouchCoordinates() {
219 return mContext.getResources().getBoolean(R.bool.doze_double_tap_reports_touch_coordinates);
220 }
221
Lucas Dupindff8cdf2018-01-09 13:01:01 -0800222 @Override
223 public void onTuningChanged(String key, String newValue) {
224 mDozeAlwaysOn = mAmbientDisplayConfiguration.alwaysOnEnabled(UserHandle.USER_CURRENT);
225 }
Adrian Roos5753f052016-07-13 10:30:37 -0700226
Adrian Roos2f5a3852018-04-23 17:48:08 +0200227 public AlwaysOnDisplayPolicy getPolicy() {
228 return mAlwaysOnPolicy;
229 }
John Spurlockd06aa572014-09-10 10:40:49 -0400230}