Notify SysUi of NavBar region user interacts with
SysUi can then adjust things like disabling
the edge back gesture region or re-drawing the
home handle in the correct positions.
Fixes: 150250451
Test: Tested quickswitch manually with
test apps fixed to different rotations.
Ensured back only showed when rotation of
touch and display matched.
Change-Id: Ie4ea3063835a09fc12ab1d4f8b504b3a9555fa9b
diff --git a/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java b/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java
index 95cd4f2..495c092 100644
--- a/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java
+++ b/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java
@@ -60,12 +60,24 @@
private SparseArray<OrientationRectF> mSwipeTouchRegions = new SparseArray<>(MAX_ORIENTATIONS);
private final RectF mAssistantLeftRegion = new RectF();
private final RectF mAssistantRightRegion = new RectF();
- private int mCurrentRotation;
+ private int mCurrentDisplayRotation;
private boolean mEnableMultipleRegions;
private Resources mResources;
private OrientationRectF mLastRectTouched;
private SysUINavigationMode.Mode mMode;
private QuickStepContractInfo mContractInfo;
+
+ /**
+ * Represents if we're currently in a swipe "session" of sorts. If value is -1, then user
+ * has not tapped on an active nav region. Otherwise it will be the rotation of the display
+ * when the user first interacted with the active nav bar region.
+ * The "session" ends when {@link #enableMultipleRegions(boolean, DefaultDisplay.Info)} is
+ * called - usually from a timeout or if user starts interacting w/ the foreground app.
+ *
+ * This is different than {@link #mLastRectTouched} as it can get reset by the system whereas
+ * the rect is purely used for tracking touch interactions and usually this "session" will
+ * outlast the touch interaction.
+ */
private int mQuickStepStartingRotation = -1;
/** For testability */
@@ -73,6 +85,7 @@
float getWindowCornerRadius();
}
+
OrientationTouchTransformer(Resources resources, SysUINavigationMode.Mode mode,
QuickStepContractInfo contractInfo) {
mResources = resources;
@@ -97,20 +110,21 @@
* @see #enableMultipleRegions(boolean, DefaultDisplay.Info)
*/
void createOrAddTouchRegion(DefaultDisplay.Info info) {
- mCurrentRotation = info.rotation;
- if (mQuickStepStartingRotation > -1 && mCurrentRotation == mQuickStepStartingRotation) {
- // Ignore nav bars in other rotations except for the one we started out in
+ mCurrentDisplayRotation = info.rotation;
+ if (mQuickStepStartingRotation > -1
+ && mCurrentDisplayRotation == 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);
return;
}
-
- OrientationRectF region = mSwipeTouchRegions.get(mCurrentRotation);
+ OrientationRectF region = mSwipeTouchRegions.get(mCurrentDisplayRotation);
if (region != null) {
return;
}
if (mEnableMultipleRegions) {
- mSwipeTouchRegions.put(mCurrentRotation, createRegionForDisplay(info));
+ mSwipeTouchRegions.put(mCurrentDisplayRotation, createRegionForDisplay(info));
} else {
resetSwipeRegions(info);
}
@@ -128,12 +142,6 @@
if (!enableMultipleRegions) {
mQuickStepStartingRotation = -1;
resetSwipeRegions(info);
- } else {
- if (mLastRectTouched != null) {
- // mLastRectTouched can be null if gesture type is changed (ex. from settings)
- // but nav bar hasn't been interacted with yet.
- mQuickStepStartingRotation = mLastRectTouched.mRotation;
- }
}
}
@@ -145,17 +153,25 @@
*/
private void resetSwipeRegions(DefaultDisplay.Info region) {
if (DEBUG) {
- Log.d(TAG, "clearing all regions except rotation: " + mCurrentRotation);
+ Log.d(TAG, "clearing all regions except rotation: " + mCurrentDisplayRotation);
}
- mCurrentRotation = region.rotation;
+ mCurrentDisplayRotation = region.rotation;
+ OrientationRectF regionToKeep = mSwipeTouchRegions.get(mCurrentDisplayRotation);
mSwipeTouchRegions.clear();
- mSwipeTouchRegions.put(mCurrentRotation, createRegionForDisplay(region));
+ mSwipeTouchRegions.put(mCurrentDisplayRotation,
+ regionToKeep != null ? regionToKeep : createRegionForDisplay(region));
+ }
+
+ private void resetSwipeRegions() {
+ OrientationRectF regionToKeep = mSwipeTouchRegions.get(mCurrentDisplayRotation);
+ mSwipeTouchRegions.clear();
+ mSwipeTouchRegions.put(mCurrentDisplayRotation, regionToKeep);
}
private OrientationRectF createRegionForDisplay(DefaultDisplay.Info display) {
if (DEBUG) {
- Log.d(TAG, "creating rotation region for: " + mCurrentRotation);
+ Log.d(TAG, "creating rotation region for: " + mCurrentDisplayRotation);
}
Point size = display.realSize;
@@ -225,6 +241,10 @@
}
}
+ int getQuickStepStartingRotation() {
+ return mQuickStepStartingRotation;
+ }
+
public void transform(MotionEvent event) {
int eventAction = event.getActionMasked();
switch (eventAction) {
@@ -257,6 +277,11 @@
}
if (rect.applyTransform(event, false)) {
mLastRectTouched = rect;
+ if (mCurrentDisplayRotation == mLastRectTouched.mRotation) {
+ // Start a touch session for the default nav region for the display
+ mQuickStepStartingRotation = mLastRectTouched.mRotation;
+ resetSwipeRegions();
+ }
if (DEBUG) {
Log.d(TAG, "set active region: " + rect);
}
@@ -310,12 +335,12 @@
boolean applyTransform(MotionEvent event, boolean forceTransform) {
mTmpMatrix.reset();
- postDisplayRotation(deltaRotation(mCurrentRotation, mRotation),
+ postDisplayRotation(deltaRotation(mCurrentDisplayRotation, mRotation),
mHeight, mWidth, mTmpMatrix);
if (forceTransform) {
if (DEBUG) {
Log.d(TAG, "Transforming rotation due to forceTransform, "
- + "mCurrentRotation: " + mCurrentRotation
+ + "mCurrentRotation: " + mCurrentDisplayRotation
+ "mRotation: " + mRotation);
}
event.transform(mTmpMatrix);
diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java b/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java
index 491c611..8cb27a3 100644
--- a/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java
+++ b/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java
@@ -17,6 +17,7 @@
import static android.content.Intent.ACTION_USER_UNLOCKED;
+import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
import static com.android.quickstep.SysUINavigationMode.Mode.NO_BUTTON;
import static com.android.quickstep.SysUINavigationMode.Mode.THREE_BUTTONS;
import static com.android.quickstep.SysUINavigationMode.Mode.TWO_BUTTONS;
@@ -120,7 +121,6 @@
private Runnable mOnDestroyFrozenTaskRunnable;
public RecentsAnimationDeviceState(Context context) {
- final ContentResolver resolver = context.getContentResolver();
mContext = context;
mSysUiNavMode = SysUINavigationMode.INSTANCE.get(context);
mDefaultDisplay = DefaultDisplay.INSTANCE.get(context);
@@ -511,8 +511,16 @@
mOrientationTouchTransformer.transform(event);
}
- public void enableMultipleRegions(boolean enable) {
+ void enableMultipleRegions(boolean enable) {
mOrientationTouchTransformer.enableMultipleRegions(enable, mDefaultDisplay.getInfo());
+ if (enable) {
+ UI_HELPER_EXECUTOR.execute(() -> {
+ int quickStepStartingRotation =
+ mOrientationTouchTransformer.getQuickStepStartingRotation();
+ SystemUiProxy.INSTANCE.get(mContext)
+ .onQuickSwitchToNewTask(quickStepStartingRotation);
+ });
+ }
}
public int getCurrentActiveRotation() {
diff --git a/quickstep/src/com/android/quickstep/SystemUiProxy.java b/quickstep/src/com/android/quickstep/SystemUiProxy.java
index f5aaf1d..20d133c 100644
--- a/quickstep/src/com/android/quickstep/SystemUiProxy.java
+++ b/quickstep/src/com/android/quickstep/SystemUiProxy.java
@@ -334,6 +334,7 @@
}
}
+ @Override
public void onQuickSwitchToNewTask(int rotation) {
if (mSystemUiProxy != null) {
try {