diff options
| author | 2020-11-27 16:13:50 +0000 | |
|---|---|---|
| committer | 2021-01-15 11:04:14 +0000 | |
| commit | c7200e18ef28f64e76680c8a3073b0450c5df6b2 (patch) | |
| tree | 5403b574f29f8373445321ef87c6178f1688485d | |
| parent | 99801ee183db5bacf751111ac440ec7e612778fa (diff) | |
Add ability to rotate screen in AoD.
This patch prevents DisplayRotation from disabling the
OrientationListener when the screen turns off, if and only if the
underlying sensor is a wakeup device_orientation sensor (i.e. we don't
have to keep the AP on to keep listening). This then allows the AoD on
the device to rotate.
Since many devices doesn't have a wake orienation sensor, a config flag is
provided to force this behaviour on (although note that the AoD might
not rotate if the AP shuts down). This can be enabled by setting
config_forceOrientationListenerEnabledWhileDreaming to true.
Test: Not yet, finding tests...
Change-Id: Ie1ee8e297ebe9a8a73793d07f173bada8e0699f1
4 files changed, 30 insertions, 2 deletions
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 1845faacc891..010d047c2c31 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -4610,4 +4610,9 @@ If omitted, image editing will not be offered via Chooser. This name is in the ComponentName flattened format (package/class) [DO NOT TRANSLATE] --> <string name="config_systemImageEditor" translatable="false"></string> + + <!-- Whether to force WindowOrientationListener to keep listening to its sensor, even when + dreaming. This allows the AoD to rotate on devices without a wake device_orientation + sensor. Note that this flag should only be enabled for development/testing use. --> + <bool name="config_forceOrientationListenerEnabledWhileDreaming">false</bool> </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index c72a0cd63b36..20db4c6f2e3f 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -4146,4 +4146,6 @@ <java-symbol type="bool" name="config_attachNavBarToAppDuringTransition" /> <java-symbol type="bool" name="config_enableBackSound" /> + + <java-symbol type="bool" name="config_forceOrientationListenerEnabledWhileDreaming" /> </resources> diff --git a/services/core/java/com/android/server/policy/WindowOrientationListener.java b/services/core/java/com/android/server/policy/WindowOrientationListener.java index 0157706866c7..17e81daa80cc 100644 --- a/services/core/java/com/android/server/policy/WindowOrientationListener.java +++ b/services/core/java/com/android/server/policy/WindowOrientationListener.java @@ -62,6 +62,7 @@ public abstract class WindowOrientationListener { private Sensor mSensor; private OrientationJudge mOrientationJudge; private int mCurrentRotation = -1; + private final Context mContext; private final Object mLock = new Object(); @@ -88,6 +89,7 @@ public abstract class WindowOrientationListener { * This constructor is private since no one uses it. */ private WindowOrientationListener(Context context, Handler handler, int rate) { + mContext = context; mHandler = handler; mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); mRate = rate; @@ -284,6 +286,19 @@ public abstract class WindowOrientationListener { } } + /** + * Returns whether this WindowOrientationListener can remain enabled while the device is dozing. + * If this returns true, it implies that the underlying sensor can still run while the AP is + * asleep, and that the underlying sensor will wake the AP on an event. + */ + public boolean shouldStayEnabledWhileDreaming() { + if (mContext.getResources().getBoolean( + com.android.internal.R.bool.config_forceOrientationListenerEnabledWhileDreaming)) { + return true; + } + return mSensor.getType() == Sensor.TYPE_DEVICE_ORIENTATION && mSensor.isWakeUpSensor(); + } + abstract class OrientationJudge implements SensorEventListener { // Number of nanoseconds per millisecond. protected static final long NANOS_PER_MS = 1000000; diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java index c4aaf7c8a935..df5d3ea3c150 100644 --- a/services/core/java/com/android/server/wm/DisplayRotation.java +++ b/services/core/java/com/android/server/wm/DisplayRotation.java @@ -955,10 +955,16 @@ public class DisplayRotation { keyguardDrawComplete, windowManagerDrawComplete); boolean disable = true; + + // If the orientation listener uses a wake sensor, keep the orientation listener on if the + // screen is on (regardless of wake state). This allows the AoD to rotate. + // // Note: We postpone the rotating of the screen until the keyguard as well as the // window manager have reported a draw complete or the keyguard is going away in dismiss // mode. - if (screenOnEarly && awake && ((keyguardDrawComplete && windowManagerDrawComplete))) { + if (screenOnEarly + && (awake || mOrientationListener.shouldStayEnabledWhileDreaming()) + && ((keyguardDrawComplete && windowManagerDrawComplete))) { if (needSensorRunning()) { disable = false; // Enable listener if not already enabled. @@ -974,7 +980,7 @@ public class DisplayRotation { } } // Check if sensors need to be disabled. - if (disable && mOrientationListener.mEnabled) { + if (disable) { mOrientationListener.disable(); } } |