From 28ebbbf0abdb4777f924fd4b5ab3b4b68186582a Mon Sep 17 00:00:00 2001 From: Wale Ogunwale Date: Mon, 3 May 2021 09:07:07 -0700 Subject: [PATCH] Add helper class FoldStateListener Reduces the need for each code that needs to know about fold/unfold from duplicating the exact same code. Bug: 184795211 Test: They pass! Change-Id: Ic05a2067c2ec64db7dab0227a7204283c1144a5f --- .../devicestate/DeviceStateManager.java | 33 +++++++++++++++++++ .../server/policy/DisplayFoldController.java | 29 ++-------------- 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/core/java/android/hardware/devicestate/DeviceStateManager.java b/core/java/android/hardware/devicestate/DeviceStateManager.java index 250145e92b890..52dad3efefb89 100644 --- a/core/java/android/hardware/devicestate/DeviceStateManager.java +++ b/core/java/android/hardware/devicestate/DeviceStateManager.java @@ -24,7 +24,10 @@ import android.annotation.SystemService; import android.annotation.TestApi; import android.content.Context; +import com.android.internal.util.ArrayUtils; + import java.util.concurrent.Executor; +import java.util.function.Consumer; /** * Manages the state of the system for devices with user-configurable hardware like a foldable @@ -170,4 +173,34 @@ public final class DeviceStateManager { */ void onStateChanged(int state); } + + /** + * 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. + * @hide + */ + public static class FoldStateListener implements DeviceStateCallback { + private final int[] mFoldedDeviceStates; + private final Consumer mDelegate; + + @Nullable + private Boolean lastResult; + + public FoldStateListener(Context context, Consumer listener) { + mFoldedDeviceStates = context.getResources().getIntArray( + com.android.internal.R.array.config_foldedDeviceStates); + mDelegate = listener; + } + + @Override + public final void onStateChanged(int state) { + final boolean folded = ArrayUtils.contains(mFoldedDeviceStates, state); + + if (lastResult == null || !lastResult.equals(folded)) { + lastResult = folded; + mDelegate.accept(folded); + } + } + } } diff --git a/services/core/java/com/android/server/policy/DisplayFoldController.java b/services/core/java/com/android/server/policy/DisplayFoldController.java index 0e12584f80a1a..3c9b1063ba934 100644 --- a/services/core/java/com/android/server/policy/DisplayFoldController.java +++ b/services/core/java/com/android/server/policy/DisplayFoldController.java @@ -21,6 +21,7 @@ import android.content.Context; import android.graphics.Rect; import android.hardware.ICameraService; import android.hardware.devicestate.DeviceStateManager; +import android.hardware.devicestate.DeviceStateManager.FoldStateListener; import android.hardware.display.DisplayManagerInternal; import android.os.Handler; import android.os.HandlerExecutor; @@ -75,7 +76,7 @@ class DisplayFoldController { DeviceStateManager deviceStateManager = context.getSystemService(DeviceStateManager.class); deviceStateManager.registerCallback(new HandlerExecutor(handler), - new DeviceStateListener(context)); + new FoldStateListener(context, folded -> setDeviceFolded(folded))); } void finishedGoingToSleep() { @@ -202,30 +203,4 @@ class DisplayFoldController { 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.DeviceStateCallback { - private final int[] mFoldedDeviceStates; - - DeviceStateListener(Context context) { - mFoldedDeviceStates = context.getResources().getIntArray( - com.android.internal.R.array.config_foldedDeviceStates); - } - - @Override - public void onStateChanged(int deviceState) { - boolean folded = false; - for (int i = 0; i < mFoldedDeviceStates.length; i++) { - if (deviceState == mFoldedDeviceStates[i]) { - folded = true; - break; - } - } - setDeviceFolded(folded); - } - } }