diff options
| author | 2024-01-13 00:55:34 +0000 | |
|---|---|---|
| committer | 2024-01-23 23:21:48 +0000 | |
| commit | ef6fd75eeb6c482a5f5c55406104a1b146e14dfd (patch) | |
| tree | b3064505863c6265374fe190d5ba3eb6d52ccd8b | |
| parent | 54debd28a7e34b4ac8ab297d6b6473fb726c288b (diff) | |
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 <winsonc@google.com>
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"); + } /** @@ -45,10 +56,19 @@ public class InputMonitorCompat { } /** + * @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<NavigationEdgeBack private boolean mIsTrackpadThreeFingerSwipe; private boolean mIsButtonForcedVisible; - private InputMonitor mInputMonitor; + private InputMonitorCompat mInputMonitor; private InputChannelCompat.InputEventReceiver mInputEventReceiver; private NavigationEdgeBackPlugin mEdgeBackPlugin; @@ -665,10 +666,8 @@ public class EdgeBackGestureHandler implements PluginListener<NavigationEdgeBack } // Register input event receiver - mInputMonitor = mContext.getSystemService(InputManager.class).monitorGestureInput( - "edge-swipe", mDisplayId); - mInputEventReceiver = new InputChannelCompat.InputEventReceiver( - mInputMonitor.getInputChannel(), Looper.getMainLooper(), + mInputMonitor = new InputMonitorCompat("edge-swipe", mDisplayId); + mInputEventReceiver = mInputMonitor.getInputReceiver(Looper.getMainLooper(), Choreographer.getInstance(), this::onInputEvent); // Add a nav bar panel window |