From ba7324e2b843276a617e5dd71d3d6d02f2229576 Mon Sep 17 00:00:00 2001 From: Jeremy Sim Date: Mon, 26 Sep 2022 19:04:33 -0400 Subject: [PATCH] Update animations for phones: Overview > OverviewSplitSelect transition This change updates the animation for initiating a split from the Overview screen on phones. Includes new timings and interpolators, and extends timing data classes related to SplitAnimationTimings. Fixes a noticeable issue where the split animation appeared slow on phones. Outstanding issues (fixes in progress): - Repeated invocations of split on phones cause an erroneous animation to play. (b/249154347) - Thumbnail corners do not match placeholder corners; the transition between the two is slightly janky. (b/236761794) - Placeholder icons should be 72dp. (b/236761794) Bug: 236761794 Test: Manual Change-Id: Ibb97ef54498b0aa9556df531d8084799259c06e2 --- .../RecentsViewStateController.java | 12 +++- .../QuickstepAtomicAnimationFactory.java | 7 ++- .../states/SplitScreenSelectState.java | 11 +++- .../com/android/quickstep/util/AnimUtils.java | 42 +++++++++++++ .../util/OverviewToSplitTimings.java | 41 +++++++------ .../util/PhoneOverviewToSplitTimings.java | 46 +++++++++++++++ .../util/PhoneSplitToConfirmTimings.java | 40 +++++++++++++ .../quickstep/util/SplitAnimationTimings.java | 25 +++++--- .../quickstep/util/SplitToConfirmTimings.java | 29 ++++----- ...ngs.java => TabletHomeToSplitTimings.java} | 5 +- .../util/TabletOverviewToSplitTimings.java | 46 +++++++++++++++ .../util/TabletSplitToConfirmTimings.java | 40 +++++++++++++ .../quickstep/views/FloatingTaskView.java | 22 +++++-- .../android/quickstep/views/RecentsView.java | 59 ++++++++++++++----- .../com/android/quickstep/views/TaskView.java | 2 +- 15 files changed, 358 insertions(+), 69 deletions(-) create mode 100644 quickstep/src/com/android/quickstep/util/AnimUtils.java create mode 100644 quickstep/src/com/android/quickstep/util/PhoneOverviewToSplitTimings.java create mode 100644 quickstep/src/com/android/quickstep/util/PhoneSplitToConfirmTimings.java rename quickstep/src/com/android/quickstep/util/{NormalToSplitTimings.java => TabletHomeToSplitTimings.java} (88%) create mode 100644 quickstep/src/com/android/quickstep/util/TabletOverviewToSplitTimings.java create mode 100644 quickstep/src/com/android/quickstep/util/TabletSplitToConfirmTimings.java diff --git a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java index 0723f8abfd..cbb9ad18f2 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java @@ -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(); diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java b/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java index f75a404821..bcd722f4e3 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java +++ b/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java @@ -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())); diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/SplitScreenSelectState.java b/quickstep/src/com/android/launcher3/uioverrides/states/SplitScreenSelectState.java index 430053d066..8babd3470b 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/states/SplitScreenSelectState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/states/SplitScreenSelectState.java @@ -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; + } } } diff --git a/quickstep/src/com/android/quickstep/util/AnimUtils.java b/quickstep/src/com/android/quickstep/util/AnimUtils.java new file mode 100644 index 0000000000..b7b7825d78 --- /dev/null +++ b/quickstep/src/com/android/quickstep/util/AnimUtils.java @@ -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; + } +} diff --git a/quickstep/src/com/android/quickstep/util/OverviewToSplitTimings.java b/quickstep/src/com/android/quickstep/util/OverviewToSplitTimings.java index f44796b79e..d46c0f80a0 100644 --- a/quickstep/src/com/android/quickstep/util/OverviewToSplitTimings.java +++ b/quickstep/src/com/android/quickstep/util/OverviewToSplitTimings.java @@ -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(); diff --git a/quickstep/src/com/android/quickstep/util/PhoneOverviewToSplitTimings.java b/quickstep/src/com/android/quickstep/util/PhoneOverviewToSplitTimings.java new file mode 100644 index 0000000000..66c41d6ab1 --- /dev/null +++ b/quickstep/src/com/android/quickstep/util/PhoneOverviewToSplitTimings.java @@ -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; } +} diff --git a/quickstep/src/com/android/quickstep/util/PhoneSplitToConfirmTimings.java b/quickstep/src/com/android/quickstep/util/PhoneSplitToConfirmTimings.java new file mode 100644 index 0000000000..9e7351a2de --- /dev/null +++ b/quickstep/src/com/android/quickstep/util/PhoneSplitToConfirmTimings.java @@ -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; } +} diff --git a/quickstep/src/com/android/quickstep/util/SplitAnimationTimings.java b/quickstep/src/com/android/quickstep/util/SplitAnimationTimings.java index 133be0394e..2966fbb5db 100644 --- a/quickstep/src/com/android/quickstep/util/SplitAnimationTimings.java +++ b/quickstep/src/com/android/quickstep/util/SplitAnimationTimings.java @@ -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; } diff --git a/quickstep/src/com/android/quickstep/util/SplitToConfirmTimings.java b/quickstep/src/com/android/quickstep/util/SplitToConfirmTimings.java index 84cfb0be94..3026e98aa9 100644 --- a/quickstep/src/com/android/quickstep/util/SplitToConfirmTimings.java +++ b/quickstep/src/com/android/quickstep/util/SplitToConfirmTimings.java @@ -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(); diff --git a/quickstep/src/com/android/quickstep/util/NormalToSplitTimings.java b/quickstep/src/com/android/quickstep/util/TabletHomeToSplitTimings.java similarity index 88% rename from quickstep/src/com/android/quickstep/util/NormalToSplitTimings.java rename to quickstep/src/com/android/quickstep/util/TabletHomeToSplitTimings.java index 1bf5a5dda7..bf8612a797 100644 --- a/quickstep/src/com/android/quickstep/util/NormalToSplitTimings.java +++ b/quickstep/src/com/android/quickstep/util/TabletHomeToSplitTimings.java @@ -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 diff --git a/quickstep/src/com/android/quickstep/util/TabletOverviewToSplitTimings.java b/quickstep/src/com/android/quickstep/util/TabletOverviewToSplitTimings.java new file mode 100644 index 0000000000..30defa7cf2 --- /dev/null +++ b/quickstep/src/com/android/quickstep/util/TabletOverviewToSplitTimings.java @@ -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; } +} diff --git a/quickstep/src/com/android/quickstep/util/TabletSplitToConfirmTimings.java b/quickstep/src/com/android/quickstep/util/TabletSplitToConfirmTimings.java new file mode 100644 index 0000000000..3ea8466148 --- /dev/null +++ b/quickstep/src/com/android/quickstep/util/TabletSplitToConfirmTimings.java @@ -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; } +} diff --git a/quickstep/src/com/android/quickstep/views/FloatingTaskView.java b/quickstep/src/com/android/quickstep/views/FloatingTaskView.java index 1a02f03bb4..dc1ae520a3 100644 --- a/quickstep/src/com/android/quickstep/views/FloatingTaskView.java +++ b/quickstep/src/com/android/quickstep/views/FloatingTaskView.java @@ -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); } /** diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 96607a0b84..2f91e16566 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -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 secondaryViewTranslate = - taskView.getSecondaryDissmissTranslationProperty(); + taskView.getSecondaryDismissTranslationProperty(); int secondaryTaskDimension = mOrientationHandler.getSecondaryDimension(taskView); int verticalFactor = mOrientationHandler.getSecondaryTranslationDirectionFactor(); @@ -2809,7 +2810,8 @@ public abstract class RecentsView getSecondaryDissmissTranslationProperty() { + public FloatProperty getSecondaryDismissTranslationProperty() { return getPagedOrientationHandler().getSecondaryValue( DISMISS_TRANSLATION_X, DISMISS_TRANSLATION_Y); }