diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-09-29 23:26:05 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-09-29 23:26:05 +0000 |
commit | 6b7accb4c26475fdb55385d9dff6fa0134403477 (patch) | |
tree | f4e98593cddb4880122363550cb918eb7c056ee8 | |
parent | 53bac7c6b3420a548bb87c6d525180a681ef9cd6 (diff) | |
parent | 888f745490428856f89599c7aa0354a4fe534567 (diff) | |
download | Launcher3-6b7accb4c26475fdb55385d9dff6fa0134403477.tar.gz |
Snap for 9121707 from 888f745490428856f89599c7aa0354a4fe534567 to tm-qpr1-release
Change-Id: I162b782d4cfcfb01e57a05d524eec980de8fc1b9
15 files changed, 357 insertions, 68 deletions
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 TABLET_ENTER_DURATION = 866; + int TABLET_CONFIRM_DURATION = 383; + + int PHONE_ENTER_DURATION = 517; + int PHONE_CONFIRM_DURATION = 333; + int ABORT_DURATION = 500; - int CONFIRM_DURATION = 383; - SplitAnimationTimings OVERVIEW_TO_SPLIT = new OverviewToSplitTimings(); - SplitAnimationTimings NORMAL_TO_SPLIT = new NormalToSplitTimings(); - SplitAnimationTimings SPLIT_TO_CONFIRM = new SplitToConfirmTimings(); + 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 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<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; diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index 9720c2a92e..a0f195ce26 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -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); } |