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