Merge "Update animations for phones: Overview > OverviewSplitSelect transition" into tm-qpr-dev

This commit is contained in:
Vinit Nayak
2022-09-28 18:30:16 +00:00
committed by Android (Google) Code Review
15 changed files with 358 additions and 69 deletions
@@ -42,6 +42,8 @@ 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.util.AnimUtils;
import com.android.quickstep.util.SplitAnimationTimings;
import com.android.quickstep.views.ClearAllButton;
import com.android.quickstep.views.LauncherRecentsView;
import com.android.quickstep.views.RecentsView;
@@ -123,12 +125,18 @@ public final class RecentsViewStateController extends
TASK_PRIMARY_SPLIT_TRANSLATION, TASK_SECONDARY_SPLIT_TRANSLATION,
mLauncher.getDeviceProfile());
SplitAnimationTimings timings =
AnimUtils.getDeviceOverviewToSplitTimings(mLauncher.getDeviceProfile().isTablet);
mRecentsView.createSplitSelectInitAnimation(builder,
toState.getTransitionDuration(mLauncher, true /* isToState */));
// Add properties to shift remaining taskViews to get out of placeholder view
builder.setFloat(mRecentsView, taskViewsFloat.first,
toState.getSplitSelectTranslation(mLauncher), LINEAR);
builder.setFloat(mRecentsView, taskViewsFloat.second, 0, LINEAR);
toState.getSplitSelectTranslation(mLauncher),
timings.getGridSlidePrimaryInterpolator());
builder.setFloat(mRecentsView, taskViewsFloat.second,
0,
timings.getGridSlideSecondaryInterpolator());
if (!animate) {
AnimatorSet as = builder.buildAnim();
@@ -191,12 +191,15 @@ public class QuickstepAtomicAnimationFactory extends
} else if (fromState == NORMAL && toState == ALL_APPS) {
AllAppsSwipeController.applyNormalToAllAppsAnimConfig(mActivity, config);
} else if (fromState == OVERVIEW && toState == OVERVIEW_SPLIT_SELECT) {
SplitAnimationTimings timings = SplitAnimationTimings.OVERVIEW_TO_SPLIT;
SplitAnimationTimings timings = mActivity.getDeviceProfile().isTablet
? SplitAnimationTimings.TABLET_OVERVIEW_TO_SPLIT
: SplitAnimationTimings.PHONE_OVERVIEW_TO_SPLIT;
config.setInterpolator(ANIM_OVERVIEW_ACTIONS_FADE, clampToProgress(LINEAR,
timings.getActionsFadeStartOffset(),
timings.getActionsFadeEndOffset()));
} else if (fromState == NORMAL && toState == OVERVIEW_SPLIT_SELECT) {
SplitAnimationTimings timings = SplitAnimationTimings.NORMAL_TO_SPLIT;
// Splitting from Home is currently only available on tablets
SplitAnimationTimings timings = SplitAnimationTimings.TABLET_HOME_TO_SPLIT;
config.setInterpolator(ANIM_SCRIM_FADE, clampToProgress(LINEAR,
timings.getScrimFadeInStartOffset(),
timings.getScrimFadeInEndOffset()));
@@ -44,8 +44,13 @@ public class SplitScreenSelectState extends OverviewState {
@Override
public int getTransitionDuration(Context context, boolean isToState) {
return isToState
? SplitAnimationTimings.ENTER_DURATION
: SplitAnimationTimings.ABORT_DURATION;
boolean isTablet = ((Launcher) context).getDeviceProfile().isTablet;
if (isToState && isTablet) {
return SplitAnimationTimings.TABLET_ENTER_DURATION;
} else if (isToState && !isTablet) {
return SplitAnimationTimings.PHONE_ENTER_DURATION;
} else {
return SplitAnimationTimings.ABORT_DURATION;
}
}
}
@@ -0,0 +1,42 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.quickstep.util;
/**
* Utility class containing methods to help manage animations, interpolators, and timings.
*/
public class AnimUtils {
/**
* Fetches device-specific timings for the Overview > Split animation
* (splitscreen initiated from Overview).
*/
public static SplitAnimationTimings getDeviceOverviewToSplitTimings(boolean isTablet) {
return isTablet
? SplitAnimationTimings.TABLET_OVERVIEW_TO_SPLIT
: SplitAnimationTimings.PHONE_OVERVIEW_TO_SPLIT;
}
/**
* Fetches device-specific timings for the Split > Confirm animation
* (splitscreen confirmed by selecting a second app).
*/
public static SplitAnimationTimings getDeviceSplitToConfirmTimings(boolean isTablet) {
return isTablet
? SplitAnimationTimings.TABLET_SPLIT_TO_CONFIRM
: SplitAnimationTimings.PHONE_SPLIT_TO_CONFIRM;
}
}
@@ -16,27 +16,28 @@
package com.android.quickstep.util;
import static com.android.launcher3.anim.Interpolators.DEACCEL_2;
import android.view.animation.Interpolator;
/**
* Timings for the Overview > OverviewSplitSelect animation.
*/
public class OverviewToSplitTimings implements SplitAnimationTimings {
public int getPlaceholderFadeInStart() { return 0; }
public int getPlaceholderFadeInEnd() { return 133; }
public int getPlaceholderIconFadeInStart() { return 167; }
public int getPlaceholderIconFadeInEnd() { return 250; }
public int getStagedRectSlideStart() { return 0; }
public int getStagedRectSlideEnd() { return 417; }
public int getGridSlideStart() { return 67; }
public int getGridSlideStagger() { return 16; }
public int getGridSlideDuration() { return 500; }
public int getActionsFadeStart() { return 0; }
public int getActionsFadeEnd() { return 83; }
abstract class OverviewToSplitTimings implements SplitAnimationTimings {
// Overwritten by device-specific timings
abstract public int getPlaceholderFadeInStart();
abstract public int getPlaceholderFadeInEnd();
abstract public int getPlaceholderIconFadeInStart();
abstract public int getPlaceholderIconFadeInEnd();
abstract public int getStagedRectSlideStart();
abstract public int getStagedRectSlideEnd();
abstract public int getGridSlideStart();
abstract public int getGridSlideStagger();
abstract public int getGridSlideDuration();
// Common timings
public int getIconFadeStart() { return 0; }
public int getIconFadeEnd() { return 83; }
public int getActionsFadeStart() { return 0; }
public int getActionsFadeEnd() { return 83; }
public int getInstructionsContainerFadeInStart() { return 167; }
public int getInstructionsContainerFadeInEnd() { return 250; }
public int getInstructionsTextFadeInStart() { return 217; }
@@ -44,11 +45,13 @@ public class OverviewToSplitTimings implements SplitAnimationTimings {
public int getInstructionsUnfoldStart() { return 167; }
public int getInstructionsUnfoldEnd() { return 500; }
public int getDuration() { return ENTER_DURATION; }
public Interpolator getStagedRectXInterpolator() { return DEACCEL_2; }
public Interpolator getStagedRectYInterpolator() { return DEACCEL_2; }
public Interpolator getStagedRectScaleXInterpolator() { return DEACCEL_2; }
public Interpolator getStagedRectScaleYInterpolator() { return DEACCEL_2; }
abstract public int getDuration();
abstract public Interpolator getStagedRectXInterpolator();
abstract public Interpolator getStagedRectYInterpolator();
abstract public Interpolator getStagedRectScaleXInterpolator();
abstract public Interpolator getStagedRectScaleYInterpolator();
abstract public Interpolator getGridSlidePrimaryInterpolator();
abstract public Interpolator getGridSlideSecondaryInterpolator();
public float getGridSlideStartOffset() {
return (float) getGridSlideStart() / getDuration();
@@ -0,0 +1,46 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.quickstep.util;
import static com.android.launcher3.anim.Interpolators.EMPHASIZED;
import static com.android.launcher3.anim.Interpolators.INSTANT;
import android.view.animation.Interpolator;
/**
* Timings for the Overview > OverviewSplitSelect animation on phones.
*/
public class PhoneOverviewToSplitTimings
extends OverviewToSplitTimings implements SplitAnimationTimings {
public int getPlaceholderFadeInStart() { return 0; }
public int getPlaceholderFadeInEnd() { return 133; }
public int getPlaceholderIconFadeInStart() { return 83; }
public int getPlaceholderIconFadeInEnd() { return 167; }
public int getStagedRectSlideStart() { return 0; }
public int getStagedRectSlideEnd() { return 333; }
public int getGridSlideStart() { return 100; }
public int getGridSlideStagger() { return 0; }
public int getGridSlideDuration() { return 417; }
public int getDuration() { return PHONE_ENTER_DURATION; }
public Interpolator getStagedRectXInterpolator() { return EMPHASIZED; }
public Interpolator getStagedRectYInterpolator() { return EMPHASIZED; }
public Interpolator getStagedRectScaleXInterpolator() { return EMPHASIZED; }
public Interpolator getStagedRectScaleYInterpolator() { return EMPHASIZED; }
public Interpolator getGridSlidePrimaryInterpolator() { return EMPHASIZED; }
public Interpolator getGridSlideSecondaryInterpolator() { return INSTANT; }
}
@@ -0,0 +1,40 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.quickstep.util;
import static com.android.launcher3.anim.Interpolators.EMPHASIZED;
import android.view.animation.Interpolator;
/**
* Timings for the OverviewSplitSelect > confirmed animation on phones.
*/
public class PhoneSplitToConfirmTimings
extends SplitToConfirmTimings implements SplitAnimationTimings {
public int getPlaceholderFadeInStart() { return 0; }
public int getPlaceholderFadeInEnd() { return 133; }
public int getPlaceholderIconFadeInStart() { return 50; }
public int getPlaceholderIconFadeInEnd() { return 133; }
public int getStagedRectSlideStart() { return 0; }
public int getStagedRectSlideEnd() { return 333; }
public int getDuration() { return PHONE_CONFIRM_DURATION; }
public Interpolator getStagedRectXInterpolator() { return EMPHASIZED; }
public Interpolator getStagedRectYInterpolator() { return EMPHASIZED; }
public Interpolator getStagedRectScaleXInterpolator() { return EMPHASIZED; }
public Interpolator getStagedRectScaleYInterpolator() { return EMPHASIZED; }
}
@@ -16,19 +16,28 @@
package com.android.quickstep.util;
import static com.android.launcher3.anim.Interpolators.LINEAR;
import android.view.animation.Interpolator;
/**
* An interface that supports the centralization of timing information for splitscreen animations.
*/
public interface SplitAnimationTimings {
int ENTER_DURATION = 866;
int ABORT_DURATION = 500;
int CONFIRM_DURATION = 383;
int TABLET_ENTER_DURATION = 866;
int TABLET_CONFIRM_DURATION = 383;
SplitAnimationTimings OVERVIEW_TO_SPLIT = new OverviewToSplitTimings();
SplitAnimationTimings NORMAL_TO_SPLIT = new NormalToSplitTimings();
SplitAnimationTimings SPLIT_TO_CONFIRM = new SplitToConfirmTimings();
int PHONE_ENTER_DURATION = 517;
int PHONE_CONFIRM_DURATION = 333;
int ABORT_DURATION = 500;
SplitAnimationTimings TABLET_OVERVIEW_TO_SPLIT = new TabletOverviewToSplitTimings();
SplitAnimationTimings TABLET_HOME_TO_SPLIT = new TabletHomeToSplitTimings();
SplitAnimationTimings TABLET_SPLIT_TO_CONFIRM = new TabletSplitToConfirmTimings();
SplitAnimationTimings PHONE_OVERVIEW_TO_SPLIT = new PhoneOverviewToSplitTimings();
SplitAnimationTimings PHONE_SPLIT_TO_CONFIRM = new PhoneSplitToConfirmTimings();
// Shared methods
int getDuration();
@@ -75,8 +84,10 @@ public interface SplitAnimationTimings {
default float getInstructionsTextFadeInEndOffset() { return 0; }
default float getInstructionsUnfoldStartOffset() { return 0; }
default float getInstructionsUnfoldEndOffset() { return 0; }
default Interpolator getGridSlidePrimaryInterpolator() { return LINEAR; }
default Interpolator getGridSlideSecondaryInterpolator() { return LINEAR; }
// Defaults for NormalToSplit
// Defaults for HomeToSplit
default float getScrimFadeInStartOffset() { return 0; }
default float getScrimFadeInEndOffset() { return 0; }
@@ -16,28 +16,29 @@
package com.android.quickstep.util;
import static com.android.launcher3.anim.Interpolators.LINEAR;
import android.view.animation.Interpolator;
/**
* Timings for the OverviewSplitSelect > confirmed animation.
*/
public class SplitToConfirmTimings implements SplitAnimationTimings {
public int getPlaceholderFadeInStart() { return 0; }
public int getPlaceholderFadeInEnd() { return 133; }
public int getPlaceholderIconFadeInStart() { return 167; }
public int getPlaceholderIconFadeInEnd() { return 250; }
public int getStagedRectSlideStart() { return 0; }
public int getStagedRectSlideEnd() { return 383; }
abstract class SplitToConfirmTimings implements SplitAnimationTimings {
// Overwritten by device-specific timings
abstract public int getPlaceholderFadeInStart();
abstract public int getPlaceholderFadeInEnd();
abstract public int getPlaceholderIconFadeInStart();
abstract public int getPlaceholderIconFadeInEnd();
abstract public int getStagedRectSlideStart();
abstract public int getStagedRectSlideEnd();
// Common timings
public int getInstructionsFadeStart() { return 0; }
public int getInstructionsFadeEnd() { return 67; }
public int getDuration() { return CONFIRM_DURATION; }
public Interpolator getStagedRectXInterpolator() { return LINEAR; }
public Interpolator getStagedRectYInterpolator() { return LINEAR; }
public Interpolator getStagedRectScaleXInterpolator() { return LINEAR; }
public Interpolator getStagedRectScaleYInterpolator() { return LINEAR; }
abstract public int getDuration();
abstract public Interpolator getStagedRectXInterpolator();
abstract public Interpolator getStagedRectYInterpolator();
abstract public Interpolator getStagedRectScaleXInterpolator();
abstract public Interpolator getStagedRectScaleYInterpolator();
public float getInstructionsFadeStartOffset() {
return (float) getInstructionsFadeStart() / getDuration();
@@ -21,9 +21,10 @@ import static com.android.launcher3.anim.Interpolators.LINEAR;
import android.view.animation.Interpolator;
/**
* Timings for the Normal > OverviewSplitSelect animation.
* Timings for the Home > OverviewSplitSelect animation on tablets.
*/
public class NormalToSplitTimings extends OverviewToSplitTimings implements SplitAnimationTimings {
public class TabletHomeToSplitTimings
extends TabletOverviewToSplitTimings implements SplitAnimationTimings {
@Override
public Interpolator getStagedRectXInterpolator() { return LINEAR; }
@Override
@@ -0,0 +1,46 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.quickstep.util;
import static com.android.launcher3.anim.Interpolators.DEACCEL_2;
import static com.android.launcher3.anim.Interpolators.LINEAR;
import android.view.animation.Interpolator;
/**
* Timings for the Overview > OverviewSplitSelect animation on tablets.
*/
public class TabletOverviewToSplitTimings
extends OverviewToSplitTimings implements SplitAnimationTimings {
public int getPlaceholderFadeInStart() { return 0; }
public int getPlaceholderFadeInEnd() { return 133; }
public int getPlaceholderIconFadeInStart() { return 167; }
public int getPlaceholderIconFadeInEnd() { return 250; }
public int getStagedRectSlideStart() { return 0; }
public int getStagedRectSlideEnd() { return 417; }
public int getGridSlideStart() { return 67; }
public int getGridSlideStagger() { return 16; }
public int getGridSlideDuration() { return 500; }
public int getDuration() { return TABLET_ENTER_DURATION; }
public Interpolator getStagedRectXInterpolator() { return DEACCEL_2; }
public Interpolator getStagedRectYInterpolator() { return DEACCEL_2; }
public Interpolator getStagedRectScaleXInterpolator() { return DEACCEL_2; }
public Interpolator getStagedRectScaleYInterpolator() { return DEACCEL_2; }
public Interpolator getGridSlidePrimaryInterpolator() { return LINEAR; }
public Interpolator getGridSlideSecondaryInterpolator() { return LINEAR; }
}
@@ -0,0 +1,40 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.quickstep.util;
import static com.android.launcher3.anim.Interpolators.LINEAR;
import android.view.animation.Interpolator;
/**
* Timings for the OverviewSplitSelect > confirmed animation on tablets.
*/
public class TabletSplitToConfirmTimings
extends SplitToConfirmTimings implements SplitAnimationTimings {
public int getPlaceholderFadeInStart() { return 0; }
public int getPlaceholderFadeInEnd() { return 133; }
public int getPlaceholderIconFadeInStart() { return 167; }
public int getPlaceholderIconFadeInEnd() { return 250; }
public int getStagedRectSlideStart() { return 0; }
public int getStagedRectSlideEnd() { return 383; }
public int getDuration() { return TABLET_CONFIRM_DURATION; }
public Interpolator getStagedRectXInterpolator() { return LINEAR; }
public Interpolator getStagedRectYInterpolator() { return LINEAR; }
public Interpolator getStagedRectScaleXInterpolator() { return LINEAR; }
public Interpolator getStagedRectScaleYInterpolator() { return LINEAR; }
}
@@ -30,6 +30,7 @@ import com.android.launcher3.statemanager.StatefulActivity;
import com.android.launcher3.touch.PagedOrientationHandler;
import com.android.launcher3.util.SplitConfigurationOptions;
import com.android.launcher3.views.BaseDragLayer;
import com.android.quickstep.util.AnimUtils;
import com.android.quickstep.util.MultiValueUpdateListener;
import com.android.quickstep.util.SplitAnimationTimings;
import com.android.quickstep.util.TaskCornerRadius;
@@ -215,9 +216,19 @@ public class FloatingTaskView extends FrameLayout {
*/
public void addStagingAnimation(PendingAnimation animation, RectF startingBounds,
Rect endBounds, boolean fadeWithThumbnail, boolean isStagedTask) {
SplitAnimationTimings timings = fadeWithThumbnail
? SplitAnimationTimings.OVERVIEW_TO_SPLIT
: SplitAnimationTimings.NORMAL_TO_SPLIT;
boolean isTablet = mActivity.getDeviceProfile().isTablet;
boolean splittingFromOverview = fadeWithThumbnail;
SplitAnimationTimings timings;
if (isTablet && splittingFromOverview) {
timings = SplitAnimationTimings.TABLET_OVERVIEW_TO_SPLIT;
} else if (!isTablet && splittingFromOverview) {
timings = SplitAnimationTimings.PHONE_OVERVIEW_TO_SPLIT;
} else {
// Splitting from Home is currently only available on tablets
timings = SplitAnimationTimings.TABLET_HOME_TO_SPLIT;
}
addAnimation(animation, startingBounds, endBounds, fadeWithThumbnail, isStagedTask,
timings);
}
@@ -228,8 +239,11 @@ public class FloatingTaskView extends FrameLayout {
*/
public void addConfirmAnimation(PendingAnimation animation, RectF startingBounds,
Rect endBounds, boolean fadeWithThumbnail, boolean isStagedTask) {
SplitAnimationTimings timings =
AnimUtils.getDeviceSplitToConfirmTimings(mActivity.getDeviceProfile().isTablet);
addAnimation(animation, startingBounds, endBounds, fadeWithThumbnail, isStagedTask,
SplitAnimationTimings.SPLIT_TO_CONFIRM);
timings);
}
/**
@@ -171,6 +171,7 @@ import com.android.quickstep.TopTaskTracker;
import com.android.quickstep.ViewUtils;
import com.android.quickstep.util.ActiveGestureErrorDetector;
import com.android.quickstep.util.ActiveGestureLog;
import com.android.quickstep.util.AnimUtils;
import com.android.quickstep.util.GroupTask;
import com.android.quickstep.util.LayoutUtils;
import com.android.quickstep.util.RecentsOrientedState;
@@ -2775,7 +2776,7 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
anim.setFloat(taskView, VIEW_ALPHA, 0,
clampToProgress(isOnGridBottomRow(taskView) ? ACCEL : FINAL_FRAME, 0, 0.5f));
FloatProperty<TaskView> secondaryViewTranslate =
taskView.getSecondaryDissmissTranslationProperty();
taskView.getSecondaryDismissTranslationProperty();
int secondaryTaskDimension = mOrientationHandler.getSecondaryDimension(taskView);
int verticalFactor = mOrientationHandler.getSecondaryTranslationDirectionFactor();
@@ -2809,7 +2810,8 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
mOrientationHandler.getInitialSplitPlaceholderBounds(mSplitPlaceholderSize,
mSplitPlaceholderInset, mActivity.getDeviceProfile(),
mSplitSelectStateController.getActiveSplitStagePosition(), mTempRect);
SplitAnimationTimings timings = SplitAnimationTimings.OVERVIEW_TO_SPLIT;
SplitAnimationTimings timings =
AnimUtils.getDeviceOverviewToSplitTimings(mActivity.getDeviceProfile().isTablet);
RectF startingTaskRect = new RectF();
safeRemoveDragLayerView(mFirstFloatingTaskView);
@@ -3053,6 +3055,9 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
}
}
SplitAnimationTimings splitTimings =
AnimUtils.getDeviceOverviewToSplitTimings(mActivity.getDeviceProfile().isTablet);
int distanceFromDismissedTask = 0;
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
@@ -3095,9 +3100,29 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
float additionalDismissDuration =
ADDITIONAL_DISMISS_TRANSLATION_INTERPOLATION_OFFSET * Math.abs(
i - dismissedIndex);
anim.setFloat(child, translationProperty, scrollDiff, clampToProgress(LINEAR,
Utilities.boundToRange(INITIAL_DISMISS_TRANSLATION_INTERPOLATION_OFFSET
+ additionalDismissDuration, 0f, 1f), 1));
// We are in non-grid layout.
// If dismissing for split select, use split timings.
// If not, use dismiss timings.
float animationStartProgress = isSplitSelectionActive()
? Utilities.boundToRange(splitTimings.getGridSlideStartOffset(), 0f, 1f)
: Utilities.boundToRange(
INITIAL_DISMISS_TRANSLATION_INTERPOLATION_OFFSET
+ additionalDismissDuration, 0f, 1f);
float animationEndProgress = isSplitSelectionActive()
? Utilities.boundToRange(splitTimings.getGridSlideStartOffset()
+ splitTimings.getGridSlideDurationOffset(), 0f, 1f)
: 1f;
anim.setFloat(child, translationProperty, scrollDiff,
clampToProgress(
splitTimings.getGridSlidePrimaryInterpolator(),
animationStartProgress,
animationEndProgress
)
);
if (ENABLE_QUICKSTEP_LIVE_TILE.get() && mEnableDrawingLiveTile
&& child instanceof TaskView
&& ((TaskView) child).isRunningTask()) {
@@ -3138,11 +3163,11 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
: distanceFromDismissedTask;
// Set timings based on if user is initiating splitscreen on the focused task,
// or splitting/dismissing some other task.
SplitAnimationTimings timings = SplitAnimationTimings.OVERVIEW_TO_SPLIT;
float animationStartProgress = isStagingFocusedTask
? Utilities.boundToRange(
timings.getGridSlideStartOffset()
+ (timings.getGridSlideStaggerOffset() * staggerColumn),
splitTimings.getGridSlideStartOffset()
+ (splitTimings.getGridSlideStaggerOffset()
* staggerColumn),
0f,
dismissTranslationInterpolationEnd)
: Utilities.boundToRange(
@@ -3151,9 +3176,9 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
* staggerColumn, 0f, dismissTranslationInterpolationEnd);
float animationEndProgress = isStagingFocusedTask
? Utilities.boundToRange(
timings.getGridSlideStartOffset()
+ (timings.getGridSlideStaggerOffset() * staggerColumn)
+ timings.getGridSlideDurationOffset(),
splitTimings.getGridSlideStartOffset()
+ (splitTimings.getGridSlideStaggerOffset() * staggerColumn)
+ splitTimings.getGridSlideDurationOffset(),
0f,
dismissTranslationInterpolationEnd)
: dismissTranslationInterpolationEnd;
@@ -3173,7 +3198,7 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
if (!nextFocusedTaskFromTop) {
secondaryTranslation -= mTopBottomRowHeightDiff;
}
anim.setFloat(taskView, taskView.getSecondaryDissmissTranslationProperty(),
anim.setFloat(taskView, taskView.getSecondaryDismissTranslationProperty(),
secondaryTranslation, clampToProgress(LINEAR, animationStartProgress,
dismissTranslationInterpolationEnd));
anim.setFloat(taskView, TaskView.FOCUS_TRANSITION, 0f,
@@ -4179,9 +4204,13 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
// TODO(194414938) starting bounds seem slightly off, investigate
Rect firstTaskStartingBounds = new Rect();
Rect firstTaskEndingBounds = mTempRect;
PendingAnimation pendingAnimation =
new PendingAnimation(SplitAnimationTimings.CONFIRM_DURATION);
SplitAnimationTimings timings = SplitAnimationTimings.SPLIT_TO_CONFIRM;
boolean isTablet = mActivity.getDeviceProfile().isTablet;
int duration = isTablet
? SplitAnimationTimings.TABLET_CONFIRM_DURATION
: SplitAnimationTimings.PHONE_CONFIRM_DURATION;
PendingAnimation pendingAnimation = new PendingAnimation(duration);
SplitAnimationTimings timings = AnimUtils.getDeviceSplitToConfirmTimings(isTablet);
int halfDividerSize = getResources()
.getDimensionPixelSize(R.dimen.multi_window_task_divider_size) / 2;
@@ -1261,7 +1261,7 @@ public class TaskView extends FrameLayout implements Reusable {
DISMISS_TRANSLATION_X, DISMISS_TRANSLATION_Y);
}
public FloatProperty<TaskView> getSecondaryDissmissTranslationProperty() {
public FloatProperty<TaskView> getSecondaryDismissTranslationProperty() {
return getPagedOrientationHandler().getSecondaryValue(
DISMISS_TRANSLATION_X, DISMISS_TRANSLATION_Y);
}