Defer starting the recents animation when swiping over back button
Bug: 73242451
Test: Swipe up over back with suitable launcher build and ensure that we
don't start the recents animation on touch down
Change-Id: I98314611eaeeabfaa47280157300ea20f0571a61
This commit is contained in:
@@ -23,6 +23,9 @@ import static android.view.MotionEvent.ACTION_UP;
|
||||
import static android.view.MotionEvent.INVALID_POINTER_ID;
|
||||
|
||||
import static com.android.quickstep.RemoteRunnable.executeSafely;
|
||||
import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_BACK;
|
||||
import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_HOME;
|
||||
import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_NONE;
|
||||
|
||||
import android.app.ActivityManager.RunningTaskInfo;
|
||||
import android.app.ActivityOptions;
|
||||
@@ -52,6 +55,7 @@ import com.android.systemui.shared.recents.ISystemUiProxy;
|
||||
import com.android.systemui.shared.system.ActivityManagerWrapper;
|
||||
import com.android.systemui.shared.system.AssistDataReceiver;
|
||||
import com.android.systemui.shared.system.BackgroundExecutor;
|
||||
import com.android.systemui.shared.system.NavigationBarCompat.HitTarget;
|
||||
import com.android.systemui.shared.system.RecentsAnimationControllerCompat;
|
||||
import com.android.systemui.shared.system.RecentsAnimationListener;
|
||||
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
||||
@@ -83,6 +87,7 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC
|
||||
private BaseSwipeInteractionHandler mInteractionHandler;
|
||||
private int mDisplayRotation;
|
||||
private Rect mStableInsets = new Rect();
|
||||
private @HitTarget int mDownHitTarget = HIT_TARGET_NONE;
|
||||
|
||||
private VelocityTracker mVelocityTracker;
|
||||
|
||||
@@ -98,6 +103,11 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC
|
||||
mMainThreadExecutor = mainThreadExecutor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDownHitTarget(@HitTarget int downHitTarget) {
|
||||
mDownHitTarget = downHitTarget;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept(MotionEvent ev) {
|
||||
if (mVelocityTracker == null) {
|
||||
@@ -112,8 +122,9 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC
|
||||
mTouchSlop = ViewConfiguration.get(this).getScaledTouchSlop();
|
||||
mTouchThresholdCrossed = false;
|
||||
|
||||
// Start the window animation on down to give more time for launcher to draw
|
||||
if (!isUsingScreenShot()) {
|
||||
// Start the window animation on down to give more time for launcher to draw if the
|
||||
// user didn't start the gesture over the back button
|
||||
if (mDownHitTarget != HIT_TARGET_BACK && !isUsingScreenShot()) {
|
||||
startTouchTrackingForWindowAnimation();
|
||||
}
|
||||
|
||||
@@ -155,6 +166,10 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC
|
||||
|
||||
if (isUsingScreenShot()) {
|
||||
startTouchTrackingForScreenshotAnimation();
|
||||
} else if (mDownHitTarget == HIT_TARGET_BACK) {
|
||||
// If the window animation was deferred on DOWN due to it starting over
|
||||
// the back button, then start it now
|
||||
startTouchTrackingForWindowAnimation();
|
||||
}
|
||||
|
||||
notifyGestureStarted();
|
||||
|
||||
@@ -20,6 +20,8 @@ import android.os.Build;
|
||||
import android.support.annotation.IntDef;
|
||||
import android.view.MotionEvent;
|
||||
|
||||
import com.android.systemui.shared.system.NavigationBarCompat.HitTarget;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.util.function.Consumer;
|
||||
@@ -50,6 +52,8 @@ public interface TouchConsumer extends Consumer<MotionEvent> {
|
||||
return false;
|
||||
}
|
||||
|
||||
default void setDownHitTarget(@HitTarget int downHitTarget) { }
|
||||
|
||||
default void updateTouchTracking(@InteractionType int interactionType) { }
|
||||
|
||||
default void onQuickScrubEnd() { }
|
||||
|
||||
@@ -36,6 +36,7 @@ import android.os.Build;
|
||||
import android.os.Handler;
|
||||
import android.os.HandlerThread;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Log;
|
||||
import android.view.Choreographer;
|
||||
import android.view.MotionEvent;
|
||||
@@ -51,6 +52,7 @@ import com.android.launcher3.R;
|
||||
import com.android.systemui.shared.recents.IOverviewProxy;
|
||||
import com.android.systemui.shared.recents.ISystemUiProxy;
|
||||
import com.android.systemui.shared.system.ActivityManagerWrapper;
|
||||
import com.android.systemui.shared.system.NavigationBarCompat.HitTarget;
|
||||
|
||||
/**
|
||||
* Service connected by system-UI for handling touch interaction.
|
||||
@@ -69,6 +71,11 @@ public class TouchInteractionService extends Service {
|
||||
|
||||
private final IBinder mMyBinder = new IOverviewProxy.Stub() {
|
||||
|
||||
@Override
|
||||
public void onPreMotionEvent(@HitTarget int downHitTarget) throws RemoteException {
|
||||
onBinderPreMotionEvent(downHitTarget);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMotionEvent(MotionEvent ev) {
|
||||
onBinderMotionEvent(ev);
|
||||
@@ -165,23 +172,25 @@ public class TouchInteractionService extends Service {
|
||||
return mMyBinder;
|
||||
}
|
||||
|
||||
private void onBinderMotionEvent(MotionEvent ev) {
|
||||
if (ev.getActionMasked() == ACTION_DOWN) {
|
||||
mRunningTask = mAM.getRunningTask();
|
||||
private void onBinderPreMotionEvent(@HitTarget int downHitTarget) {
|
||||
mRunningTask = mAM.getRunningTask();
|
||||
|
||||
mCurrentConsumer.reset();
|
||||
if (mRunningTask == null) {
|
||||
mCurrentConsumer = mNoOpTouchConsumer;
|
||||
} else if (mRunningTask.topActivity.equals(mLauncher)) {
|
||||
mCurrentConsumer = getLauncherConsumer();
|
||||
} else {
|
||||
mCurrentConsumer = getOtherActivityConsumer();
|
||||
}
|
||||
|
||||
mEventQueue.setConsumer(mCurrentConsumer);
|
||||
mEventQueue.setInterimChoreographer(mCurrentConsumer.shouldUseBackgroundConsumer()
|
||||
? mBackgroundThreadChoreographer : null);
|
||||
mCurrentConsumer.reset();
|
||||
if (mRunningTask == null) {
|
||||
mCurrentConsumer = mNoOpTouchConsumer;
|
||||
} else if (mRunningTask.topActivity.equals(mLauncher)) {
|
||||
mCurrentConsumer = getLauncherConsumer();
|
||||
} else {
|
||||
mCurrentConsumer = getOtherActivityConsumer();
|
||||
}
|
||||
|
||||
mCurrentConsumer.setDownHitTarget(downHitTarget);
|
||||
mEventQueue.setConsumer(mCurrentConsumer);
|
||||
mEventQueue.setInterimChoreographer(mCurrentConsumer.shouldUseBackgroundConsumer()
|
||||
? mBackgroundThreadChoreographer : null);
|
||||
}
|
||||
|
||||
private void onBinderMotionEvent(MotionEvent ev) {
|
||||
mCurrentConsumer.preProcessMotionEvent(ev);
|
||||
mEventQueue.queue(ev);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user