diff --git a/quickstep/src/com/android/launcher3/uioverrides/BaseRecentsViewStateController.java b/quickstep/src/com/android/launcher3/uioverrides/BaseRecentsViewStateController.java index c85b2566a7..0eaea83801 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/BaseRecentsViewStateController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/BaseRecentsViewStateController.java @@ -29,12 +29,9 @@ import static com.android.launcher3.states.StateAnimationConfig.SKIP_OVERVIEW; import static com.android.quickstep.views.RecentsView.ADJACENT_PAGE_HORIZONTAL_OFFSET; import static com.android.quickstep.views.RecentsView.RECENTS_GRID_PROGRESS; import static com.android.quickstep.views.RecentsView.RECENTS_SCALE_PROPERTY; -import static com.android.quickstep.views.RecentsView.TASK_PRIMARY_SPLIT_TRANSLATION; -import static com.android.quickstep.views.RecentsView.TASK_SECONDARY_SPLIT_TRANSLATION; import static com.android.quickstep.views.RecentsView.TASK_SECONDARY_TRANSLATION; import android.util.FloatProperty; -import android.util.Pair; import androidx.annotation.NonNull; @@ -43,7 +40,6 @@ import com.android.launcher3.LauncherState; import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.statemanager.StateManager.StateHandler; import com.android.launcher3.states.StateAnimationConfig; -import com.android.launcher3.touch.PagedOrientationHandler; import com.android.quickstep.views.RecentsView; /** @@ -100,15 +96,6 @@ public abstract class BaseRecentsViewStateController config.getInterpolator(ANIM_OVERVIEW_TRANSLATE_X, LINEAR)); setter.setFloat(mRecentsView, TASK_SECONDARY_TRANSLATION, 0f, config.getInterpolator(ANIM_OVERVIEW_TRANSLATE_Y, LINEAR)); - PagedOrientationHandler orientationHandler = - ((RecentsView) mLauncher.getOverviewPanel()).getPagedOrientationHandler(); - Pair taskViewsFloat = - orientationHandler.getSplitSelectTaskOffset( - TASK_PRIMARY_SPLIT_TRANSLATION, TASK_SECONDARY_SPLIT_TRANSLATION, - mLauncher.getDeviceProfile()); - setter.setFloat(mRecentsView, taskViewsFloat.first, - toState.getSplitSelectTranslation(mLauncher), LINEAR); - setter.setFloat(mRecentsView, taskViewsFloat.second, 0, LINEAR); setter.setFloat(mRecentsView, getContentAlphaProperty(), toState.overviewUi ? 1 : 0, config.getInterpolator(ANIM_OVERVIEW_FADE, AGGRESSIVE_EASE_IN_OUT)); diff --git a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java index 19897a1bf8..32ce1c40d7 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java @@ -23,13 +23,17 @@ import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_AC import static com.android.quickstep.views.RecentsView.CONTENT_ALPHA; import static com.android.quickstep.views.RecentsView.FULLSCREEN_PROGRESS; import static com.android.quickstep.views.RecentsView.TASK_MODALNESS; +import static com.android.quickstep.views.RecentsView.TASK_PRIMARY_SPLIT_TRANSLATION; +import static com.android.quickstep.views.RecentsView.TASK_SECONDARY_SPLIT_TRANSLATION; import static com.android.quickstep.views.TaskView.FLAG_UPDATE_ALL; import android.annotation.TargetApi; import android.os.Build; import android.util.FloatProperty; +import android.util.Pair; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.android.launcher3.BaseQuickstepLauncher; import com.android.launcher3.LauncherState; @@ -37,6 +41,7 @@ import com.android.launcher3.anim.AnimatorListeners; import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.anim.PropertySetter; import com.android.launcher3.states.StateAnimationConfig; +import com.android.launcher3.touch.PagedOrientationHandler; import com.android.launcher3.util.MultiValueAlpha; import com.android.quickstep.views.ClearAllButton; import com.android.quickstep.views.LauncherRecentsView; @@ -67,11 +72,7 @@ public final class RecentsViewStateController extends // DepthController to prevent optimizations which might occlude the layers behind mLauncher.getDepthController().setHasContentBehindLauncher(state.overviewUi); - if (isSplitSelectionState(state)) { - mRecentsView.applySplitPrimaryScrollOffset(); - } else { - mRecentsView.resetSplitPrimaryScrollOffset(); - } + handleSplitSelectionState(state, null); } @Override @@ -92,16 +93,7 @@ public final class RecentsViewStateController extends builder.addListener(AnimatorListeners.forSuccessCallback(() -> mLauncher.getDepthController().setHasContentBehindLauncher(toState.overviewUi))); - // Create or dismiss split screen select animations - LauncherState currentState = mLauncher.getStateManager().getState(); - if (isSplitSelectionState(toState) && !isSplitSelectionState(currentState)) { - builder.add(mRecentsView.createSplitSelectInitAnimation().buildAnim()); - } - if (isSplitSelectionState(toState)) { - mRecentsView.applySplitPrimaryScrollOffset(); - } else { - mRecentsView.resetSplitPrimaryScrollOffset(); - } + handleSplitSelectionState(toState, builder); setAlphas(builder, config, toState); builder.setFloat(mRecentsView, FULLSCREEN_PROGRESS, @@ -109,10 +101,52 @@ public final class RecentsViewStateController extends } /** - * @return true if {@param toState} is {@link LauncherState#OVERVIEW_SPLIT_SELECT} + * Create or dismiss split screen select animations. + * @param builder if null then this will run the split select animations right away, otherwise + * will add animations to builder. */ - private boolean isSplitSelectionState(@NonNull LauncherState toState) { - return toState == OVERVIEW_SPLIT_SELECT; + private void handleSplitSelectionState(@NonNull LauncherState toState, + @Nullable PendingAnimation builder) { + LauncherState currentState = mLauncher.getStateManager().getState(); + boolean animate = builder != null; + PagedOrientationHandler orientationHandler = + ((RecentsView) mLauncher.getOverviewPanel()).getPagedOrientationHandler(); + Pair taskViewsFloat = + orientationHandler.getSplitSelectTaskOffset( + TASK_PRIMARY_SPLIT_TRANSLATION, TASK_SECONDARY_SPLIT_TRANSLATION, + mLauncher.getDeviceProfile()); + + if (isSplitSelectionState(currentState, toState)) { + // Animation to "dismiss" selected taskView + PendingAnimation splitSelectInitAnimation = + mRecentsView.createSplitSelectInitAnimation(); + // Add properties to shift remaining taskViews to get out of placeholder view + splitSelectInitAnimation.setFloat(mRecentsView, taskViewsFloat.first, + toState.getSplitSelectTranslation(mLauncher), LINEAR); + splitSelectInitAnimation.setFloat(mRecentsView, taskViewsFloat.second, 0, LINEAR); + + if (!animate && isSplitSelectionState(currentState, toState)) { + splitSelectInitAnimation.buildAnim().start(); + } else if (animate && + isSplitSelectionState(currentState, toState)) { + builder.add(splitSelectInitAnimation.buildAnim()); + } + } + + if (isSplitSelectionState(currentState, toState)) { + mRecentsView.applySplitPrimaryScrollOffset(); + } else { + mRecentsView.resetSplitPrimaryScrollOffset(); + } + } + + /** + * @return true if {@param toState} is {@link LauncherState#OVERVIEW_SPLIT_SELECT} + * and {@param fromState} is not {@link LauncherState#OVERVIEW_SPLIT_SELECT} + */ + private boolean isSplitSelectionState(@NonNull LauncherState fromState, + @NonNull LauncherState toState) { + return fromState != OVERVIEW_SPLIT_SELECT && toState == OVERVIEW_SPLIT_SELECT; } private void setAlphas(PropertySetter propertySetter, StateAnimationConfig config, diff --git a/quickstep/src/com/android/quickstep/TaskShortcutFactory.java b/quickstep/src/com/android/quickstep/TaskShortcutFactory.java index cbdbdb5571..f507ea3dfc 100644 --- a/quickstep/src/com/android/quickstep/TaskShortcutFactory.java +++ b/quickstep/src/com/android/quickstep/TaskShortcutFactory.java @@ -242,6 +242,7 @@ public interface TaskShortcutFactory { } } + /** @Deprecated */ TaskShortcutFactory SPLIT_SCREEN = new MultiWindowFactory(R.drawable.ic_split_screen, R.string.recent_task_option_split_screen, LAUNCHER_SYSTEM_SHORTCUT_SPLIT_SCREEN_TAP) { diff --git a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java index d3108936e7..5253e8c657 100644 --- a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java +++ b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java @@ -64,7 +64,6 @@ public class SplitSelectStateController { private @StagePosition int mStagePosition; private Task mInitialTask; private Task mSecondTask; - private Rect mInitialBounds; private boolean mRecentsAnimationRunning; /** If not null, this is the TaskView we want to launch from */ @Nullable @@ -86,7 +85,6 @@ public class SplitSelectStateController { Rect initialBounds) { mInitialTask = task; mStagePosition = stagePosition; - mInitialBounds = initialBounds; } /** @@ -229,7 +227,6 @@ public class SplitSelectStateController { mInitialTask = null; mSecondTask = null; mStagePosition = SplitConfigurationOptions.STAGE_POSITION_UNDEFINED; - mInitialBounds = null; mRecentsAnimationRunning = false; mLaunchingTaskView = null; } @@ -241,8 +238,4 @@ public class SplitSelectStateController { public boolean isSplitSelectActive() { return mInitialTask != null && mSecondTask == null; } - - public Rect getInitialBounds() { - return mInitialBounds; - } } diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 10efa3ecbf..f0e57c9932 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -3994,7 +3994,7 @@ public abstract class RecentsView