Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f567e7e2 authored by vinayjoglekar's avatar vinayjoglekar
Browse files

Fix animation while hiding Desktop tasks during split

1. Scale down desktop tasks
2. Change translation start when all desktop tasks need to hidden

Fix: 378447894
Flag: com.android.launcher3.enable_large_desktop_windowing_tile
Test: Manual: Add desktop window and split focussed task, desktop task(s)(also in RTL)
Change-Id: I25c11d654539efc6529a2e995d8d00cbf73c870d
parent 9639fcc3
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.quickstep.util;

import static com.android.app.animation.Interpolators.LINEAR;
import static com.android.app.animation.Interpolators.STANDARD;

import android.view.animation.Interpolator;

@@ -38,6 +39,8 @@ public interface SplitAnimationTimings {
    int TABLET_APP_PAIR_LAUNCH_DURATION = 998;
    /** Total duration (ms) for launching an app pair from its icon on phones. */
    int PHONE_APP_PAIR_LAUNCH_DURATION = 915;
    /** Total duration (ms) for fading out desktop tasks in split mode. */
    int DESKTOP_FADE_OUT_DURATION = 200;

    // Initialize timing classes so they can be accessed statically
    SplitAnimationTimings TABLET_OVERVIEW_TO_SPLIT = new TabletOverviewToSplitTimings();
@@ -83,6 +86,10 @@ public interface SplitAnimationTimings {
        return (float) getStagedRectSlideEnd() / getDuration();
    }

    default float getDesktopFadeSplitAnimationEndOffset() {
        return (float) DESKTOP_FADE_OUT_DURATION / getDuration();
    }

    // DEFAULT VALUES: We define default values here so that SplitAnimationTimings can be used
    // flexibly in animation-running functions, e.g. a single function that handles 2 types of split
    // animations. The values are not intended to be used, and can safely be removed if refactoring
@@ -124,5 +131,9 @@ public interface SplitAnimationTimings {
    default float getAppRevealEndOffset() { return 0; }
    default Interpolator getCellSplitInterpolator() { return LINEAR; }
    default Interpolator getIconFadeInterpolator() { return LINEAR; }

    default Interpolator getDesktopTaskScaleInterpolator() {
        return STANDARD;
    }
}
+58 −15
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ import static com.android.app.animation.Interpolators.EMPHASIZED_DECELERATE;
import static com.android.app.animation.Interpolators.FAST_OUT_SLOW_IN;
import static com.android.app.animation.Interpolators.FINAL_FRAME;
import static com.android.app.animation.Interpolators.LINEAR;
import static com.android.app.animation.Interpolators.OVERSHOOT_0_75;
import static com.android.app.animation.Interpolators.EMPHASIZED;
import static com.android.app.animation.Interpolators.clampToProgress;
import static com.android.launcher3.AbstractFloatingView.TYPE_REBIND_SAFE;
import static com.android.launcher3.AbstractFloatingView.TYPE_TASK_MENU;
@@ -3649,6 +3649,7 @@ public abstract class RecentsView<
        // Grid specific properties.
        boolean isFocusedTaskDismissed = false;
        boolean isStagingFocusedTask = false;
        boolean isSlidingTasks = false;
        TaskView nextFocusedTaskView = null;
        boolean nextFocusedTaskFromTop = false;
        float dismissedTaskWidth = 0;
@@ -3704,6 +3705,7 @@ public abstract class RecentsView<
            scrollDiffPerPage = Math.abs(oldScroll[1] - oldScroll[0]);
        }

        isSlidingTasks = isStagingFocusedTask || areAllDesktopTasksDismissed;
        float dismissTranslationInterpolationEnd = 1;
        boolean closeGapBetweenClearAll = false;
        boolean isClearAllHidden = isClearAllHidden();
@@ -3844,14 +3846,14 @@ public abstract class RecentsView<
                AnimUtils.getDeviceOverviewToSplitTimings(mContainer.getDeviceProfile().isTablet);

        int distanceFromDismissedTask = 1;
        int stagingTranslation = 0;
        if (isStagingFocusedTask || areAllDesktopTasksDismissed) {
        int slidingTranslation = 0;
        if (isSlidingTasks) {
            int nextSnappedPage = isStagingFocusedTask
                    ? indexOfChild(mUtils.getFirstSmallTaskView(getTaskViews()))
                    : mUtils.getDesktopTaskViewCount(getTaskViews());
            stagingTranslation = getPagedOrientationHandler().getPrimaryScroll(this)
            slidingTranslation = getPagedOrientationHandler().getPrimaryScroll(this)
                    - getScrollForPage(nextSnappedPage);
            stagingTranslation += mIsRtl ? newClearAllShortTotalWidthTranslation
            slidingTranslation += mIsRtl ? newClearAllShortTotalWidthTranslation
                    : -newClearAllShortTotalWidthTranslation;
        }
        mDismissPrimaryTranslations = new int[taskCount];
@@ -3879,12 +3881,12 @@ public abstract class RecentsView<
                // Animate task with index >= dismissed index and in the same row as the
                // dismissed index or next focused index. Offset successive task dismissal
                // durations for a staggered effect.
                int staggerColumn = isStagingFocusedTask
                int staggerColumn = isSlidingTasks
                        ? (int) Math.ceil(distanceFromDismissedTask / 2f)
                        : distanceFromDismissedTask;
                // Set timings based on if user is initiating splitscreen on the focused task,
                // or splitting/dismissing some other task.
                float animationStartProgress = isStagingFocusedTask
                float animationStartProgress = isSlidingTasks
                        ? Utilities.boundToRange(
                        splitTimings.getGridSlideStartOffset()
                                + (splitTimings.getGridSlideStaggerOffset()
@@ -3895,7 +3897,7 @@ public abstract class RecentsView<
                                INITIAL_DISMISS_TRANSLATION_INTERPOLATION_OFFSET
                                        + ADDITIONAL_DISMISS_TRANSLATION_INTERPOLATION_OFFSET
                                        * staggerColumn, 0f, dismissTranslationInterpolationEnd);
                float animationEndProgress = isStagingFocusedTask
                float animationEndProgress = isSlidingTasks
                        ? Utilities.boundToRange(
                        splitTimings.getGridSlideStartOffset()
                                + (splitTimings.getGridSlideStaggerOffset() * staggerColumn)
@@ -3903,7 +3905,8 @@ public abstract class RecentsView<
                        0f,
                        dismissTranslationInterpolationEnd)
                        : dismissTranslationInterpolationEnd;
                Interpolator dismissInterpolator = isStagingFocusedTask ? OVERSHOOT_0_75 : LINEAR;

                Interpolator dismissInterpolator = isSlidingTasks ? EMPHASIZED : LINEAR;

                float primaryTranslation = 0;
                if (taskView == nextFocusedTaskView) {
@@ -3930,14 +3933,30 @@ public abstract class RecentsView<
                    primaryTranslation +=
                            nextFocusedTaskView != null ? nextFocusedTaskWidth : dismissedTaskWidth;
                }
                primaryTranslation += mIsRtl ? stagingTranslation : -stagingTranslation;
                if (!(taskView instanceof DesktopTaskView)) {
                    primaryTranslation += mIsRtl ? slidingTranslation : -slidingTranslation;
                }

                if (primaryTranslation != 0) {
                    float finalTranslation = mIsRtl ? primaryTranslation : -primaryTranslation;
                    anim.setFloat(taskView, taskView.getPrimaryDismissTranslationProperty(),
                            finalTranslation,
                    float startTranslation = 0;
                    if (!(taskView instanceof DesktopTaskView) && slidingTranslation != 0) {
                        startTranslation = isTaskViewVisible(taskView) ? 0
                                : finalTranslation + (mIsRtl ? -mLastComputedTaskSize.right
                                        : mLastComputedTaskSize.right);
                        animationStartProgress = Utilities.boundToRange(
                                animationStartProgress
                                        + splitTimings.getDesktopFadeSplitAnimationEndOffset(),
                                0f,
                                dismissTranslationInterpolationEnd);
                    }
                    Animator dismissAnimator = ObjectAnimator.ofFloat(taskView,
                            taskView.getPrimaryDismissTranslationProperty(),
                            startTranslation, finalTranslation);
                    dismissAnimator.setInterpolator(
                            clampToProgress(dismissInterpolator, animationStartProgress,
                                    animationEndProgress));
                    anim.add(dismissAnimator);
                    mDismissPrimaryTranslations[i] = (int) finalTranslation;
                    distanceFromDismissedTask++;
                }
@@ -5114,13 +5133,37 @@ public abstract class RecentsView<
     */
    public void handleDesktopTaskInSplitSelectState(PendingAnimation builder,
            Interpolator deskTopFadeInterPolator) {
        SplitAnimationTimings timings = AnimUtils.getDeviceOverviewToSplitTimings(
                mContainer.getDeviceProfile().isTablet);
        if (enableLargeDesktopWindowingTile()) {
            for (TaskView taskView : getTaskViews()) {
            for (int i = 0; i < getTaskViewCount(); i++) {
                TaskView taskView = requireTaskViewAt(i);
                if (taskView instanceof DesktopTaskView) {
                    // Correcting the animation for split mode since we hide DW in split.
                    // Setting pivot to scale down from screen centre.
                    if (i >= mCurrentPage - 1 && i <= mCurrentPage + 1) {
                        float pivotX;
                        if (i == mCurrentPage - 1) {
                            pivotX = mIsRtl ? taskView.getWidth() / 2f - mPageSpacing
                                    - taskView.getWidth()
                                    : taskView.getWidth() / 2f + mPageSpacing + taskView.getWidth();
                        } else if (i == mCurrentPage) {
                            pivotX = taskView.getWidth() / 2f;
                        } else {
                            pivotX = mIsRtl ? taskView.getWidth() + mPageSpacing
                                    + taskView.getWidth()
                                    : taskView.getWidth() - mPageSpacing - taskView.getWidth();
                        }
                        taskView.setPivotX(pivotX);
                        taskView.setPivotY(taskView.getHeight() / 2f);
                        builder.add(ObjectAnimator
                                        .ofFloat(taskView, TaskView.DISMISS_SCALE, 0.95f),
                                clampToProgress(timings.getDesktopTaskScaleInterpolator(), 0f,
                                        timings.getDesktopFadeSplitAnimationEndOffset()));
                    }
                    builder.addFloat(taskView.getSplitAlphaProperty(),
                            MULTI_PROPERTY_VALUE, 1f, 0f,
                            clampToProgress(deskTopFadeInterPolator, 0f, 0.1f));
                            clampToProgress(deskTopFadeInterPolator, 0f,
                                    timings.getDesktopFadeSplitAnimationEndOffset()));
                }
            }
        }