Merge "Notify SysUi of NavBar region user interacts with" into ub-launcher3-rvc-dev

This commit is contained in:
TreeHugger Robot
2020-04-09 21:09:55 +00:00
committed by Android (Google) Code Review
3 changed files with 55 additions and 21 deletions
@@ -60,12 +60,24 @@ class OrientationTouchTransformer {
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 @@ class OrientationTouchTransformer {
float getWindowCornerRadius();
}
OrientationTouchTransformer(Resources resources, SysUINavigationMode.Mode mode,
QuickStepContractInfo contractInfo) {
mResources = resources;
@@ -97,20 +110,21 @@ class OrientationTouchTransformer {
* @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 @@ class OrientationTouchTransformer {
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 @@ class OrientationTouchTransformer {
*/
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 @@ class OrientationTouchTransformer {
}
}
int getQuickStepStartingRotation() {
return mQuickStepStartingRotation;
}
public void transform(MotionEvent event) {
int eventAction = event.getActionMasked();
switch (eventAction) {
@@ -257,6 +277,11 @@ class OrientationTouchTransformer {
}
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 @@ class OrientationTouchTransformer {
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);
@@ -17,6 +17,7 @@ package com.android.quickstep;
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 @@ public class RecentsAnimationDeviceState implements
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 @@ public class RecentsAnimationDeviceState implements
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() {
@@ -334,6 +334,7 @@ public class SystemUiProxy implements ISystemUiProxy {
}
}
@Override
public void onQuickSwitchToNewTask(int rotation) {
if (mSystemUiProxy != null) {
try {