1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.launcher3.taskbar; 17 18 import android.view.View; 19 import android.view.WindowManager; 20 21 import com.android.quickstep.util.LauncherViewsMoveFromCenterTranslationApplier; 22 import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator; 23 import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener; 24 import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider; 25 26 /** 27 * Controls animation of taskbar icons when unfolding foldable devices 28 */ 29 public class TaskbarUnfoldAnimationController { 30 31 private final ScopedUnfoldTransitionProgressProvider mUnfoldTransitionProgressProvider; 32 private final UnfoldMoveFromCenterAnimator mMoveFromCenterAnimator; 33 private final TransitionListener mTransitionListener = new TransitionListener(); 34 private TaskbarViewController mTaskbarViewController; 35 TaskbarUnfoldAnimationController(ScopedUnfoldTransitionProgressProvider unfoldTransitionProgressProvider, WindowManager windowManager)36 public TaskbarUnfoldAnimationController(ScopedUnfoldTransitionProgressProvider 37 unfoldTransitionProgressProvider, WindowManager windowManager) { 38 mUnfoldTransitionProgressProvider = unfoldTransitionProgressProvider; 39 mMoveFromCenterAnimator = new UnfoldMoveFromCenterAnimator(windowManager, 40 new LauncherViewsMoveFromCenterTranslationApplier()); 41 } 42 43 /** 44 * Initializes the controller 45 * @param taskbarControllers references to all other taskbar controllers 46 */ init(TaskbarControllers taskbarControllers)47 public void init(TaskbarControllers taskbarControllers) { 48 mTaskbarViewController = taskbarControllers.taskbarViewController; 49 mTaskbarViewController.addOneTimePreDrawListener(() -> 50 mUnfoldTransitionProgressProvider.setReadyToHandleTransition(true)); 51 mUnfoldTransitionProgressProvider.addCallback(mTransitionListener); 52 } 53 54 /** 55 * Destroys the controller 56 */ onDestroy()57 public void onDestroy() { 58 mUnfoldTransitionProgressProvider.setReadyToHandleTransition(false); 59 mUnfoldTransitionProgressProvider.removeCallback(mTransitionListener); 60 } 61 62 private class TransitionListener implements TransitionProgressListener { 63 64 @Override onTransitionStarted()65 public void onTransitionStarted() { 66 mMoveFromCenterAnimator.updateDisplayProperties(); 67 View[] icons = mTaskbarViewController.getIconViews(); 68 for (View icon : icons) { 69 // TODO(b/193794563) we should re-register views if they are re-bound/re-inflated 70 // during the animation 71 mMoveFromCenterAnimator.registerViewForAnimation(icon); 72 } 73 74 mMoveFromCenterAnimator.onTransitionStarted(); 75 } 76 77 @Override onTransitionFinished()78 public void onTransitionFinished() { 79 mMoveFromCenterAnimator.onTransitionFinished(); 80 mMoveFromCenterAnimator.clearRegisteredViews(); 81 } 82 83 @Override onTransitionProgress(float progress)84 public void onTransitionProgress(float progress) { 85 mMoveFromCenterAnimator.onTransitionProgress(progress); 86 } 87 } 88 } 89