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