blob: 965a6a79fec524c38f57711c031ef2a8ea74b49e [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 Ogunwalee05f5012016-09-16 16:27:29 -070019import android.content.res.Configuration;
20import android.graphics.Rect;
Tarandeep Singhe1cfcf42017-07-10 18:50:00 -070021import android.hardware.display.DisplayManager;
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;
35import android.util.EventLog;
36import android.util.Slog;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070037import android.util.SparseIntArray;
38import android.view.Display;
39import android.view.DisplayInfo;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070040import android.view.WindowManager;
Jorim Jaggi86c39f92017-05-02 18:02:46 +020041
42import com.android.internal.os.SomeArgs;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070043import com.android.internal.util.ArrayUtils;
44import com.android.server.EventLogTags;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070045
46import java.io.FileDescriptor;
47import java.io.PrintWriter;
48import java.util.ArrayList;
Wale Ogunwale1e129a42016-11-21 13:03:47 -080049import java.util.function.Consumer;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070050
Wale Ogunwalef7cab102016-10-25 15:25:14 -070051import static android.app.AppOpsManager.MODE_ALLOWED;
52import static android.app.AppOpsManager.MODE_DEFAULT;
53import static android.app.AppOpsManager.OP_NONE;
Wale Ogunwale02319a62016-09-26 15:21:22 -070054import static android.view.Display.DEFAULT_DISPLAY;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070055import static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070056import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070057import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE;
58import static android.view.WindowManager.LayoutParams.TYPE_DREAM;
59import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070060import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070061import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
62import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Jorim Jaggi879ff722016-11-04 18:08:17 -070063
Wale Ogunwalee05f5012016-09-16 16:27:29 -070064import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DISPLAY;
65import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_KEEP_SCREEN_ON;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070066import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT_REPEATS;
67import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION;
68import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_POWER;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070069import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY;
70import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT;
71import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_TRACE;
72import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS;
73import static com.android.server.wm.WindowManagerDebugConfig.SHOW_SURFACE_ALLOC;
74import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS;
75import static com.android.server.wm.WindowManagerDebugConfig.TAG_KEEP_SCREEN_ON;
76import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
77import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070078import static com.android.server.wm.WindowManagerService.H.REPORT_LOSING_FOCUS;
79import static com.android.server.wm.WindowManagerService.H.SEND_NEW_CONFIGURATION;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070080import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_PLACING_SURFACES;
81import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES;
82import static com.android.server.wm.WindowManagerService.WINDOWS_FREEZING_SCREENS_NONE;
83import static com.android.server.wm.WindowManagerService.H.WINDOW_FREEZE_TIMEOUT;
84import static com.android.server.wm.WindowManagerService.logSurface;
85import static com.android.server.wm.WindowSurfacePlacer.SET_FORCE_HIDING_CHANGED;
86import static com.android.server.wm.WindowSurfacePlacer.SET_ORIENTATION_CHANGE_COMPLETE;
87import static com.android.server.wm.WindowSurfacePlacer.SET_TURN_ON_SCREEN;
88import static com.android.server.wm.WindowSurfacePlacer.SET_UPDATE_ROTATION;
89import static com.android.server.wm.WindowSurfacePlacer.SET_WALLPAPER_ACTION_PENDING;
90import static com.android.server.wm.WindowSurfacePlacer.SET_WALLPAPER_MAY_CHANGE;
91
92/** Root {@link WindowContainer} for the device. */
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -070093class RootWindowContainer extends WindowContainer<DisplayContent> {
Wale Ogunwalee05f5012016-09-16 16:27:29 -070094 private static final String TAG = TAG_WITH_CLASS_NAME ? "RootWindowContainer" : TAG_WM;
95
Jorim Jaggi86c39f92017-05-02 18:02:46 +020096 private static final int SET_SCREEN_BRIGHTNESS_OVERRIDE = 1;
97 private static final int SET_USER_ACTIVITY_TIMEOUT = 2;
98
Wale Ogunwalee05f5012016-09-16 16:27:29 -070099 WindowManagerService mService;
100
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700101 private boolean mWallpaperForceHidingChanged = false;
102 private Object mLastWindowFreezeSource = null;
103 private Session mHoldScreen = null;
104 private float mScreenBrightness = -1;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700105 private long mUserActivityTimeout = -1;
106 private boolean mUpdateRotation = false;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700107 // Following variables are for debugging screen wakelock only.
108 // Last window that requires screen wakelock
109 WindowState mHoldScreenWindow = null;
110 // Last window that obscures all windows below
Wale Ogunwaled4a00a02016-10-10 11:29:17 -0700111 WindowState mObscuringWindow = null;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700112 // Only set while traversing the default display based on its content.
113 // Affects the behavior of mirroring on secondary displays.
114 private boolean mObscureApplicationContentOnSecondaryDisplays = false;
115
116 private boolean mSustainedPerformanceModeEnabled = false;
117 private boolean mSustainedPerformanceModeCurrent = false;
118
119 boolean mWallpaperMayChange = false;
Robert Carr11c26c22016-09-23 12:40:27 -0700120 // During an orientation change, we track whether all windows have rendered
121 // at the new orientation, and this will be false from changing orientation until that occurs.
122 // For seamless rotation cases this always stays true, as the windows complete their orientation
123 // changes 1 by 1 without disturbing global state.
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700124 boolean mOrientationChangeComplete = true;
125 boolean mWallpaperActionPending = false;
126
127 private final ArrayList<Integer> mChangedStackList = new ArrayList();
128
129 // State for the RemoteSurfaceTrace system used in testing. If this is enabled SurfaceControl
130 // instances will be replaced with an instance that writes a binary representation of all
131 // commands to mSurfaceTraceFd.
132 boolean mSurfaceTraceEnabled;
133 ParcelFileDescriptor mSurfaceTraceFd;
134 RemoteEventTrace mRemoteEventTrace;
135
Wale Ogunwalec69694a2016-10-18 13:51:15 -0700136 private final WindowLayersController mLayersController;
Wale Ogunwale0303c572016-10-20 10:16:29 -0700137 final WallpaperController mWallpaperController;
Wale Ogunwalec69694a2016-10-18 13:51:15 -0700138
Jorim Jaggi86c39f92017-05-02 18:02:46 +0200139 private final Handler mHandler;
140
Wale Ogunwale1e129a42016-11-21 13:03:47 -0800141 private String mCloseSystemDialogsReason;
142 private final Consumer<WindowState> mCloseSystemDialogsConsumer = w -> {
143 if (w.mHasSurface) {
144 try {
145 w.mClient.closeSystemDialogs(mCloseSystemDialogsReason);
146 } catch (RemoteException e) {
147 }
148 }
149 };
150
151 private static final Consumer<WindowState> sRemoveReplacedWindowsConsumer = w -> {
152 final AppWindowToken aToken = w.mAppToken;
153 if (aToken != null) {
154 aToken.removeReplacedWindowIfNeeded(w);
155 }
156 };
157
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700158 RootWindowContainer(WindowManagerService service) {
159 mService = service;
Jorim Jaggi86c39f92017-05-02 18:02:46 +0200160 mHandler = new MyHandler(service.mH.getLooper());
Wale Ogunwalec69694a2016-10-18 13:51:15 -0700161 mLayersController = new WindowLayersController(mService);
Wale Ogunwale0303c572016-10-20 10:16:29 -0700162 mWallpaperController = new WallpaperController(mService);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700163 }
164
165 WindowState computeFocusedWindow() {
David Stevens46939562017-03-24 13:04:00 -0700166 for (int i = mChildren.size() - 1; i >= 0; i--) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700167 final DisplayContent dc = mChildren.get(i);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700168 final WindowState win = dc.findFocusedWindow();
169 if (win != null) {
170 return win;
171 }
172 }
173 return null;
174 }
175
176 /**
Andrii Kulian7fc22812016-12-28 13:04:11 -0800177 * Get an array with display ids ordered by focus priority - last items should be given
178 * focus first. Sparse array just maps position to displayId.
179 */
180 void getDisplaysInFocusOrder(SparseIntArray displaysInFocusOrder) {
181 displaysInFocusOrder.clear();
182
183 final int size = mChildren.size();
184 for (int i = 0; i < size; ++i) {
Andrii Kulian0214ed92017-05-16 13:44:05 -0700185 final DisplayContent displayContent = mChildren.get(i);
186 if (displayContent.isRemovalDeferred()) {
187 // Don't report displays that are going to be removed soon.
188 continue;
189 }
190 displaysInFocusOrder.put(i, displayContent.getDisplayId());
Andrii Kulian7fc22812016-12-28 13:04:11 -0800191 }
192 }
193
194 /**
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700195 * Retrieve the DisplayContent for the specified displayId. Will create a new DisplayContent if
196 * there is a Display for the displayId.
197 *
198 * @param displayId The display the caller is interested in.
199 * @return The DisplayContent associated with displayId or null if there is no Display for it.
200 */
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700201 DisplayContent getDisplayContentOrCreate(int displayId) {
202 DisplayContent dc = getDisplayContent(displayId);
203
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700204 if (dc == null) {
205 final Display display = mService.mDisplayManager.getDisplay(displayId);
206 if (display != null) {
Andrii Kulian325cac42017-04-20 16:02:47 -0700207 final long callingIdentity = Binder.clearCallingIdentity();
208 try {
209 dc = createDisplayContent(display);
210 } finally {
211 Binder.restoreCallingIdentity(callingIdentity);
212 }
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700213 }
214 }
215 return dc;
216 }
217
Wale Ogunwale02319a62016-09-26 15:21:22 -0700218 DisplayContent getDisplayContent(int displayId) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700219 for (int i = mChildren.size() - 1; i >= 0; --i) {
220 final DisplayContent current = mChildren.get(i);
221 if (current.getDisplayId() == displayId) {
222 return current;
223 }
224 }
225 return null;
226 }
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700227
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700228 private DisplayContent createDisplayContent(final Display display) {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700229 final DisplayContent dc = new DisplayContent(display, mService, mLayersController,
230 mWallpaperController);
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700231 final int displayId = display.getDisplayId();
232
233 if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Adding display=" + display);
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700234
235 final DisplayInfo displayInfo = dc.getDisplayInfo();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700236 final Rect rect = new Rect();
237 mService.mDisplaySettings.getOverscanLocked(displayInfo.name, displayInfo.uniqueId, rect);
238 displayInfo.overscanLeft = rect.left;
239 displayInfo.overscanTop = rect.top;
240 displayInfo.overscanRight = rect.right;
241 displayInfo.overscanBottom = rect.bottom;
242 if (mService.mDisplayManagerInternal != null) {
243 mService.mDisplayManagerInternal.setDisplayInfoOverrideFromWindowManager(
244 displayId, displayInfo);
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700245 mService.configureDisplayPolicyLocked(dc);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700246
Tarandeep Singhe1cfcf42017-07-10 18:50:00 -0700247 // Tap Listeners are supported for:
248 // 1. All physical displays (multi-display).
249 // 2. VirtualDisplays that support virtual touch input. (Only VR for now)
250 // TODO(multi-display): Support VirtualDisplays with no virtual touch input.
251 if ((display.getType() != Display.TYPE_VIRTUAL
252 || (display.getType() == Display.TYPE_VIRTUAL
253 // Only VR VirtualDisplays
254 && displayId == mService.mVr2dDisplayId))
255 && mService.canDispatchPointerEvents()) {
256 if (DEBUG_DISPLAY) {
257 Slog.d(TAG,
258 "Registering PointerEventListener for DisplayId: " + displayId);
259 }
260 dc.mTapDetector = new TaskTapPointerEventListener(mService, dc);
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700261 mService.registerPointerEventListener(dc.mTapDetector);
Tarandeep Singhe1cfcf42017-07-10 18:50:00 -0700262 if (displayId == DEFAULT_DISPLAY) {
263 mService.registerPointerEventListener(mService.mMousePositionTracker);
264 }
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700265 }
266 }
267
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700268 return dc;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700269 }
270
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -0700271 boolean isLayoutNeeded() {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700272 final int numDisplays = mChildren.size();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700273 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700274 final DisplayContent displayContent = mChildren.get(displayNdx);
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -0700275 if (displayContent.isLayoutNeeded()) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700276 return true;
277 }
278 }
279 return false;
280 }
281
Wale Ogunwale6213caa2016-12-02 16:47:15 +0000282 void getWindowsByName(ArrayList<WindowState> output, String name) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700283 int objectId = 0;
284 // See if this is an object ID.
285 try {
286 objectId = Integer.parseInt(name, 16);
287 name = null;
288 } catch (RuntimeException e) {
289 }
Wale Ogunwaled1880962016-11-08 10:31:59 -0800290
291 getWindowsByName(output, name, objectId);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700292 }
293
Wale Ogunwale6213caa2016-12-02 16:47:15 +0000294 private void getWindowsByName(ArrayList<WindowState> output, String name, int objectId) {
Wale Ogunwaled1880962016-11-08 10:31:59 -0800295 forAllWindows((w) -> {
296 if (name != null) {
297 if (w.mAttrs.getTitle().toString().contains(name)) {
298 output.add(w);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700299 }
Wale Ogunwaled1880962016-11-08 10:31:59 -0800300 } else if (System.identityHashCode(w) == objectId) {
301 output.add(w);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700302 }
Wale Ogunwaled1880962016-11-08 10:31:59 -0800303 }, true /* traverseTopToBottom */);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700304 }
305
Wale Ogunwale02319a62016-09-26 15:21:22 -0700306 /**
307 * Returns the app window token for the input binder if it exist in the system.
308 * NOTE: Only one AppWindowToken is allowed to exist in the system for a binder token, since
309 * AppWindowToken represents an activity which can only exist on one display.
310 */
311 AppWindowToken getAppWindowToken(IBinder binder) {
312 for (int i = mChildren.size() - 1; i >= 0; --i) {
313 final DisplayContent dc = mChildren.get(i);
314 final AppWindowToken atoken = dc.getAppWindowToken(binder);
315 if (atoken != null) {
316 return atoken;
317 }
318 }
319 return null;
320 }
321
322 /** Returns the display object the input window token is currently mapped on. */
323 DisplayContent getWindowTokenDisplay(WindowToken token) {
324 if (token == null) {
325 return null;
326 }
327
328 for (int i = mChildren.size() - 1; i >= 0; --i) {
329 final DisplayContent dc = mChildren.get(i);
330 final WindowToken current = dc.getWindowToken(token.token);
331 if (current == token) {
332 return dc;
333 }
334 }
335
336 return null;
337 }
338
Andrii Kulian5406e7a2016-10-21 11:55:23 -0700339 /**
340 * Set new display override config and return array of ids of stacks that were changed during
341 * update. If called for the default display, global configuration will also be updated.
342 */
343 int[] setDisplayOverrideConfigurationIfNeeded(Configuration newConfiguration, int displayId) {
344 final DisplayContent displayContent = getDisplayContent(displayId);
345 if (displayContent == null) {
346 throw new IllegalArgumentException("Display not found for id: " + displayId);
347 }
348
349 final Configuration currentConfig = displayContent.getOverrideConfiguration();
350 final boolean configChanged = currentConfig.diff(newConfiguration) != 0;
351 if (!configChanged) {
352 return null;
353 }
Andrii Kuliand68501e2017-01-10 22:57:27 -0800354 displayContent.onOverrideConfigurationChanged(newConfiguration);
Andrii Kulian5406e7a2016-10-21 11:55:23 -0700355
356 if (displayId == DEFAULT_DISPLAY) {
357 // Override configuration of the default display duplicates global config. In this case
358 // we also want to update the global config.
359 return setGlobalConfigurationIfNeeded(newConfiguration);
360 } else {
361 return updateStackBoundsAfterConfigChange(displayId);
362 }
363 }
364
365 private int[] setGlobalConfigurationIfNeeded(Configuration newConfiguration) {
Andrii Kulian441e4492016-09-29 15:25:00 -0700366 final boolean configChanged = getConfiguration().diff(newConfiguration) != 0;
367 if (!configChanged) {
368 return null;
369 }
370 onConfigurationChanged(newConfiguration);
371 return updateStackBoundsAfterConfigChange();
372 }
373
374 @Override
375 void onConfigurationChanged(Configuration newParentConfig) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700376 prepareFreezingTaskBounds();
Andrii Kulian441e4492016-09-29 15:25:00 -0700377 super.onConfigurationChanged(newParentConfig);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700378
379 mService.mPolicy.onConfigurationChanged();
Andrii Kulian441e4492016-09-29 15:25:00 -0700380 }
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700381
Andrii Kulian441e4492016-09-29 15:25:00 -0700382 /**
383 * Callback used to trigger bounds update after configuration change and get ids of stacks whose
384 * bounds were updated.
385 */
Wale Ogunwaled4a00a02016-10-10 11:29:17 -0700386 private int[] updateStackBoundsAfterConfigChange() {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700387 mChangedStackList.clear();
388
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700389 final int numDisplays = mChildren.size();
390 for (int i = 0; i < numDisplays; ++i) {
391 final DisplayContent dc = mChildren.get(i);
Andrii Kulian441e4492016-09-29 15:25:00 -0700392 dc.updateStackBoundsAfterConfigChange(mChangedStackList);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700393 }
394
395 return mChangedStackList.isEmpty() ? null : ArrayUtils.convertToIntArray(mChangedStackList);
396 }
397
Andrii Kulian5406e7a2016-10-21 11:55:23 -0700398 /** Same as {@link #updateStackBoundsAfterConfigChange()} but only for a specific display. */
399 private int[] updateStackBoundsAfterConfigChange(int displayId) {
400 mChangedStackList.clear();
401
402 final DisplayContent dc = getDisplayContent(displayId);
403 dc.updateStackBoundsAfterConfigChange(mChangedStackList);
404
405 return mChangedStackList.isEmpty() ? null : ArrayUtils.convertToIntArray(mChangedStackList);
406 }
407
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700408 private void prepareFreezingTaskBounds() {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700409 for (int i = mChildren.size() - 1; i >= 0; i--) {
410 mChildren.get(i).prepareFreezingTaskBounds();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700411 }
412 }
413
Wale Ogunwale1666e312016-12-16 11:27:18 -0800414 TaskStack getStackById(int stackId) {
415 for (int i = mChildren.size() - 1; i >= 0; i--) {
416 final DisplayContent dc = mChildren.get(i);
417 final TaskStack stack = dc.getStackById(stackId);
418 if (stack != null) {
419 return stack;
420 }
421 }
422 return null;
423 }
424
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700425 void setSecureSurfaceState(int userId, boolean disabled) {
Wale Ogunwaled1880962016-11-08 10:31:59 -0800426 forAllWindows((w) -> {
427 if (w.mHasSurface && userId == UserHandle.getUserId(w.mOwnerUid)) {
428 w.mWinAnimator.setSecureLocked(disabled);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700429 }
Wale Ogunwaled1880962016-11-08 10:31:59 -0800430 }, true /* traverseTopToBottom */);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700431 }
432
433 void updateAppOpsState() {
Wale Ogunwaled1880962016-11-08 10:31:59 -0800434 forAllWindows((w) -> {
435 if (w.mAppOp == OP_NONE) {
436 return;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700437 }
Wale Ogunwaled1880962016-11-08 10:31:59 -0800438 final int mode = mService.mAppOps.checkOpNoThrow(w.mAppOp, w.getOwningUid(),
439 w.getOwningPackage());
440 w.setAppOpVisibilityLw(mode == MODE_ALLOWED || mode == MODE_DEFAULT);
441 }, false /* traverseTopToBottom */);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700442 }
443
444 boolean canShowStrictModeViolation(int pid) {
Wale Ogunwaled1880962016-11-08 10:31:59 -0800445 final WindowState win = getWindow((w) -> w.mSession.mPid == pid && w.isVisibleLw());
446 return win != null;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700447 }
448
449 void closeSystemDialogs(String reason) {
Wale Ogunwale1e129a42016-11-21 13:03:47 -0800450 mCloseSystemDialogsReason = reason;
451 forAllWindows(mCloseSystemDialogsConsumer, false /* traverseTopToBottom */);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700452 }
453
454 void removeReplacedWindows() {
455 if (SHOW_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION removeReplacedWindows");
456 mService.openSurfaceTransaction();
457 try {
Wale Ogunwale1e129a42016-11-21 13:03:47 -0800458 forAllWindows(sRemoveReplacedWindowsConsumer, true /* traverseTopToBottom */);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700459 } finally {
460 mService.closeSurfaceTransaction();
461 if (SHOW_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION removeReplacedWindows");
462 }
463 }
464
465 boolean hasPendingLayoutChanges(WindowAnimator animator) {
466 boolean hasChanges = false;
467
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700468 final int count = mChildren.size();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700469 for (int i = 0; i < count; ++i) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700470 final DisplayContent dc = mChildren.get(i);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700471 final int pendingChanges = animator.getPendingLayoutChanges(dc.getDisplayId());
472 if ((pendingChanges & FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
473 animator.mBulkUpdateParams |= SET_WALLPAPER_ACTION_PENDING;
474 }
475 if (pendingChanges != 0) {
476 hasChanges = true;
477 }
478 }
479
480 return hasChanges;
481 }
482
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700483 boolean reclaimSomeSurfaceMemory(WindowStateAnimator winAnimator, String operation,
484 boolean secure) {
485 final WindowSurfaceController surfaceController = winAnimator.mSurfaceController;
486 boolean leakedSurface = false;
487 boolean killedApps = false;
488
489 EventLog.writeEvent(EventLogTags.WM_NO_SURFACE_MEMORY, winAnimator.mWin.toString(),
490 winAnimator.mSession.mPid, operation);
491
492 final long callingIdentity = Binder.clearCallingIdentity();
493 try {
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700494 // There was some problem...first, do a sanity check of the window list to make sure
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700495 // we haven't left any dangling surfaces around.
496
497 Slog.i(TAG_WM, "Out of memory for surface! Looking for leaks...");
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700498 final int numDisplays = mChildren.size();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700499 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700500 leakedSurface |= mChildren.get(displayNdx).destroyLeakedSurfaces();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700501 }
502
503 if (!leakedSurface) {
504 Slog.w(TAG_WM, "No leaked surfaces; killing applications!");
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700505 final SparseIntArray pidCandidates = new SparseIntArray();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700506 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
Wale Ogunwaled1880962016-11-08 10:31:59 -0800507 mChildren.get(displayNdx).forAllWindows((w) -> {
508 if (mService.mForceRemoves.contains(w)) {
509 return;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700510 }
Wale Ogunwaled1880962016-11-08 10:31:59 -0800511 final WindowStateAnimator wsa = w.mWinAnimator;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700512 if (wsa.mSurfaceController != null) {
513 pidCandidates.append(wsa.mSession.mPid, wsa.mSession.mPid);
514 }
Wale Ogunwaled1880962016-11-08 10:31:59 -0800515 }, false /* traverseTopToBottom */);
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700516
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700517 if (pidCandidates.size() > 0) {
518 int[] pids = new int[pidCandidates.size()];
519 for (int i = 0; i < pids.length; i++) {
520 pids[i] = pidCandidates.keyAt(i);
521 }
522 try {
523 if (mService.mActivityManager.killPids(pids, "Free memory", secure)) {
524 killedApps = true;
525 }
526 } catch (RemoteException e) {
527 }
528 }
529 }
530 }
531
532 if (leakedSurface || killedApps) {
533 // We managed to reclaim some memory, so get rid of the trouble surface and ask the
534 // app to request another one.
535 Slog.w(TAG_WM,
536 "Looks like we have reclaimed some memory, clearing surface for retry.");
537 if (surfaceController != null) {
538 if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) logSurface(winAnimator.mWin,
539 "RECOVER DESTROY", false);
540 winAnimator.destroySurface();
Jorim Jaggiba41f4b2016-12-14 17:43:07 -0800541 if (winAnimator.mWin.mAppToken != null
542 && winAnimator.mWin.mAppToken.getController() != null) {
543 winAnimator.mWin.mAppToken.getController().removeStartingWindow();
544 }
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700545 }
546
547 try {
548 winAnimator.mWin.mClient.dispatchGetNewSurface();
549 } catch (RemoteException e) {
550 }
551 }
552 } finally {
553 Binder.restoreCallingIdentity(callingIdentity);
554 }
555
556 return leakedSurface || killedApps;
557 }
558
559 // "Something has changed! Let's make it correct now."
560 // TODO: Super crazy long method that should be broken down...
561 void performSurfacePlacement(boolean recoveringMemory) {
562 if (DEBUG_WINDOW_TRACE) Slog.v(TAG, "performSurfacePlacementInner: entry. Called by "
563 + Debug.getCallers(3));
564
565 int i;
566 boolean updateInputWindowsNeeded = false;
567
568 if (mService.mFocusMayChange) {
569 mService.mFocusMayChange = false;
570 updateInputWindowsNeeded = mService.updateFocusedWindowLocked(
571 UPDATE_FOCUS_WILL_PLACE_SURFACES, false /*updateInputWindows*/);
572 }
573
574 // Initialize state of exiting tokens.
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700575 final int numDisplays = mChildren.size();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700576 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700577 final DisplayContent displayContent = mChildren.get(displayNdx);
Wale Ogunwale1666e312016-12-16 11:27:18 -0800578 displayContent.setExitingTokensHasVisible(false);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700579 }
580
581 mHoldScreen = null;
582 mScreenBrightness = -1;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700583 mUserActivityTimeout = -1;
584 mObscureApplicationContentOnSecondaryDisplays = false;
585 mSustainedPerformanceModeCurrent = false;
586 mService.mTransactionSequence++;
587
588 // TODO(multi-display):
589 final DisplayContent defaultDisplay = mService.getDefaultDisplayContentLocked();
590 final DisplayInfo defaultInfo = defaultDisplay.getDisplayInfo();
591 final int defaultDw = defaultInfo.logicalWidth;
592 final int defaultDh = defaultInfo.logicalHeight;
593
594 if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
595 ">>> OPEN TRANSACTION performLayoutAndPlaceSurfaces");
596 mService.openSurfaceTransaction();
597 try {
Wale Ogunwale9d9d8f12016-09-28 15:29:59 -0700598 applySurfaceChangesTransaction(recoveringMemory, defaultDw, defaultDh);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700599 } catch (RuntimeException e) {
600 Slog.wtf(TAG, "Unhandled exception in Window Manager", e);
601 } finally {
602 mService.closeSurfaceTransaction();
603 if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
604 "<<< CLOSE TRANSACTION performLayoutAndPlaceSurfaces");
605 }
606
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700607 final WindowSurfacePlacer surfacePlacer = mService.mWindowPlacerLocked;
608
609 // If we are ready to perform an app transition, check through all of the app tokens to be
610 // shown and see if they are ready to go.
611 if (mService.mAppTransition.isReady()) {
612 defaultDisplay.pendingLayoutChanges |=
Wale Ogunwale0303c572016-10-20 10:16:29 -0700613 surfacePlacer.handleAppTransitionReadyLocked();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700614 if (DEBUG_LAYOUT_REPEATS)
615 surfacePlacer.debugLayoutRepeats("after handleAppTransitionReadyLocked",
616 defaultDisplay.pendingLayoutChanges);
617 }
618
619 if (!mService.mAnimator.mAppWindowAnimating && mService.mAppTransition.isRunning()) {
620 // We have finished the animation of an app transition. To do this, we have delayed a
621 // lot of operations like showing and hiding apps, moving apps in Z-order, etc. The app
622 // token list reflects the correct Z-order, but the window list may now be out of sync
623 // with it. So here we will just rebuild the entire app window list. Fun!
624 defaultDisplay.pendingLayoutChanges |=
625 mService.handleAnimatingStoppedAndTransitionLocked();
626 if (DEBUG_LAYOUT_REPEATS)
627 surfacePlacer.debugLayoutRepeats("after handleAnimStopAndXitionLock",
628 defaultDisplay.pendingLayoutChanges);
629 }
630
631 if (mWallpaperForceHidingChanged && defaultDisplay.pendingLayoutChanges == 0
632 && !mService.mAppTransition.isReady()) {
633 // At this point, there was a window with a wallpaper that was force hiding other
634 // windows behind it, but now it is going away. This may be simple -- just animate away
635 // the wallpaper and its window -- or it may be hard -- the wallpaper now needs to be
636 // shown behind something that was hidden.
637 defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_LAYOUT;
638 if (DEBUG_LAYOUT_REPEATS) surfacePlacer.debugLayoutRepeats(
639 "after animateAwayWallpaperLocked", defaultDisplay.pendingLayoutChanges);
640 }
641 mWallpaperForceHidingChanged = false;
642
643 if (mWallpaperMayChange) {
644 if (DEBUG_WALLPAPER_LIGHT) Slog.v(TAG, "Wallpaper may change! Adjusting");
645 defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
646 if (DEBUG_LAYOUT_REPEATS) surfacePlacer.debugLayoutRepeats("WallpaperMayChange",
647 defaultDisplay.pendingLayoutChanges);
648 }
649
650 if (mService.mFocusMayChange) {
651 mService.mFocusMayChange = false;
652 if (mService.updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES,
653 false /*updateInputWindows*/)) {
654 updateInputWindowsNeeded = true;
655 defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_ANIM;
656 }
657 }
658
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -0700659 if (isLayoutNeeded()) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700660 defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_LAYOUT;
661 if (DEBUG_LAYOUT_REPEATS) surfacePlacer.debugLayoutRepeats("mLayoutNeeded",
662 defaultDisplay.pendingLayoutChanges);
663 }
664
665 for (i = mService.mResizingWindows.size() - 1; i >= 0; i--) {
666 WindowState win = mService.mResizingWindows.get(i);
667 if (win.mAppFreezing) {
668 // Don't remove this window until rotation has completed.
669 continue;
670 }
671 // Discard the saved surface if window size is changed, it can't be reused.
672 if (win.mAppToken != null) {
673 win.mAppToken.destroySavedSurfaces();
674 }
675 win.reportResized();
676 mService.mResizingWindows.remove(i);
677 }
678
679 if (DEBUG_ORIENTATION && mService.mDisplayFrozen) Slog.v(TAG,
680 "With display frozen, orientationChangeComplete=" + mOrientationChangeComplete);
681 if (mOrientationChangeComplete) {
682 if (mService.mWindowsFreezingScreen != WINDOWS_FREEZING_SCREENS_NONE) {
683 mService.mWindowsFreezingScreen = WINDOWS_FREEZING_SCREENS_NONE;
684 mService.mLastFinishedFreezeSource = mLastWindowFreezeSource;
685 mService.mH.removeMessages(WINDOW_FREEZE_TIMEOUT);
686 }
687 mService.stopFreezingDisplayLocked();
688 }
689
690 // Destroy the surface of any windows that are no longer visible.
691 boolean wallpaperDestroyed = false;
692 i = mService.mDestroySurface.size();
693 if (i > 0) {
694 do {
695 i--;
696 WindowState win = mService.mDestroySurface.get(i);
697 win.mDestroying = false;
698 if (mService.mInputMethodWindow == win) {
Wale Ogunwale6213caa2016-12-02 16:47:15 +0000699 mService.setInputMethodWindowLocked(null);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700700 }
Wale Ogunwale0303c572016-10-20 10:16:29 -0700701 if (win.getDisplayContent().mWallpaperController.isWallpaperTarget(win)) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700702 wallpaperDestroyed = true;
703 }
Robert Carr89a28ab2017-04-24 15:33:11 -0700704 win.destroyOrSaveSurfaceUnchecked();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700705 } while (i > 0);
706 mService.mDestroySurface.clear();
707 }
708
709 // Time to remove any exiting tokens?
710 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700711 final DisplayContent displayContent = mChildren.get(displayNdx);
Wale Ogunwale1666e312016-12-16 11:27:18 -0800712 displayContent.removeExistingTokensIfPossible();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700713 }
714
715 if (wallpaperDestroyed) {
716 defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -0700717 defaultDisplay.setLayoutNeeded();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700718 }
719
720 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700721 final DisplayContent displayContent = mChildren.get(displayNdx);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700722 if (displayContent.pendingLayoutChanges != 0) {
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -0700723 displayContent.setLayoutNeeded();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700724 }
725 }
726
727 // Finally update all input windows now that the window changes have stabilized.
728 mService.mInputMonitor.updateInputWindowsLw(true /*force*/);
729
730 mService.setHoldScreenLocked(mHoldScreen);
731 if (!mService.mDisplayFrozen) {
Jorim Jaggi86c39f92017-05-02 18:02:46 +0200732 final int brightness = mScreenBrightness < 0 || mScreenBrightness > 1.0f
733 ? -1 : toBrightnessOverride(mScreenBrightness);
734
735 // Post these on a handler such that we don't call into power manager service while
736 // holding the window manager lock to avoid lock contention with power manager lock.
737 mHandler.obtainMessage(SET_SCREEN_BRIGHTNESS_OVERRIDE, brightness, 0).sendToTarget();
738 mHandler.obtainMessage(SET_USER_ACTIVITY_TIMEOUT, mUserActivityTimeout).sendToTarget();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700739 }
740
741 if (mSustainedPerformanceModeCurrent != mSustainedPerformanceModeEnabled) {
742 mSustainedPerformanceModeEnabled = mSustainedPerformanceModeCurrent;
743 mService.mPowerManagerInternal.powerHint(
Ruchi Kandoi0d434042016-10-03 09:12:02 -0700744 PowerHint.SUSTAINED_PERFORMANCE,
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700745 (mSustainedPerformanceModeEnabled ? 1 : 0));
746 }
747
748 if (mService.mTurnOnScreen) {
749 if (mService.mAllowTheaterModeWakeFromLayout
750 || Settings.Global.getInt(mService.mContext.getContentResolver(),
751 Settings.Global.THEATER_MODE_ON, 0) == 0) {
752 if (DEBUG_VISIBILITY || DEBUG_POWER) {
753 Slog.v(TAG, "Turning screen on after layout!");
754 }
755 mService.mPowerManager.wakeUp(SystemClock.uptimeMillis(),
756 "android.server.wm:TURN_ON");
757 }
758 mService.mTurnOnScreen = false;
759 }
760
761 if (mUpdateRotation) {
762 if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation");
Andrii Kulian5406e7a2016-10-21 11:55:23 -0700763 // TODO(multi-display): Update rotation for different displays separately.
764 final int displayId = defaultDisplay.getDisplayId();
Andrii Kulian06d07d62017-03-14 11:11:47 -0700765 if (defaultDisplay.updateRotationUnchecked(false /* inTransaction */)) {
Andrii Kulian5406e7a2016-10-21 11:55:23 -0700766 mService.mH.obtainMessage(SEND_NEW_CONFIGURATION, displayId).sendToTarget();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700767 } else {
768 mUpdateRotation = false;
769 }
770 }
771
772 if (mService.mWaitingForDrawnCallback != null ||
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -0700773 (mOrientationChangeComplete && !defaultDisplay.isLayoutNeeded()
774 && !mUpdateRotation)) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700775 mService.checkDrawnWindowsLocked();
776 }
777
778 final int N = mService.mPendingRemove.size();
779 if (N > 0) {
780 if (mService.mPendingRemoveTmp.length < N) {
781 mService.mPendingRemoveTmp = new WindowState[N+10];
782 }
783 mService.mPendingRemove.toArray(mService.mPendingRemoveTmp);
784 mService.mPendingRemove.clear();
Wale Ogunwale19e452e2016-10-12 12:36:29 -0700785 ArrayList<DisplayContent> displayList = new ArrayList();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700786 for (i = 0; i < N; i++) {
787 final WindowState w = mService.mPendingRemoveTmp[i];
788 w.removeImmediately();
789 final DisplayContent displayContent = w.getDisplayContent();
790 if (displayContent != null && !displayList.contains(displayContent)) {
791 displayList.add(displayContent);
792 }
793 }
794
Wale Ogunwalec69694a2016-10-18 13:51:15 -0700795 for (int j = displayList.size() - 1; j >= 0; --j) {
796 final DisplayContent dc = displayList.get(j);
797 dc.assignWindowLayers(true /*setLayoutNeeded*/);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700798 }
799 }
800
801 // Remove all deferred displays stacks, tasks, and activities.
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700802 for (int displayNdx = mChildren.size() - 1; displayNdx >= 0; --displayNdx) {
803 mChildren.get(displayNdx).checkCompleteDeferredRemoval();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700804 }
805
806 if (updateInputWindowsNeeded) {
807 mService.mInputMonitor.updateInputWindowsLw(false /*force*/);
808 }
David Stevensee9e2772017-02-09 16:30:27 -0800809 mService.setFocusTaskRegionLocked(null);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700810
811 // Check to see if we are now in a state where the screen should
812 // be enabled, because the window obscured flags have changed.
813 mService.enableScreenIfNeededLocked();
814
815 mService.scheduleAnimationLocked();
816 mService.mWindowPlacerLocked.destroyPendingSurfaces();
817
818 if (DEBUG_WINDOW_TRACE) Slog.e(TAG,
819 "performSurfacePlacementInner exit: animating=" + mService.mAnimator.isAnimating());
820 }
821
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700822 private void applySurfaceChangesTransaction(boolean recoveringMemory, int defaultDw,
823 int defaultDh) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700824 mHoldScreenWindow = null;
Wale Ogunwaled4a00a02016-10-10 11:29:17 -0700825 mObscuringWindow = null;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700826
Andrii Kulian8ee72852017-03-10 10:36:45 -0800827 // TODO(multi-display): Support these features on secondary screens.
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700828 if (mService.mWatermark != null) {
829 mService.mWatermark.positionSurface(defaultDw, defaultDh);
830 }
831 if (mService.mStrictModeFlash != null) {
832 mService.mStrictModeFlash.positionSurface(defaultDw, defaultDh);
833 }
834 if (mService.mCircularDisplayMask != null) {
Andrii Kulian8ee72852017-03-10 10:36:45 -0800835 mService.mCircularDisplayMask.positionSurface(defaultDw, defaultDh,
836 mService.getDefaultDisplayRotation());
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700837 }
838 if (mService.mEmulatorDisplayOverlay != null) {
839 mService.mEmulatorDisplayOverlay.positionSurface(defaultDw, defaultDh,
Andrii Kulian8ee72852017-03-10 10:36:45 -0800840 mService.getDefaultDisplayRotation());
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700841 }
842
843 boolean focusDisplayed = false;
844
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700845 final int count = mChildren.size();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700846 for (int j = 0; j < count; ++j) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700847 final DisplayContent dc = mChildren.get(j);
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700848 focusDisplayed |= dc.applySurfaceChangesTransaction(recoveringMemory);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700849 }
850
851 if (focusDisplayed) {
852 mService.mH.sendEmptyMessage(REPORT_LOSING_FOCUS);
853 }
854
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700855 // Give the display manager a chance to adjust properties like display rotation if it needs
856 // to.
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700857 mService.mDisplayManagerInternal.performTraversalInTransactionFromWindowManager();
858 }
859
860 /**
861 * @param w WindowState this method is applied to.
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700862 * @param obscured True if there is a window on top of this obscuring the display.
863 * @param syswin System window?
864 * @return True when the display contains content to show the user. When false, the display
865 * manager may choose to mirror or blank the display.
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700866 */
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700867 boolean handleNotObscuredLocked(WindowState w, boolean obscured, boolean syswin) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700868 final WindowManager.LayoutParams attrs = w.mAttrs;
869 final int attrFlags = attrs.flags;
870 final boolean canBeSeen = w.isDisplayedLw();
871 final int privateflags = attrs.privateFlags;
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700872 boolean displayHasContent = false;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700873
874 if (w.mHasSurface && canBeSeen) {
875 if ((attrFlags & FLAG_KEEP_SCREEN_ON) != 0) {
876 mHoldScreen = w.mSession;
877 mHoldScreenWindow = w;
878 } else if (DEBUG_KEEP_SCREEN_ON && w == mService.mLastWakeLockHoldingWindow) {
879 Slog.d(TAG_KEEP_SCREEN_ON, "handleNotObscuredLocked: " + w + " was holding "
Wale Ogunwale743fcc12017-06-06 21:36:50 +0000880 + "screen wakelock but no longer has FLAG_KEEP_SCREEN_ON!!! called by"
881 + Debug.getCallers(10));
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700882 }
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700883 if (!syswin && w.mAttrs.screenBrightness >= 0 && mScreenBrightness < 0) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700884 mScreenBrightness = w.mAttrs.screenBrightness;
885 }
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700886 if (!syswin && w.mAttrs.userActivityTimeout >= 0 && mUserActivityTimeout < 0) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700887 mUserActivityTimeout = w.mAttrs.userActivityTimeout;
888 }
889
890 final int type = attrs.type;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700891 // This function assumes that the contents of the default display are processed first
892 // before secondary displays.
893 final DisplayContent displayContent = w.getDisplayContent();
894 if (displayContent != null && displayContent.isDefaultDisplay) {
895 // While a dream or keyguard is showing, obscure ordinary application content on
896 // secondary displays (by forcibly enabling mirroring unless there is other content
897 // we want to show) but still allow opaque keyguard dialogs to be shown.
898 if (type == TYPE_DREAM || (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) {
899 mObscureApplicationContentOnSecondaryDisplays = true;
900 }
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700901 displayHasContent = true;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700902 } else if (displayContent != null &&
903 (!mObscureApplicationContentOnSecondaryDisplays
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700904 || (obscured && type == TYPE_KEYGUARD_DIALOG))) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700905 // Allow full screen keyguard presentation dialogs to be seen.
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700906 displayHasContent = true;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700907 }
908 if ((privateflags & PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE) != 0) {
909 mSustainedPerformanceModeCurrent = true;
910 }
911 }
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700912
913 return displayHasContent;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700914 }
915
916 boolean copyAnimToLayoutParams() {
917 boolean doRequest = false;
918
919 final int bulkUpdateParams = mService.mAnimator.mBulkUpdateParams;
920 if ((bulkUpdateParams & SET_UPDATE_ROTATION) != 0) {
921 mUpdateRotation = true;
922 doRequest = true;
923 }
924 if ((bulkUpdateParams & SET_WALLPAPER_MAY_CHANGE) != 0) {
925 mWallpaperMayChange = true;
926 doRequest = true;
927 }
928 if ((bulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0) {
929 mWallpaperForceHidingChanged = true;
930 doRequest = true;
931 }
932 if ((bulkUpdateParams & SET_ORIENTATION_CHANGE_COMPLETE) == 0) {
933 mOrientationChangeComplete = false;
934 } else {
935 mOrientationChangeComplete = true;
936 mLastWindowFreezeSource = mService.mAnimator.mLastWindowFreezeSource;
937 if (mService.mWindowsFreezingScreen != WINDOWS_FREEZING_SCREENS_NONE) {
938 doRequest = true;
939 }
940 }
941 if ((bulkUpdateParams & SET_TURN_ON_SCREEN) != 0) {
942 mService.mTurnOnScreen = true;
943 }
944 if ((bulkUpdateParams & SET_WALLPAPER_ACTION_PENDING) != 0) {
945 mWallpaperActionPending = true;
946 }
947
948 return doRequest;
949 }
950
951 private static int toBrightnessOverride(float value) {
952 return (int)(value * PowerManager.BRIGHTNESS_ON);
953 }
954
Jorim Jaggi86c39f92017-05-02 18:02:46 +0200955 private final class MyHandler extends Handler {
956
957 public MyHandler(Looper looper) {
958 super(looper);
959 }
960
961 @Override
962 public void handleMessage(Message msg) {
963 switch (msg.what) {
964 case SET_SCREEN_BRIGHTNESS_OVERRIDE:
965 mService.mPowerManagerInternal.setScreenBrightnessOverrideFromWindowManager(
966 msg.arg1);
967 break;
968 case SET_USER_ACTIVITY_TIMEOUT:
969 mService.mPowerManagerInternal.setUserActivityTimeoutOverrideFromWindowManager(
970 (Long) msg.obj);
971 break;
972 default:
973 break;
974 }
975 }
976 }
977
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700978 void enableSurfaceTrace(ParcelFileDescriptor pfd) {
979 final FileDescriptor fd = pfd.getFileDescriptor();
980 if (mSurfaceTraceEnabled) {
981 disableSurfaceTrace();
982 }
983 mSurfaceTraceEnabled = true;
984 mRemoteEventTrace = new RemoteEventTrace(mService, fd);
985 mSurfaceTraceFd = pfd;
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700986 for (int displayNdx = mChildren.size() - 1; displayNdx >= 0; --displayNdx) {
987 final DisplayContent dc = mChildren.get(displayNdx);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700988 dc.enableSurfaceTrace(fd);
989 }
990 }
991
992 void disableSurfaceTrace() {
993 mSurfaceTraceEnabled = false;
994 mRemoteEventTrace = null;
995 mSurfaceTraceFd = null;
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700996 for (int displayNdx = mChildren.size() - 1; displayNdx >= 0; --displayNdx) {
997 final DisplayContent dc = mChildren.get(displayNdx);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700998 dc.disableSurfaceTrace();
999 }
1000 }
1001
1002 void dumpDisplayContents(PrintWriter pw) {
1003 pw.println("WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)");
1004 if (mService.mDisplayReady) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -07001005 final int count = mChildren.size();
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001006 for (int i = 0; i < count; ++i) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -07001007 final DisplayContent displayContent = mChildren.get(i);
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001008 displayContent.dump(" ", pw);
1009 }
1010 } else {
1011 pw.println(" NO DISPLAY");
1012 }
1013 }
1014
1015 void dumpLayoutNeededDisplayIds(PrintWriter pw) {
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -07001016 if (!isLayoutNeeded()) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001017 return;
1018 }
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -07001019 pw.print(" mLayoutNeeded on displays=");
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -07001020 final int count = mChildren.size();
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001021 for (int displayNdx = 0; displayNdx < count; ++displayNdx) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -07001022 final DisplayContent displayContent = mChildren.get(displayNdx);
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -07001023 if (displayContent.isLayoutNeeded()) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001024 pw.print(displayContent.getDisplayId());
1025 }
1026 }
1027 pw.println();
1028 }
1029
1030 void dumpWindowsNoHeader(PrintWriter pw, boolean dumpAll, ArrayList<WindowState> windows) {
Wale Ogunwaled1880962016-11-08 10:31:59 -08001031 final int[] index = new int[1];
1032 forAllWindows((w) -> {
1033 if (windows == null || windows.contains(w)) {
1034 pw.println(" Window #" + index[0] + " " + w + ":");
1035 w.dump(pw, " ", dumpAll || windows != null);
1036 index[0] = index[0] + 1;
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001037 }
Wale Ogunwaled1880962016-11-08 10:31:59 -08001038 }, true /* traverseTopToBottom */);
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001039 }
Wale Ogunwaleba51ca22016-09-23 06:06:54 -07001040
Wale Ogunwale02319a62016-09-26 15:21:22 -07001041 void dumpTokens(PrintWriter pw, boolean dumpAll) {
1042 pw.println(" All tokens:");
1043 for (int i = mChildren.size() - 1; i >= 0; --i) {
1044 mChildren.get(i).dumpTokens(pw, dumpAll);
1045 }
1046 }
1047
Wale Ogunwaleba51ca22016-09-23 06:06:54 -07001048 @Override
1049 String getName() {
1050 return "ROOT";
1051 }
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001052}