From c5d3a0d891d4b59e952f0cd7253da0dec0585074 Mon Sep 17 00:00:00 2001 From: Nick Chameyev Date: Fri, 26 Nov 2021 14:03:09 +0000 Subject: [PATCH] Do not animate QSB and hotseat when portrait Disables fold/unfold animation for QSB and hotseat icons when in portrait orientation. Launcher workspace icons and widgets are still animated intentionally. Reuses NaturalOrientationRotationProvider which is currently used to disable fold/unfold animation in the status bar when in non-natural orientation. Bug: 201518277 Test: fold/unfold on launcher in landscape => QSB and hotseat animated; rotate screen during fold/unfold animation => translation reset after rotating to portrait, animated after returning to landscape; rotate after fold/unfold animation => no changes Change-Id: I8ed405b09f445f554d7638ab44393c90773e0bb6 --- .../BaseUnfoldMoveFromCenterAnimator.java | 93 +++++++++++++++++++ .../LauncherUnfoldAnimationController.java | 31 ++++--- .../UnfoldMoveFromCenterHotseatAnimator.java | 55 +++++++++++ ...UnfoldMoveFromCenterWorkspaceAnimator.java | 66 +------------ 4 files changed, 171 insertions(+), 74 deletions(-) create mode 100644 quickstep/src/com/android/quickstep/util/BaseUnfoldMoveFromCenterAnimator.java create mode 100644 quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterHotseatAnimator.java diff --git a/quickstep/src/com/android/quickstep/util/BaseUnfoldMoveFromCenterAnimator.java b/quickstep/src/com/android/quickstep/util/BaseUnfoldMoveFromCenterAnimator.java new file mode 100644 index 0000000000..861ff96b5e --- /dev/null +++ b/quickstep/src/com/android/quickstep/util/BaseUnfoldMoveFromCenterAnimator.java @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2021 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 android.annotation.CallSuper; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; + +import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator; +import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener; + +import java.util.HashMap; +import java.util.Map; + +/** + * Animation that moves launcher icons and widgets from center to the sides (final position) + */ +public abstract class BaseUnfoldMoveFromCenterAnimator implements TransitionProgressListener { + + private final UnfoldMoveFromCenterAnimator mMoveFromCenterAnimation; + + private final Map mOriginalClipToPadding = new HashMap<>(); + private final Map mOriginalClipChildren = new HashMap<>(); + + public BaseUnfoldMoveFromCenterAnimator(WindowManager windowManager) { + mMoveFromCenterAnimation = new UnfoldMoveFromCenterAnimator(windowManager, + new LauncherViewsMoveFromCenterTranslationApplier()); + } + + @CallSuper + @Override + public void onTransitionStarted() { + mMoveFromCenterAnimation.updateDisplayProperties(); + onPrepareViewsForAnimation(); + onTransitionProgress(0f); + } + + @CallSuper + @Override + public void onTransitionProgress(float progress) { + mMoveFromCenterAnimation.onTransitionProgress(progress); + } + + @CallSuper + @Override + public void onTransitionFinished() { + mMoveFromCenterAnimation.onTransitionFinished(); + mMoveFromCenterAnimation.clearRegisteredViews(); + + mOriginalClipChildren.clear(); + mOriginalClipToPadding.clear(); + } + + protected void onPrepareViewsForAnimation() { + + } + + protected void registerViewForAnimation(View view) { + mMoveFromCenterAnimation.registerViewForAnimation(view); + } + + protected void disableClipping(ViewGroup view) { + mOriginalClipToPadding.put(view, view.getClipToPadding()); + mOriginalClipChildren.put(view, view.getClipChildren()); + view.setClipToPadding(false); + view.setClipChildren(false); + } + + protected void restoreClipping(ViewGroup view) { + final Boolean originalClipToPadding = mOriginalClipToPadding.get(view); + if (originalClipToPadding != null) { + view.setClipToPadding(originalClipToPadding); + } + final Boolean originalClipChildren = mOriginalClipChildren.get(view); + if (originalClipChildren != null) { + view.setClipChildren(originalClipChildren); + } + } +} diff --git a/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java b/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java index b39412b982..6b6bd6a8b3 100644 --- a/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java +++ b/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java @@ -18,14 +18,17 @@ package com.android.quickstep.util; import static com.android.launcher3.Utilities.comp; import android.annotation.Nullable; -import android.view.ViewTreeObserver; import android.view.WindowManager; +import android.view.WindowManagerGlobal; + +import androidx.core.view.OneShotPreDrawListener; import com.android.launcher3.Hotseat; import com.android.launcher3.Launcher; import com.android.launcher3.util.HorizontalInsettableView; import com.android.systemui.unfold.UnfoldTransitionProgressProvider; import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener; +import com.android.systemui.unfold.util.NaturalRotationUnfoldProgressProvider; import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider; /** @@ -43,6 +46,7 @@ public class LauncherUnfoldAnimationController { private HorizontalInsettableView mQsbInsettable; private final ScopedUnfoldTransitionProgressProvider mProgressProvider; + private final NaturalRotationUnfoldProgressProvider mNaturalOrientationProgressProvider; public LauncherUnfoldAnimationController( Launcher launcher, @@ -51,10 +55,19 @@ public class LauncherUnfoldAnimationController { mLauncher = launcher; mProgressProvider = new ScopedUnfoldTransitionProgressProvider( unfoldTransitionProgressProvider); + mNaturalOrientationProgressProvider = new NaturalRotationUnfoldProgressProvider(launcher, + WindowManagerGlobal.getWindowManagerService(), mProgressProvider); + mNaturalOrientationProgressProvider.init(); + // Animated in all orientations mProgressProvider.addCallback(new UnfoldMoveFromCenterWorkspaceAnimator(launcher, windowManager)); - mProgressProvider.addCallback(new QsbAnimationListener()); + + // Animated only in natural orientation + mNaturalOrientationProgressProvider + .addCallback(new QsbAnimationListener()); + mNaturalOrientationProgressProvider + .addCallback(new UnfoldMoveFromCenterHotseatAnimator(launcher, windowManager)); } /** @@ -66,17 +79,8 @@ public class LauncherUnfoldAnimationController { mQsbInsettable = (HorizontalInsettableView) hotseat.getQsb(); } - final ViewTreeObserver obs = mLauncher.getWorkspace().getViewTreeObserver(); - obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { - @Override - public boolean onPreDraw() { - if (obs.isAlive()) { - mProgressProvider.setReadyToHandleTransition(true); - obs.removeOnPreDrawListener(this); - } - return true; - } - }); + OneShotPreDrawListener.add(mLauncher.getWorkspace(), + () -> mProgressProvider.setReadyToHandleTransition(true)); } /** @@ -92,6 +96,7 @@ public class LauncherUnfoldAnimationController { */ public void onDestroy() { mProgressProvider.destroy(); + mNaturalOrientationProgressProvider.destroy(); } private class QsbAnimationListener implements TransitionProgressListener { diff --git a/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterHotseatAnimator.java b/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterHotseatAnimator.java new file mode 100644 index 0000000000..dc97dd6f86 --- /dev/null +++ b/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterHotseatAnimator.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2021 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 android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; + +import com.android.launcher3.Hotseat; +import com.android.launcher3.Launcher; + +/** + * Animation that moves hotseat icons from center to the sides (final position) + */ +public class UnfoldMoveFromCenterHotseatAnimator extends BaseUnfoldMoveFromCenterAnimator { + + private final Launcher mLauncher; + + public UnfoldMoveFromCenterHotseatAnimator(Launcher launcher, WindowManager windowManager) { + super(windowManager); + mLauncher = launcher; + } + + @Override + protected void onPrepareViewsForAnimation() { + Hotseat hotseat = mLauncher.getHotseat(); + + ViewGroup hotseatIcons = hotseat.getShortcutsAndWidgets(); + disableClipping(hotseat); + + for (int i = 0; i < hotseatIcons.getChildCount(); i++) { + View child = hotseatIcons.getChildAt(i); + registerViewForAnimation(child); + } + } + + @Override + public void onTransitionFinished() { + restoreClipping(mLauncher.getHotseat()); + super.onTransitionFinished(); + } +} diff --git a/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterWorkspaceAnimator.java b/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterWorkspaceAnimator.java index 95403b2d0c..3d72398832 100644 --- a/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterWorkspaceAnimator.java +++ b/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterWorkspaceAnimator.java @@ -16,44 +16,28 @@ package com.android.quickstep.util; import android.view.View; -import android.view.ViewGroup; import android.view.WindowManager; import com.android.launcher3.CellLayout; -import com.android.launcher3.Hotseat; import com.android.launcher3.Launcher; import com.android.launcher3.ShortcutAndWidgetContainer; import com.android.launcher3.Workspace; -import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator; -import com.android.systemui.unfold.UnfoldTransitionProgressProvider; - -import java.util.HashMap; -import java.util.Map; /** * Animation that moves launcher icons and widgets from center to the sides (final position) */ -public class UnfoldMoveFromCenterWorkspaceAnimator - implements UnfoldTransitionProgressProvider.TransitionProgressListener { +public class UnfoldMoveFromCenterWorkspaceAnimator extends BaseUnfoldMoveFromCenterAnimator { private final Launcher mLauncher; - private final UnfoldMoveFromCenterAnimator mMoveFromCenterAnimation; - - private final Map mOriginalClipToPadding = new HashMap<>(); - private final Map mOriginalClipChildren = new HashMap<>(); public UnfoldMoveFromCenterWorkspaceAnimator(Launcher launcher, WindowManager windowManager) { + super(windowManager); mLauncher = launcher; - mMoveFromCenterAnimation = new UnfoldMoveFromCenterAnimator(windowManager, - new LauncherViewsMoveFromCenterTranslationApplier()); } @Override - public void onTransitionStarted() { - mMoveFromCenterAnimation.updateDisplayProperties(); - + protected void onPrepareViewsForAnimation() { Workspace workspace = mLauncher.getWorkspace(); - Hotseat hotseat = mLauncher.getHotseat(); // App icons and widgets workspace @@ -65,57 +49,17 @@ public class UnfoldMoveFromCenterWorkspaceAnimator for (int i = 0; i < itemsContainer.getChildCount(); i++) { View child = itemsContainer.getChildAt(i); - mMoveFromCenterAnimation.registerViewForAnimation(child); + registerViewForAnimation(child); } }); disableClipping(workspace); - - // Hotseat icons - ViewGroup hotseatIcons = hotseat.getShortcutsAndWidgets(); - disableClipping(hotseat); - - for (int i = 0; i < hotseatIcons.getChildCount(); i++) { - View child = hotseatIcons.getChildAt(i); - mMoveFromCenterAnimation.registerViewForAnimation(child); - } - - onTransitionProgress(0f); - } - - @Override - public void onTransitionProgress(float progress) { - mMoveFromCenterAnimation.onTransitionProgress(progress); } @Override public void onTransitionFinished() { - mMoveFromCenterAnimation.onTransitionFinished(); - mMoveFromCenterAnimation.clearRegisteredViews(); - restoreClipping(mLauncher.getWorkspace()); mLauncher.getWorkspace().forEachVisiblePage(page -> restoreClipping((CellLayout) page)); - restoreClipping(mLauncher.getHotseat()); - - mOriginalClipChildren.clear(); - mOriginalClipToPadding.clear(); - } - - private void disableClipping(ViewGroup view) { - mOriginalClipToPadding.put(view, view.getClipToPadding()); - mOriginalClipChildren.put(view, view.getClipChildren()); - view.setClipToPadding(false); - view.setClipChildren(false); - } - - private void restoreClipping(ViewGroup view) { - final Boolean originalClipToPadding = mOriginalClipToPadding.get(view); - if (originalClipToPadding != null) { - view.setClipToPadding(originalClipToPadding); - } - final Boolean originalClipChildren = mOriginalClipChildren.get(view); - if (originalClipChildren != null) { - view.setClipChildren(originalClipChildren); - } + super.onTransitionFinished(); } }