1 /* 2 * Copyright (C) 2019 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.wm.shell; 18 19 import static com.android.wm.shell.ShellTaskOrganizer.TASK_LISTENER_TYPE_FULLSCREEN; 20 21 import com.android.wm.shell.apppairs.AppPairsController; 22 import com.android.wm.shell.bubbles.BubbleController; 23 import com.android.wm.shell.common.DisplayImeController; 24 import com.android.wm.shell.common.ShellExecutor; 25 import com.android.wm.shell.common.annotations.ExternalThread; 26 import com.android.wm.shell.draganddrop.DragAndDropController; 27 import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; 28 import com.android.wm.shell.pip.phone.PipTouchHandler; 29 import com.android.wm.shell.splitscreen.SplitScreenController; 30 import com.android.wm.shell.startingsurface.StartingWindowController; 31 import com.android.wm.shell.transition.Transitions; 32 33 import java.util.Optional; 34 35 /** 36 * The entry point implementation into the shell for initializing shell internal state. 37 */ 38 public class ShellInitImpl { 39 private static final String TAG = ShellInitImpl.class.getSimpleName(); 40 41 private final DisplayImeController mDisplayImeController; 42 private final DragAndDropController mDragAndDropController; 43 private final ShellTaskOrganizer mShellTaskOrganizer; 44 private final Optional<BubbleController> mBubblesOptional; 45 private final Optional<LegacySplitScreenController> mLegacySplitScreenOptional; 46 private final Optional<SplitScreenController> mSplitScreenOptional; 47 private final Optional<AppPairsController> mAppPairsOptional; 48 private final Optional<PipTouchHandler> mPipTouchHandlerOptional; 49 private final FullscreenTaskListener mFullscreenTaskListener; 50 private final ShellExecutor mMainExecutor; 51 private final Transitions mTransitions; 52 private final StartingWindowController mStartingWindow; 53 54 private final InitImpl mImpl = new InitImpl(); 55 ShellInitImpl(DisplayImeController displayImeController, DragAndDropController dragAndDropController, ShellTaskOrganizer shellTaskOrganizer, Optional<BubbleController> bubblesOptional, Optional<LegacySplitScreenController> legacySplitScreenOptional, Optional<SplitScreenController> splitScreenOptional, Optional<AppPairsController> appPairsOptional, Optional<PipTouchHandler> pipTouchHandlerOptional, FullscreenTaskListener fullscreenTaskListener, Transitions transitions, StartingWindowController startingWindow, ShellExecutor mainExecutor)56 public ShellInitImpl(DisplayImeController displayImeController, 57 DragAndDropController dragAndDropController, 58 ShellTaskOrganizer shellTaskOrganizer, 59 Optional<BubbleController> bubblesOptional, 60 Optional<LegacySplitScreenController> legacySplitScreenOptional, 61 Optional<SplitScreenController> splitScreenOptional, 62 Optional<AppPairsController> appPairsOptional, 63 Optional<PipTouchHandler> pipTouchHandlerOptional, 64 FullscreenTaskListener fullscreenTaskListener, 65 Transitions transitions, 66 StartingWindowController startingWindow, 67 ShellExecutor mainExecutor) { 68 mDisplayImeController = displayImeController; 69 mDragAndDropController = dragAndDropController; 70 mShellTaskOrganizer = shellTaskOrganizer; 71 mBubblesOptional = bubblesOptional; 72 mLegacySplitScreenOptional = legacySplitScreenOptional; 73 mSplitScreenOptional = splitScreenOptional; 74 mAppPairsOptional = appPairsOptional; 75 mFullscreenTaskListener = fullscreenTaskListener; 76 mPipTouchHandlerOptional = pipTouchHandlerOptional; 77 mTransitions = transitions; 78 mMainExecutor = mainExecutor; 79 mStartingWindow = startingWindow; 80 } 81 asShellInit()82 public ShellInit asShellInit() { 83 return mImpl; 84 } 85 init()86 private void init() { 87 // Start listening for display changes 88 mDisplayImeController.startMonitorDisplays(); 89 90 // Setup the shell organizer 91 mShellTaskOrganizer.addListenerForType( 92 mFullscreenTaskListener, TASK_LISTENER_TYPE_FULLSCREEN); 93 mShellTaskOrganizer.initStartingWindow(mStartingWindow); 94 mShellTaskOrganizer.registerOrganizer(); 95 96 mAppPairsOptional.ifPresent(AppPairsController::onOrganizerRegistered); 97 mSplitScreenOptional.ifPresent(SplitScreenController::onOrganizerRegistered); 98 mBubblesOptional.ifPresent(BubbleController::initialize); 99 100 // Bind the splitscreen impl to the drag drop controller 101 mDragAndDropController.initialize(mSplitScreenOptional); 102 103 if (Transitions.ENABLE_SHELL_TRANSITIONS) { 104 mTransitions.register(mShellTaskOrganizer); 105 } 106 107 // TODO(b/181599115): This should really be the pip controller, but until we can provide the 108 // controller instead of the feature interface, can just initialize the touch handler if 109 // needed 110 mPipTouchHandlerOptional.ifPresent((handler) -> handler.init()); 111 } 112 113 @ExternalThread 114 private class InitImpl implements ShellInit { 115 @Override init()116 public void init() { 117 try { 118 mMainExecutor.executeBlocking(() -> ShellInitImpl.this.init()); 119 } catch (InterruptedException e) { 120 throw new RuntimeException("Failed to initialize the Shell in 2s", e); 121 } 122 } 123 } 124 } 125