• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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