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.content.pm.ActivityInfo.Config;
19 
20 import androidx.annotation.NonNull;
21 
22 import com.android.systemui.shared.rotation.RotationButtonController;
23 
24 import java.util.ArrayList;
25 import java.util.List;
26 
27 /**
28  * Hosts various taskbar controllers to facilitate passing between one another.
29  */
30 public class TaskbarControllers {
31 
32     public final TaskbarActivityContext taskbarActivityContext;
33     public final TaskbarDragController taskbarDragController;
34     public final TaskbarNavButtonController navButtonController;
35     public final NavbarButtonsViewController navbarButtonsViewController;
36     public final RotationButtonController rotationButtonController;
37     public final TaskbarDragLayerController taskbarDragLayerController;
38     public final TaskbarScrimViewController taskbarScrimViewController;
39     public final TaskbarViewController taskbarViewController;
40     public final TaskbarUnfoldAnimationController taskbarUnfoldAnimationController;
41     public final TaskbarKeyguardController taskbarKeyguardController;
42     public final StashedHandleViewController stashedHandleViewController;
43     public final TaskbarStashController taskbarStashController;
44     public final TaskbarEduController taskbarEduController;
45     public final TaskbarAutohideSuspendController taskbarAutohideSuspendController;
46     public final TaskbarPopupController taskbarPopupController;
47 
48     /** Do not store this controller, as it may change at runtime. */
49     @NonNull public TaskbarUIController uiController = TaskbarUIController.DEFAULT;
50 
51     private boolean mAreAllControllersInitialized;
52     private final List<Runnable> mPostInitCallbacks = new ArrayList<>();
53 
TaskbarControllers(TaskbarActivityContext taskbarActivityContext, TaskbarDragController taskbarDragController, TaskbarNavButtonController navButtonController, NavbarButtonsViewController navbarButtonsViewController, RotationButtonController rotationButtonController, TaskbarDragLayerController taskbarDragLayerController, TaskbarViewController taskbarViewController, TaskbarScrimViewController taskbarScrimViewController, TaskbarUnfoldAnimationController taskbarUnfoldAnimationController, TaskbarKeyguardController taskbarKeyguardController, StashedHandleViewController stashedHandleViewController, TaskbarStashController taskbarStashController, TaskbarEduController taskbarEduController, TaskbarAutohideSuspendController taskbarAutoHideSuspendController, TaskbarPopupController taskbarPopupController)54     public TaskbarControllers(TaskbarActivityContext taskbarActivityContext,
55             TaskbarDragController taskbarDragController,
56             TaskbarNavButtonController navButtonController,
57             NavbarButtonsViewController navbarButtonsViewController,
58             RotationButtonController rotationButtonController,
59             TaskbarDragLayerController taskbarDragLayerController,
60             TaskbarViewController taskbarViewController,
61             TaskbarScrimViewController taskbarScrimViewController,
62             TaskbarUnfoldAnimationController taskbarUnfoldAnimationController,
63             TaskbarKeyguardController taskbarKeyguardController,
64             StashedHandleViewController stashedHandleViewController,
65             TaskbarStashController taskbarStashController,
66             TaskbarEduController taskbarEduController,
67             TaskbarAutohideSuspendController taskbarAutoHideSuspendController,
68             TaskbarPopupController taskbarPopupController) {
69         this.taskbarActivityContext = taskbarActivityContext;
70         this.taskbarDragController = taskbarDragController;
71         this.navButtonController = navButtonController;
72         this.navbarButtonsViewController = navbarButtonsViewController;
73         this.rotationButtonController = rotationButtonController;
74         this.taskbarDragLayerController = taskbarDragLayerController;
75         this.taskbarViewController = taskbarViewController;
76         this.taskbarScrimViewController = taskbarScrimViewController;
77         this.taskbarUnfoldAnimationController = taskbarUnfoldAnimationController;
78         this.taskbarKeyguardController = taskbarKeyguardController;
79         this.stashedHandleViewController = stashedHandleViewController;
80         this.taskbarStashController = taskbarStashController;
81         this.taskbarEduController = taskbarEduController;
82         this.taskbarAutohideSuspendController = taskbarAutoHideSuspendController;
83         this.taskbarPopupController = taskbarPopupController;
84     }
85 
86     /**
87      * Initializes all controllers. Note that controllers can now reference each other through this
88      * TaskbarControllers instance, but should be careful to only access things that were created
89      * in constructors for now, as some controllers may still be waiting for init().
90      */
init(TaskbarSharedState sharedState)91     public void init(TaskbarSharedState sharedState) {
92         mAreAllControllersInitialized = false;
93 
94         taskbarDragController.init(this);
95         navbarButtonsViewController.init(this);
96         rotationButtonController.init();
97         taskbarDragLayerController.init(this);
98         taskbarViewController.init(this);
99         taskbarScrimViewController.init(this);
100         taskbarUnfoldAnimationController.init(this);
101         taskbarKeyguardController.init(navbarButtonsViewController);
102         stashedHandleViewController.init(this);
103         taskbarStashController.init(this, sharedState);
104         taskbarEduController.init(this);
105 
106         mAreAllControllersInitialized = true;
107         for (Runnable postInitCallback : mPostInitCallbacks) {
108             postInitCallback.run();
109         }
110         mPostInitCallbacks.clear();
111     }
112 
onConfigurationChanged(@onfig int configChanges)113     public void onConfigurationChanged(@Config int configChanges) {
114         navbarButtonsViewController.onConfigurationChanged(configChanges);
115     }
116 
117     /**
118      * Cleans up all controllers.
119      */
onDestroy()120     public void onDestroy() {
121         navbarButtonsViewController.onDestroy();
122         uiController.onDestroy();
123         rotationButtonController.onDestroy();
124         taskbarDragLayerController.onDestroy();
125         taskbarKeyguardController.onDestroy();
126         taskbarUnfoldAnimationController.onDestroy();
127         taskbarViewController.onDestroy();
128         stashedHandleViewController.onDestroy();
129         taskbarAutohideSuspendController.onDestroy();
130     }
131 
132     /**
133      * If all controllers are already initialized, runs the given callback immediately. Otherwise,
134      * queues it to run after calling init() on all controllers. This should likely be used in any
135      * case where one controller is telling another controller to do something inside init().
136      */
runAfterInit(Runnable callback)137     public void runAfterInit(Runnable callback) {
138         if (mAreAllControllersInitialized) {
139             callback.run();
140         } else {
141             mPostInitCallbacks.add(callback);
142         }
143     }
144 }
145