From fe9ec740cc0c04565cfb5ccbd7a0786dd266d1d3 Mon Sep 17 00:00:00 2001 From: Nick Chameyev Date: Fri, 4 Mar 2022 16:27:54 +0000 Subject: [PATCH] Do not run unfold taskbar animation when in portrait Limits taskbar icons translation animation only when the display is in natural orientation. Bug: 219958588 Test: fold/unfold in portrait and landscape Change-Id: I33e26829ae37f1df39e8c7234f98d20eb7993b93 --- .../taskbar/TaskbarActivityContext.java | 5 ++-- .../launcher3/taskbar/TaskbarManager.java | 7 +++-- .../TaskbarUnfoldAnimationController.java | 25 +++++++++++----- .../taskbar/TaskbarViewController.java | 19 ++++-------- ...copedUnfoldTransitionProgressProvider.java | 30 +++++++++++++++++++ 5 files changed, 60 insertions(+), 26 deletions(-) create mode 100644 quickstep/src/com/android/launcher3/taskbar/unfold/NonDestroyableScopedUnfoldTransitionProgressProvider.java diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index 8f0b9345d7..46640e25f1 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -47,6 +47,7 @@ import android.view.Gravity; import android.view.RoundedCorner; import android.view.View; import android.view.WindowManager; +import android.view.WindowManagerGlobal; import android.widget.FrameLayout; import android.widget.Toast; @@ -178,8 +179,8 @@ public class TaskbarActivityContext extends BaseTaskbarContext { new TaskbarDragLayerController(this, mDragLayer), new TaskbarViewController(this, taskbarView), new TaskbarScrimViewController(this, taskbarScrimView), - new TaskbarUnfoldAnimationController(unfoldTransitionProgressProvider, - mWindowManager), + new TaskbarUnfoldAnimationController(this, unfoldTransitionProgressProvider, + mWindowManager, WindowManagerGlobal.getWindowManagerService()), new TaskbarKeyguardController(this), new StashedHandleViewController(this, stashedHandleView), new TaskbarStashController(this), diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java index 0f7abda714..16cf883fa4 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java @@ -40,8 +40,8 @@ import androidx.annotation.Nullable; import com.android.launcher3.BaseQuickstepLauncher; import com.android.launcher3.DeviceProfile; import com.android.launcher3.LauncherAppState; -import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.statemanager.StatefulActivity; +import com.android.launcher3.taskbar.unfold.NonDestroyableScopedUnfoldTransitionProgressProvider; import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.DisplayController.Info; import com.android.launcher3.util.SettingsCache; @@ -78,8 +78,11 @@ public class TaskbarManager implements DisplayController.DisplayInfoChangeListen private final SimpleBroadcastReceiver mShutdownReceiver; // The source for this provider is set when Launcher is available + // We use 'non-destroyable' version here so the original provider won't be destroyed + // as it is tied to the activity lifecycle, not the taskbar lifecycle. + // It's destruction/creation will be managed by the activity. private final ScopedUnfoldTransitionProgressProvider mUnfoldProgressProvider = - new ScopedUnfoldTransitionProgressProvider(); + new NonDestroyableScopedUnfoldTransitionProgressProvider(); private TaskbarActivityContext mTaskbarActivityContext; private StatefulActivity mActivity; diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarUnfoldAnimationController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarUnfoldAnimationController.java index d5ea570613..64a4fa79df 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarUnfoldAnimationController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarUnfoldAnimationController.java @@ -15,12 +15,14 @@ */ package com.android.launcher3.taskbar; +import android.view.IWindowManager; import android.view.View; import android.view.WindowManager; import com.android.quickstep.util.LauncherViewsMoveFromCenterTranslationApplier; import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator; import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener; +import com.android.systemui.unfold.util.NaturalRotationUnfoldProgressProvider; import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider; import java.io.PrintWriter; @@ -31,14 +33,18 @@ import java.io.PrintWriter; public class TaskbarUnfoldAnimationController implements TaskbarControllers.LoggableTaskbarController { - private final ScopedUnfoldTransitionProgressProvider mUnfoldTransitionProgressProvider; + private final ScopedUnfoldTransitionProgressProvider mScopedUnfoldTransitionProgressProvider; + private final NaturalRotationUnfoldProgressProvider mNaturalUnfoldTransitionProgressProvider; private final UnfoldMoveFromCenterAnimator mMoveFromCenterAnimator; private final TransitionListener mTransitionListener = new TransitionListener(); private TaskbarViewController mTaskbarViewController; - public TaskbarUnfoldAnimationController(ScopedUnfoldTransitionProgressProvider - unfoldTransitionProgressProvider, WindowManager windowManager) { - mUnfoldTransitionProgressProvider = unfoldTransitionProgressProvider; + public TaskbarUnfoldAnimationController(BaseTaskbarContext context, + ScopedUnfoldTransitionProgressProvider source, + WindowManager windowManager, IWindowManager iWindowManager) { + mScopedUnfoldTransitionProgressProvider = source; + mNaturalUnfoldTransitionProgressProvider = + new NaturalRotationUnfoldProgressProvider(context, iWindowManager, source); mMoveFromCenterAnimator = new UnfoldMoveFromCenterAnimator(windowManager, new LauncherViewsMoveFromCenterTranslationApplier()); } @@ -48,18 +54,21 @@ public class TaskbarUnfoldAnimationController implements * @param taskbarControllers references to all other taskbar controllers */ public void init(TaskbarControllers taskbarControllers) { + mNaturalUnfoldTransitionProgressProvider.init(); mTaskbarViewController = taskbarControllers.taskbarViewController; mTaskbarViewController.addOneTimePreDrawListener(() -> - mUnfoldTransitionProgressProvider.setReadyToHandleTransition(true)); - mUnfoldTransitionProgressProvider.addCallback(mTransitionListener); + mScopedUnfoldTransitionProgressProvider.setReadyToHandleTransition(true)); + mNaturalUnfoldTransitionProgressProvider.addCallback(mTransitionListener); } /** * Destroys the controller */ public void onDestroy() { - mUnfoldTransitionProgressProvider.setReadyToHandleTransition(false); - mUnfoldTransitionProgressProvider.removeCallback(mTransitionListener); + mScopedUnfoldTransitionProgressProvider.setReadyToHandleTransition(false); + mNaturalUnfoldTransitionProgressProvider.removeCallback(mTransitionListener); + mNaturalUnfoldTransitionProgressProvider.destroy(); + mTaskbarViewController = null; } @Override diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java index 153ed140b4..3575dc151b 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java @@ -20,13 +20,14 @@ import static com.android.launcher3.Utilities.squaredHypot; import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.quickstep.AnimatedFloat.VALUE; +import android.annotation.NonNull; import android.graphics.Rect; import android.util.FloatProperty; import android.util.Log; import android.view.MotionEvent; import android.view.View; -import android.view.ViewTreeObserver; -import android.view.ViewTreeObserver.OnPreDrawListener; + +import androidx.core.view.OneShotPreDrawListener; import com.android.launcher3.BubbleTextView; import com.android.launcher3.DeviceProfile; @@ -142,18 +143,8 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar * drawing a frame and invoked only once * @param listener callback that will be invoked before drawing the next frame */ - public void addOneTimePreDrawListener(Runnable listener) { - mTaskbarView.getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() { - @Override - public boolean onPreDraw() { - final ViewTreeObserver viewTreeObserver = mTaskbarView.getViewTreeObserver(); - if (viewTreeObserver.isAlive()) { - listener.run(); - viewTreeObserver.removeOnPreDrawListener(this); - } - return true; - } - }); + public void addOneTimePreDrawListener(@NonNull Runnable listener) { + OneShotPreDrawListener.add(mTaskbarView, listener); } public Rect getIconLayoutBounds() { diff --git a/quickstep/src/com/android/launcher3/taskbar/unfold/NonDestroyableScopedUnfoldTransitionProgressProvider.java b/quickstep/src/com/android/launcher3/taskbar/unfold/NonDestroyableScopedUnfoldTransitionProgressProvider.java new file mode 100644 index 0000000000..f9da4e4e74 --- /dev/null +++ b/quickstep/src/com/android/launcher3/taskbar/unfold/NonDestroyableScopedUnfoldTransitionProgressProvider.java @@ -0,0 +1,30 @@ +/* + * 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.launcher3.taskbar.unfold; + +import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider; + +/** + * ScopedUnfoldTransitionProgressProvider that doesn't propagate destroy method + */ +public class NonDestroyableScopedUnfoldTransitionProgressProvider extends + ScopedUnfoldTransitionProgressProvider { + + @Override + public void destroy() { + // no-op + } +}