diff options
author | 2024-11-21 18:42:14 +0000 | |
---|---|---|
committer | 2024-11-22 16:53:22 +0000 | |
commit | ce1a73829f7f900dc868efc152c802c028e83303 (patch) | |
tree | 3fdf5668a051a28fe119edd9a63c239b621abd99 | |
parent | 9163f5415855f6545ee28f31d433cc4eece2f19c (diff) |
Update OHM regions whenever other regions change
- Speculative fix, there are some scenarios where we update the swipe
touch/assistant regions without updating the OHM regions
Bug: 362039326
Flag: EXEMPT bugfix
Test: Manual
Change-Id: If5c558623073e5185827ae17a162dacf322c74a4
4 files changed, 76 insertions, 39 deletions
diff --git a/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java b/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java index a03c0f8b2a..ef103c4953 100644 --- a/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java +++ b/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java @@ -37,6 +37,7 @@ import com.android.launcher3.testing.shared.TestProtocol; import com.android.launcher3.util.DisplayController.Info; import com.android.launcher3.util.NavigationMode; import com.android.launcher3.util.window.CachedDisplayInfo; +import com.android.quickstep.util.ActiveGestureProtoLogProxy; import com.android.systemui.shared.Flags; import java.io.PrintWriter; @@ -111,13 +112,13 @@ class OrientationTouchTransformer { mNavBarGesturalHeight); } - private void refreshTouchRegion(Info info, Resources newRes) { + private void refreshTouchRegion(Info info, Resources newRes, String reason) { // Swipe touch regions are independent of nav mode, so we have to clear them explicitly // here to avoid, for ex, a nav region for 2-button rotation 0 being used for 3-button mode // It tries to cache and reuse swipe regions whenever possible based only on rotation mResources = newRes; mSwipeTouchRegions.clear(); - resetSwipeRegions(info); + resetSwipeRegions(info, reason); } void setNavigationMode(NavigationMode newMode, Info info, Resources newRes) { @@ -128,7 +129,7 @@ class OrientationTouchTransformer { return; } this.mMode = newMode; - refreshTouchRegion(info, newRes); + refreshTouchRegion(info, newRes, "setNavigationMode"); } void setGesturalHeight(int newGesturalHeight, Info info, Resources newRes) { @@ -136,7 +137,7 @@ class OrientationTouchTransformer { return; } mNavBarGesturalHeight = newGesturalHeight; - refreshTouchRegion(info, newRes); + refreshTouchRegion(info, newRes, "setGesturalHeight"); } /** @@ -147,14 +148,14 @@ class OrientationTouchTransformer { * * @see #enableMultipleRegions(boolean, Info) */ - void createOrAddTouchRegion(Info info) { + void createOrAddTouchRegion(Info info, String reason) { mCachedDisplayInfo = new CachedDisplayInfo(info.currentSize, info.rotation); if (mQuickStepStartingRotation > QUICKSTEP_ROTATION_UNINITIALIZED && mCachedDisplayInfo.rotation == mQuickStepStartingRotation) { // User already was swiping and the current screen is same rotation as the starting one // Remove active nav bars in other rotations except for the one we started out in - resetSwipeRegions(info); + resetSwipeRegions(info, reason); return; } OrientationRectF region = mSwipeTouchRegions.get(mCachedDisplayInfo); @@ -163,9 +164,9 @@ class OrientationTouchTransformer { } if (mEnableMultipleRegions) { - mSwipeTouchRegions.put(mCachedDisplayInfo, createRegionForDisplay(info)); + mSwipeTouchRegions.put(mCachedDisplayInfo, createRegionForDisplay(info, reason)); } else { - resetSwipeRegions(info); + resetSwipeRegions(info, reason); } } @@ -184,7 +185,7 @@ class OrientationTouchTransformer { mActiveTouchRotation = 0; mQuickStepStartingRotation = QUICKSTEP_ROTATION_UNINITIALIZED; } - resetSwipeRegions(info); + resetSwipeRegions(info, "enableMultipleRegions"); } /** @@ -198,7 +199,7 @@ class OrientationTouchTransformer { */ void setSingleActiveRegion(Info displayInfo) { mActiveTouchRotation = displayInfo.rotation; - resetSwipeRegions(displayInfo); + resetSwipeRegions(displayInfo, "setSingleActiveRegion"); } /** @@ -207,19 +208,21 @@ class OrientationTouchTransformer { * To be called whenever we want to stop tracking more than one swipe region. * Ok to call multiple times. */ - private void resetSwipeRegions(Info region) { + private void resetSwipeRegions(Info region, String reason) { if (enableLog()) { - Log.d(TAG, "clearing all regions except rotation: " + mCachedDisplayInfo.rotation); + Log.d(TAG, "clearing all regions except rotation: " + mCachedDisplayInfo.rotation + + " reason=" + reason); } mCachedDisplayInfo = new CachedDisplayInfo(region.currentSize, region.rotation); OrientationRectF regionToKeep = mSwipeTouchRegions.get(mCachedDisplayInfo); if (regionToKeep == null) { - regionToKeep = createRegionForDisplay(region); + regionToKeep = createRegionForDisplay(region, reason); } mSwipeTouchRegions.clear(); mSwipeTouchRegions.put(mCachedDisplayInfo, regionToKeep); updateAssistantRegions(regionToKeep); + updateOneHandedRegions(regionToKeep); } private void resetSwipeRegions() { @@ -228,15 +231,17 @@ class OrientationTouchTransformer { if (regionToKeep != null) { mSwipeTouchRegions.put(mCachedDisplayInfo, regionToKeep); updateAssistantRegions(regionToKeep); + updateOneHandedRegions(regionToKeep); } } - private OrientationRectF createRegionForDisplay(Info display) { + private OrientationRectF createRegionForDisplay(Info display, String reason) { if (enableLog()) { Log.d(TAG, "creating rotation region for: " + mCachedDisplayInfo.rotation + " with mode: " + mMode + " displayRotation: " + display.rotation + " displaySize: " + display.currentSize + - " navBarHeight: " + mNavBarGesturalHeight); + " navBarHeight: " + mNavBarGesturalHeight + + " reason: " + reason); } Point size = display.currentSize; @@ -264,9 +269,10 @@ class OrientationTouchTransformer { orientationRectF.top = orientationRectF.bottom - touchHeight; } } - // One handed gestural only active on portrait mode - mOneHandedModeRegion.set(0, orientationRectF.bottom - mNavBarLargerGesturalHeight, - size.x, size.y); + updateOneHandedRegions(orientationRectF); + ActiveGestureProtoLogProxy.logCreateTouchRegionForDisplay(rotation, size, orientationRectF, + mOneHandedModeRegion, mNavBarGesturalHeight, mNavBarLargerGesturalHeight, + reason); return orientationRectF; } @@ -286,6 +292,12 @@ class OrientationTouchTransformer { mAssistantRightRegion.left = orientationRectF.right - assistantWidth; } + private void updateOneHandedRegions(OrientationRectF orientationRectF) { + // One handed gestural only active on portrait mode + mOneHandedModeRegion.set(0, orientationRectF.bottom - mNavBarLargerGesturalHeight, + orientationRectF.right, orientationRectF.bottom); + } + boolean touchInAssistantRegion(MotionEvent ev) { return mAssistantLeftRegion.contains(ev.getX(), ev.getY()) || mAssistantRightRegion.contains(ev.getX(), ev.getY()); @@ -411,9 +423,11 @@ class OrientationTouchTransformer { OrientationRectF rectF = mSwipeTouchRegions.get(key); regions.append(rectF).append(" "); } - pw.println(regions.toString()); + pw.println(regions); pw.println(" mNavBarGesturalHeight=" + mNavBarGesturalHeight); pw.println(" mNavBarLargerGesturalHeight=" + mNavBarLargerGesturalHeight); + pw.println(" mAssistantLeftRegion=" + mAssistantLeftRegion); + pw.println(" mAssistantRightRegion=" + mAssistantRightRegion); pw.println(" mOneHandedModeRegion=" + mOneHandedModeRegion); } } diff --git a/quickstep/src/com/android/quickstep/RotationTouchHelper.java b/quickstep/src/com/android/quickstep/RotationTouchHelper.java index 79abc0f369..909cc35d2b 100644 --- a/quickstep/src/com/android/quickstep/RotationTouchHelper.java +++ b/quickstep/src/com/android/quickstep/RotationTouchHelper.java @@ -236,7 +236,8 @@ public class RotationTouchHelper implements DisplayInfoChangeListener, SafeClose return; } - mOrientationTouchTransformer.createOrAddTouchRegion(mDisplayController.getInfo()); + mOrientationTouchTransformer.createOrAddTouchRegion(mDisplayController.getInfo(), + "RTH.updateGestureTouchRegions"); } /** @@ -273,7 +274,8 @@ public class RotationTouchHelper implements DisplayInfoChangeListener, SafeClose if (hasGestures(mMode)) { updateGestureTouchRegions(); - mOrientationTouchTransformer.createOrAddTouchRegion(info); + mOrientationTouchTransformer.createOrAddTouchRegion(info, + "RTH.onDisplayInfoChanged"); mCurrentAppRotation = mDisplayRotation; /* Update nav bars on the following: diff --git a/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java index f43a125aa4..63519d2b77 100644 --- a/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java +++ b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java @@ -38,6 +38,8 @@ import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.START_RECENTS_ANIMATION; import static com.android.quickstep.util.QuickstepProtoLogGroup.ACTIVE_GESTURE_LOG; +import android.graphics.Point; +import android.graphics.RectF; import android.view.MotionEvent; import androidx.annotation.NonNull; @@ -499,4 +501,16 @@ public class ActiveGestureProtoLogProxy { taskId, packageName); } + + public static void logCreateTouchRegionForDisplay(int displayRotation, + @NonNull Point displaySize, @NonNull RectF swipeRegion, @NonNull RectF ohmRegion, + int gesturalHeight, int largerGesturalHeight, @NonNull String reason) { + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, + "OrientationTouchTransformer.createRegionForDisplay: " + + "dispRot=%d, dispSize=%s, swipeRegion=%s, ohmRegion=%s, " + + "gesturalHeight=%d, largerGesturalHeight=%d, reason=%s", + displayRotation, displaySize.flattenToString(), swipeRegion.toShortString(), + ohmRegion.toShortString(), gesturalHeight, largerGesturalHeight, reason); + } } diff --git a/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java b/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java index f5d082dd5c..ff0ad535cd 100644 --- a/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java +++ b/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java @@ -90,7 +90,7 @@ public class OrientationTouchTransformerTest { float landscapeRegionY = generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_90) + 1; - mTouchTransformer.createOrAddTouchRegion(mInfo); + mTouchTransformer.createOrAddTouchRegion(mInfo, "test"); tapAndAssertTrue(100, portraitRegionY, event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY())); tapAndAssertFalse(100, landscapeRegionY, @@ -102,7 +102,8 @@ public class OrientationTouchTransformerTest { // Override region mTouchTransformer - .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90)); + .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90), + "test"); tapAndAssertFalse(100, portraitRegionY, event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY())); tapAndAssertTrue(100, landscapeRegionY, @@ -113,7 +114,7 @@ public class OrientationTouchTransformerTest { event -> mTouchTransformer.touchInAssistantRegion(event)); // Override region again - mTouchTransformer.createOrAddTouchRegion(mInfo); + mTouchTransformer.createOrAddTouchRegion(mInfo, "test"); tapAndAssertTrue(100, portraitRegionY, event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY())); tapAndAssertFalse(100, landscapeRegionY, @@ -132,7 +133,8 @@ public class OrientationTouchTransformerTest { generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_90) + 1; mTouchTransformer - .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90)); + .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90), + "test"); tapAndAssertFalse(100, portraitRegionY, event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY())); tapAndAssertTrue(100, landscapeRegionY, @@ -144,7 +146,7 @@ public class OrientationTouchTransformerTest { // We have to add 0 rotation second so that gets set as the current rotation, otherwise // matrix transform will fail (tests only work in Portrait at the moment) mTouchTransformer.enableMultipleRegions(true, mInfo); - mTouchTransformer.createOrAddTouchRegion(mInfo); + mTouchTransformer.createOrAddTouchRegion(mInfo, "test"); tapAndAssertTrue(100, portraitRegionY, event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY())); @@ -165,8 +167,9 @@ public class OrientationTouchTransformerTest { mTouchTransformer.enableMultipleRegions(true, mInfo); mTouchTransformer - .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90)); - mTouchTransformer.createOrAddTouchRegion(mInfo); + .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90), + "test"); + mTouchTransformer.createOrAddTouchRegion(mInfo, "test"); tapAndAssertTrue(0, portraitRegionY, event -> mTouchTransformer.touchInAssistantRegion(event)); tapAndAssertFalse(0, landscapeRegionY, @@ -181,9 +184,10 @@ public class OrientationTouchTransformerTest { generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_90) + 1; mTouchTransformer.enableMultipleRegions(true, mInfo); - mTouchTransformer.createOrAddTouchRegion(mInfo); + mTouchTransformer.createOrAddTouchRegion(mInfo, "test"); mTouchTransformer - .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90)); + .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90), + "test"); mTouchTransformer.enableMultipleRegions(false, mInfo); tapAndAssertTrue(0, portraitRegionY, event -> mTouchTransformer.touchInAssistantRegion(event)); @@ -213,14 +217,14 @@ public class OrientationTouchTransformerTest { @Test public void applyTransform_taskNotFrozen_notInRegion() { - mTouchTransformer.createOrAddTouchRegion(mInfo); + mTouchTransformer.createOrAddTouchRegion(mInfo, "test"); tapAndAssertFalse(100, 100, event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY())); } @Test public void applyTransform_taskFrozen_noRotate_outOfRegion() { - mTouchTransformer.createOrAddTouchRegion(mInfo); + mTouchTransformer.createOrAddTouchRegion(mInfo, "test"); mTouchTransformer.enableMultipleRegions(true, mInfo); tapAndAssertFalse(100, 100, event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY())); @@ -228,7 +232,7 @@ public class OrientationTouchTransformerTest { @Test public void applyTransform_taskFrozen_noRotate_inRegion() { - mTouchTransformer.createOrAddTouchRegion(mInfo); + mTouchTransformer.createOrAddTouchRegion(mInfo, "test"); mTouchTransformer.enableMultipleRegions(true, mInfo); float y = generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_0) + 1; tapAndAssertTrue(100, y, @@ -237,7 +241,7 @@ public class OrientationTouchTransformerTest { @Test public void applyTransform_taskNotFrozen_noRotate_inDefaultRegion() { - mTouchTransformer.createOrAddTouchRegion(mInfo); + mTouchTransformer.createOrAddTouchRegion(mInfo, "test"); float y = generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_0) + 1; tapAndAssertTrue(100, y, event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY())); @@ -246,7 +250,8 @@ public class OrientationTouchTransformerTest { @Test public void applyTransform_taskNotFrozen_90Rotate_inRegion() { mTouchTransformer - .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90)); + .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90), + "test"); float y = generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_90) + 1; tapAndAssertTrue(100, y, event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY())); @@ -254,10 +259,11 @@ public class OrientationTouchTransformerTest { @Test public void applyTransform_taskNotFrozen_90Rotate_withTwoRegions() { - mTouchTransformer.createOrAddTouchRegion(mInfo); + mTouchTransformer.createOrAddTouchRegion(mInfo, "test"); mTouchTransformer.enableMultipleRegions(true, mInfo); mTouchTransformer - .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90)); + .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90), + "test"); // Landscape point float y1 = generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_90) + 1; MotionEvent inRegion1_down = generateMotionEvent(MotionEvent.ACTION_DOWN, 10, y1); @@ -278,10 +284,11 @@ public class OrientationTouchTransformerTest { @Test public void applyTransform_90Rotate_inRotatedRegion() { // Create regions for both 0 Rotation and 90 Rotation - mTouchTransformer.createOrAddTouchRegion(mInfo); + mTouchTransformer.createOrAddTouchRegion(mInfo, "test"); mTouchTransformer.enableMultipleRegions(true, mInfo); mTouchTransformer - .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90)); + .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90), + "test"); // Portrait point in landscape orientation axis float x1 = generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_0); // bottom of screen, from landscape perspective right side of screen |