blob: 83bd9114c48f613ade0d6bcfcffa363bb5be0c78 [file] [log] [blame]
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001/*
2 * Copyright (C) 2016 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
17package com.android.server.wm;
18
Wale Ogunwale0d5609b2017-09-13 05:55:07 -070019import android.annotation.CallSuper;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070020import android.content.res.Configuration;
21import android.graphics.Rect;
Ruchi Kandoi0d434042016-10-03 09:12:02 -070022import android.hardware.power.V1_0.PowerHint;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070023import android.os.Binder;
24import android.os.Debug;
Jorim Jaggi86c39f92017-05-02 18:02:46 +020025import android.os.Handler;
Wale Ogunwale02319a62016-09-26 15:21:22 -070026import android.os.IBinder;
Jorim Jaggi86c39f92017-05-02 18:02:46 +020027import android.os.Looper;
28import android.os.Message;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070029import android.os.ParcelFileDescriptor;
30import android.os.PowerManager;
31import android.os.RemoteException;
32import android.os.SystemClock;
33import android.os.UserHandle;
34import android.provider.Settings;
David Stevensf833ba92017-03-16 19:00:20 -070035import android.util.ArraySet;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070036import android.util.EventLog;
37import android.util.Slog;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070038import android.util.SparseIntArray;
Steven Timotiusaf03df62017-07-18 16:56:43 -070039import android.util.proto.ProtoOutputStream;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070040import android.view.Display;
41import android.view.DisplayInfo;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070042import android.view.WindowManager;
Jorim Jaggi86c39f92017-05-02 18:02:46 +020043
Wale Ogunwalee05f5012016-09-16 16:27:29 -070044import com.android.internal.util.ArrayUtils;
45import com.android.server.EventLogTags;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070046
47import java.io.FileDescriptor;
48import java.io.PrintWriter;
49import java.util.ArrayList;
Bryce Leeaea60d22018-01-31 14:42:15 -080050import java.util.List;
Wale Ogunwale1e129a42016-11-21 13:03:47 -080051import java.util.function.Consumer;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070052
Wale Ogunwalef7cab102016-10-25 15:25:14 -070053import static android.app.AppOpsManager.MODE_ALLOWED;
54import static android.app.AppOpsManager.MODE_DEFAULT;
55import static android.app.AppOpsManager.OP_NONE;
Wale Ogunwale02319a62016-09-26 15:21:22 -070056import static android.view.Display.DEFAULT_DISPLAY;
Andrii Kulian48146fd2017-08-07 11:22:50 -070057import static android.view.Display.INVALID_DISPLAY;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070058import static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070059import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070060import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE;
61import static android.view.WindowManager.LayoutParams.TYPE_DREAM;
62import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG;
Jorim Jaggi879ff722016-11-04 18:08:17 -070063
Adrian Roose99bc052017-11-20 17:55:31 +010064import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
65import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
66import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070067import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DISPLAY;
68import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_KEEP_SCREEN_ON;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070069import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT_REPEATS;
70import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION;
71import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_POWER;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070072import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY;
73import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT;
74import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_TRACE;
75import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS;
76import static com.android.server.wm.WindowManagerDebugConfig.SHOW_SURFACE_ALLOC;
77import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS;
78import static com.android.server.wm.WindowManagerDebugConfig.TAG_KEEP_SCREEN_ON;
79import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
80import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070081import static com.android.server.wm.WindowManagerService.H.REPORT_LOSING_FOCUS;
82import static com.android.server.wm.WindowManagerService.H.SEND_NEW_CONFIGURATION;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070083import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_PLACING_SURFACES;
84import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES;
85import static com.android.server.wm.WindowManagerService.WINDOWS_FREEZING_SCREENS_NONE;
86import static com.android.server.wm.WindowManagerService.H.WINDOW_FREEZE_TIMEOUT;
87import static com.android.server.wm.WindowManagerService.logSurface;
88import static com.android.server.wm.WindowSurfacePlacer.SET_FORCE_HIDING_CHANGED;
89import static com.android.server.wm.WindowSurfacePlacer.SET_ORIENTATION_CHANGE_COMPLETE;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070090import static com.android.server.wm.WindowSurfacePlacer.SET_UPDATE_ROTATION;
91import static com.android.server.wm.WindowSurfacePlacer.SET_WALLPAPER_ACTION_PENDING;
92import static com.android.server.wm.WindowSurfacePlacer.SET_WALLPAPER_MAY_CHANGE;
Wale Ogunwale0d5609b2017-09-13 05:55:07 -070093import static com.android.server.wm.proto.RootWindowContainerProto.DISPLAYS;
94import static com.android.server.wm.proto.RootWindowContainerProto.WINDOWS;
95import static com.android.server.wm.proto.RootWindowContainerProto.WINDOW_CONTAINER;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070096
97/** Root {@link WindowContainer} for the device. */
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -070098class RootWindowContainer extends WindowContainer<DisplayContent> {
Wale Ogunwalee05f5012016-09-16 16:27:29 -070099 private static final String TAG = TAG_WITH_CLASS_NAME ? "RootWindowContainer" : TAG_WM;
100
Jorim Jaggi86c39f92017-05-02 18:02:46 +0200101 private static final int SET_SCREEN_BRIGHTNESS_OVERRIDE = 1;
102 private static final int SET_USER_ACTIVITY_TIMEOUT = 2;
103
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700104 private boolean mWallpaperForceHidingChanged = false;
105 private Object mLastWindowFreezeSource = null;
106 private Session mHoldScreen = null;
107 private float mScreenBrightness = -1;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700108 private long mUserActivityTimeout = -1;
109 private boolean mUpdateRotation = false;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700110 // Following variables are for debugging screen wakelock only.
111 // Last window that requires screen wakelock
112 WindowState mHoldScreenWindow = null;
113 // Last window that obscures all windows below
Wale Ogunwaled4a00a02016-10-10 11:29:17 -0700114 WindowState mObscuringWindow = null;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700115 // Only set while traversing the default display based on its content.
116 // Affects the behavior of mirroring on secondary displays.
117 private boolean mObscureApplicationContentOnSecondaryDisplays = false;
118
119 private boolean mSustainedPerformanceModeEnabled = false;
120 private boolean mSustainedPerformanceModeCurrent = false;
121
122 boolean mWallpaperMayChange = false;
Robert Carr11c26c22016-09-23 12:40:27 -0700123 // During an orientation change, we track whether all windows have rendered
124 // at the new orientation, and this will be false from changing orientation until that occurs.
125 // For seamless rotation cases this always stays true, as the windows complete their orientation
126 // changes 1 by 1 without disturbing global state.
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700127 boolean mOrientationChangeComplete = true;
128 boolean mWallpaperActionPending = false;
129
Bryce Leeaea60d22018-01-31 14:42:15 -0800130 private final ArrayList<TaskStack> mTmpStackList = new ArrayList();
131 private final ArrayList<Integer> mTmpStackIds = new ArrayList<>();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700132
133 // State for the RemoteSurfaceTrace system used in testing. If this is enabled SurfaceControl
134 // instances will be replaced with an instance that writes a binary representation of all
135 // commands to mSurfaceTraceFd.
136 boolean mSurfaceTraceEnabled;
137 ParcelFileDescriptor mSurfaceTraceFd;
138 RemoteEventTrace mRemoteEventTrace;
139
Wale Ogunwale0303c572016-10-20 10:16:29 -0700140 final WallpaperController mWallpaperController;
Wale Ogunwalec69694a2016-10-18 13:51:15 -0700141
Jorim Jaggi86c39f92017-05-02 18:02:46 +0200142 private final Handler mHandler;
143
Wale Ogunwale1e129a42016-11-21 13:03:47 -0800144 private String mCloseSystemDialogsReason;
145 private final Consumer<WindowState> mCloseSystemDialogsConsumer = w -> {
146 if (w.mHasSurface) {
147 try {
148 w.mClient.closeSystemDialogs(mCloseSystemDialogsReason);
149 } catch (RemoteException e) {
150 }
151 }
152 };
153
154 private static final Consumer<WindowState> sRemoveReplacedWindowsConsumer = w -> {
155 final AppWindowToken aToken = w.mAppToken;
156 if (aToken != null) {
157 aToken.removeReplacedWindowIfNeeded(w);
158 }
159 };
160
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700161 RootWindowContainer(WindowManagerService service) {
Jorim Jaggiffe128d2017-11-30 13:54:36 +0100162 super(service);
Jorim Jaggi86c39f92017-05-02 18:02:46 +0200163 mHandler = new MyHandler(service.mH.getLooper());
Wale Ogunwale0303c572016-10-20 10:16:29 -0700164 mWallpaperController = new WallpaperController(mService);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700165 }
166
167 WindowState computeFocusedWindow() {
David Stevens46939562017-03-24 13:04:00 -0700168 for (int i = mChildren.size() - 1; i >= 0; i--) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700169 final DisplayContent dc = mChildren.get(i);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700170 final WindowState win = dc.findFocusedWindow();
171 if (win != null) {
172 return win;
173 }
174 }
175 return null;
176 }
177
178 /**
Andrii Kulian7fc22812016-12-28 13:04:11 -0800179 * Get an array with display ids ordered by focus priority - last items should be given
180 * focus first. Sparse array just maps position to displayId.
181 */
182 void getDisplaysInFocusOrder(SparseIntArray displaysInFocusOrder) {
183 displaysInFocusOrder.clear();
184
185 final int size = mChildren.size();
186 for (int i = 0; i < size; ++i) {
Andrii Kulian0214ed92017-05-16 13:44:05 -0700187 final DisplayContent displayContent = mChildren.get(i);
188 if (displayContent.isRemovalDeferred()) {
189 // Don't report displays that are going to be removed soon.
190 continue;
191 }
192 displaysInFocusOrder.put(i, displayContent.getDisplayId());
Andrii Kulian7fc22812016-12-28 13:04:11 -0800193 }
194 }
195
Wale Ogunwale02319a62016-09-26 15:21:22 -0700196 DisplayContent getDisplayContent(int displayId) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700197 for (int i = mChildren.size() - 1; i >= 0; --i) {
198 final DisplayContent current = mChildren.get(i);
199 if (current.getDisplayId() == displayId) {
200 return current;
201 }
202 }
203 return null;
204 }
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700205
Bryce Leef19cbe22018-02-02 15:09:21 -0800206 DisplayContent createDisplayContent(final Display display, DisplayWindowController controller) {
207 final DisplayContent dc =
208 new DisplayContent(display, mService, mWallpaperController, controller);
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700209 final int displayId = display.getDisplayId();
210
211 if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Adding display=" + display);
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700212
213 final DisplayInfo displayInfo = dc.getDisplayInfo();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700214 final Rect rect = new Rect();
215 mService.mDisplaySettings.getOverscanLocked(displayInfo.name, displayInfo.uniqueId, rect);
216 displayInfo.overscanLeft = rect.left;
217 displayInfo.overscanTop = rect.top;
218 displayInfo.overscanRight = rect.right;
219 displayInfo.overscanBottom = rect.bottom;
220 if (mService.mDisplayManagerInternal != null) {
221 mService.mDisplayManagerInternal.setDisplayInfoOverrideFromWindowManager(
222 displayId, displayInfo);
Wale Ogunwale828ff7e2017-11-14 01:01:29 +0000223 dc.configureDisplayPolicy();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700224
Tarandeep Singhe1cfcf42017-07-10 18:50:00 -0700225 // Tap Listeners are supported for:
226 // 1. All physical displays (multi-display).
Tarandeep Singh7ac8d3a2017-09-05 11:09:39 -0700227 // 2. VirtualDisplays on VR, AA (and everything else).
228 if (mService.canDispatchPointerEvents()) {
Tarandeep Singhe1cfcf42017-07-10 18:50:00 -0700229 if (DEBUG_DISPLAY) {
230 Slog.d(TAG,
231 "Registering PointerEventListener for DisplayId: " + displayId);
232 }
233 dc.mTapDetector = new TaskTapPointerEventListener(mService, dc);
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700234 mService.registerPointerEventListener(dc.mTapDetector);
Tarandeep Singhe1cfcf42017-07-10 18:50:00 -0700235 if (displayId == DEFAULT_DISPLAY) {
236 mService.registerPointerEventListener(mService.mMousePositionTracker);
237 }
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700238 }
239 }
240
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700241 return dc;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700242 }
243
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -0700244 boolean isLayoutNeeded() {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700245 final int numDisplays = mChildren.size();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700246 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700247 final DisplayContent displayContent = mChildren.get(displayNdx);
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -0700248 if (displayContent.isLayoutNeeded()) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700249 return true;
250 }
251 }
252 return false;
253 }
254
Wale Ogunwale6213caa2016-12-02 16:47:15 +0000255 void getWindowsByName(ArrayList<WindowState> output, String name) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700256 int objectId = 0;
257 // See if this is an object ID.
258 try {
259 objectId = Integer.parseInt(name, 16);
260 name = null;
261 } catch (RuntimeException e) {
262 }
Wale Ogunwaled1880962016-11-08 10:31:59 -0800263
264 getWindowsByName(output, name, objectId);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700265 }
266
Wale Ogunwale6213caa2016-12-02 16:47:15 +0000267 private void getWindowsByName(ArrayList<WindowState> output, String name, int objectId) {
Wale Ogunwaled1880962016-11-08 10:31:59 -0800268 forAllWindows((w) -> {
269 if (name != null) {
270 if (w.mAttrs.getTitle().toString().contains(name)) {
271 output.add(w);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700272 }
Wale Ogunwaled1880962016-11-08 10:31:59 -0800273 } else if (System.identityHashCode(w) == objectId) {
274 output.add(w);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700275 }
Wale Ogunwaled1880962016-11-08 10:31:59 -0800276 }, true /* traverseTopToBottom */);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700277 }
278
Wale Ogunwale02319a62016-09-26 15:21:22 -0700279 /**
280 * Returns the app window token for the input binder if it exist in the system.
281 * NOTE: Only one AppWindowToken is allowed to exist in the system for a binder token, since
282 * AppWindowToken represents an activity which can only exist on one display.
283 */
284 AppWindowToken getAppWindowToken(IBinder binder) {
285 for (int i = mChildren.size() - 1; i >= 0; --i) {
286 final DisplayContent dc = mChildren.get(i);
287 final AppWindowToken atoken = dc.getAppWindowToken(binder);
288 if (atoken != null) {
289 return atoken;
290 }
291 }
292 return null;
293 }
294
295 /** Returns the display object the input window token is currently mapped on. */
296 DisplayContent getWindowTokenDisplay(WindowToken token) {
297 if (token == null) {
298 return null;
299 }
300
301 for (int i = mChildren.size() - 1; i >= 0; --i) {
302 final DisplayContent dc = mChildren.get(i);
303 final WindowToken current = dc.getWindowToken(token.token);
304 if (current == token) {
305 return dc;
306 }
307 }
308
309 return null;
310 }
311
Andrii Kulian5406e7a2016-10-21 11:55:23 -0700312 /**
313 * Set new display override config and return array of ids of stacks that were changed during
Bryce Leeaea60d22018-01-31 14:42:15 -0800314 * update. If called for the default display, global configuration will also be updated. Stacks
315 * that are marked for deferred removal are excluded from the returned array.
Andrii Kulian5406e7a2016-10-21 11:55:23 -0700316 */
317 int[] setDisplayOverrideConfigurationIfNeeded(Configuration newConfiguration, int displayId) {
318 final DisplayContent displayContent = getDisplayContent(displayId);
319 if (displayContent == null) {
320 throw new IllegalArgumentException("Display not found for id: " + displayId);
321 }
322
323 final Configuration currentConfig = displayContent.getOverrideConfiguration();
324 final boolean configChanged = currentConfig.diff(newConfiguration) != 0;
325 if (!configChanged) {
326 return null;
327 }
Bryce Leeaea60d22018-01-31 14:42:15 -0800328
Andrii Kuliand68501e2017-01-10 22:57:27 -0800329 displayContent.onOverrideConfigurationChanged(newConfiguration);
Andrii Kulian5406e7a2016-10-21 11:55:23 -0700330
Bryce Leeaea60d22018-01-31 14:42:15 -0800331 mTmpStackList.clear();
Andrii Kulian5406e7a2016-10-21 11:55:23 -0700332 if (displayId == DEFAULT_DISPLAY) {
333 // Override configuration of the default display duplicates global config. In this case
334 // we also want to update the global config.
Bryce Leeaea60d22018-01-31 14:42:15 -0800335 setGlobalConfigurationIfNeeded(newConfiguration, mTmpStackList);
Andrii Kulian5406e7a2016-10-21 11:55:23 -0700336 } else {
Bryce Leeaea60d22018-01-31 14:42:15 -0800337 updateStackBoundsAfterConfigChange(displayId, mTmpStackList);
Andrii Kulian5406e7a2016-10-21 11:55:23 -0700338 }
Bryce Leeaea60d22018-01-31 14:42:15 -0800339
340 mTmpStackIds.clear();
341 final int stackCount = mTmpStackList.size();
342
343 for (int i = 0; i < stackCount; ++i) {
344 final TaskStack stack = mTmpStackList.get(i);
345
346 // We only include stacks that are not marked for removal as they do not exist outside
347 // of WindowManager at this point.
348 if (!stack.mDeferRemoval) {
349 mTmpStackIds.add(stack.mStackId);
350 }
351 }
352
353 return mTmpStackIds.isEmpty() ? null : ArrayUtils.convertToIntArray(mTmpStackIds);
Andrii Kulian5406e7a2016-10-21 11:55:23 -0700354 }
355
Bryce Leeaea60d22018-01-31 14:42:15 -0800356 private void setGlobalConfigurationIfNeeded(Configuration newConfiguration,
357 List<TaskStack> changedStacks) {
Andrii Kulian441e4492016-09-29 15:25:00 -0700358 final boolean configChanged = getConfiguration().diff(newConfiguration) != 0;
359 if (!configChanged) {
Bryce Leeaea60d22018-01-31 14:42:15 -0800360 return;
Andrii Kulian441e4492016-09-29 15:25:00 -0700361 }
362 onConfigurationChanged(newConfiguration);
Bryce Leeaea60d22018-01-31 14:42:15 -0800363 updateStackBoundsAfterConfigChange(changedStacks);
Andrii Kulian441e4492016-09-29 15:25:00 -0700364 }
365
366 @Override
Wale Ogunwale98d62312017-07-12 09:24:56 -0700367 public void onConfigurationChanged(Configuration newParentConfig) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700368 prepareFreezingTaskBounds();
Andrii Kulian441e4492016-09-29 15:25:00 -0700369 super.onConfigurationChanged(newParentConfig);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700370
371 mService.mPolicy.onConfigurationChanged();
Andrii Kulian441e4492016-09-29 15:25:00 -0700372 }
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700373
Andrii Kulian441e4492016-09-29 15:25:00 -0700374 /**
375 * Callback used to trigger bounds update after configuration change and get ids of stacks whose
376 * bounds were updated.
377 */
Bryce Leeaea60d22018-01-31 14:42:15 -0800378 private void updateStackBoundsAfterConfigChange(List<TaskStack> changedStacks) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700379 final int numDisplays = mChildren.size();
380 for (int i = 0; i < numDisplays; ++i) {
381 final DisplayContent dc = mChildren.get(i);
Bryce Leeaea60d22018-01-31 14:42:15 -0800382 dc.updateStackBoundsAfterConfigChange(changedStacks);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700383 }
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700384 }
385
Andrii Kulian5406e7a2016-10-21 11:55:23 -0700386 /** Same as {@link #updateStackBoundsAfterConfigChange()} but only for a specific display. */
Bryce Leeaea60d22018-01-31 14:42:15 -0800387 private void updateStackBoundsAfterConfigChange(int displayId, List<TaskStack> changedStacks) {
Andrii Kulian5406e7a2016-10-21 11:55:23 -0700388 final DisplayContent dc = getDisplayContent(displayId);
Bryce Leeaea60d22018-01-31 14:42:15 -0800389 dc.updateStackBoundsAfterConfigChange(changedStacks);
Andrii Kulian5406e7a2016-10-21 11:55:23 -0700390 }
391
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700392 private void prepareFreezingTaskBounds() {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700393 for (int i = mChildren.size() - 1; i >= 0; i--) {
394 mChildren.get(i).prepareFreezingTaskBounds();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700395 }
396 }
397
Wale Ogunwale68278562017-09-23 17:13:55 -0700398 TaskStack getStack(int windowingMode, int activityType) {
399 for (int i = mChildren.size() - 1; i >= 0; i--) {
400 final DisplayContent dc = mChildren.get(i);
401 final TaskStack stack = dc.getStack(windowingMode, activityType);
402 if (stack != null) {
403 return stack;
404 }
405 }
406 return null;
407 }
408
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700409 void setSecureSurfaceState(int userId, boolean disabled) {
Wale Ogunwaled1880962016-11-08 10:31:59 -0800410 forAllWindows((w) -> {
411 if (w.mHasSurface && userId == UserHandle.getUserId(w.mOwnerUid)) {
412 w.mWinAnimator.setSecureLocked(disabled);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700413 }
Wale Ogunwaled1880962016-11-08 10:31:59 -0800414 }, true /* traverseTopToBottom */);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700415 }
416
417 void updateAppOpsState() {
Wale Ogunwaled1880962016-11-08 10:31:59 -0800418 forAllWindows((w) -> {
419 if (w.mAppOp == OP_NONE) {
420 return;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700421 }
Peter Visontay96449f62017-12-11 18:50:03 +0000422 final int mode = mService.mAppOps.noteOpNoThrow(w.mAppOp, w.getOwningUid(),
Wale Ogunwaled1880962016-11-08 10:31:59 -0800423 w.getOwningPackage());
424 w.setAppOpVisibilityLw(mode == MODE_ALLOWED || mode == MODE_DEFAULT);
425 }, false /* traverseTopToBottom */);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700426 }
427
428 boolean canShowStrictModeViolation(int pid) {
Wale Ogunwaled1880962016-11-08 10:31:59 -0800429 final WindowState win = getWindow((w) -> w.mSession.mPid == pid && w.isVisibleLw());
430 return win != null;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700431 }
432
433 void closeSystemDialogs(String reason) {
Wale Ogunwale1e129a42016-11-21 13:03:47 -0800434 mCloseSystemDialogsReason = reason;
435 forAllWindows(mCloseSystemDialogsConsumer, false /* traverseTopToBottom */);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700436 }
437
438 void removeReplacedWindows() {
439 if (SHOW_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION removeReplacedWindows");
440 mService.openSurfaceTransaction();
441 try {
Wale Ogunwale1e129a42016-11-21 13:03:47 -0800442 forAllWindows(sRemoveReplacedWindowsConsumer, true /* traverseTopToBottom */);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700443 } finally {
Adrian Roos111aff92017-09-27 18:11:46 +0200444 mService.closeSurfaceTransaction("removeReplacedWindows");
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700445 if (SHOW_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION removeReplacedWindows");
446 }
447 }
448
449 boolean hasPendingLayoutChanges(WindowAnimator animator) {
450 boolean hasChanges = false;
451
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700452 final int count = mChildren.size();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700453 for (int i = 0; i < count; ++i) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700454 final DisplayContent dc = mChildren.get(i);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700455 final int pendingChanges = animator.getPendingLayoutChanges(dc.getDisplayId());
456 if ((pendingChanges & FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
457 animator.mBulkUpdateParams |= SET_WALLPAPER_ACTION_PENDING;
458 }
459 if (pendingChanges != 0) {
460 hasChanges = true;
461 }
462 }
463
464 return hasChanges;
465 }
466
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700467 boolean reclaimSomeSurfaceMemory(WindowStateAnimator winAnimator, String operation,
468 boolean secure) {
469 final WindowSurfaceController surfaceController = winAnimator.mSurfaceController;
470 boolean leakedSurface = false;
471 boolean killedApps = false;
472
473 EventLog.writeEvent(EventLogTags.WM_NO_SURFACE_MEMORY, winAnimator.mWin.toString(),
474 winAnimator.mSession.mPid, operation);
475
476 final long callingIdentity = Binder.clearCallingIdentity();
477 try {
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700478 // There was some problem...first, do a sanity check of the window list to make sure
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700479 // we haven't left any dangling surfaces around.
480
481 Slog.i(TAG_WM, "Out of memory for surface! Looking for leaks...");
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700482 final int numDisplays = mChildren.size();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700483 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700484 leakedSurface |= mChildren.get(displayNdx).destroyLeakedSurfaces();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700485 }
486
487 if (!leakedSurface) {
488 Slog.w(TAG_WM, "No leaked surfaces; killing applications!");
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700489 final SparseIntArray pidCandidates = new SparseIntArray();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700490 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
Wale Ogunwaled1880962016-11-08 10:31:59 -0800491 mChildren.get(displayNdx).forAllWindows((w) -> {
492 if (mService.mForceRemoves.contains(w)) {
493 return;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700494 }
Wale Ogunwaled1880962016-11-08 10:31:59 -0800495 final WindowStateAnimator wsa = w.mWinAnimator;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700496 if (wsa.mSurfaceController != null) {
497 pidCandidates.append(wsa.mSession.mPid, wsa.mSession.mPid);
498 }
Wale Ogunwaled1880962016-11-08 10:31:59 -0800499 }, false /* traverseTopToBottom */);
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700500
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700501 if (pidCandidates.size() > 0) {
502 int[] pids = new int[pidCandidates.size()];
503 for (int i = 0; i < pids.length; i++) {
504 pids[i] = pidCandidates.keyAt(i);
505 }
506 try {
507 if (mService.mActivityManager.killPids(pids, "Free memory", secure)) {
508 killedApps = true;
509 }
510 } catch (RemoteException e) {
511 }
512 }
513 }
514 }
515
516 if (leakedSurface || killedApps) {
517 // We managed to reclaim some memory, so get rid of the trouble surface and ask the
518 // app to request another one.
519 Slog.w(TAG_WM,
520 "Looks like we have reclaimed some memory, clearing surface for retry.");
521 if (surfaceController != null) {
522 if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) logSurface(winAnimator.mWin,
523 "RECOVER DESTROY", false);
524 winAnimator.destroySurface();
Jorim Jaggiba41f4b2016-12-14 17:43:07 -0800525 if (winAnimator.mWin.mAppToken != null
526 && winAnimator.mWin.mAppToken.getController() != null) {
527 winAnimator.mWin.mAppToken.getController().removeStartingWindow();
528 }
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700529 }
530
531 try {
532 winAnimator.mWin.mClient.dispatchGetNewSurface();
533 } catch (RemoteException e) {
534 }
535 }
536 } finally {
537 Binder.restoreCallingIdentity(callingIdentity);
538 }
539
540 return leakedSurface || killedApps;
541 }
542
543 // "Something has changed! Let's make it correct now."
544 // TODO: Super crazy long method that should be broken down...
545 void performSurfacePlacement(boolean recoveringMemory) {
546 if (DEBUG_WINDOW_TRACE) Slog.v(TAG, "performSurfacePlacementInner: entry. Called by "
547 + Debug.getCallers(3));
548
549 int i;
550 boolean updateInputWindowsNeeded = false;
551
552 if (mService.mFocusMayChange) {
553 mService.mFocusMayChange = false;
554 updateInputWindowsNeeded = mService.updateFocusedWindowLocked(
555 UPDATE_FOCUS_WILL_PLACE_SURFACES, false /*updateInputWindows*/);
556 }
557
558 // Initialize state of exiting tokens.
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700559 final int numDisplays = mChildren.size();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700560 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700561 final DisplayContent displayContent = mChildren.get(displayNdx);
Wale Ogunwale1666e312016-12-16 11:27:18 -0800562 displayContent.setExitingTokensHasVisible(false);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700563 }
564
565 mHoldScreen = null;
566 mScreenBrightness = -1;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700567 mUserActivityTimeout = -1;
568 mObscureApplicationContentOnSecondaryDisplays = false;
569 mSustainedPerformanceModeCurrent = false;
570 mService.mTransactionSequence++;
571
572 // TODO(multi-display):
573 final DisplayContent defaultDisplay = mService.getDefaultDisplayContentLocked();
574 final DisplayInfo defaultInfo = defaultDisplay.getDisplayInfo();
575 final int defaultDw = defaultInfo.logicalWidth;
576 final int defaultDh = defaultInfo.logicalHeight;
577
578 if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
579 ">>> OPEN TRANSACTION performLayoutAndPlaceSurfaces");
580 mService.openSurfaceTransaction();
581 try {
Wale Ogunwale9d9d8f12016-09-28 15:29:59 -0700582 applySurfaceChangesTransaction(recoveringMemory, defaultDw, defaultDh);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700583 } catch (RuntimeException e) {
584 Slog.wtf(TAG, "Unhandled exception in Window Manager", e);
585 } finally {
Adrian Roos111aff92017-09-27 18:11:46 +0200586 mService.closeSurfaceTransaction("performLayoutAndPlaceSurfaces");
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700587 if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
588 "<<< CLOSE TRANSACTION performLayoutAndPlaceSurfaces");
589 }
590
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700591 final WindowSurfacePlacer surfacePlacer = mService.mWindowPlacerLocked;
592
593 // If we are ready to perform an app transition, check through all of the app tokens to be
594 // shown and see if they are ready to go.
595 if (mService.mAppTransition.isReady()) {
596 defaultDisplay.pendingLayoutChanges |=
Wale Ogunwale0303c572016-10-20 10:16:29 -0700597 surfacePlacer.handleAppTransitionReadyLocked();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700598 if (DEBUG_LAYOUT_REPEATS)
599 surfacePlacer.debugLayoutRepeats("after handleAppTransitionReadyLocked",
600 defaultDisplay.pendingLayoutChanges);
601 }
602
Jorim Jaggif5f9e122017-10-24 18:21:09 +0200603 if (!isAppAnimating() && mService.mAppTransition.isRunning()) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700604 // We have finished the animation of an app transition. To do this, we have delayed a
605 // lot of operations like showing and hiding apps, moving apps in Z-order, etc. The app
606 // token list reflects the correct Z-order, but the window list may now be out of sync
607 // with it. So here we will just rebuild the entire app window list. Fun!
608 defaultDisplay.pendingLayoutChanges |=
609 mService.handleAnimatingStoppedAndTransitionLocked();
610 if (DEBUG_LAYOUT_REPEATS)
611 surfacePlacer.debugLayoutRepeats("after handleAnimStopAndXitionLock",
612 defaultDisplay.pendingLayoutChanges);
613 }
614
Winson Chunge2d72172018-01-25 17:46:20 +0000615 // Defer starting the recents animation until the wallpaper has drawn
616 final RecentsAnimationController recentsAnimationController =
617 mService.getRecentsAnimationController();
618 if (recentsAnimationController != null) {
619 recentsAnimationController.checkAnimationReady(mWallpaperController);
620 }
621
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700622 if (mWallpaperForceHidingChanged && defaultDisplay.pendingLayoutChanges == 0
623 && !mService.mAppTransition.isReady()) {
624 // At this point, there was a window with a wallpaper that was force hiding other
625 // windows behind it, but now it is going away. This may be simple -- just animate away
626 // the wallpaper and its window -- or it may be hard -- the wallpaper now needs to be
627 // shown behind something that was hidden.
628 defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_LAYOUT;
629 if (DEBUG_LAYOUT_REPEATS) surfacePlacer.debugLayoutRepeats(
630 "after animateAwayWallpaperLocked", defaultDisplay.pendingLayoutChanges);
631 }
632 mWallpaperForceHidingChanged = false;
633
634 if (mWallpaperMayChange) {
635 if (DEBUG_WALLPAPER_LIGHT) Slog.v(TAG, "Wallpaper may change! Adjusting");
636 defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
637 if (DEBUG_LAYOUT_REPEATS) surfacePlacer.debugLayoutRepeats("WallpaperMayChange",
638 defaultDisplay.pendingLayoutChanges);
639 }
640
641 if (mService.mFocusMayChange) {
642 mService.mFocusMayChange = false;
643 if (mService.updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES,
644 false /*updateInputWindows*/)) {
645 updateInputWindowsNeeded = true;
646 defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_ANIM;
647 }
648 }
649
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -0700650 if (isLayoutNeeded()) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700651 defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_LAYOUT;
652 if (DEBUG_LAYOUT_REPEATS) surfacePlacer.debugLayoutRepeats("mLayoutNeeded",
653 defaultDisplay.pendingLayoutChanges);
654 }
655
David Stevensf833ba92017-03-16 19:00:20 -0700656 final ArraySet<DisplayContent> touchExcludeRegionUpdateDisplays = handleResizingWindows();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700657
658 if (DEBUG_ORIENTATION && mService.mDisplayFrozen) Slog.v(TAG,
659 "With display frozen, orientationChangeComplete=" + mOrientationChangeComplete);
660 if (mOrientationChangeComplete) {
661 if (mService.mWindowsFreezingScreen != WINDOWS_FREEZING_SCREENS_NONE) {
662 mService.mWindowsFreezingScreen = WINDOWS_FREEZING_SCREENS_NONE;
663 mService.mLastFinishedFreezeSource = mLastWindowFreezeSource;
664 mService.mH.removeMessages(WINDOW_FREEZE_TIMEOUT);
665 }
666 mService.stopFreezingDisplayLocked();
667 }
668
669 // Destroy the surface of any windows that are no longer visible.
670 boolean wallpaperDestroyed = false;
671 i = mService.mDestroySurface.size();
672 if (i > 0) {
673 do {
674 i--;
675 WindowState win = mService.mDestroySurface.get(i);
676 win.mDestroying = false;
677 if (mService.mInputMethodWindow == win) {
Wale Ogunwale6213caa2016-12-02 16:47:15 +0000678 mService.setInputMethodWindowLocked(null);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700679 }
Wale Ogunwale0303c572016-10-20 10:16:29 -0700680 if (win.getDisplayContent().mWallpaperController.isWallpaperTarget(win)) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700681 wallpaperDestroyed = true;
682 }
Jorim Jaggie7d2b852017-08-28 17:55:15 +0200683 win.destroySurfaceUnchecked();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700684 } while (i > 0);
685 mService.mDestroySurface.clear();
686 }
687
688 // Time to remove any exiting tokens?
689 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700690 final DisplayContent displayContent = mChildren.get(displayNdx);
Wale Ogunwale1666e312016-12-16 11:27:18 -0800691 displayContent.removeExistingTokensIfPossible();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700692 }
693
694 if (wallpaperDestroyed) {
695 defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -0700696 defaultDisplay.setLayoutNeeded();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700697 }
698
699 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700700 final DisplayContent displayContent = mChildren.get(displayNdx);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700701 if (displayContent.pendingLayoutChanges != 0) {
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -0700702 displayContent.setLayoutNeeded();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700703 }
704 }
705
706 // Finally update all input windows now that the window changes have stabilized.
707 mService.mInputMonitor.updateInputWindowsLw(true /*force*/);
708
709 mService.setHoldScreenLocked(mHoldScreen);
710 if (!mService.mDisplayFrozen) {
Jorim Jaggi86c39f92017-05-02 18:02:46 +0200711 final int brightness = mScreenBrightness < 0 || mScreenBrightness > 1.0f
712 ? -1 : toBrightnessOverride(mScreenBrightness);
713
714 // Post these on a handler such that we don't call into power manager service while
715 // holding the window manager lock to avoid lock contention with power manager lock.
716 mHandler.obtainMessage(SET_SCREEN_BRIGHTNESS_OVERRIDE, brightness, 0).sendToTarget();
717 mHandler.obtainMessage(SET_USER_ACTIVITY_TIMEOUT, mUserActivityTimeout).sendToTarget();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700718 }
719
720 if (mSustainedPerformanceModeCurrent != mSustainedPerformanceModeEnabled) {
721 mSustainedPerformanceModeEnabled = mSustainedPerformanceModeCurrent;
722 mService.mPowerManagerInternal.powerHint(
Ruchi Kandoi0d434042016-10-03 09:12:02 -0700723 PowerHint.SUSTAINED_PERFORMANCE,
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700724 (mSustainedPerformanceModeEnabled ? 1 : 0));
725 }
726
727 if (mService.mTurnOnScreen) {
728 if (mService.mAllowTheaterModeWakeFromLayout
729 || Settings.Global.getInt(mService.mContext.getContentResolver(),
730 Settings.Global.THEATER_MODE_ON, 0) == 0) {
731 if (DEBUG_VISIBILITY || DEBUG_POWER) {
732 Slog.v(TAG, "Turning screen on after layout!");
733 }
734 mService.mPowerManager.wakeUp(SystemClock.uptimeMillis(),
735 "android.server.wm:TURN_ON");
736 }
737 mService.mTurnOnScreen = false;
738 }
739
740 if (mUpdateRotation) {
741 if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation");
Andrii Kulian48146fd2017-08-07 11:22:50 -0700742 // TODO(multi-display): Update rotation for different displays separately.
743 final int displayId = defaultDisplay.getDisplayId();
744 if (defaultDisplay.updateRotationUnchecked(false /* inTransaction */)) {
745 mService.mH.obtainMessage(SEND_NEW_CONFIGURATION, displayId).sendToTarget();
746 } else {
747 mUpdateRotation = false;
748 }
749 // Update rotation of VR virtual display separately. Currently this is the only kind of
750 // secondary display that can be rotated because of the single-display limitations in
751 // PhoneWindowManager.
752 final DisplayContent vrDisplay = mService.mVr2dDisplayId != INVALID_DISPLAY
753 ? getDisplayContent(mService.mVr2dDisplayId) : null;
754 if (vrDisplay != null && vrDisplay.updateRotationUnchecked(false /* inTransaction */)) {
755 mService.mH.obtainMessage(SEND_NEW_CONFIGURATION, mService.mVr2dDisplayId)
756 .sendToTarget();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700757 }
758 }
759
760 if (mService.mWaitingForDrawnCallback != null ||
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -0700761 (mOrientationChangeComplete && !defaultDisplay.isLayoutNeeded()
762 && !mUpdateRotation)) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700763 mService.checkDrawnWindowsLocked();
764 }
765
766 final int N = mService.mPendingRemove.size();
767 if (N > 0) {
768 if (mService.mPendingRemoveTmp.length < N) {
769 mService.mPendingRemoveTmp = new WindowState[N+10];
770 }
771 mService.mPendingRemove.toArray(mService.mPendingRemoveTmp);
772 mService.mPendingRemove.clear();
Wale Ogunwale19e452e2016-10-12 12:36:29 -0700773 ArrayList<DisplayContent> displayList = new ArrayList();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700774 for (i = 0; i < N; i++) {
775 final WindowState w = mService.mPendingRemoveTmp[i];
776 w.removeImmediately();
777 final DisplayContent displayContent = w.getDisplayContent();
778 if (displayContent != null && !displayList.contains(displayContent)) {
779 displayList.add(displayContent);
780 }
781 }
782
Wale Ogunwalec69694a2016-10-18 13:51:15 -0700783 for (int j = displayList.size() - 1; j >= 0; --j) {
784 final DisplayContent dc = displayList.get(j);
785 dc.assignWindowLayers(true /*setLayoutNeeded*/);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700786 }
787 }
788
789 // Remove all deferred displays stacks, tasks, and activities.
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700790 for (int displayNdx = mChildren.size() - 1; displayNdx >= 0; --displayNdx) {
791 mChildren.get(displayNdx).checkCompleteDeferredRemoval();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700792 }
793
794 if (updateInputWindowsNeeded) {
795 mService.mInputMonitor.updateInputWindowsLw(false /*force*/);
796 }
David Stevensee9e2772017-02-09 16:30:27 -0800797 mService.setFocusTaskRegionLocked(null);
David Stevensf833ba92017-03-16 19:00:20 -0700798 if (touchExcludeRegionUpdateDisplays != null) {
799 final DisplayContent focusedDc = mService.mFocusedApp != null
800 ? mService.mFocusedApp.getDisplayContent() : null;
801 for (DisplayContent dc : touchExcludeRegionUpdateDisplays) {
802 // The focused DisplayContent was recalcuated in setFocusTaskRegionLocked
803 if (focusedDc != dc) {
804 dc.setTouchExcludeRegion(null /* focusedTask */);
805 }
806 }
807 }
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700808
809 // Check to see if we are now in a state where the screen should
810 // be enabled, because the window obscured flags have changed.
811 mService.enableScreenIfNeededLocked();
812
813 mService.scheduleAnimationLocked();
814 mService.mWindowPlacerLocked.destroyPendingSurfaces();
815
816 if (DEBUG_WINDOW_TRACE) Slog.e(TAG,
817 "performSurfacePlacementInner exit: animating=" + mService.mAnimator.isAnimating());
818 }
819
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700820 private void applySurfaceChangesTransaction(boolean recoveringMemory, int defaultDw,
821 int defaultDh) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700822 mHoldScreenWindow = null;
Wale Ogunwaled4a00a02016-10-10 11:29:17 -0700823 mObscuringWindow = null;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700824
Andrii Kulian8ee72852017-03-10 10:36:45 -0800825 // TODO(multi-display): Support these features on secondary screens.
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700826 if (mService.mWatermark != null) {
827 mService.mWatermark.positionSurface(defaultDw, defaultDh);
828 }
829 if (mService.mStrictModeFlash != null) {
830 mService.mStrictModeFlash.positionSurface(defaultDw, defaultDh);
831 }
832 if (mService.mCircularDisplayMask != null) {
Andrii Kulian8ee72852017-03-10 10:36:45 -0800833 mService.mCircularDisplayMask.positionSurface(defaultDw, defaultDh,
834 mService.getDefaultDisplayRotation());
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700835 }
836 if (mService.mEmulatorDisplayOverlay != null) {
837 mService.mEmulatorDisplayOverlay.positionSurface(defaultDw, defaultDh,
Andrii Kulian8ee72852017-03-10 10:36:45 -0800838 mService.getDefaultDisplayRotation());
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700839 }
840
841 boolean focusDisplayed = false;
842
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700843 final int count = mChildren.size();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700844 for (int j = 0; j < count; ++j) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700845 final DisplayContent dc = mChildren.get(j);
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700846 focusDisplayed |= dc.applySurfaceChangesTransaction(recoveringMemory);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700847 }
848
849 if (focusDisplayed) {
850 mService.mH.sendEmptyMessage(REPORT_LOSING_FOCUS);
851 }
852
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700853 // Give the display manager a chance to adjust properties like display rotation if it needs
854 // to.
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700855 mService.mDisplayManagerInternal.performTraversalInTransactionFromWindowManager();
856 }
857
858 /**
David Stevensf833ba92017-03-16 19:00:20 -0700859 * Handles resizing windows during surface placement.
860 *
861 * @return A set of any DisplayContent whose touch exclude region needs to be recalculated due
862 * to a tap-exclude window resizing, or null if no such DisplayContents were found.
863 */
864 private ArraySet<DisplayContent> handleResizingWindows() {
865 ArraySet<DisplayContent> touchExcludeRegionUpdateSet = null;
866 for (int i = mService.mResizingWindows.size() - 1; i >= 0; i--) {
867 WindowState win = mService.mResizingWindows.get(i);
868 if (win.mAppFreezing) {
869 // Don't remove this window until rotation has completed.
870 continue;
871 }
872 win.reportResized();
873 mService.mResizingWindows.remove(i);
874 if (WindowManagerService.excludeWindowTypeFromTapOutTask(win.mAttrs.type)) {
875 final DisplayContent dc = win.getDisplayContent();
876 if (touchExcludeRegionUpdateSet == null) {
877 touchExcludeRegionUpdateSet = new ArraySet<>();
878 }
879 touchExcludeRegionUpdateSet.add(dc);
880 }
881 }
882 return touchExcludeRegionUpdateSet;
883 }
884
885 /**
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700886 * @param w WindowState this method is applied to.
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700887 * @param obscured True if there is a window on top of this obscuring the display.
888 * @param syswin System window?
889 * @return True when the display contains content to show the user. When false, the display
890 * manager may choose to mirror or blank the display.
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700891 */
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700892 boolean handleNotObscuredLocked(WindowState w, boolean obscured, boolean syswin) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700893 final WindowManager.LayoutParams attrs = w.mAttrs;
894 final int attrFlags = attrs.flags;
Aaron Whyte8cbdf042018-01-23 12:06:02 -0800895 final boolean onScreen = w.isOnScreen();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700896 final boolean canBeSeen = w.isDisplayedLw();
897 final int privateflags = attrs.privateFlags;
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700898 boolean displayHasContent = false;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700899
Aaron Whyte8cbdf042018-01-23 12:06:02 -0800900 if (DEBUG_KEEP_SCREEN_ON) {
901 Slog.d(TAG_KEEP_SCREEN_ON, "handleNotObscuredLocked w: " + w
902 + ", w.mHasSurface: " + w.mHasSurface
903 + ", w.isOnScreen(): " + onScreen
904 + ", w.isDisplayedLw(): " + w.isDisplayedLw()
905 + ", w.mAttrs.userActivityTimeout: " + w.mAttrs.userActivityTimeout);
906 }
907 if (w.mHasSurface && onScreen) {
908 if (!syswin && w.mAttrs.userActivityTimeout >= 0 && mUserActivityTimeout < 0) {
909 mUserActivityTimeout = w.mAttrs.userActivityTimeout;
910 if (DEBUG_KEEP_SCREEN_ON) {
911 Slog.d(TAG, "mUserActivityTimeout set to " + mUserActivityTimeout);
912 }
913 }
914 }
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700915 if (w.mHasSurface && canBeSeen) {
916 if ((attrFlags & FLAG_KEEP_SCREEN_ON) != 0) {
917 mHoldScreen = w.mSession;
918 mHoldScreenWindow = w;
919 } else if (DEBUG_KEEP_SCREEN_ON && w == mService.mLastWakeLockHoldingWindow) {
920 Slog.d(TAG_KEEP_SCREEN_ON, "handleNotObscuredLocked: " + w + " was holding "
Wale Ogunwale743fcc12017-06-06 21:36:50 +0000921 + "screen wakelock but no longer has FLAG_KEEP_SCREEN_ON!!! called by"
922 + Debug.getCallers(10));
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700923 }
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700924 if (!syswin && w.mAttrs.screenBrightness >= 0 && mScreenBrightness < 0) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700925 mScreenBrightness = w.mAttrs.screenBrightness;
926 }
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700927
928 final int type = attrs.type;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700929 // This function assumes that the contents of the default display are processed first
930 // before secondary displays.
931 final DisplayContent displayContent = w.getDisplayContent();
932 if (displayContent != null && displayContent.isDefaultDisplay) {
933 // While a dream or keyguard is showing, obscure ordinary application content on
934 // secondary displays (by forcibly enabling mirroring unless there is other content
935 // we want to show) but still allow opaque keyguard dialogs to be shown.
936 if (type == TYPE_DREAM || (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) {
937 mObscureApplicationContentOnSecondaryDisplays = true;
938 }
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700939 displayHasContent = true;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700940 } else if (displayContent != null &&
941 (!mObscureApplicationContentOnSecondaryDisplays
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700942 || (obscured && type == TYPE_KEYGUARD_DIALOG))) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700943 // Allow full screen keyguard presentation dialogs to be seen.
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700944 displayHasContent = true;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700945 }
946 if ((privateflags & PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE) != 0) {
947 mSustainedPerformanceModeCurrent = true;
948 }
949 }
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700950
951 return displayHasContent;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700952 }
953
954 boolean copyAnimToLayoutParams() {
955 boolean doRequest = false;
956
957 final int bulkUpdateParams = mService.mAnimator.mBulkUpdateParams;
958 if ((bulkUpdateParams & SET_UPDATE_ROTATION) != 0) {
959 mUpdateRotation = true;
960 doRequest = true;
961 }
962 if ((bulkUpdateParams & SET_WALLPAPER_MAY_CHANGE) != 0) {
963 mWallpaperMayChange = true;
964 doRequest = true;
965 }
966 if ((bulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0) {
967 mWallpaperForceHidingChanged = true;
968 doRequest = true;
969 }
970 if ((bulkUpdateParams & SET_ORIENTATION_CHANGE_COMPLETE) == 0) {
971 mOrientationChangeComplete = false;
972 } else {
973 mOrientationChangeComplete = true;
974 mLastWindowFreezeSource = mService.mAnimator.mLastWindowFreezeSource;
975 if (mService.mWindowsFreezingScreen != WINDOWS_FREEZING_SCREENS_NONE) {
976 doRequest = true;
977 }
978 }
chaviw042059d2018-01-11 11:24:08 -0800979
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700980 if ((bulkUpdateParams & SET_WALLPAPER_ACTION_PENDING) != 0) {
981 mWallpaperActionPending = true;
982 }
983
984 return doRequest;
985 }
986
987 private static int toBrightnessOverride(float value) {
988 return (int)(value * PowerManager.BRIGHTNESS_ON);
989 }
990
Jorim Jaggi86c39f92017-05-02 18:02:46 +0200991 private final class MyHandler extends Handler {
992
993 public MyHandler(Looper looper) {
994 super(looper);
995 }
996
997 @Override
998 public void handleMessage(Message msg) {
999 switch (msg.what) {
1000 case SET_SCREEN_BRIGHTNESS_OVERRIDE:
1001 mService.mPowerManagerInternal.setScreenBrightnessOverrideFromWindowManager(
1002 msg.arg1);
1003 break;
1004 case SET_USER_ACTIVITY_TIMEOUT:
1005 mService.mPowerManagerInternal.setUserActivityTimeoutOverrideFromWindowManager(
1006 (Long) msg.obj);
1007 break;
1008 default:
1009 break;
1010 }
1011 }
1012 }
1013
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001014 void enableSurfaceTrace(ParcelFileDescriptor pfd) {
1015 final FileDescriptor fd = pfd.getFileDescriptor();
1016 if (mSurfaceTraceEnabled) {
1017 disableSurfaceTrace();
1018 }
1019 mSurfaceTraceEnabled = true;
1020 mRemoteEventTrace = new RemoteEventTrace(mService, fd);
1021 mSurfaceTraceFd = pfd;
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -07001022 for (int displayNdx = mChildren.size() - 1; displayNdx >= 0; --displayNdx) {
1023 final DisplayContent dc = mChildren.get(displayNdx);
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001024 dc.enableSurfaceTrace(fd);
1025 }
1026 }
1027
1028 void disableSurfaceTrace() {
1029 mSurfaceTraceEnabled = false;
1030 mRemoteEventTrace = null;
1031 mSurfaceTraceFd = null;
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -07001032 for (int displayNdx = mChildren.size() - 1; displayNdx >= 0; --displayNdx) {
1033 final DisplayContent dc = mChildren.get(displayNdx);
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001034 dc.disableSurfaceTrace();
1035 }
1036 }
1037
1038 void dumpDisplayContents(PrintWriter pw) {
1039 pw.println("WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)");
1040 if (mService.mDisplayReady) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -07001041 final int count = mChildren.size();
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001042 for (int i = 0; i < count; ++i) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -07001043 final DisplayContent displayContent = mChildren.get(i);
Jorim Jaggif5f9e122017-10-24 18:21:09 +02001044 displayContent.dump(pw, " ", true /* dumpAll */);
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001045 }
1046 } else {
1047 pw.println(" NO DISPLAY");
1048 }
1049 }
1050
1051 void dumpLayoutNeededDisplayIds(PrintWriter pw) {
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -07001052 if (!isLayoutNeeded()) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001053 return;
1054 }
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -07001055 pw.print(" mLayoutNeeded on displays=");
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -07001056 final int count = mChildren.size();
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001057 for (int displayNdx = 0; displayNdx < count; ++displayNdx) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -07001058 final DisplayContent displayContent = mChildren.get(displayNdx);
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -07001059 if (displayContent.isLayoutNeeded()) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001060 pw.print(displayContent.getDisplayId());
1061 }
1062 }
1063 pw.println();
1064 }
1065
1066 void dumpWindowsNoHeader(PrintWriter pw, boolean dumpAll, ArrayList<WindowState> windows) {
Wale Ogunwaled1880962016-11-08 10:31:59 -08001067 final int[] index = new int[1];
1068 forAllWindows((w) -> {
1069 if (windows == null || windows.contains(w)) {
1070 pw.println(" Window #" + index[0] + " " + w + ":");
1071 w.dump(pw, " ", dumpAll || windows != null);
1072 index[0] = index[0] + 1;
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001073 }
Wale Ogunwaled1880962016-11-08 10:31:59 -08001074 }, true /* traverseTopToBottom */);
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001075 }
Wale Ogunwaleba51ca22016-09-23 06:06:54 -07001076
Wale Ogunwale02319a62016-09-26 15:21:22 -07001077 void dumpTokens(PrintWriter pw, boolean dumpAll) {
1078 pw.println(" All tokens:");
1079 for (int i = mChildren.size() - 1; i >= 0; --i) {
1080 mChildren.get(i).dumpTokens(pw, dumpAll);
1081 }
1082 }
1083
Wale Ogunwale0d5609b2017-09-13 05:55:07 -07001084 @CallSuper
1085 @Override
Adrian Roos4921ccf2017-09-28 16:54:06 +02001086 public void writeToProto(ProtoOutputStream proto, long fieldId, boolean trim) {
Wale Ogunwale0d5609b2017-09-13 05:55:07 -07001087 final long token = proto.start(fieldId);
Adrian Roos4921ccf2017-09-28 16:54:06 +02001088 super.writeToProto(proto, WINDOW_CONTAINER, trim);
Steven Timotiusaf03df62017-07-18 16:56:43 -07001089 if (mService.mDisplayReady) {
1090 final int count = mChildren.size();
1091 for (int i = 0; i < count; ++i) {
1092 final DisplayContent displayContent = mChildren.get(i);
Adrian Roos4921ccf2017-09-28 16:54:06 +02001093 displayContent.writeToProto(proto, DISPLAYS, trim);
Steven Timotiusaf03df62017-07-18 16:56:43 -07001094 }
1095 }
Adrian Roos4921ccf2017-09-28 16:54:06 +02001096 if (!trim) {
1097 forAllWindows((w) -> {
1098 w.writeIdentifierToProto(proto, WINDOWS);
1099 }, true);
1100 }
Wale Ogunwale0d5609b2017-09-13 05:55:07 -07001101 proto.end(token);
Steven Timotiusaf03df62017-07-18 16:56:43 -07001102 }
1103
Wale Ogunwaleba51ca22016-09-23 06:06:54 -07001104 @Override
1105 String getName() {
1106 return "ROOT";
1107 }
Robert Carrb1579c82017-09-05 14:54:47 -07001108
1109 @Override
1110 void scheduleAnimation() {
1111 mService.scheduleAnimationLocked();
1112 }
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001113}