Merge "Move focused task to front when attaching RecentsView" into sc-v2-dev

This commit is contained in:
TreeHugger Robot
2021-07-15 16:36:30 +00:00
committed by Android (Google) Code Review
3 changed files with 57 additions and 3 deletions

View File

@@ -539,7 +539,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
@Override
public void onMotionPauseDetected() {
mHasMotionEverBeenPaused = true;
maybeUpdateRecentsAttachedState();
maybeUpdateRecentsAttachedState(true/* animate */, true/* moveFocusedTask */);
performHapticFeedback();
}
@@ -550,18 +550,24 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
};
}
public void maybeUpdateRecentsAttachedState() {
private void maybeUpdateRecentsAttachedState() {
maybeUpdateRecentsAttachedState(true /* animate */);
}
private void maybeUpdateRecentsAttachedState(boolean animate) {
maybeUpdateRecentsAttachedState(animate, false /* moveFocusedTask */);
}
/**
* Determines whether to show or hide RecentsView. The window is always
* synchronized with its corresponding TaskView in RecentsView, so if
* RecentsView is shown, it will appear to be attached to the window.
*
* Note this method has no effect unless the navigation mode is NO_BUTTON.
* @param animate whether to animate when attaching RecentsView
* @param moveFocusedTask whether to move focused task to front when attaching
*/
private void maybeUpdateRecentsAttachedState(boolean animate) {
private void maybeUpdateRecentsAttachedState(boolean animate, boolean moveFocusedTask) {
if (!mDeviceState.isFullyGesturalNavMode() || mRecentsView == null) {
return;
}
@@ -580,6 +586,12 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
} else {
recentsAttachedToAppWindow = mHasMotionEverBeenPaused || mIsLikelyToStartNewTask;
}
if (moveFocusedTask && !mAnimationFactory.hasRecentsEverAttachedToAppWindow()
&& recentsAttachedToAppWindow) {
// Only move focused task if RecentsView has never been attached before, to avoid
// TaskView jumping to new position as we move the tasks.
mRecentsView.moveFocusedTaskToFront();
}
mAnimationFactory.setRecentsAttachedToAppWindow(recentsAttachedToAppWindow, animate);
// Reapply window transform throughout the attach animation, as the animation affects how

View File

@@ -396,6 +396,10 @@ public abstract class BaseActivityInterface<STATE_TYPE extends BaseState<STATE_T
default boolean isRecentsAttachedToAppWindow() {
return false;
}
default boolean hasRecentsEverAttachedToAppWindow() {
return false;
}
}
class DefaultAnimationFactory implements AnimationFactory {
@@ -405,6 +409,7 @@ public abstract class BaseActivityInterface<STATE_TYPE extends BaseState<STATE_T
private final Consumer<AnimatorControllerWithResistance> mCallback;
private boolean mIsAttachedToWindow;
private boolean mHasEverAttachedToWindow;
DefaultAnimationFactory(Consumer<AnimatorControllerWithResistance> callback) {
mCallback = callback;
@@ -458,6 +463,9 @@ public abstract class BaseActivityInterface<STATE_TYPE extends BaseState<STATE_T
}
mIsAttachedToWindow = attached;
RecentsView recentsView = mActivity.getOverviewPanel();
if (attached) {
mHasEverAttachedToWindow = true;
}
Animator fadeAnim = mActivity.getStateManager()
.createStateElementAnimation(INDEX_RECENTS_FADE_ANIM, attached ? 1 : 0);
@@ -487,6 +495,11 @@ public abstract class BaseActivityInterface<STATE_TYPE extends BaseState<STATE_T
return mIsAttachedToWindow;
}
@Override
public boolean hasRecentsEverAttachedToAppWindow() {
return mHasEverAttachedToWindow;
}
protected void createBackgroundToOverviewAnim(ACTIVITY_TYPE activity, PendingAnimation pa) {
// Scale down recents from being full screen to being in overview.
RecentsView recentsView = activity.getOverviewPanel();

View File

@@ -1111,6 +1111,35 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
}
}
/**
* Moves the focused task to the front of the carousel in tablets, to minimize animation
* required to focus the task in grid.
*/
public void moveFocusedTaskToFront() {
if (!(mActivity.getDeviceProfile().isTablet && FeatureFlags.ENABLE_OVERVIEW_GRID.get())) {
return;
}
TaskView focusedTaskView = getFocusedTaskView();
if (focusedTaskView == null) {
return;
}
if (indexOfChild(focusedTaskView) != mCurrentPage) {
return;
}
int primaryScroll = mOrientationHandler.getPrimaryScroll(this);
int currentPageScroll = getScrollForPage(mCurrentPage);
mCurrentPageScrollDiff = primaryScroll - currentPageScroll;
removeView(focusedTaskView);
addView(focusedTaskView, mTaskViewStartIndex);
setCurrentPage(0);
updateGridProperties();
}
protected void applyLoadPlan(ArrayList<Task> tasks) {
if (mPendingAnimation != null) {
mPendingAnimation.addEndListener(success -> applyLoadPlan(tasks));