From 1a12af54e0197a900fc5221d23eb15829d598104 Mon Sep 17 00:00:00 2001 From: Nick Chameyev Date: Fri, 19 Apr 2024 11:54:51 +0000 Subject: [FoldableDeviceStateProvider] Do not listen to hall sensor when not used Disables listening to hall sensor when the new posture based closed state flag is enabled. When this flag is enabled we do not rely on hall sensor and use hinge angle sensor instead. Hall sensor is a wake-up sensor and it might waste power by waking up CPU when not needed. Test: manual check in sensor service dumpsys that we don't listen to hall sensor anymore Test: atest BookStyleDeviceStatePolicyTest Bug: 335386446 Change-Id: I89406859d5df23d17eea73113d4c46b273dd778b --- .../server/policy/BookStyleDeviceStatePolicy.java | 6 ++++++ .../server/policy/FoldableDeviceStateProvider.java | 15 +++++++++------ .../policy/BookStyleDeviceStatePolicyTest.java | 20 ++++++++++++++++++++ 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/services/foldables/devicestateprovider/src/com/android/server/policy/BookStyleDeviceStatePolicy.java b/services/foldables/devicestateprovider/src/com/android/server/policy/BookStyleDeviceStatePolicy.java index bc264a46f051..b5fb48fbee99 100644 --- a/services/foldables/devicestateprovider/src/com/android/server/policy/BookStyleDeviceStatePolicy.java +++ b/services/foldables/devicestateprovider/src/com/android/server/policy/BookStyleDeviceStatePolicy.java @@ -90,6 +90,12 @@ public class BookStyleDeviceStatePolicy extends DeviceStatePolicy implements final DisplayManager displayManager = mContext.getSystemService(DisplayManager.class); mEnablePostureBasedClosedState = featureFlags.enableFoldablesPostureBasedClosedState(); + if (mEnablePostureBasedClosedState) { + // This configuration doesn't require listening to hall sensor, it solely relies + // on the fused hinge angle sensor + hallSensor = null; + } + mIsDualDisplayBlockingEnabled = featureFlags.enableDualDisplayBlocking(); final DeviceStateConfiguration[] configuration = createConfiguration( diff --git a/services/foldables/devicestateprovider/src/com/android/server/policy/FoldableDeviceStateProvider.java b/services/foldables/devicestateprovider/src/com/android/server/policy/FoldableDeviceStateProvider.java index 42e41d59cfeb..27365210e0a5 100644 --- a/services/foldables/devicestateprovider/src/com/android/server/policy/FoldableDeviceStateProvider.java +++ b/services/foldables/devicestateprovider/src/com/android/server/policy/FoldableDeviceStateProvider.java @@ -96,6 +96,7 @@ public final class FoldableDeviceStateProvider implements DeviceStateProvider, private final Sensor mHingeAngleSensor; private final DisplayManager mDisplayManager; + @Nullable private final Sensor mHallSensor; private static final Predicate ALLOWED = p -> true; @@ -123,7 +124,7 @@ public final class FoldableDeviceStateProvider implements DeviceStateProvider, @NonNull Context context, @NonNull SensorManager sensorManager, @NonNull Sensor hingeAngleSensor, - @NonNull Sensor hallSensor, + @Nullable Sensor hallSensor, @NonNull DisplayManager displayManager, @NonNull DeviceStateConfiguration[] deviceStateConfigurations) { this(new FeatureFlagsImpl(), context, sensorManager, hingeAngleSensor, hallSensor, @@ -136,7 +137,7 @@ public final class FoldableDeviceStateProvider implements DeviceStateProvider, @NonNull Context context, @NonNull SensorManager sensorManager, @NonNull Sensor hingeAngleSensor, - @NonNull Sensor hallSensor, + @Nullable Sensor hallSensor, @NonNull DisplayManager displayManager, @NonNull DeviceStateConfiguration[] deviceStateConfigurations) { @@ -150,7 +151,9 @@ public final class FoldableDeviceStateProvider implements DeviceStateProvider, mIsDualDisplayBlockingEnabled = featureFlags.enableDualDisplayBlocking(); sensorManager.registerListener(this, mHingeAngleSensor, SENSOR_DELAY_FASTEST); - sensorManager.registerListener(this, mHallSensor, SENSOR_DELAY_FASTEST); + if (hallSensor != null) { + sensorManager.registerListener(this, mHallSensor, SENSOR_DELAY_FASTEST); + } mOrderedStates = new DeviceState[deviceStateConfigurations.length]; for (int i = 0; i < deviceStateConfigurations.length; i++) { @@ -326,7 +329,7 @@ public final class FoldableDeviceStateProvider implements DeviceStateProvider, @Override public void onSensorChanged(SensorEvent event) { synchronized (mLock) { - if (event.sensor == mHallSensor) { + if (mHallSensor != null && event.sensor == mHallSensor) { mLastHallSensorEvent = event; } else if (event.sensor == mHingeAngleSensor) { mLastHingeAngleSensorEvent = event; @@ -361,11 +364,11 @@ public final class FoldableDeviceStateProvider implements DeviceStateProvider, } @GuardedBy("mLock") - private void dumpSensorValues(Sensor sensor, @Nullable SensorEvent event) { + private void dumpSensorValues(@Nullable Sensor sensor, @Nullable SensorEvent event) { Slog.i(TAG, toSensorValueString(sensor, event)); } - private String toSensorValueString(Sensor sensor, @Nullable SensorEvent event) { + private String toSensorValueString(@Nullable Sensor sensor, @Nullable SensorEvent event) { String sensorString = sensor == null ? "null" : sensor.getName(); String eventValues = event == null ? "null" : Arrays.toString(event.values); return sensorString + " : " + eventValues; diff --git a/services/foldables/devicestateprovider/tests/src/com/android/server/policy/BookStyleDeviceStatePolicyTest.java b/services/foldables/devicestateprovider/tests/src/com/android/server/policy/BookStyleDeviceStatePolicyTest.java index 901f24dd9b0b..9f07aa8c1a41 100644 --- a/services/foldables/devicestateprovider/tests/src/com/android/server/policy/BookStyleDeviceStatePolicyTest.java +++ b/services/foldables/devicestateprovider/tests/src/com/android/server/policy/BookStyleDeviceStatePolicyTest.java @@ -218,6 +218,26 @@ public final class BookStyleDeviceStatePolicyTest { setScreenOn(true); } + @Test + public void test_postureBasedClosedState_createPolicy_doesNotRegisterHallSensor() { + mFakeFeatureFlags.setFlag(Flags.FLAG_ENABLE_FOLDABLES_POSTURE_BASED_CLOSED_STATE, true); + clearInvocations(mSensorManager); + + mInstrumentation.runOnMainSync(() -> mProvider = createProvider()); + + verify(mSensorManager, never()).registerListener(any(), eq(mHallSensor), anyInt()); + } + + @Test + public void test_postureBasedClosedStateDisabled_createPolicy_registersHallSensor() { + mFakeFeatureFlags.setFlag(Flags.FLAG_ENABLE_FOLDABLES_POSTURE_BASED_CLOSED_STATE, false); + clearInvocations(mSensorManager); + + mInstrumentation.runOnMainSync(() -> mProvider = createProvider()); + + verify(mSensorManager).registerListener(any(), eq(mHallSensor), anyInt()); + } + @Test public void test_noSensorEventsYet_reportOpenedState() { mProvider.setListener(mListener); -- cgit v1.2.3-59-g8ed1b