Updates Assistant gesture regions when no longer tracking multiple. am: d2731957ea

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Launcher3/+/11992046

Change-Id: Iacfc6d6f8d8eb7eda45137d7aef8941c9620cb39
This commit is contained in:
Andy Wickham
2020-06-25 02:39:14 +00:00
committed by Automerger Merge Worker
2 changed files with 142 additions and 53 deletions
@@ -59,6 +59,7 @@ public class OrientationTouchTransformerTest {
mResources = mock(Resources.class); mResources = mock(Resources.class);
when(mResources.getBoolean(anyInt())).thenReturn(true); when(mResources.getBoolean(anyInt())).thenReturn(true);
when(mResources.getDimension(anyInt())).thenReturn(10.0f); when(mResources.getDimension(anyInt())).thenReturn(10.0f);
when(mResources.getDimensionPixelSize(anyInt())).thenReturn(10);
DisplayMetrics mockDisplayMetrics = new DisplayMetrics(); DisplayMetrics mockDisplayMetrics = new DisplayMetrics();
mockDisplayMetrics.density = DENSITY_DISPLAY_METRICS; mockDisplayMetrics.density = DENSITY_DISPLAY_METRICS;
when(mResources.getDisplayMetrics()).thenReturn(mockDisplayMetrics); when(mResources.getDisplayMetrics()).thenReturn(mockDisplayMetrics);
@@ -67,53 +68,114 @@ public class OrientationTouchTransformerTest {
} }
@Test @Test
public void disabledMultipeRegions_shouldOverrideFirstRegion() { public void disabledMultipleRegions_shouldOverrideFirstRegion() {
mTouchTransformer.createOrAddTouchRegion(mInfo); float portraitRegionY = generateTouchRegionHeight(Surface.ROTATION_0) + 1;
DefaultDisplay.Info info2 = createDisplayInfo(Surface.ROTATION_90); float landscapeRegionY = generateTouchRegionHeight(Surface.ROTATION_90) + 1;
mTouchTransformer.createOrAddTouchRegion(info2);
float y = generateTouchRegionHeight(Surface.ROTATION_0) + 1; mTouchTransformer.createOrAddTouchRegion(mInfo);
MotionEvent inOldRegion = generateMotionEvent(MotionEvent.ACTION_DOWN, 100, y); tapAndAssertTrue(100, portraitRegionY,
mTouchTransformer.transform(inOldRegion); event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
assertFalse(mTouchTransformer.touchInValidSwipeRegions(inOldRegion.getX(), inOldRegion.getY())); tapAndAssertFalse(100, landscapeRegionY,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
tapAndAssertTrue(0, portraitRegionY,
event -> mTouchTransformer.touchInAssistantRegion(event));
tapAndAssertFalse(0, landscapeRegionY,
event -> mTouchTransformer.touchInAssistantRegion(event));
// Override region // Override region
mTouchTransformer.createOrAddTouchRegion(createDisplayInfo(Surface.ROTATION_90));
tapAndAssertFalse(100, portraitRegionY,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
tapAndAssertTrue(100, landscapeRegionY,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
tapAndAssertFalse(0, portraitRegionY,
event -> mTouchTransformer.touchInAssistantRegion(event));
tapAndAssertTrue(0, landscapeRegionY,
event -> mTouchTransformer.touchInAssistantRegion(event));
// Override region again
mTouchTransformer.createOrAddTouchRegion(mInfo); mTouchTransformer.createOrAddTouchRegion(mInfo);
inOldRegion = generateMotionEvent(MotionEvent.ACTION_DOWN, 100, y); tapAndAssertTrue(100, portraitRegionY,
mTouchTransformer.transform(inOldRegion); event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
assertTrue(mTouchTransformer.touchInValidSwipeRegions(inOldRegion.getX(), inOldRegion.getY())); tapAndAssertFalse(100, landscapeRegionY,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
tapAndAssertTrue(0, portraitRegionY,
event -> mTouchTransformer.touchInAssistantRegion(event));
tapAndAssertFalse(0, landscapeRegionY,
event -> mTouchTransformer.touchInAssistantRegion(event));
} }
@Test @Test
public void allowMultipeRegions_shouldOverrideFirstRegion() { public void enableMultipleRegions_shouldOverrideFirstRegion() {
DefaultDisplay.Info info2 = createDisplayInfo(Surface.ROTATION_90); float portraitRegionY = generateTouchRegionHeight(Surface.ROTATION_0) + 1;
mTouchTransformer.createOrAddTouchRegion(info2); float landscapeRegionY = generateTouchRegionHeight(Surface.ROTATION_90) + 1;
mTouchTransformer.createOrAddTouchRegion(createDisplayInfo(Surface.ROTATION_90));
tapAndAssertFalse(100, portraitRegionY,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
tapAndAssertTrue(100, landscapeRegionY,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
tapAndAssertFalse(0, portraitRegionY,
event -> mTouchTransformer.touchInAssistantRegion(event));
tapAndAssertTrue(0, landscapeRegionY,
event -> mTouchTransformer.touchInAssistantRegion(event));
// We have to add 0 rotation second so that gets set as the current rotation, otherwise // 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) // matrix transform will fail (tests only work in Portrait at the moment)
mTouchTransformer.enableMultipleRegions(true, mInfo); mTouchTransformer.enableMultipleRegions(true, mInfo);
mTouchTransformer.createOrAddTouchRegion(mInfo); mTouchTransformer.createOrAddTouchRegion(mInfo);
float y = generateTouchRegionHeight(Surface.ROTATION_0) + 1; tapAndAssertTrue(100, portraitRegionY,
MotionEvent inNewRegion = generateMotionEvent(MotionEvent.ACTION_DOWN, 100, y); event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
mTouchTransformer.transform(inNewRegion); tapAndAssertFalse(100, landscapeRegionY,
assertTrue(mTouchTransformer.touchInValidSwipeRegions(inNewRegion.getX(), inNewRegion.getY())); event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
tapAndAssertTrue(0, portraitRegionY,
event -> mTouchTransformer.touchInAssistantRegion(event));
tapAndAssertFalse(0, landscapeRegionY,
event -> mTouchTransformer.touchInAssistantRegion(event));
}
@Test
public void enableMultipleRegions_assistantTriggersInMostRecent() {
float portraitRegionY = generateTouchRegionHeight(Surface.ROTATION_0) + 1;
float landscapeRegionY = generateTouchRegionHeight(Surface.ROTATION_90) + 1;
mTouchTransformer.enableMultipleRegions(true, mInfo);
mTouchTransformer.createOrAddTouchRegion(createDisplayInfo(Surface.ROTATION_90));
mTouchTransformer.createOrAddTouchRegion(mInfo);
tapAndAssertTrue(0, portraitRegionY,
event -> mTouchTransformer.touchInAssistantRegion(event));
tapAndAssertFalse(0, landscapeRegionY,
event -> mTouchTransformer.touchInAssistantRegion(event));
}
@Test
public void enableMultipleRegions_assistantTriggersInCurrentOrientationAfterDisable() {
float portraitRegionY = generateTouchRegionHeight(Surface.ROTATION_0) + 1;
float landscapeRegionY = generateTouchRegionHeight(Surface.ROTATION_90) + 1;
mTouchTransformer.enableMultipleRegions(true, mInfo);
mTouchTransformer.createOrAddTouchRegion(mInfo);
mTouchTransformer.createOrAddTouchRegion(createDisplayInfo(Surface.ROTATION_90));
mTouchTransformer.enableMultipleRegions(false, mInfo);
tapAndAssertTrue(0, portraitRegionY,
event -> mTouchTransformer.touchInAssistantRegion(event));
tapAndAssertFalse(0, landscapeRegionY,
event -> mTouchTransformer.touchInAssistantRegion(event));
} }
@Test @Test
public void applyTransform_taskNotFrozen_notInRegion() { public void applyTransform_taskNotFrozen_notInRegion() {
mTouchTransformer.createOrAddTouchRegion(mInfo); mTouchTransformer.createOrAddTouchRegion(mInfo);
MotionEvent outOfRegion = generateMotionEvent(MotionEvent.ACTION_DOWN, 100, 100); tapAndAssertFalse(100, 100,
mTouchTransformer.transform(outOfRegion); event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
assertFalse(mTouchTransformer.touchInValidSwipeRegions(outOfRegion.getX(), outOfRegion.getY()));
} }
@Test @Test
public void applyTransform_taskFrozen_noRotate_outOfRegion() { public void applyTransform_taskFrozen_noRotate_outOfRegion() {
mTouchTransformer.createOrAddTouchRegion(mInfo); mTouchTransformer.createOrAddTouchRegion(mInfo);
mTouchTransformer.enableMultipleRegions(true, mInfo); mTouchTransformer.enableMultipleRegions(true, mInfo);
MotionEvent outOfRegion = generateMotionEvent(MotionEvent.ACTION_DOWN, 100, 100); tapAndAssertFalse(100, 100,
mTouchTransformer.transform(outOfRegion); event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
assertFalse(mTouchTransformer.touchInValidSwipeRegions(outOfRegion.getX(), outOfRegion.getY()));
} }
@Test @Test
@@ -121,27 +183,24 @@ public class OrientationTouchTransformerTest {
mTouchTransformer.createOrAddTouchRegion(mInfo); mTouchTransformer.createOrAddTouchRegion(mInfo);
mTouchTransformer.enableMultipleRegions(true, mInfo); mTouchTransformer.enableMultipleRegions(true, mInfo);
float y = generateTouchRegionHeight(Surface.ROTATION_0) + 1; float y = generateTouchRegionHeight(Surface.ROTATION_0) + 1;
MotionEvent inRegion = generateMotionEvent(MotionEvent.ACTION_DOWN, 100, y); tapAndAssertTrue(100, y,
mTouchTransformer.transform(inRegion); event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
assertTrue(mTouchTransformer.touchInValidSwipeRegions(inRegion.getX(), inRegion.getY()));
} }
@Test @Test
public void applyTransform_taskNotFrozen_noRotate_inDefaultRegion() { public void applyTransform_taskNotFrozen_noRotate_inDefaultRegion() {
mTouchTransformer.createOrAddTouchRegion(mInfo); mTouchTransformer.createOrAddTouchRegion(mInfo);
float y = generateTouchRegionHeight(Surface.ROTATION_0) + 1; float y = generateTouchRegionHeight(Surface.ROTATION_0) + 1;
MotionEvent inRegion = generateMotionEvent(MotionEvent.ACTION_DOWN, 100, y); tapAndAssertTrue(100, y,
mTouchTransformer.transform(inRegion); event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
assertTrue(mTouchTransformer.touchInValidSwipeRegions(inRegion.getX(), inRegion.getY()));
} }
@Test @Test
public void applyTransform_taskNotFrozen_90Rotate_inRegion() { public void applyTransform_taskNotFrozen_90Rotate_inRegion() {
mTouchTransformer.createOrAddTouchRegion(createDisplayInfo(Surface.ROTATION_90)); mTouchTransformer.createOrAddTouchRegion(createDisplayInfo(Surface.ROTATION_90));
float y = generateTouchRegionHeight(Surface.ROTATION_90) + 1; float y = generateTouchRegionHeight(Surface.ROTATION_90) + 1;
MotionEvent inRegion = generateMotionEvent(MotionEvent.ACTION_DOWN, 100, y); tapAndAssertTrue(100, y,
mTouchTransformer.transform(inRegion); event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
assertTrue(mTouchTransformer.touchInValidSwipeRegions(inRegion.getX(), inRegion.getY()));
} }
@Test @Test
@@ -160,15 +219,15 @@ public class OrientationTouchTransformerTest {
MotionEvent inRegion2 = generateMotionEvent(MotionEvent.ACTION_DOWN, 10, 10); MotionEvent inRegion2 = generateMotionEvent(MotionEvent.ACTION_DOWN, 10, 10);
mTouchTransformer.transform(inRegion1_down); mTouchTransformer.transform(inRegion1_down);
mTouchTransformer.transform(inRegion2); mTouchTransformer.transform(inRegion2);
assertTrue(mTouchTransformer.touchInValidSwipeRegions(inRegion1_down.getX(), inRegion1_down.getY())); assertTrue(mTouchTransformer.touchInValidSwipeRegions(
inRegion1_down.getX(), inRegion1_down.getY()));
// We only process one gesture region until we see a MotionEvent.ACTION_UP // We only process one gesture region until we see a MotionEvent.ACTION_UP
assertFalse(mTouchTransformer.touchInValidSwipeRegions(inRegion2.getX(), inRegion2.getY())); assertFalse(mTouchTransformer.touchInValidSwipeRegions(inRegion2.getX(), inRegion2.getY()));
mTouchTransformer.transform(inRegion1_up); mTouchTransformer.transform(inRegion1_up);
// Set the new region with this MotionEvent.ACTION_DOWN // Set the new region with this MotionEvent.ACTION_DOWN
inRegion2 = generateMotionEvent(MotionEvent.ACTION_DOWN, 10, 370); inRegion2 = generateAndTransformMotionEvent(MotionEvent.ACTION_DOWN, 10, 370);
mTouchTransformer.transform(inRegion2);
assertTrue(mTouchTransformer.touchInValidSwipeRegions(inRegion2.getX(), inRegion2.getY())); assertTrue(mTouchTransformer.touchInValidSwipeRegions(inRegion2.getX(), inRegion2.getY()));
} }
@@ -191,4 +250,26 @@ public class OrientationTouchTransformerTest {
private MotionEvent generateMotionEvent(int motionAction, float x, float y) { private MotionEvent generateMotionEvent(int motionAction, float x, float y) {
return MotionEvent.obtain(0, 0, motionAction, x, y, 0); return MotionEvent.obtain(0, 0, motionAction, x, y, 0);
} }
private MotionEvent generateAndTransformMotionEvent(int motionAction, float x, float y) {
MotionEvent motionEvent = generateMotionEvent(motionAction, x, y);
mTouchTransformer.transform(motionEvent);
return motionEvent;
}
private void tapAndAssertTrue(float x, float y, MotionEventAssertion assertion) {
MotionEvent motionEvent = generateAndTransformMotionEvent(MotionEvent.ACTION_DOWN, x, y);
assertTrue(assertion.getCondition(motionEvent));
generateAndTransformMotionEvent(MotionEvent.ACTION_UP, x, y);
}
private void tapAndAssertFalse(float x, float y, MotionEventAssertion assertion) {
MotionEvent motionEvent = generateAndTransformMotionEvent(MotionEvent.ACTION_DOWN, x, y);
assertFalse(assertion.getCondition(motionEvent));
generateAndTransformMotionEvent(MotionEvent.ACTION_UP, x, y);
}
private interface MotionEventAssertion {
boolean getCondition(MotionEvent motionEvent);
}
} }
@@ -192,15 +192,21 @@ class OrientationTouchTransformer {
mCurrentDisplayRotation = region.rotation; mCurrentDisplayRotation = region.rotation;
OrientationRectF regionToKeep = mSwipeTouchRegions.get(mCurrentDisplayRotation); OrientationRectF regionToKeep = mSwipeTouchRegions.get(mCurrentDisplayRotation);
if (regionToKeep == null) {
regionToKeep = createRegionForDisplay(region);
}
mSwipeTouchRegions.clear(); mSwipeTouchRegions.clear();
mSwipeTouchRegions.put(mCurrentDisplayRotation, mSwipeTouchRegions.put(mCurrentDisplayRotation, regionToKeep);
regionToKeep != null ? regionToKeep : createRegionForDisplay(region)); updateAssistantRegions(regionToKeep);
} }
private void resetSwipeRegions() { private void resetSwipeRegions() {
OrientationRectF regionToKeep = mSwipeTouchRegions.get(mCurrentDisplayRotation); OrientationRectF regionToKeep = mSwipeTouchRegions.get(mCurrentDisplayRotation);
mSwipeTouchRegions.clear(); mSwipeTouchRegions.clear();
mSwipeTouchRegions.put(mCurrentDisplayRotation, regionToKeep); if (regionToKeep != null) {
mSwipeTouchRegions.put(mCurrentDisplayRotation, regionToKeep);
updateAssistantRegions(regionToKeep);
}
} }
private OrientationRectF createRegionForDisplay(DefaultDisplay.Info display) { private OrientationRectF createRegionForDisplay(DefaultDisplay.Info display) {
@@ -215,20 +221,7 @@ class OrientationTouchTransformer {
if (mMode == SysUINavigationMode.Mode.NO_BUTTON) { if (mMode == SysUINavigationMode.Mode.NO_BUTTON) {
int touchHeight = getNavbarSize(ResourceUtils.NAVBAR_BOTTOM_GESTURE_SIZE); int touchHeight = getNavbarSize(ResourceUtils.NAVBAR_BOTTOM_GESTURE_SIZE);
orientationRectF.top = orientationRectF.bottom - touchHeight; orientationRectF.top = orientationRectF.bottom - touchHeight;
updateAssistantRegions(orientationRectF);
final int assistantWidth = mResources
.getDimensionPixelSize(R.dimen.gestures_assistant_width);
final float assistantHeight = Math.max(touchHeight,
mContractInfo.getWindowCornerRadius());
mAssistantLeftRegion.bottom = mAssistantRightRegion.bottom = orientationRectF.bottom;
mAssistantLeftRegion.top = mAssistantRightRegion.top =
orientationRectF.bottom - assistantHeight;
mAssistantLeftRegion.left = 0;
mAssistantLeftRegion.right = assistantWidth;
mAssistantRightRegion.right = orientationRectF.right;
mAssistantRightRegion.left = orientationRectF.right - assistantWidth;
} else { } else {
mAssistantLeftRegion.setEmpty(); mAssistantLeftRegion.setEmpty();
mAssistantRightRegion.setEmpty(); mAssistantRightRegion.setEmpty();
@@ -250,6 +243,21 @@ class OrientationTouchTransformer {
return orientationRectF; return orientationRectF;
} }
private void updateAssistantRegions(OrientationRectF orientationRectF) {
int navbarHeight = getNavbarSize(ResourceUtils.NAVBAR_BOTTOM_GESTURE_SIZE);
int assistantWidth = mResources.getDimensionPixelSize(R.dimen.gestures_assistant_width);
float assistantHeight = Math.max(navbarHeight, mContractInfo.getWindowCornerRadius());
mAssistantLeftRegion.bottom = mAssistantRightRegion.bottom = orientationRectF.bottom;
mAssistantLeftRegion.top = mAssistantRightRegion.top =
orientationRectF.bottom - assistantHeight;
mAssistantLeftRegion.left = 0;
mAssistantLeftRegion.right = assistantWidth;
mAssistantRightRegion.right = orientationRectF.right;
mAssistantRightRegion.left = orientationRectF.right - assistantWidth;
}
boolean touchInAssistantRegion(MotionEvent ev) { boolean touchInAssistantRegion(MotionEvent ev) {
return mAssistantLeftRegion.contains(ev.getX(), ev.getY()) return mAssistantLeftRegion.contains(ev.getX(), ev.getY())
|| mAssistantRightRegion.contains(ev.getX(), ev.getY()); || mAssistantRightRegion.contains(ev.getX(), ev.getY());