From ef6fd75eeb6c482a5f5c55406104a1b146e14dfd Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Sat, 13 Jan 2024 00:55:34 +0000 Subject: Add additional logging and trace points for input monitor/receiver creation - This helps to identify cases where the input channel and receiver are mismatched which can lead to ANRs Bug: 25877554 Test: Verify with a perfetto trace that the above tags are seen Change-Id: I3599cee1ba4470d610814f436889a0ba5913cf0d Signed-off-by: Winson Chung --- .../systemui/shared/system/InputChannelCompat.java | 23 ++++++++++++------- .../systemui/shared/system/InputMonitorCompat.java | 26 ++++++++++++++++++++-- .../gestural/EdgeBackGestureHandler.java | 9 ++++---- 3 files changed, 43 insertions(+), 15 deletions(-) diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputChannelCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputChannelCompat.java index 259cca8c01e2..9e92c939dbbc 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputChannelCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputChannelCompat.java @@ -16,8 +16,11 @@ package com.android.systemui.shared.system; -import android.graphics.Matrix; +import static android.os.Trace.TRACE_TAG_INPUT; + import android.os.Looper; +import android.os.Trace; +import android.util.Log; import android.view.BatchedInputEventReceiver; import android.view.Choreographer; import android.view.InputChannel; @@ -52,23 +55,24 @@ public class InputChannelCompat { return target.addBatch(src); } - /** @see MotionEvent#createRotateMatrix */ - public static Matrix createRotationMatrix( - /*@Surface.Rotation*/ int rotation, int displayW, int displayH) { - return MotionEvent.createRotateMatrix(rotation, displayW, displayH); - } - /** * @see BatchedInputEventReceiver */ public static class InputEventReceiver { + private final String mName; private final BatchedInputEventReceiver mReceiver; + @Deprecated public InputEventReceiver(InputChannel inputChannel, Looper looper, Choreographer choreographer, final InputEventListener listener) { - mReceiver = new BatchedInputEventReceiver(inputChannel, looper, choreographer) { + this("unknown", inputChannel, looper, choreographer, listener); + } + public InputEventReceiver(String name, InputChannel inputChannel, Looper looper, + Choreographer choreographer, final InputEventListener listener) { + mName = name; + mReceiver = new BatchedInputEventReceiver(inputChannel, looper, choreographer) { @Override public void onInputEvent(InputEvent event) { listener.onInputEvent(event); @@ -89,6 +93,9 @@ public class InputChannelCompat { */ public void dispose() { mReceiver.dispose(); + Trace.instant(TRACE_TAG_INPUT, "InputMonitorCompat-" + mName + " receiver disposed"); + Log.d(InputMonitorCompat.TAG, "Input event receiver for monitor (" + mName + + ") disposed"); } } } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputMonitorCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputMonitorCompat.java index c4aac111f24c..78beaf76ea78 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputMonitorCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputMonitorCompat.java @@ -17,8 +17,13 @@ package com.android.systemui.shared.system; import android.hardware.input.InputManagerGlobal; import android.os.Looper; +import android.os.Trace; +import android.util.Log; import android.view.Choreographer; import android.view.InputMonitor; +import android.view.SurfaceControl; + +import androidx.annotation.NonNull; import com.android.systemui.shared.system.InputChannelCompat.InputEventListener; import com.android.systemui.shared.system.InputChannelCompat.InputEventReceiver; @@ -27,14 +32,20 @@ import com.android.systemui.shared.system.InputChannelCompat.InputEventReceiver; * @see android.view.InputMonitor */ public class InputMonitorCompat { + static final String TAG = "InputMonitorCompat"; private final InputMonitor mInputMonitor; + private final String mName; /** * Monitor input on the specified display for gestures. */ - public InputMonitorCompat(String name, int displayId) { + public InputMonitorCompat(@NonNull String name, int displayId) { + mName = name + "-disp" + displayId; mInputMonitor = InputManagerGlobal.getInstance() .monitorGestureInput(name, displayId); + Trace.instant(Trace.TRACE_TAG_INPUT, "InputMonitorCompat-" + mName + " created"); + Log.d(TAG, "Input monitor (" + mName + ") created"); + } /** @@ -44,11 +55,20 @@ public class InputMonitorCompat { mInputMonitor.pilferPointers(); } + /** + * @see InputMonitor#getSurface() + */ + public SurfaceControl getSurface() { + return mInputMonitor.getSurface(); + } + /** * @see InputMonitor#dispose() */ public void dispose() { mInputMonitor.dispose(); + Trace.instant(Trace.TRACE_TAG_INPUT, "InputMonitorCompat-" + mName + " disposed"); + Log.d(TAG, "Input monitor (" + mName + ") disposed"); } /** @@ -56,7 +76,9 @@ public class InputMonitorCompat { */ public InputEventReceiver getInputReceiver(Looper looper, Choreographer choreographer, InputEventListener listener) { - return new InputEventReceiver(mInputMonitor.getInputChannel(), looper, choreographer, + Trace.instant(Trace.TRACE_TAG_INPUT, "InputMonitorCompat-" + mName + " receiver created"); + Log.d(TAG, "Input event receiver for monitor (" + mName + ") created"); + return new InputEventReceiver(mName, mInputMonitor.getInputChannel(), looper, choreographer, listener); } } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java index 58e042868607..91c86dff34ea 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java @@ -84,6 +84,7 @@ import com.android.systemui.res.R; import com.android.systemui.settings.UserTracker; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.InputChannelCompat; +import com.android.systemui.shared.system.InputMonitorCompat; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.SysUiStatsLog; import com.android.systemui.shared.system.TaskStackChangeListener; @@ -261,7 +262,7 @@ public class EdgeBackGestureHandler implements PluginListener