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); - } - } }