diff options
5 files changed, 35 insertions, 2 deletions
diff --git a/core/java/android/hardware/input/IInputManager.aidl b/core/java/android/hardware/input/IInputManager.aidl index 19fb845d9384..2ac194b67192 100644 --- a/core/java/android/hardware/input/IInputManager.aidl +++ b/core/java/android/hardware/input/IInputManager.aidl @@ -144,4 +144,6 @@ interface IInputManager { void openLightSession(int deviceId, String opPkg, in IBinder token); void closeLightSession(int deviceId, in IBinder token); + + void cancelCurrentTouch(); } diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java index 6f0c944b76ff..6253fb90323a 100644 --- a/core/java/android/hardware/input/InputManager.java +++ b/core/java/android/hardware/input/InputManager.java @@ -1650,6 +1650,18 @@ public final class InputManager { } /** + * Cancel all ongoing pointer gestures on all displays. + * @hide + */ + public void cancelCurrentTouch() { + try { + mIm.cancelCurrentTouch(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** * Listens for changes in input devices. */ public interface InputDeviceListener { diff --git a/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt b/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt index e6fc49fae315..0b89ef28d227 100644 --- a/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt +++ b/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt @@ -20,6 +20,7 @@ import android.content.Context import android.graphics.PixelFormat import android.hardware.devicestate.DeviceStateManager import android.hardware.devicestate.DeviceStateManager.FoldStateListener +import android.hardware.input.InputManager import android.hardware.display.DisplayManager import android.os.Handler import android.os.Trace @@ -195,8 +196,7 @@ class UnfoldLightRevealOverlayAnimation @Inject constructor( params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS params.fitInsetsTypes = 0 - params.flags = (WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE - or WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE) + params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE params.setTrustedOverlay() val packageName: String = context.opPackageName @@ -239,6 +239,8 @@ class UnfoldLightRevealOverlayAnimation @Inject constructor( if (scrimView == null) { addView() } + // Disable input dispatching during transition. + InputManager.getInstance().cancelCurrentTouch() } } diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index 3d04037185f3..261aa32f093e 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -347,6 +347,7 @@ public class InputManagerService extends IInputManager.Stub private static native boolean nativeEnableSensor(long ptr, int deviceId, int sensorType, int samplingPeriodUs, int maxBatchReportLatencyUs); private static native void nativeDisableSensor(long ptr, int deviceId, int sensorType); + private static native void nativeCancelCurrentTouch(long ptr); // Maximum number of milliseconds to wait for input event injection. private static final int INJECTION_TIMEOUT_MILLIS = 30 * 1000; @@ -2510,6 +2511,16 @@ public class InputManagerService extends IInputManager.Stub } @Override + public void cancelCurrentTouch() { + if (!checkCallingPermission(android.Manifest.permission.MONITOR_INPUT, + "cancelCurrentTouch()")) { + throw new SecurityException("Requires MONITOR_INPUT permission"); + } + + nativeCancelCurrentTouch(mPtr); + } + + @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return; diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index c5a69e2f84b7..6aa632388ffd 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -2292,6 +2292,11 @@ static jboolean nativeFlushSensor(JNIEnv* env, jclass /* clazz */, jlong ptr, ji sensorType)); } +static void nativeCancelCurrentTouch(JNIEnv* env, jclass /* clazz */, jlong ptr) { + NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); + im->getInputManager()->getDispatcher().cancelCurrentTouch(); +} + // ---------------------------------------------------------------------------- static const JNINativeMethod gInputManagerMethods[] = { @@ -2371,6 +2376,7 @@ static const JNINativeMethod gInputManagerMethods[] = { {"nativeEnableSensor", "(JIIII)Z", (void*)nativeEnableSensor}, {"nativeDisableSensor", "(JII)V", (void*)nativeDisableSensor}, {"nativeFlushSensor", "(JII)Z", (void*)nativeFlushSensor}, + {"nativeCancelCurrentTouch", "(J)V", (void*)nativeCancelCurrentTouch}, }; #define FIND_CLASS(var, className) \ |