summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Darryl L Johnson <darryljohnson@google.com> 2020-12-03 14:10:57 -0800
committer Darryl L Johnson <darryljohnson@google.com> 2020-12-10 12:24:56 -0800
commit61c63d5306b2bc09f3d28c9308d808300e8170f6 (patch)
treec7f6ec2fab405f6315a3030402a29078a4567312
parentf64e1381244539283ddbcde12790eb7c22016f48 (diff)
Migrate DisplayFoldController fold state to be based on device state.
This modifies DisplayFoldController to base it's internal 'fold' state from being configured directly based on the lid switch (or the proximity sensor) to be based on the device state. Bug: 159401801 Test: Manual - fold/unfold and validate fold state Change-Id: Ib3ecc6326b1d73720d31fa94f33160cfaf1109cd
-rw-r--r--core/res/res/values/config.xml7
-rw-r--r--core/res/res/values/symbols.xml2
-rw-r--r--services/core/java/com/android/server/policy/DisplayFoldController.java69
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java14
-rw-r--r--services/java/com/android/server/SystemServer.java8
5 files changed, 40 insertions, 60 deletions
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 40e11cb92d3e..3d0c5f1a68fe 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -654,10 +654,9 @@
The default is false. -->
<bool name="config_lidControlsSleep">false</bool>
- <!-- Indicate whether closing the lid causes the device to enter the folded state which means
- to get a smaller screen and opening the lid causes the device to enter the unfolded state
- which means to get a larger screen. -->
- <bool name="config_lidControlsDisplayFold">false</bool>
+ <!-- The device state (supplied by DeviceStateManager) that should be treated as folded by the
+ display fold controller. Default is DeviceStateManager.INVALID_DEVICE_STATE. -->
+ <integer name="config_foldedDeviceState">-1</integer>
<!-- Indicate the display area rect for foldable devices in folded state. -->
<string name="config_foldedArea"></string>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index e50eee6afa91..9a08a494021b 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -3701,7 +3701,7 @@
<java-symbol type="string" name="config_customCountryDetector" />
<!-- For Foldables -->
- <java-symbol type="bool" name="config_lidControlsDisplayFold" />
+ <java-symbol type="integer" name="config_foldedDeviceState" />
<java-symbol type="string" name="config_foldedArea" />
<java-symbol type="array" name="config_disableApksUnlessMatchedSku_apk_list" />
diff --git a/services/core/java/com/android/server/policy/DisplayFoldController.java b/services/core/java/com/android/server/policy/DisplayFoldController.java
index b007a75c1ca5..ff51237a900a 100644
--- a/services/core/java/com/android/server/policy/DisplayFoldController.java
+++ b/services/core/java/com/android/server/policy/DisplayFoldController.java
@@ -20,12 +20,10 @@ import android.annotation.Nullable;
import android.content.Context;
import android.graphics.Rect;
import android.hardware.ICameraService;
-import android.hardware.Sensor;
-import android.hardware.SensorEvent;
-import android.hardware.SensorEventListener;
-import android.hardware.SensorManager;
+import android.hardware.devicestate.DeviceStateManager;
import android.hardware.display.DisplayManagerInternal;
import android.os.Handler;
+import android.os.HandlerExecutor;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.util.Slog;
@@ -63,7 +61,8 @@ class DisplayFoldController {
private String mFocusedApp;
private final DisplayFoldDurationLogger mDurationLogger = new DisplayFoldDurationLogger();
- DisplayFoldController(WindowManagerInternal windowManagerInternal,
+ DisplayFoldController(
+ Context context, WindowManagerInternal windowManagerInternal,
DisplayManagerInternal displayManagerInternal,
@Nullable CameraServiceProxy cameraServiceProxy, int displayId, Rect foldedArea,
Handler handler) {
@@ -73,6 +72,10 @@ class DisplayFoldController {
mDisplayId = displayId;
mFoldedArea = new Rect(foldedArea);
mHandler = handler;
+
+ DeviceStateManager deviceStateManager = context.getSystemService(DeviceStateManager.class);
+ deviceStateManager.registerDeviceStateListener(new DeviceStateListener(context),
+ new HandlerExecutor(handler));
}
void finishedGoingToSleep() {
@@ -83,11 +86,7 @@ class DisplayFoldController {
mDurationLogger.onFinishedWakingUp(mFolded);
}
- void requestDeviceFolded(boolean folded) {
- mHandler.post(() -> setDeviceFolded(folded));
- }
-
- void setDeviceFolded(boolean folded) {
+ private void setDeviceFolded(boolean folded) {
if (mFolded != null && mFolded == folded) {
return;
}
@@ -179,33 +178,6 @@ class DisplayFoldController {
}
}
- /**
- * Only used for the case that persist.debug.force_foldable is set.
- * This is using proximity sensor to simulate the fold state switch.
- */
- static DisplayFoldController createWithProxSensor(Context context, int displayId) {
- final SensorManager sensorManager = context.getSystemService(SensorManager.class);
- final Sensor proxSensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
- if (proxSensor == null) {
- return null;
- }
-
- final DisplayFoldController result = create(context, displayId);
- sensorManager.registerListener(new SensorEventListener() {
- @Override
- public void onSensorChanged(SensorEvent event) {
- result.requestDeviceFolded(event.values[0] < 1f);
- }
-
- @Override
- public void onAccuracyChanged(Sensor sensor, int accuracy) {
- // Ignore.
- }
- }, proxSensor, SensorManager.SENSOR_DELAY_NORMAL);
-
- return result;
- }
-
void onDefaultDisplayFocusChanged(String pkg) {
mFocusedApp = pkg;
}
@@ -227,7 +199,26 @@ class DisplayFoldController {
foldedArea = Rect.unflattenFromString(configFoldedArea);
}
- return new DisplayFoldController(windowManagerService, displayService, cameraServiceProxy,
- displayId, foldedArea, DisplayThread.getHandler());
+ return new DisplayFoldController(context, windowManagerService, displayService,
+ cameraServiceProxy, displayId, foldedArea, DisplayThread.getHandler());
+ }
+
+ /**
+ * Listens to changes in device state and reports the state as folded if the device state
+ * matches the value in the {@link com.android.internal.R.integer.config_foldedDeviceState}
+ * resource.
+ */
+ private class DeviceStateListener implements DeviceStateManager.DeviceStateListener {
+ private final int mFoldedDeviceState;
+
+ DeviceStateListener(Context context) {
+ mFoldedDeviceState = context.getResources().getInteger(
+ com.android.internal.R.integer.config_foldedDeviceState);
+ }
+
+ @Override
+ public void onDeviceStateChanged(int deviceState) {
+ setDeviceFolded(deviceState == mFoldedDeviceState);
+ }
}
}
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index ea985df1c6b8..4fa8c8e1395d 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -472,7 +472,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
int mLidKeyboardAccessibility;
int mLidNavigationAccessibility;
- private boolean mLidControlsDisplayFold;
int mShortPressOnPowerBehavior;
int mLongPressOnPowerBehavior;
int mVeryLongPressOnPowerBehavior;
@@ -1789,8 +1788,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
com.android.internal.R.integer.config_lidKeyboardAccessibility);
mLidNavigationAccessibility = mContext.getResources().getInteger(
com.android.internal.R.integer.config_lidNavigationAccessibility);
- mLidControlsDisplayFold = mContext.getResources().getBoolean(
- com.android.internal.R.bool.config_lidControlsDisplayFold);
mAllowTheaterModeWakeFromKey = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_allowTheaterModeWakeFromKey);
@@ -1847,12 +1844,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
readConfigurationDependentBehaviors();
- if (mLidControlsDisplayFold) {
- mDisplayFoldController = DisplayFoldController.create(context, DEFAULT_DISPLAY);
- } else if (SystemProperties.getBoolean("persist.debug.force_foldable", false)) {
- mDisplayFoldController = DisplayFoldController.createWithProxSensor(context,
- DEFAULT_DISPLAY);
- }
+ mDisplayFoldController = DisplayFoldController.create(context, DEFAULT_DISPLAY);
mAccessibilityManager = (AccessibilityManager) context.getSystemService(
Context.ACCESSIBILITY_SERVICE);
@@ -4853,9 +4845,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private void applyLidSwitchState() {
final int lidState = mDefaultDisplayPolicy.getLidState();
- if (mLidControlsDisplayFold && mDisplayFoldController != null) {
- mDisplayFoldController.requestDeviceFolded(lidState == LID_CLOSED);
- } else if (lidState == LID_CLOSED) {
+ if (lidState == LID_CLOSED) {
int lidBehavior = getLidBehavior();
switch (lidBehavior) {
case LID_BEHAVIOR_LOCK:
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 92c64f822b78..242cee8eaccd 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -1281,6 +1281,10 @@ public final class SystemServer implements Dumpable {
inputManager = new InputManagerService(context);
t.traceEnd();
+ t.traceBegin("DeviceStateManagerService");
+ mSystemServiceManager.startService(DeviceStateManagerService.class);
+ t.traceEnd();
+
if (!disableCameraService) {
t.traceBegin("StartCameraServiceProxy");
mSystemServiceManager.startService(CameraServiceProxy.class);
@@ -1374,10 +1378,6 @@ public final class SystemServer implements Dumpable {
mSystemServiceManager.startService(AppIntegrityManagerService.class);
t.traceEnd();
- t.traceBegin("DeviceStateManagerService");
- mSystemServiceManager.startService(DeviceStateManagerService.class);
- t.traceEnd();
-
} catch (Throwable e) {
Slog.e("System", "******************************************");
Slog.e("System", "************ Failure starting core service");