• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2020 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 
17 package com.android.systemui.wmshell;
18 
19 import static com.android.systemui.car.Flags.scalableUi;
20 import static com.android.wm.shell.Flags.enableAutoTaskStackController;
21 
22 import android.content.Context;
23 import android.os.Handler;
24 import android.view.IWindowManager;
25 
26 import androidx.annotation.NonNull;
27 
28 import com.android.systemui.R;
29 import com.android.systemui.car.CarServiceProvider;
30 import com.android.systemui.car.wm.AutoDisplayCompatWindowDecorViewModel;
31 import com.android.systemui.car.wm.CarFullscreenTaskMonitorListener;
32 import com.android.systemui.car.wm.scalableui.PanelAutoTaskStackTransitionHandlerDelegate;
33 import com.android.systemui.car.wm.scalableui.PanelConfigReader;
34 import com.android.systemui.car.wm.scalableui.ScalableUIWMInitializer;
35 import com.android.systemui.car.wm.scalableui.panel.DecorPanel;
36 import com.android.systemui.car.wm.scalableui.panel.TaskPanel;
37 import com.android.systemui.dagger.qualifiers.Main;
38 import com.android.systemui.wm.DisplaySystemBarsController;
39 import com.android.wm.shell.ShellTaskOrganizer;
40 import com.android.wm.shell.automotive.AutoShellModule;
41 import com.android.wm.shell.automotive.AutoTaskRepository;
42 import com.android.wm.shell.common.DisplayController;
43 import com.android.wm.shell.common.DisplayInsetsController;
44 import com.android.wm.shell.common.ShellExecutor;
45 import com.android.wm.shell.common.SyncTransactionQueue;
46 import com.android.wm.shell.dagger.DynamicOverride;
47 import com.android.wm.shell.dagger.WMShellBaseModule;
48 import com.android.wm.shell.dagger.WMSingleton;
49 import com.android.wm.shell.fullscreen.FullscreenTaskListener;
50 import com.android.wm.shell.pip.Pip;
51 import com.android.wm.shell.recents.RecentTasksController;
52 import com.android.wm.shell.shared.annotations.ShellBackgroundThread;
53 import com.android.wm.shell.shared.annotations.ShellMainThread;
54 import com.android.wm.shell.sysui.ShellInit;
55 import com.android.wm.shell.taskview.TaskViewTransitions;
56 import com.android.wm.shell.transition.FocusTransitionObserver;
57 import com.android.wm.shell.windowdecor.WindowDecorViewModel;
58 import com.android.wm.shell.windowdecor.common.viewhost.DefaultWindowDecorViewHostSupplier;
59 import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHost;
60 import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHostSupplier;
61 
62 import dagger.BindsOptionalOf;
63 import dagger.Lazy;
64 import dagger.Module;
65 import dagger.Provides;
66 
67 import kotlinx.coroutines.CoroutineScope;
68 
69 import java.util.Optional;
70 
71 /** Provides dependencies from {@link com.android.wm.shell} for CarSystemUI. */
72 @Module(includes = {WMShellBaseModule.class, AutoShellModule.class})
73 public abstract class CarWMShellModule {
74 
75     @WMSingleton
76     @Provides
provideDisplaySystemBarsController(Context context, IWindowManager wmService, DisplayController displayController, DisplayInsetsController displayInsetsController, @Main Handler mainHandler)77     static DisplaySystemBarsController provideDisplaySystemBarsController(Context context,
78             IWindowManager wmService, DisplayController displayController,
79             DisplayInsetsController displayInsetsController,
80             @Main Handler mainHandler) {
81         return new DisplaySystemBarsController(context, wmService, displayController,
82                 displayInsetsController, mainHandler);
83     }
84 
85     @BindsOptionalOf
optionalPip()86     abstract Pip optionalPip();
87 
88     @WMSingleton
89     @Provides
90     @DynamicOverride
provideFullScreenTaskListener(Context context, CarServiceProvider carServiceProvider, ShellInit shellInit, ShellTaskOrganizer shellTaskOrganizer, SyncTransactionQueue syncQueue, Optional<RecentTasksController> recentTasksOptional, Optional<WindowDecorViewModel> windowDecorViewModelOptional, TaskViewTransitions taskViewTransitions, AutoTaskRepository taskRepository)91     static FullscreenTaskListener provideFullScreenTaskListener(Context context,
92             CarServiceProvider carServiceProvider,
93             ShellInit shellInit,
94             ShellTaskOrganizer shellTaskOrganizer,
95             SyncTransactionQueue syncQueue,
96             Optional<RecentTasksController> recentTasksOptional,
97             Optional<WindowDecorViewModel> windowDecorViewModelOptional,
98             TaskViewTransitions taskViewTransitions,
99             AutoTaskRepository taskRepository) {
100         return new CarFullscreenTaskMonitorListener(context,
101                 carServiceProvider,
102                 shellInit,
103                 shellTaskOrganizer,
104                 syncQueue,
105                 recentTasksOptional,
106                 windowDecorViewModelOptional,
107                 taskViewTransitions,
108                 taskRepository);
109     }
110 
111     @WMSingleton
112     @Provides
provideWindowDecorViewHostSupplier( @hellMainThread @onNull CoroutineScope mainScope)113     static WindowDecorViewHostSupplier<WindowDecorViewHost> provideWindowDecorViewHostSupplier(
114             @ShellMainThread @NonNull CoroutineScope mainScope) {
115         return new DefaultWindowDecorViewHostSupplier(mainScope);
116     }
117 
118     @WMSingleton
119     @Provides
provideWindowDecorViewModel( Context context, @ShellMainThread ShellExecutor mainExecutor, @ShellBackgroundThread ShellExecutor bgExecutor, ShellInit shellInit, ShellTaskOrganizer taskOrganizer, DisplayController displayController, DisplayInsetsController displayInsetsController, SyncTransactionQueue syncQueue, FocusTransitionObserver focusTransitionObserver, WindowDecorViewHostSupplier<WindowDecorViewHost> windowDecorViewHostSupplier, CarServiceProvider carServiceProvider )120     static WindowDecorViewModel provideWindowDecorViewModel(
121             Context context,
122             @ShellMainThread ShellExecutor mainExecutor,
123             @ShellBackgroundThread ShellExecutor bgExecutor,
124             ShellInit shellInit,
125             ShellTaskOrganizer taskOrganizer,
126             DisplayController displayController,
127             DisplayInsetsController displayInsetsController,
128             SyncTransactionQueue syncQueue,
129             FocusTransitionObserver focusTransitionObserver,
130             WindowDecorViewHostSupplier<WindowDecorViewHost> windowDecorViewHostSupplier,
131             CarServiceProvider carServiceProvider
132     ) {
133         return new AutoDisplayCompatWindowDecorViewModel(
134                 context,
135                 mainExecutor,
136                 bgExecutor,
137                 shellInit,
138                 taskOrganizer,
139                 displayController,
140                 displayInsetsController,
141                 syncQueue,
142                 focusTransitionObserver,
143                 windowDecorViewHostSupplier,
144                 carServiceProvider);
145     }
146 
147     @WMSingleton
148     @Provides
providesPanelConfigReader( Context context, TaskPanel.Factory taskPanelFactory, DecorPanel.Factory decorPanelFactory )149     static Optional<PanelConfigReader> providesPanelConfigReader(
150             Context context,
151             TaskPanel.Factory taskPanelFactory,
152             DecorPanel.Factory decorPanelFactory
153     ) {
154         if (isScalableUIEnabled(context)) {
155             return Optional.of(new PanelConfigReader(
156                     context,
157                     taskPanelFactory,
158                     decorPanelFactory));
159         }
160         return Optional.empty();
161     }
162 
163     @WMSingleton
164     @Provides
provideScalableUIInitializer(ShellInit shellInit, Context context, Optional<PanelConfigReader> panelConfigReaderOptional, Lazy<PanelAutoTaskStackTransitionHandlerDelegate> delegate)165     static Optional<ScalableUIWMInitializer> provideScalableUIInitializer(ShellInit shellInit,
166             Context context,
167             Optional<PanelConfigReader> panelConfigReaderOptional,
168             Lazy<PanelAutoTaskStackTransitionHandlerDelegate> delegate) {
169         if (isScalableUIEnabled(context) && panelConfigReaderOptional.isPresent()) {
170             return Optional.of(
171                     new ScalableUIWMInitializer(shellInit, panelConfigReaderOptional.get(),
172                             delegate.get()));
173         }
174         return Optional.empty();
175     }
176 
isScalableUIEnabled(Context context)177     private static boolean isScalableUIEnabled(Context context) {
178         return scalableUi() && enableAutoTaskStackController()
179                 && context.getResources().getBoolean(R.bool.config_enableScalableUI);
180     }
181 }
182