From ba7e1a521f2bcc7802cd64e6f3c7557dd1adcec1 Mon Sep 17 00:00:00 2001 From: Evan Rosky Date: Wed, 24 Feb 2021 17:53:15 -0800 Subject: [PATCH] Fix some bugs in input rotation Set deviceWidth/Height properly when setting displayviewport Remove unnecessary rotation from pointerlocationview (which was double rotating PointerEventDispatcher). Fixed PointerEventDispatcher to use "real" size. Bug: 179308296 Test: enable input rotation, rotate, and touch things Change-Id: I156b6b3e0bf6d71996901c6e616c5710b12e3f0c --- .../internal/widget/PointerLocationView.java | 20 ------------------- .../server/input/InputManagerService.java | 11 ++++++---- .../server/wm/PointerEventDispatcher.java | 10 ++++++---- 3 files changed, 13 insertions(+), 28 deletions(-) diff --git a/core/java/com/android/internal/widget/PointerLocationView.java b/core/java/com/android/internal/widget/PointerLocationView.java index 143017cba57dc..fd6038fd655d4 100644 --- a/core/java/com/android/internal/widget/PointerLocationView.java +++ b/core/java/com/android/internal/widget/PointerLocationView.java @@ -36,7 +36,6 @@ import android.view.InputDevice; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.MotionEvent.PointerCoords; -import android.view.Surface; import android.view.VelocityTracker; import android.view.View; import android.view.ViewConfiguration; @@ -60,9 +59,6 @@ public class PointerLocationView extends View implements InputDeviceListener, */ private static final String GESTURE_EXCLUSION_PROP = "debug.pointerlocation.showexclusion"; - private static final boolean ENABLE_PER_WINDOW_INPUT_ROTATION = - SystemProperties.getBoolean("persist.debug.per_window_input_rotation", false); - public static class PointerState { // Trace of previous points. private float[] mTraceX = new float[32]; @@ -356,21 +352,6 @@ public class PointerLocationView extends View implements InputDeviceListener, .toString(), 1 + itemW * 6, base, mTextPaint); } - int saveId = canvas.save(); - if (ENABLE_PER_WINDOW_INPUT_ROTATION) { - // Rotate negative (since we're rotating the drawing canvas vs the output). - canvas.rotate(-90.0f * mContext.getDisplay().getRotation()); - switch (mContext.getDisplay().getRotation()) { - case Surface.ROTATION_90: - canvas.translate(-canvas.getHeight(), 0); - break; - case Surface.ROTATION_180: - canvas.translate(-canvas.getWidth(), -canvas.getHeight()); - break; - case Surface.ROTATION_270: - canvas.translate(0, -canvas.getWidth()); - } - } // Pointer trace. for (int p = 0; p < NP; p++) { final PointerState ps = mPointers.get(p); @@ -480,7 +461,6 @@ public class PointerLocationView extends View implements InputDeviceListener, } } } - canvas.restoreToCount(saveId); } private void logMotionEvent(String type, MotionEvent event) { diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index bbe52bcecea2a..edb5d97f1a5a3 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -590,10 +590,13 @@ public class InputManagerService extends IInputManager.Stub for (int i = viewports.size() - 1; i >= 0; --i) { final DisplayViewport v = vArray[i] = viewports.get(i).makeCopy(); // deviceWidth/Height are apparently in "rotated" space, so flip them if needed. - int dw = (v.orientation % 2) == 0 ? v.deviceWidth : v.deviceHeight; - int dh = (v.orientation % 2) == 0 ? v.deviceHeight : v.deviceWidth; - v.logicalFrame.set(0, 0, dw, dh); - v.physicalFrame.set(0, 0, dw, dh); + if (v.orientation % 2 != 0) { + final int dw = v.deviceWidth; + v.deviceWidth = v.deviceHeight; + v.deviceHeight = dw; + } + v.logicalFrame.set(0, 0, v.deviceWidth, v.deviceHeight); + v.physicalFrame.set(0, 0, v.deviceWidth, v.deviceHeight); v.orientation = 0; } } else { diff --git a/services/core/java/com/android/server/wm/PointerEventDispatcher.java b/services/core/java/com/android/server/wm/PointerEventDispatcher.java index 08de9b052ced9..9bc7e93443cbd 100644 --- a/services/core/java/com/android/server/wm/PointerEventDispatcher.java +++ b/services/core/java/com/android/server/wm/PointerEventDispatcher.java @@ -18,6 +18,7 @@ package com.android.server.wm; import static com.android.server.input.InputManagerService.ENABLE_PER_WINDOW_INPUT_ROTATION; +import android.graphics.Point; import android.view.InputChannel; import android.view.InputDevice; import android.view.InputEvent; @@ -35,6 +36,7 @@ public class PointerEventDispatcher extends InputEventReceiver { private PointerEventListener[] mListenersArray = new PointerEventListener[0]; private final DisplayContent mDisplayContent; + private final Point mTmpSize = new Point(); public PointerEventDispatcher(InputChannel inputChannel, DisplayContent dc) { super(inputChannel, UiThread.getHandler().getLooper()); @@ -48,12 +50,12 @@ public class PointerEventDispatcher extends InputEventReceiver { && (event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) { MotionEvent motionEvent = (MotionEvent) event; if (ENABLE_PER_WINDOW_INPUT_ROTATION) { - int rotation = mDisplayContent.getRotation(); + final int rotation = mDisplayContent.getRotation(); if (rotation != Surface.ROTATION_0) { + mDisplayContent.getDisplay().getRealSize(mTmpSize); motionEvent = MotionEvent.obtain(motionEvent); - motionEvent.transform(MotionEvent.createRotateMatrix(rotation, - mDisplayContent.getDisplayMetrics().widthPixels, - mDisplayContent.getDisplayMetrics().heightPixels)); + motionEvent.transform(MotionEvent.createRotateMatrix( + rotation, mTmpSize.x, mTmpSize.y)); } } PointerEventListener[] listeners;