fixes more error

This commit is contained in:
MrSluffy
2024-11-02 10:45:09 +08:00
parent 2e4a2330d3
commit 76aa855f1e
1419 changed files with 238037 additions and 44 deletions
@@ -0,0 +1,998 @@
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.wm.shell.dagger;
import static com.android.wm.shell.onehanded.OneHandedController.SUPPORT_ONE_HANDED_MODE;
import android.app.ActivityTaskManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Handler;
import android.os.SystemProperties;
import android.view.IWindowManager;
import android.view.accessibility.AccessibilityManager;
import android.window.SystemPerformanceHinter;
import com.android.internal.logging.UiEventLogger;
import com.android.launcher3.icons.IconProvider;
import com.android.window.flags.Flags;
import com.android.wm.shell.ProtoLogController;
import com.android.wm.shell.R;
import com.android.wm.shell.RootDisplayAreaOrganizer;
import com.android.wm.shell.RootTaskDisplayAreaOrganizer;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.WindowManagerShellWrapper;
import com.android.wm.shell.activityembedding.ActivityEmbeddingController;
import com.android.wm.shell.back.BackAnimation;
import com.android.wm.shell.back.BackAnimationBackground;
import com.android.wm.shell.back.BackAnimationController;
import com.android.wm.shell.back.ShellBackAnimationRegistry;
import com.android.wm.shell.bubbles.BubbleController;
import com.android.wm.shell.bubbles.Bubbles;
import com.android.wm.shell.common.DevicePostureController;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayImeController;
import com.android.wm.shell.common.DisplayInsetsController;
import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.DockStateReader;
import com.android.wm.shell.common.FloatingContentCoordinator;
import com.android.wm.shell.common.LaunchAdjacentController;
import com.android.wm.shell.common.MultiInstanceHelper;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.common.SystemWindows;
import com.android.wm.shell.common.TabletopModeController;
import com.android.wm.shell.common.TaskStackListenerImpl;
import com.android.wm.shell.common.TransactionPool;
import com.android.wm.shell.common.pip.PhonePipKeepClearAlgorithm;
import com.android.wm.shell.common.pip.PhoneSizeSpecSource;
import com.android.wm.shell.common.pip.PipBoundsAlgorithm;
import com.android.wm.shell.common.pip.PipBoundsState;
import com.android.wm.shell.common.pip.PipDisplayLayoutState;
import com.android.wm.shell.common.pip.PipMediaController;
import com.android.wm.shell.common.pip.PipPerfHintController;
import com.android.wm.shell.common.pip.PipSnapAlgorithm;
import com.android.wm.shell.common.pip.PipUiEventLogger;
import com.android.wm.shell.common.pip.SizeSpecSource;
import com.android.wm.shell.compatui.CompatUIConfiguration;
import com.android.wm.shell.compatui.CompatUIController;
import com.android.wm.shell.compatui.CompatUIShellCommandHandler;
import com.android.wm.shell.desktopmode.DesktopMode;
import com.android.wm.shell.desktopmode.DesktopModeTaskRepository;
import com.android.wm.shell.desktopmode.DesktopTasksController;
import com.android.wm.shell.displayareahelper.DisplayAreaHelper;
import com.android.wm.shell.displayareahelper.DisplayAreaHelperController;
import com.android.wm.shell.freeform.FreeformComponents;
import com.android.wm.shell.fullscreen.FullscreenTaskListener;
import com.android.wm.shell.hidedisplaycutout.HideDisplayCutoutController;
import com.android.wm.shell.keyguard.KeyguardTransitionHandler;
import com.android.wm.shell.keyguard.KeyguardTransitions;
import com.android.wm.shell.onehanded.OneHanded;
import com.android.wm.shell.onehanded.OneHandedController;
import com.android.wm.shell.performance.PerfHintController;
import com.android.wm.shell.recents.RecentTasks;
import com.android.wm.shell.recents.RecentTasksController;
import com.android.wm.shell.recents.RecentsTransitionHandler;
import com.android.wm.shell.recents.TaskStackTransitionObserver;
import com.android.wm.shell.shared.DesktopModeStatus;
import com.android.wm.shell.shared.ShellTransitions;
import com.android.wm.shell.shared.annotations.ShellAnimationThread;
import com.android.wm.shell.shared.annotations.ShellBackgroundThread;
import com.android.wm.shell.shared.annotations.ShellMainThread;
import com.android.wm.shell.shared.annotations.ShellSplashscreenThread;
import com.android.wm.shell.splitscreen.SplitScreen;
import com.android.wm.shell.splitscreen.SplitScreenController;
import com.android.wm.shell.startingsurface.StartingSurface;
import com.android.wm.shell.startingsurface.StartingWindowController;
import com.android.wm.shell.startingsurface.StartingWindowTypeAlgorithm;
import com.android.wm.shell.startingsurface.phone.PhoneStartingWindowTypeAlgorithm;
import com.android.wm.shell.sysui.ShellCommandHandler;
import com.android.wm.shell.sysui.ShellController;
import com.android.wm.shell.sysui.ShellInit;
import com.android.wm.shell.sysui.ShellInterface;
import com.android.wm.shell.taskview.TaskViewFactory;
import com.android.wm.shell.taskview.TaskViewFactoryController;
import com.android.wm.shell.taskview.TaskViewTransitions;
import com.android.wm.shell.transition.HomeTransitionObserver;
import com.android.wm.shell.transition.MixedTransitionHandler;
import com.android.wm.shell.transition.Transitions;
import com.android.wm.shell.unfold.ShellUnfoldProgressProvider;
import com.android.wm.shell.unfold.UnfoldAnimationController;
import com.android.wm.shell.unfold.UnfoldTransitionHandler;
import com.android.wm.shell.windowdecor.WindowDecorViewModel;
import dagger.BindsOptionalOf;
import dagger.Lazy;
import dagger.Module;
import dagger.Provides;
import java.util.Optional;
/**
* Provides basic dependencies from {@link com.android.wm.shell}, these dependencies are only
* accessible from components within the WM subcomponent (can be explicitly exposed to the
* SysUIComponent, see {@link com.android.systemui.dagger.WMComponent}).
*
* <p>This module only defines *common* dependencies across various SystemUI implementations,
* dependencies that are device/form factor SystemUI implementation specific should go into their
* respective modules (ie. {@link WMShellModule} for handheld, {@link TvWMShellModule} for tv, etc.)
*/
@Module(includes = WMShellConcurrencyModule.class)
public abstract class WMShellBaseModule {
//
// Internal common - Components used internally by multiple shell features
//
@WMSingleton
@Provides
static FloatingContentCoordinator provideFloatingContentCoordinator() {
return new FloatingContentCoordinator();
}
@WMSingleton
@Provides
static DisplayController provideDisplayController(Context context,
IWindowManager wmService,
ShellInit shellInit,
@ShellMainThread ShellExecutor mainExecutor) {
return new DisplayController(context, wmService, shellInit, mainExecutor);
}
@WMSingleton
@Provides
static DisplayInsetsController provideDisplayInsetsController(IWindowManager wmService,
ShellInit shellInit,
DisplayController displayController,
@ShellMainThread ShellExecutor mainExecutor) {
return new DisplayInsetsController(wmService, shellInit, displayController,
mainExecutor);
}
@WMSingleton
@Provides
static DisplayImeController provideDisplayImeController(
IWindowManager wmService,
ShellInit shellInit,
DisplayController displayController,
DisplayInsetsController displayInsetsController,
TransactionPool transactionPool,
@ShellMainThread ShellExecutor mainExecutor
) {
return new DisplayImeController(wmService, shellInit, displayController,
displayInsetsController, transactionPool, mainExecutor);
}
@WMSingleton
@Provides
static DisplayLayout provideDisplayLayout() {
return new DisplayLayout();
}
@WMSingleton
@Provides
static DevicePostureController provideDevicePostureController(
Context context,
ShellInit shellInit,
@ShellMainThread ShellExecutor mainExecutor
) {
return new DevicePostureController(context, shellInit, mainExecutor);
}
@WMSingleton
@Provides
static TabletopModeController provideTabletopModeController(
Context context,
ShellInit shellInit,
DevicePostureController postureController,
DisplayController displayController,
@ShellMainThread ShellExecutor mainExecutor) {
return new TabletopModeController(
context, shellInit, postureController, displayController, mainExecutor);
}
@WMSingleton
@Provides
static ShellTaskOrganizer provideShellTaskOrganizer(
Context context,
ShellInit shellInit,
ShellCommandHandler shellCommandHandler,
Optional<CompatUIController> compatUI,
Optional<UnfoldAnimationController> unfoldAnimationController,
Optional<RecentTasksController> recentTasksOptional,
@ShellMainThread ShellExecutor mainExecutor) {
if (!context.getResources().getBoolean(R.bool.config_registerShellTaskOrganizerOnInit)) {
// TODO(b/238217847): Force override shell init if registration is disabled
shellInit = new ShellInit(mainExecutor);
}
return new ShellTaskOrganizer(
shellInit,
shellCommandHandler,
compatUI.orElse(null),
unfoldAnimationController,
recentTasksOptional,
mainExecutor);
}
@WMSingleton
@Provides
static Optional<CompatUIController> provideCompatUIController(
Context context,
ShellInit shellInit,
ShellController shellController,
DisplayController displayController,
DisplayInsetsController displayInsetsController,
DisplayImeController imeController,
SyncTransactionQueue syncQueue,
@ShellMainThread ShellExecutor mainExecutor,
Lazy<Transitions> transitionsLazy,
Lazy<DockStateReader> dockStateReader,
Lazy<CompatUIConfiguration> compatUIConfiguration,
Lazy<CompatUIShellCommandHandler> compatUIShellCommandHandler,
Lazy<AccessibilityManager> accessibilityManager) {
if (!context.getResources().getBoolean(R.bool.config_enableCompatUIController)) {
return Optional.empty();
}
return Optional.of(
new CompatUIController(
context,
shellInit,
shellController,
displayController,
displayInsetsController,
imeController,
syncQueue,
mainExecutor,
transitionsLazy,
dockStateReader.get(),
compatUIConfiguration.get(),
compatUIShellCommandHandler.get(),
accessibilityManager.get()));
}
@WMSingleton
@Provides
static SyncTransactionQueue provideSyncTransactionQueue(TransactionPool pool,
@ShellMainThread ShellExecutor mainExecutor) {
return new SyncTransactionQueue(pool, mainExecutor);
}
@WMSingleton
@Provides
static SystemWindows provideSystemWindows(DisplayController displayController,
IWindowManager wmService) {
return new SystemWindows(displayController, wmService);
}
@WMSingleton
@Provides
static IconProvider provideIconProvider(Context context) {
return new IconProvider(context);
}
// We currently dedupe multiple messages, so we use the shell main handler directly
@WMSingleton
@Provides
static TaskStackListenerImpl providerTaskStackListenerImpl(
@ShellMainThread Handler mainHandler) {
return new TaskStackListenerImpl(mainHandler);
}
@WMSingleton
@Provides
static TransactionPool provideTransactionPool() {
return new TransactionPool();
}
@WMSingleton
@Provides
static WindowManagerShellWrapper provideWindowManagerShellWrapper(
@ShellMainThread ShellExecutor mainExecutor) {
return new WindowManagerShellWrapper(mainExecutor);
}
@WMSingleton
@Provides
static LaunchAdjacentController provideLaunchAdjacentController(
SyncTransactionQueue syncQueue) {
return new LaunchAdjacentController(syncQueue);
}
@WMSingleton
@Provides
static Optional<SystemPerformanceHinter> provideSystemPerformanceHinter(Context context,
ShellInit shellInit,
ShellCommandHandler shellCommandHandler,
RootTaskDisplayAreaOrganizer rootTdaOrganizer) {
if (!com.android.window.flags.Flags.explicitRefreshRateHints()) {
return Optional.empty();
}
final PerfHintController perfHintController =
new PerfHintController(context, shellInit, shellCommandHandler, rootTdaOrganizer);
return Optional.of(perfHintController.getHinter());
}
@WMSingleton
@Provides
static MultiInstanceHelper provideMultiInstanceHelper(Context context) {
return new MultiInstanceHelper(context, context.getPackageManager(),
Flags.supportsMultiInstanceSystemUi());
}
//
// Back animation
//
@WMSingleton
@Provides
static Optional<BackAnimation> provideBackAnimation(
Optional<BackAnimationController> backAnimationController) {
return backAnimationController.map(BackAnimationController::getBackAnimationImpl);
}
@WMSingleton
@Provides
static BackAnimationBackground provideBackAnimationBackground(
RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer) {
return new BackAnimationBackground(rootTaskDisplayAreaOrganizer);
}
@WMSingleton
@Provides
static Optional<BackAnimationController> provideBackAnimationController(
Context context,
ShellInit shellInit,
ShellController shellController,
@ShellMainThread ShellExecutor shellExecutor,
@ShellBackgroundThread Handler backgroundHandler,
BackAnimationBackground backAnimationBackground,
Optional<ShellBackAnimationRegistry> shellBackAnimationRegistry,
ShellCommandHandler shellCommandHandler) {
if (BackAnimationController.IS_ENABLED) {
return shellBackAnimationRegistry.map(
(animations) ->
new BackAnimationController(
shellInit,
shellController,
shellExecutor,
backgroundHandler,
context,
backAnimationBackground,
animations,
shellCommandHandler));
}
return Optional.empty();
}
@BindsOptionalOf
abstract ShellBackAnimationRegistry optionalBackAnimationRegistry();
//
// PiP (optional feature)
//
@WMSingleton
@Provides
static PipUiEventLogger providePipUiEventLogger(UiEventLogger uiEventLogger,
PackageManager packageManager) {
return new PipUiEventLogger(uiEventLogger, packageManager);
}
@WMSingleton
@Provides
static PipMediaController providePipMediaController(Context context,
@ShellMainThread Handler mainHandler) {
return new PipMediaController(context, mainHandler);
}
@WMSingleton
@Provides
static SizeSpecSource provideSizeSpecSource(Context context,
PipDisplayLayoutState pipDisplayLayoutState) {
return new PhoneSizeSpecSource(context, pipDisplayLayoutState);
}
@WMSingleton
@Provides
static Optional<PipPerfHintController> providePipPerfHintController(
PipDisplayLayoutState pipDisplayLayoutState,
@ShellMainThread ShellExecutor mainExecutor,
Optional<SystemPerformanceHinter> systemPerformanceHinterOptional) {
if (systemPerformanceHinterOptional.isPresent()) {
return Optional.of(new PipPerfHintController(pipDisplayLayoutState, mainExecutor,
systemPerformanceHinterOptional.get()));
} else {
return Optional.empty();
}
}
@WMSingleton
@Provides
static PipBoundsState providePipBoundsState(Context context,
SizeSpecSource sizeSpecSource, PipDisplayLayoutState pipDisplayLayoutState) {
return new PipBoundsState(context, sizeSpecSource, pipDisplayLayoutState);
}
@WMSingleton
@Provides
static PipSnapAlgorithm providePipSnapAlgorithm() {
return new PipSnapAlgorithm();
}
@WMSingleton
@Provides
static PhonePipKeepClearAlgorithm providePhonePipKeepClearAlgorithm(Context context) {
return new PhonePipKeepClearAlgorithm(context);
}
@WMSingleton
@Provides
static PipBoundsAlgorithm providesPipBoundsAlgorithm(Context context,
PipBoundsState pipBoundsState, PipSnapAlgorithm pipSnapAlgorithm,
PhonePipKeepClearAlgorithm pipKeepClearAlgorithm,
PipDisplayLayoutState pipDisplayLayoutState, SizeSpecSource sizeSpecSource) {
return new PipBoundsAlgorithm(context, pipBoundsState, pipSnapAlgorithm,
pipKeepClearAlgorithm, pipDisplayLayoutState, sizeSpecSource);
}
//
// Bubbles (optional feature)
//
@WMSingleton
@Provides
static Optional<Bubbles> provideBubbles(Optional<BubbleController> bubbleController) {
return bubbleController.map((controller) -> controller.asBubbles());
}
@BindsOptionalOf
abstract BubbleController optionalBubblesController();
//
// Fullscreen
//
// Workaround for dynamic overriding with a default implementation, see {@link DynamicOverride}
@BindsOptionalOf
@DynamicOverride
abstract FullscreenTaskListener optionalFullscreenTaskListener();
@WMSingleton
@Provides
static FullscreenTaskListener provideFullscreenTaskListener(
@DynamicOverride Optional<FullscreenTaskListener> fullscreenTaskListener,
ShellInit shellInit,
ShellTaskOrganizer shellTaskOrganizer,
SyncTransactionQueue syncQueue,
Optional<RecentTasksController> recentTasksOptional,
Optional<WindowDecorViewModel> windowDecorViewModelOptional) {
if (fullscreenTaskListener.isPresent()) {
return fullscreenTaskListener.get();
} else {
return new FullscreenTaskListener(shellInit, shellTaskOrganizer, syncQueue,
recentTasksOptional, windowDecorViewModelOptional);
}
}
//
// Window Decoration
//
@BindsOptionalOf
abstract WindowDecorViewModel optionalWindowDecorViewModel();
//
// Unfold transition
//
@BindsOptionalOf
abstract ShellUnfoldProgressProvider optionalShellUnfoldProgressProvider();
// Workaround for dynamic overriding with a default implementation, see {@link DynamicOverride}
@BindsOptionalOf
@DynamicOverride
abstract UnfoldAnimationController optionalUnfoldController();
@WMSingleton
@Provides
static Optional<UnfoldAnimationController> provideUnfoldController(
@DynamicOverride Lazy<Optional<UnfoldAnimationController>>
fullscreenUnfoldController,
Optional<ShellUnfoldProgressProvider> progressProvider) {
if (progressProvider.isPresent()
&& progressProvider.get() != ShellUnfoldProgressProvider.NO_PROVIDER) {
return fullscreenUnfoldController.get();
}
return Optional.empty();
}
@BindsOptionalOf
@DynamicOverride
abstract UnfoldTransitionHandler optionalUnfoldTransitionHandler();
@WMSingleton
@Provides
static Optional<UnfoldTransitionHandler> provideUnfoldTransitionHandler(
Optional<ShellUnfoldProgressProvider> progressProvider,
@DynamicOverride Lazy<Optional<UnfoldTransitionHandler>> handler) {
if (progressProvider.isPresent()
&& progressProvider.get() != ShellUnfoldProgressProvider.NO_PROVIDER) {
return handler.get();
}
return Optional.empty();
}
//
// Freeform (optional feature)
//
// Workaround for dynamic overriding with a default implementation, see {@link DynamicOverride}
@BindsOptionalOf
@DynamicOverride
abstract FreeformComponents optionalFreeformComponents();
@WMSingleton
@Provides
static Optional<FreeformComponents> provideFreeformComponents(
@DynamicOverride Optional<FreeformComponents> freeformComponents,
Context context) {
if (FreeformComponents.isFreeformEnabled(context)) {
return freeformComponents;
}
return Optional.empty();
}
//
// Hide display cutout
//
@WMSingleton
@Provides
static Optional<HideDisplayCutoutController> provideHideDisplayCutoutController(Context context,
ShellInit shellInit,
ShellCommandHandler shellCommandHandler,
ShellController shellController,
DisplayController displayController,
@ShellMainThread ShellExecutor mainExecutor) {
return Optional.ofNullable(
HideDisplayCutoutController.create(context, shellInit, shellCommandHandler,
shellController, displayController, mainExecutor));
}
//
// One handed mode (optional feature)
//
@WMSingleton
@Provides
static Optional<OneHanded> provideOneHanded(Optional<OneHandedController> oneHandedController) {
return oneHandedController.map((controller) -> controller.asOneHanded());
}
// Workaround for dynamic overriding with a default implementation, see {@link DynamicOverride}
@BindsOptionalOf
@DynamicOverride
abstract OneHandedController optionalOneHandedController();
@WMSingleton
@Provides
static Optional<OneHandedController> providesOneHandedController(
@DynamicOverride Optional<OneHandedController> oneHandedController) {
if (SystemProperties.getBoolean(SUPPORT_ONE_HANDED_MODE, false)) {
return oneHandedController;
}
return Optional.empty();
}
//
// Recent tasks
//
@WMSingleton
@Provides
static Optional<RecentTasks> provideRecentTasks(
Optional<RecentTasksController> recentTasksController) {
return recentTasksController.map((controller) -> controller.asRecentTasks());
}
@WMSingleton
@Provides
static Optional<RecentTasksController> provideRecentTasksController(
Context context,
ShellInit shellInit,
ShellController shellController,
ShellCommandHandler shellCommandHandler,
TaskStackListenerImpl taskStackListener,
ActivityTaskManager activityTaskManager,
Optional<DesktopModeTaskRepository> desktopModeTaskRepository,
TaskStackTransitionObserver taskStackTransitionObserver,
@ShellMainThread ShellExecutor mainExecutor
) {
return Optional.ofNullable(
RecentTasksController.create(context, shellInit, shellController,
shellCommandHandler, taskStackListener, activityTaskManager,
desktopModeTaskRepository, taskStackTransitionObserver, mainExecutor));
}
@BindsOptionalOf
abstract RecentsTransitionHandler optionalRecentsTransitionHandler();
//
// Shell transitions
//
@WMSingleton
@Provides
static ShellTransitions provideRemoteTransitions(Transitions transitions) {
return transitions.asRemoteTransitions();
}
@WMSingleton
@Provides
static Transitions provideTransitions(Context context,
ShellInit shellInit,
ShellCommandHandler shellCommandHandler,
ShellController shellController,
ShellTaskOrganizer organizer,
TransactionPool pool,
DisplayController displayController,
@ShellMainThread ShellExecutor mainExecutor,
@ShellMainThread Handler mainHandler,
@ShellAnimationThread ShellExecutor animExecutor,
RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
HomeTransitionObserver homeTransitionObserver) {
if (!context.getResources().getBoolean(R.bool.config_registerShellTransitionsOnInit)) {
// TODO(b/238217847): Force override shell init if registration is disabled
shellInit = new ShellInit(mainExecutor);
}
return new Transitions(context, shellInit, shellCommandHandler, shellController, organizer,
pool, displayController, mainExecutor, mainHandler, animExecutor,
rootTaskDisplayAreaOrganizer, homeTransitionObserver);
}
@WMSingleton
@Provides
static HomeTransitionObserver provideHomeTransitionObserver(Context context,
@ShellMainThread ShellExecutor mainExecutor) {
return new HomeTransitionObserver(context, mainExecutor);
}
@WMSingleton
@Provides
static TaskViewTransitions provideTaskViewTransitions(Transitions transitions) {
return new TaskViewTransitions(transitions);
}
// Workaround for dynamic overriding with a default implementation, see {@link DynamicOverride}
@BindsOptionalOf
@DynamicOverride
abstract MixedTransitionHandler optionalMixedTransitionHandler();
@WMSingleton
@Provides
static Optional<MixedTransitionHandler> provideMixedTransitionHandler(
@DynamicOverride Optional<MixedTransitionHandler> mixedTransitionHandler
) {
if (mixedTransitionHandler.isPresent()) {
return mixedTransitionHandler;
}
return Optional.empty();
}
//
// Keyguard transitions (optional feature)
//
@WMSingleton
@Provides
static KeyguardTransitionHandler provideKeyguardTransitionHandler(
ShellInit shellInit,
ShellController shellController,
Transitions transitions,
TaskStackListenerImpl taskStackListener,
@ShellMainThread Handler mainHandler,
@ShellMainThread ShellExecutor mainExecutor) {
return new KeyguardTransitionHandler(
shellInit, shellController, transitions, taskStackListener, mainHandler,
mainExecutor);
}
@WMSingleton
@Provides
static KeyguardTransitions provideKeyguardTransitions(
KeyguardTransitionHandler handler) {
return handler.asKeyguardTransitions();
}
//
// Display areas
//
@WMSingleton
@Provides
static RootTaskDisplayAreaOrganizer provideRootTaskDisplayAreaOrganizer(
@ShellMainThread ShellExecutor mainExecutor, Context context, ShellInit shellInit) {
return new RootTaskDisplayAreaOrganizer(mainExecutor, context, shellInit);
}
@WMSingleton
@Provides
static RootDisplayAreaOrganizer provideRootDisplayAreaOrganizer(
@ShellMainThread ShellExecutor mainExecutor, ShellInit shellInit) {
return new RootDisplayAreaOrganizer(mainExecutor, shellInit);
}
@WMSingleton
@Provides
static Optional<DisplayAreaHelper> provideDisplayAreaHelper(
@ShellMainThread ShellExecutor mainExecutor,
RootDisplayAreaOrganizer rootDisplayAreaOrganizer) {
return Optional.of(new DisplayAreaHelperController(mainExecutor,
rootDisplayAreaOrganizer));
}
//
// Splitscreen (optional feature)
//
@WMSingleton
@Provides
static Optional<SplitScreen> provideSplitScreen(
Optional<SplitScreenController> splitScreenController) {
return splitScreenController.map((controller) -> controller.asSplitScreen());
}
// Workaround for dynamic overriding with a default implementation, see {@link DynamicOverride}
@BindsOptionalOf
@DynamicOverride
abstract SplitScreenController optionalSplitScreenController();
@WMSingleton
@Provides
static Optional<SplitScreenController> providesSplitScreenController(
@DynamicOverride Optional<SplitScreenController> splitscreenController,
Context context) {
if (ActivityTaskManager.supportsSplitScreenMultiWindow(context)) {
return splitscreenController;
}
return Optional.empty();
}
//
// Starting window
//
@WMSingleton
@Provides
static Optional<StartingSurface> provideStartingSurface(
StartingWindowController startingWindowController) {
return Optional.of(startingWindowController.asStartingSurface());
}
@WMSingleton
@Provides
static StartingWindowController provideStartingWindowController(
Context context,
ShellInit shellInit,
ShellController shellController,
ShellTaskOrganizer shellTaskOrganizer,
@ShellSplashscreenThread ShellExecutor splashScreenExecutor,
StartingWindowTypeAlgorithm startingWindowTypeAlgorithm, IconProvider iconProvider,
TransactionPool pool) {
return new StartingWindowController(context, shellInit, shellController, shellTaskOrganizer,
splashScreenExecutor, startingWindowTypeAlgorithm, iconProvider, pool);
}
// Workaround for dynamic overriding with a default implementation, see {@link DynamicOverride}
@BindsOptionalOf
@DynamicOverride
abstract StartingWindowTypeAlgorithm optionalStartingWindowTypeAlgorithm();
@WMSingleton
@Provides
static StartingWindowTypeAlgorithm provideStartingWindowTypeAlgorithm(
@DynamicOverride Optional<StartingWindowTypeAlgorithm> startingWindowTypeAlgorithm
) {
if (startingWindowTypeAlgorithm.isPresent()) {
return startingWindowTypeAlgorithm.get();
}
// Default to phone starting window type
return new PhoneStartingWindowTypeAlgorithm();
}
//
// Task view factory
//
@WMSingleton
@Provides
static Optional<TaskViewFactory> provideTaskViewFactory(
TaskViewFactoryController taskViewFactoryController) {
return Optional.of(taskViewFactoryController.asTaskViewFactory());
}
@WMSingleton
@Provides
static TaskViewFactoryController provideTaskViewFactoryController(
ShellTaskOrganizer shellTaskOrganizer,
@ShellMainThread ShellExecutor mainExecutor,
SyncTransactionQueue syncQueue,
TaskViewTransitions taskViewTransitions) {
return new TaskViewFactoryController(shellTaskOrganizer, mainExecutor, syncQueue,
taskViewTransitions);
}
//
// ActivityEmbedding
//
@WMSingleton
@Provides
static Optional<ActivityEmbeddingController> provideActivityEmbeddingController(
Context context,
ShellInit shellInit,
Transitions transitions) {
return Optional.ofNullable(
ActivityEmbeddingController.create(context, shellInit, transitions));
}
//
// SysUI -> Shell interface
//
@WMSingleton
@Provides
static ShellInterface provideShellSysuiCallbacks(
@ShellCreateTrigger Object createTrigger,
ShellController shellController) {
return shellController.asShell();
}
@WMSingleton
@Provides
static ShellController provideShellController(Context context,
ShellInit shellInit,
ShellCommandHandler shellCommandHandler,
DisplayInsetsController displayInsetsController,
@ShellMainThread ShellExecutor mainExecutor) {
return new ShellController(context, shellInit, shellCommandHandler,
displayInsetsController, mainExecutor);
}
//
// Desktop mode (optional feature)
//
@WMSingleton
@Provides
static Optional<DesktopMode> provideDesktopMode(
Optional<DesktopTasksController> desktopTasksController) {
return desktopTasksController.map(DesktopTasksController::asDesktopMode);
}
@BindsOptionalOf
@DynamicOverride
abstract DesktopTasksController optionalDesktopTasksController();
@WMSingleton
@Provides
static Optional<DesktopTasksController> providesDesktopTasksController(Context context,
@DynamicOverride Optional<Lazy<DesktopTasksController>> desktopTasksController) {
// Use optional-of-lazy for the dependency that this provider relies on.
// Lazy ensures that this provider will not be the cause the dependency is created
// when it will not be returned due to the condition below.
return desktopTasksController.flatMap((lazy)-> {
if (DesktopModeStatus.canEnterDesktopMode(context)) {
return Optional.of(lazy.get());
}
return Optional.empty();
});
}
@BindsOptionalOf
@DynamicOverride
abstract DesktopModeTaskRepository optionalDesktopModeTaskRepository();
@WMSingleton
@Provides
static Optional<DesktopModeTaskRepository> provideDesktopTaskRepository(Context context,
@DynamicOverride Optional<Lazy<DesktopModeTaskRepository>> desktopModeTaskRepository) {
// Use optional-of-lazy for the dependency that this provider relies on.
// Lazy ensures that this provider will not be the cause the dependency is created
// when it will not be returned due to the condition below.
return desktopModeTaskRepository.flatMap((lazy)-> {
if (DesktopModeStatus.canEnterDesktopMode(context)) {
return Optional.of(lazy.get());
}
return Optional.empty();
});
}
//
// Task Stack
//
@WMSingleton
@Provides
static TaskStackTransitionObserver provideTaskStackTransitionObserver(
Lazy<Transitions> transitions,
ShellInit shellInit
) {
return new TaskStackTransitionObserver(transitions, shellInit);
}
//
// Misc
//
// Workaround for dynamic overriding with a default implementation, see {@link DynamicOverride}
@BindsOptionalOf
@ShellCreateTriggerOverride
abstract Object provideIndependentShellComponentsToCreateOverride();
// TODO: Temporarily move dependencies to this instead of ShellInit since that is needed to add
// the callback. We will be moving to a different explicit startup mechanism in a follow- up CL.
@WMSingleton
@ShellCreateTrigger
@Provides
static Object provideIndependentShellComponentsToCreate(
DisplayController displayController,
DisplayImeController displayImeController,
DisplayInsetsController displayInsetsController,
ShellTaskOrganizer shellTaskOrganizer,
Optional<BubbleController> bubblesOptional,
Optional<SplitScreenController> splitScreenOptional,
FullscreenTaskListener fullscreenTaskListener,
Optional<UnfoldAnimationController> unfoldAnimationController,
Optional<UnfoldTransitionHandler> unfoldTransitionHandler,
Optional<FreeformComponents> freeformComponents,
Optional<RecentTasksController> recentTasksOptional,
Optional<RecentsTransitionHandler> recentsTransitionHandlerOptional,
Optional<OneHandedController> oneHandedControllerOptional,
Optional<HideDisplayCutoutController> hideDisplayCutoutControllerOptional,
Optional<ActivityEmbeddingController> activityEmbeddingOptional,
Optional<MixedTransitionHandler> mixedTransitionHandler,
Transitions transitions,
StartingWindowController startingWindow,
ProtoLogController protoLogController,
@ShellCreateTriggerOverride Optional<Object> overriddenCreateTrigger) {
return new Object();
}
@WMSingleton
@Provides
static ShellInit provideShellInit(@ShellMainThread ShellExecutor mainExecutor) {
return new ShellInit(mainExecutor);
}
@WMSingleton
@Provides
static ShellCommandHandler provideShellCommandHandler() {
return new ShellCommandHandler();
}
@WMSingleton
@Provides
static ProtoLogController provideProtoLogController(
ShellInit shellInit,
ShellCommandHandler shellCommandHandler) {
return new ProtoLogController(shellInit, shellCommandHandler);
}
}