blob: 471fc3a351aff148446c7ab82d4fcb9f6783bfd4 [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;
Steven Timotiusaf03df62017-07-18 16:56:43 -070038import android.util.proto.ProtoOutputStream;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070039import android.view.Display;
40import android.view.DisplayInfo;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070041import android.view.WindowManager;
Jorim Jaggi86c39f92017-05-02 18:02:46 +020042
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;
Andrii Kulian48146fd2017-08-07 11:22:50 -070055import static android.view.Display.INVALID_DISPLAY;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070056import static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070057import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070058import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE;
59import static android.view.WindowManager.LayoutParams.TYPE_DREAM;
60import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070061import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070062import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
63import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Jorim Jaggi879ff722016-11-04 18:08:17 -070064
Wale Ogunwalee05f5012016-09-16 16:27:29 -070065import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DISPLAY;
66import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_KEEP_SCREEN_ON;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070067import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT_REPEATS;
68import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION;
69import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_POWER;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070070import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY;
71import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT;
72import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_TRACE;
73import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS;
74import static com.android.server.wm.WindowManagerDebugConfig.SHOW_SURFACE_ALLOC;
75import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS;
76import static com.android.server.wm.WindowManagerDebugConfig.TAG_KEEP_SCREEN_ON;
77import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
78import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070079import static com.android.server.wm.WindowManagerService.H.REPORT_LOSING_FOCUS;
80import static com.android.server.wm.WindowManagerService.H.SEND_NEW_CONFIGURATION;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070081import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_PLACING_SURFACES;
82import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES;
83import static com.android.server.wm.WindowManagerService.WINDOWS_FREEZING_SCREENS_NONE;
84import static com.android.server.wm.WindowManagerService.H.WINDOW_FREEZE_TIMEOUT;
85import static com.android.server.wm.WindowManagerService.logSurface;
86import static com.android.server.wm.WindowSurfacePlacer.SET_FORCE_HIDING_CHANGED;
87import static com.android.server.wm.WindowSurfacePlacer.SET_ORIENTATION_CHANGE_COMPLETE;
88import static com.android.server.wm.WindowSurfacePlacer.SET_TURN_ON_SCREEN;
89import static com.android.server.wm.WindowSurfacePlacer.SET_UPDATE_ROTATION;
90import static com.android.server.wm.WindowSurfacePlacer.SET_WALLPAPER_ACTION_PENDING;
91import static com.android.server.wm.WindowSurfacePlacer.SET_WALLPAPER_MAY_CHANGE;
Steven Timotiusaf03df62017-07-18 16:56:43 -070092import static com.android.server.wm.proto.WindowManagerServiceProto.DISPLAYS;
93import static com.android.server.wm.proto.WindowManagerServiceProto.WINDOWS;
Wale Ogunwalee05f5012016-09-16 16:27:29 -070094
95/** Root {@link WindowContainer} for the device. */
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -070096class RootWindowContainer extends WindowContainer<DisplayContent> {
Wale Ogunwalee05f5012016-09-16 16:27:29 -070097 private static final String TAG = TAG_WITH_CLASS_NAME ? "RootWindowContainer" : TAG_WM;
98
Jorim Jaggi86c39f92017-05-02 18:02:46 +020099 private static final int SET_SCREEN_BRIGHTNESS_OVERRIDE = 1;
100 private static final int SET_USER_ACTIVITY_TIMEOUT = 2;
101
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700102 WindowManagerService mService;
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
130 private final ArrayList<Integer> mChangedStackList = new ArrayList();
131
132 // State for the RemoteSurfaceTrace system used in testing. If this is enabled SurfaceControl
133 // instances will be replaced with an instance that writes a binary representation of all
134 // commands to mSurfaceTraceFd.
135 boolean mSurfaceTraceEnabled;
136 ParcelFileDescriptor mSurfaceTraceFd;
137 RemoteEventTrace mRemoteEventTrace;
138
Wale Ogunwalec69694a2016-10-18 13:51:15 -0700139 private final WindowLayersController mLayersController;
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) {
162 mService = service;
Jorim Jaggi86c39f92017-05-02 18:02:46 +0200163 mHandler = new MyHandler(service.mH.getLooper());
Wale Ogunwalec69694a2016-10-18 13:51:15 -0700164 mLayersController = new WindowLayersController(mService);
Wale Ogunwale0303c572016-10-20 10:16:29 -0700165 mWallpaperController = new WallpaperController(mService);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700166 }
167
168 WindowState computeFocusedWindow() {
David Stevens46939562017-03-24 13:04:00 -0700169 for (int i = mChildren.size() - 1; i >= 0; i--) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700170 final DisplayContent dc = mChildren.get(i);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700171 final WindowState win = dc.findFocusedWindow();
172 if (win != null) {
173 return win;
174 }
175 }
176 return null;
177 }
178
179 /**
Andrii Kulian7fc22812016-12-28 13:04:11 -0800180 * Get an array with display ids ordered by focus priority - last items should be given
181 * focus first. Sparse array just maps position to displayId.
182 */
183 void getDisplaysInFocusOrder(SparseIntArray displaysInFocusOrder) {
184 displaysInFocusOrder.clear();
185
186 final int size = mChildren.size();
187 for (int i = 0; i < size; ++i) {
Andrii Kulian0214ed92017-05-16 13:44:05 -0700188 final DisplayContent displayContent = mChildren.get(i);
189 if (displayContent.isRemovalDeferred()) {
190 // Don't report displays that are going to be removed soon.
191 continue;
192 }
193 displaysInFocusOrder.put(i, displayContent.getDisplayId());
Andrii Kulian7fc22812016-12-28 13:04:11 -0800194 }
195 }
196
197 /**
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700198 * Retrieve the DisplayContent for the specified displayId. Will create a new DisplayContent if
199 * there is a Display for the displayId.
200 *
201 * @param displayId The display the caller is interested in.
202 * @return The DisplayContent associated with displayId or null if there is no Display for it.
203 */
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700204 DisplayContent getDisplayContentOrCreate(int displayId) {
205 DisplayContent dc = getDisplayContent(displayId);
206
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700207 if (dc == null) {
208 final Display display = mService.mDisplayManager.getDisplay(displayId);
209 if (display != null) {
Andrii Kulian325cac42017-04-20 16:02:47 -0700210 final long callingIdentity = Binder.clearCallingIdentity();
211 try {
212 dc = createDisplayContent(display);
213 } finally {
214 Binder.restoreCallingIdentity(callingIdentity);
215 }
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700216 }
217 }
218 return dc;
219 }
220
Wale Ogunwale02319a62016-09-26 15:21:22 -0700221 DisplayContent getDisplayContent(int displayId) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700222 for (int i = mChildren.size() - 1; i >= 0; --i) {
223 final DisplayContent current = mChildren.get(i);
224 if (current.getDisplayId() == displayId) {
225 return current;
226 }
227 }
228 return null;
229 }
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700230
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700231 private DisplayContent createDisplayContent(final Display display) {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700232 final DisplayContent dc = new DisplayContent(display, mService, mLayersController,
233 mWallpaperController);
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700234 final int displayId = display.getDisplayId();
235
236 if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Adding display=" + display);
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700237
238 final DisplayInfo displayInfo = dc.getDisplayInfo();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700239 final Rect rect = new Rect();
240 mService.mDisplaySettings.getOverscanLocked(displayInfo.name, displayInfo.uniqueId, rect);
241 displayInfo.overscanLeft = rect.left;
242 displayInfo.overscanTop = rect.top;
243 displayInfo.overscanRight = rect.right;
244 displayInfo.overscanBottom = rect.bottom;
245 if (mService.mDisplayManagerInternal != null) {
246 mService.mDisplayManagerInternal.setDisplayInfoOverrideFromWindowManager(
247 displayId, displayInfo);
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700248 mService.configureDisplayPolicyLocked(dc);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700249
Tarandeep Singhe1cfcf42017-07-10 18:50:00 -0700250 // Tap Listeners are supported for:
251 // 1. All physical displays (multi-display).
252 // 2. VirtualDisplays that support virtual touch input. (Only VR for now)
253 // TODO(multi-display): Support VirtualDisplays with no virtual touch input.
254 if ((display.getType() != Display.TYPE_VIRTUAL
255 || (display.getType() == Display.TYPE_VIRTUAL
256 // Only VR VirtualDisplays
257 && displayId == mService.mVr2dDisplayId))
258 && mService.canDispatchPointerEvents()) {
259 if (DEBUG_DISPLAY) {
260 Slog.d(TAG,
261 "Registering PointerEventListener for DisplayId: " + displayId);
262 }
263 dc.mTapDetector = new TaskTapPointerEventListener(mService, dc);
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700264 mService.registerPointerEventListener(dc.mTapDetector);
Tarandeep Singhe1cfcf42017-07-10 18:50:00 -0700265 if (displayId == DEFAULT_DISPLAY) {
266 mService.registerPointerEventListener(mService.mMousePositionTracker);
267 }
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700268 }
269 }
270
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700271 return dc;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700272 }
273
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -0700274 boolean isLayoutNeeded() {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700275 final int numDisplays = mChildren.size();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700276 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700277 final DisplayContent displayContent = mChildren.get(displayNdx);
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -0700278 if (displayContent.isLayoutNeeded()) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700279 return true;
280 }
281 }
282 return false;
283 }
284
Wale Ogunwale6213caa2016-12-02 16:47:15 +0000285 void getWindowsByName(ArrayList<WindowState> output, String name) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700286 int objectId = 0;
287 // See if this is an object ID.
288 try {
289 objectId = Integer.parseInt(name, 16);
290 name = null;
291 } catch (RuntimeException e) {
292 }
Wale Ogunwaled1880962016-11-08 10:31:59 -0800293
294 getWindowsByName(output, name, objectId);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700295 }
296
Wale Ogunwale6213caa2016-12-02 16:47:15 +0000297 private void getWindowsByName(ArrayList<WindowState> output, String name, int objectId) {
Wale Ogunwaled1880962016-11-08 10:31:59 -0800298 forAllWindows((w) -> {
299 if (name != null) {
300 if (w.mAttrs.getTitle().toString().contains(name)) {
301 output.add(w);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700302 }
Wale Ogunwaled1880962016-11-08 10:31:59 -0800303 } else if (System.identityHashCode(w) == objectId) {
304 output.add(w);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700305 }
Wale Ogunwaled1880962016-11-08 10:31:59 -0800306 }, true /* traverseTopToBottom */);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700307 }
308
Wale Ogunwale02319a62016-09-26 15:21:22 -0700309 /**
310 * Returns the app window token for the input binder if it exist in the system.
311 * NOTE: Only one AppWindowToken is allowed to exist in the system for a binder token, since
312 * AppWindowToken represents an activity which can only exist on one display.
313 */
314 AppWindowToken getAppWindowToken(IBinder binder) {
315 for (int i = mChildren.size() - 1; i >= 0; --i) {
316 final DisplayContent dc = mChildren.get(i);
317 final AppWindowToken atoken = dc.getAppWindowToken(binder);
318 if (atoken != null) {
319 return atoken;
320 }
321 }
322 return null;
323 }
324
325 /** Returns the display object the input window token is currently mapped on. */
326 DisplayContent getWindowTokenDisplay(WindowToken token) {
327 if (token == null) {
328 return null;
329 }
330
331 for (int i = mChildren.size() - 1; i >= 0; --i) {
332 final DisplayContent dc = mChildren.get(i);
333 final WindowToken current = dc.getWindowToken(token.token);
334 if (current == token) {
335 return dc;
336 }
337 }
338
339 return null;
340 }
341
Andrii Kulian5406e7a2016-10-21 11:55:23 -0700342 /**
343 * Set new display override config and return array of ids of stacks that were changed during
344 * update. If called for the default display, global configuration will also be updated.
345 */
346 int[] setDisplayOverrideConfigurationIfNeeded(Configuration newConfiguration, int displayId) {
347 final DisplayContent displayContent = getDisplayContent(displayId);
348 if (displayContent == null) {
349 throw new IllegalArgumentException("Display not found for id: " + displayId);
350 }
351
352 final Configuration currentConfig = displayContent.getOverrideConfiguration();
353 final boolean configChanged = currentConfig.diff(newConfiguration) != 0;
354 if (!configChanged) {
355 return null;
356 }
Andrii Kuliand68501e2017-01-10 22:57:27 -0800357 displayContent.onOverrideConfigurationChanged(newConfiguration);
Andrii Kulian5406e7a2016-10-21 11:55:23 -0700358
359 if (displayId == DEFAULT_DISPLAY) {
360 // Override configuration of the default display duplicates global config. In this case
361 // we also want to update the global config.
362 return setGlobalConfigurationIfNeeded(newConfiguration);
363 } else {
364 return updateStackBoundsAfterConfigChange(displayId);
365 }
366 }
367
368 private int[] setGlobalConfigurationIfNeeded(Configuration newConfiguration) {
Andrii Kulian441e4492016-09-29 15:25:00 -0700369 final boolean configChanged = getConfiguration().diff(newConfiguration) != 0;
370 if (!configChanged) {
371 return null;
372 }
373 onConfigurationChanged(newConfiguration);
374 return updateStackBoundsAfterConfigChange();
375 }
376
377 @Override
378 void onConfigurationChanged(Configuration newParentConfig) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700379 prepareFreezingTaskBounds();
Andrii Kulian441e4492016-09-29 15:25:00 -0700380 super.onConfigurationChanged(newParentConfig);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700381
382 mService.mPolicy.onConfigurationChanged();
Andrii Kulian441e4492016-09-29 15:25:00 -0700383 }
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700384
Andrii Kulian441e4492016-09-29 15:25:00 -0700385 /**
386 * Callback used to trigger bounds update after configuration change and get ids of stacks whose
387 * bounds were updated.
388 */
Wale Ogunwaled4a00a02016-10-10 11:29:17 -0700389 private int[] updateStackBoundsAfterConfigChange() {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700390 mChangedStackList.clear();
391
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700392 final int numDisplays = mChildren.size();
393 for (int i = 0; i < numDisplays; ++i) {
394 final DisplayContent dc = mChildren.get(i);
Andrii Kulian441e4492016-09-29 15:25:00 -0700395 dc.updateStackBoundsAfterConfigChange(mChangedStackList);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700396 }
397
398 return mChangedStackList.isEmpty() ? null : ArrayUtils.convertToIntArray(mChangedStackList);
399 }
400
Andrii Kulian5406e7a2016-10-21 11:55:23 -0700401 /** Same as {@link #updateStackBoundsAfterConfigChange()} but only for a specific display. */
402 private int[] updateStackBoundsAfterConfigChange(int displayId) {
403 mChangedStackList.clear();
404
405 final DisplayContent dc = getDisplayContent(displayId);
406 dc.updateStackBoundsAfterConfigChange(mChangedStackList);
407
408 return mChangedStackList.isEmpty() ? null : ArrayUtils.convertToIntArray(mChangedStackList);
409 }
410
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700411 private void prepareFreezingTaskBounds() {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700412 for (int i = mChildren.size() - 1; i >= 0; i--) {
413 mChildren.get(i).prepareFreezingTaskBounds();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700414 }
415 }
416
Wale Ogunwale1666e312016-12-16 11:27:18 -0800417 TaskStack getStackById(int stackId) {
418 for (int i = mChildren.size() - 1; i >= 0; i--) {
419 final DisplayContent dc = mChildren.get(i);
420 final TaskStack stack = dc.getStackById(stackId);
421 if (stack != null) {
422 return stack;
423 }
424 }
425 return null;
426 }
427
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700428 void setSecureSurfaceState(int userId, boolean disabled) {
Wale Ogunwaled1880962016-11-08 10:31:59 -0800429 forAllWindows((w) -> {
430 if (w.mHasSurface && userId == UserHandle.getUserId(w.mOwnerUid)) {
431 w.mWinAnimator.setSecureLocked(disabled);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700432 }
Wale Ogunwaled1880962016-11-08 10:31:59 -0800433 }, true /* traverseTopToBottom */);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700434 }
435
436 void updateAppOpsState() {
Wale Ogunwaled1880962016-11-08 10:31:59 -0800437 forAllWindows((w) -> {
438 if (w.mAppOp == OP_NONE) {
439 return;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700440 }
Wale Ogunwaled1880962016-11-08 10:31:59 -0800441 final int mode = mService.mAppOps.checkOpNoThrow(w.mAppOp, w.getOwningUid(),
442 w.getOwningPackage());
443 w.setAppOpVisibilityLw(mode == MODE_ALLOWED || mode == MODE_DEFAULT);
444 }, false /* traverseTopToBottom */);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700445 }
446
447 boolean canShowStrictModeViolation(int pid) {
Wale Ogunwaled1880962016-11-08 10:31:59 -0800448 final WindowState win = getWindow((w) -> w.mSession.mPid == pid && w.isVisibleLw());
449 return win != null;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700450 }
451
452 void closeSystemDialogs(String reason) {
Wale Ogunwale1e129a42016-11-21 13:03:47 -0800453 mCloseSystemDialogsReason = reason;
454 forAllWindows(mCloseSystemDialogsConsumer, false /* traverseTopToBottom */);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700455 }
456
457 void removeReplacedWindows() {
458 if (SHOW_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION removeReplacedWindows");
459 mService.openSurfaceTransaction();
460 try {
Wale Ogunwale1e129a42016-11-21 13:03:47 -0800461 forAllWindows(sRemoveReplacedWindowsConsumer, true /* traverseTopToBottom */);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700462 } finally {
463 mService.closeSurfaceTransaction();
464 if (SHOW_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION removeReplacedWindows");
465 }
466 }
467
468 boolean hasPendingLayoutChanges(WindowAnimator animator) {
469 boolean hasChanges = false;
470
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700471 final int count = mChildren.size();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700472 for (int i = 0; i < count; ++i) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700473 final DisplayContent dc = mChildren.get(i);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700474 final int pendingChanges = animator.getPendingLayoutChanges(dc.getDisplayId());
475 if ((pendingChanges & FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
476 animator.mBulkUpdateParams |= SET_WALLPAPER_ACTION_PENDING;
477 }
478 if (pendingChanges != 0) {
479 hasChanges = true;
480 }
481 }
482
483 return hasChanges;
484 }
485
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700486 boolean reclaimSomeSurfaceMemory(WindowStateAnimator winAnimator, String operation,
487 boolean secure) {
488 final WindowSurfaceController surfaceController = winAnimator.mSurfaceController;
489 boolean leakedSurface = false;
490 boolean killedApps = false;
491
492 EventLog.writeEvent(EventLogTags.WM_NO_SURFACE_MEMORY, winAnimator.mWin.toString(),
493 winAnimator.mSession.mPid, operation);
494
495 final long callingIdentity = Binder.clearCallingIdentity();
496 try {
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700497 // There was some problem...first, do a sanity check of the window list to make sure
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700498 // we haven't left any dangling surfaces around.
499
500 Slog.i(TAG_WM, "Out of memory for surface! Looking for leaks...");
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700501 final int numDisplays = mChildren.size();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700502 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700503 leakedSurface |= mChildren.get(displayNdx).destroyLeakedSurfaces();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700504 }
505
506 if (!leakedSurface) {
507 Slog.w(TAG_WM, "No leaked surfaces; killing applications!");
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700508 final SparseIntArray pidCandidates = new SparseIntArray();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700509 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
Wale Ogunwaled1880962016-11-08 10:31:59 -0800510 mChildren.get(displayNdx).forAllWindows((w) -> {
511 if (mService.mForceRemoves.contains(w)) {
512 return;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700513 }
Wale Ogunwaled1880962016-11-08 10:31:59 -0800514 final WindowStateAnimator wsa = w.mWinAnimator;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700515 if (wsa.mSurfaceController != null) {
516 pidCandidates.append(wsa.mSession.mPid, wsa.mSession.mPid);
517 }
Wale Ogunwaled1880962016-11-08 10:31:59 -0800518 }, false /* traverseTopToBottom */);
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700519
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700520 if (pidCandidates.size() > 0) {
521 int[] pids = new int[pidCandidates.size()];
522 for (int i = 0; i < pids.length; i++) {
523 pids[i] = pidCandidates.keyAt(i);
524 }
525 try {
526 if (mService.mActivityManager.killPids(pids, "Free memory", secure)) {
527 killedApps = true;
528 }
529 } catch (RemoteException e) {
530 }
531 }
532 }
533 }
534
535 if (leakedSurface || killedApps) {
536 // We managed to reclaim some memory, so get rid of the trouble surface and ask the
537 // app to request another one.
538 Slog.w(TAG_WM,
539 "Looks like we have reclaimed some memory, clearing surface for retry.");
540 if (surfaceController != null) {
541 if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) logSurface(winAnimator.mWin,
542 "RECOVER DESTROY", false);
543 winAnimator.destroySurface();
Jorim Jaggiba41f4b2016-12-14 17:43:07 -0800544 if (winAnimator.mWin.mAppToken != null
545 && winAnimator.mWin.mAppToken.getController() != null) {
546 winAnimator.mWin.mAppToken.getController().removeStartingWindow();
547 }
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700548 }
549
550 try {
551 winAnimator.mWin.mClient.dispatchGetNewSurface();
552 } catch (RemoteException e) {
553 }
554 }
555 } finally {
556 Binder.restoreCallingIdentity(callingIdentity);
557 }
558
559 return leakedSurface || killedApps;
560 }
561
562 // "Something has changed! Let's make it correct now."
563 // TODO: Super crazy long method that should be broken down...
564 void performSurfacePlacement(boolean recoveringMemory) {
565 if (DEBUG_WINDOW_TRACE) Slog.v(TAG, "performSurfacePlacementInner: entry. Called by "
566 + Debug.getCallers(3));
567
568 int i;
569 boolean updateInputWindowsNeeded = false;
570
571 if (mService.mFocusMayChange) {
572 mService.mFocusMayChange = false;
573 updateInputWindowsNeeded = mService.updateFocusedWindowLocked(
574 UPDATE_FOCUS_WILL_PLACE_SURFACES, false /*updateInputWindows*/);
575 }
576
577 // Initialize state of exiting tokens.
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700578 final int numDisplays = mChildren.size();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700579 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700580 final DisplayContent displayContent = mChildren.get(displayNdx);
Wale Ogunwale1666e312016-12-16 11:27:18 -0800581 displayContent.setExitingTokensHasVisible(false);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700582 }
583
584 mHoldScreen = null;
585 mScreenBrightness = -1;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700586 mUserActivityTimeout = -1;
587 mObscureApplicationContentOnSecondaryDisplays = false;
588 mSustainedPerformanceModeCurrent = false;
589 mService.mTransactionSequence++;
590
591 // TODO(multi-display):
592 final DisplayContent defaultDisplay = mService.getDefaultDisplayContentLocked();
593 final DisplayInfo defaultInfo = defaultDisplay.getDisplayInfo();
594 final int defaultDw = defaultInfo.logicalWidth;
595 final int defaultDh = defaultInfo.logicalHeight;
596
597 if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
598 ">>> OPEN TRANSACTION performLayoutAndPlaceSurfaces");
599 mService.openSurfaceTransaction();
600 try {
Wale Ogunwale9d9d8f12016-09-28 15:29:59 -0700601 applySurfaceChangesTransaction(recoveringMemory, defaultDw, defaultDh);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700602 } catch (RuntimeException e) {
603 Slog.wtf(TAG, "Unhandled exception in Window Manager", e);
604 } finally {
605 mService.closeSurfaceTransaction();
606 if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
607 "<<< CLOSE TRANSACTION performLayoutAndPlaceSurfaces");
608 }
609
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700610 final WindowSurfacePlacer surfacePlacer = mService.mWindowPlacerLocked;
611
612 // If we are ready to perform an app transition, check through all of the app tokens to be
613 // shown and see if they are ready to go.
614 if (mService.mAppTransition.isReady()) {
615 defaultDisplay.pendingLayoutChanges |=
Wale Ogunwale0303c572016-10-20 10:16:29 -0700616 surfacePlacer.handleAppTransitionReadyLocked();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700617 if (DEBUG_LAYOUT_REPEATS)
618 surfacePlacer.debugLayoutRepeats("after handleAppTransitionReadyLocked",
619 defaultDisplay.pendingLayoutChanges);
620 }
621
622 if (!mService.mAnimator.mAppWindowAnimating && mService.mAppTransition.isRunning()) {
623 // We have finished the animation of an app transition. To do this, we have delayed a
624 // lot of operations like showing and hiding apps, moving apps in Z-order, etc. The app
625 // token list reflects the correct Z-order, but the window list may now be out of sync
626 // with it. So here we will just rebuild the entire app window list. Fun!
627 defaultDisplay.pendingLayoutChanges |=
628 mService.handleAnimatingStoppedAndTransitionLocked();
629 if (DEBUG_LAYOUT_REPEATS)
630 surfacePlacer.debugLayoutRepeats("after handleAnimStopAndXitionLock",
631 defaultDisplay.pendingLayoutChanges);
632 }
633
634 if (mWallpaperForceHidingChanged && defaultDisplay.pendingLayoutChanges == 0
635 && !mService.mAppTransition.isReady()) {
636 // At this point, there was a window with a wallpaper that was force hiding other
637 // windows behind it, but now it is going away. This may be simple -- just animate away
638 // the wallpaper and its window -- or it may be hard -- the wallpaper now needs to be
639 // shown behind something that was hidden.
640 defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_LAYOUT;
641 if (DEBUG_LAYOUT_REPEATS) surfacePlacer.debugLayoutRepeats(
642 "after animateAwayWallpaperLocked", defaultDisplay.pendingLayoutChanges);
643 }
644 mWallpaperForceHidingChanged = false;
645
646 if (mWallpaperMayChange) {
647 if (DEBUG_WALLPAPER_LIGHT) Slog.v(TAG, "Wallpaper may change! Adjusting");
648 defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
649 if (DEBUG_LAYOUT_REPEATS) surfacePlacer.debugLayoutRepeats("WallpaperMayChange",
650 defaultDisplay.pendingLayoutChanges);
651 }
652
653 if (mService.mFocusMayChange) {
654 mService.mFocusMayChange = false;
655 if (mService.updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES,
656 false /*updateInputWindows*/)) {
657 updateInputWindowsNeeded = true;
658 defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_ANIM;
659 }
660 }
661
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -0700662 if (isLayoutNeeded()) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700663 defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_LAYOUT;
664 if (DEBUG_LAYOUT_REPEATS) surfacePlacer.debugLayoutRepeats("mLayoutNeeded",
665 defaultDisplay.pendingLayoutChanges);
666 }
667
668 for (i = mService.mResizingWindows.size() - 1; i >= 0; i--) {
669 WindowState win = mService.mResizingWindows.get(i);
670 if (win.mAppFreezing) {
671 // Don't remove this window until rotation has completed.
672 continue;
673 }
674 // Discard the saved surface if window size is changed, it can't be reused.
675 if (win.mAppToken != null) {
676 win.mAppToken.destroySavedSurfaces();
677 }
678 win.reportResized();
679 mService.mResizingWindows.remove(i);
680 }
681
682 if (DEBUG_ORIENTATION && mService.mDisplayFrozen) Slog.v(TAG,
683 "With display frozen, orientationChangeComplete=" + mOrientationChangeComplete);
684 if (mOrientationChangeComplete) {
685 if (mService.mWindowsFreezingScreen != WINDOWS_FREEZING_SCREENS_NONE) {
686 mService.mWindowsFreezingScreen = WINDOWS_FREEZING_SCREENS_NONE;
687 mService.mLastFinishedFreezeSource = mLastWindowFreezeSource;
688 mService.mH.removeMessages(WINDOW_FREEZE_TIMEOUT);
689 }
690 mService.stopFreezingDisplayLocked();
691 }
692
693 // Destroy the surface of any windows that are no longer visible.
694 boolean wallpaperDestroyed = false;
695 i = mService.mDestroySurface.size();
696 if (i > 0) {
697 do {
698 i--;
699 WindowState win = mService.mDestroySurface.get(i);
700 win.mDestroying = false;
701 if (mService.mInputMethodWindow == win) {
Wale Ogunwale6213caa2016-12-02 16:47:15 +0000702 mService.setInputMethodWindowLocked(null);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700703 }
Wale Ogunwale0303c572016-10-20 10:16:29 -0700704 if (win.getDisplayContent().mWallpaperController.isWallpaperTarget(win)) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700705 wallpaperDestroyed = true;
706 }
Robert Carr89a28ab2017-04-24 15:33:11 -0700707 win.destroyOrSaveSurfaceUnchecked();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700708 } while (i > 0);
709 mService.mDestroySurface.clear();
710 }
711
712 // Time to remove any exiting tokens?
713 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700714 final DisplayContent displayContent = mChildren.get(displayNdx);
Wale Ogunwale1666e312016-12-16 11:27:18 -0800715 displayContent.removeExistingTokensIfPossible();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700716 }
717
718 if (wallpaperDestroyed) {
719 defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -0700720 defaultDisplay.setLayoutNeeded();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700721 }
722
723 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700724 final DisplayContent displayContent = mChildren.get(displayNdx);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700725 if (displayContent.pendingLayoutChanges != 0) {
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -0700726 displayContent.setLayoutNeeded();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700727 }
728 }
729
730 // Finally update all input windows now that the window changes have stabilized.
731 mService.mInputMonitor.updateInputWindowsLw(true /*force*/);
732
733 mService.setHoldScreenLocked(mHoldScreen);
734 if (!mService.mDisplayFrozen) {
Jorim Jaggi86c39f92017-05-02 18:02:46 +0200735 final int brightness = mScreenBrightness < 0 || mScreenBrightness > 1.0f
736 ? -1 : toBrightnessOverride(mScreenBrightness);
737
738 // Post these on a handler such that we don't call into power manager service while
739 // holding the window manager lock to avoid lock contention with power manager lock.
740 mHandler.obtainMessage(SET_SCREEN_BRIGHTNESS_OVERRIDE, brightness, 0).sendToTarget();
741 mHandler.obtainMessage(SET_USER_ACTIVITY_TIMEOUT, mUserActivityTimeout).sendToTarget();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700742 }
743
744 if (mSustainedPerformanceModeCurrent != mSustainedPerformanceModeEnabled) {
745 mSustainedPerformanceModeEnabled = mSustainedPerformanceModeCurrent;
746 mService.mPowerManagerInternal.powerHint(
Ruchi Kandoi0d434042016-10-03 09:12:02 -0700747 PowerHint.SUSTAINED_PERFORMANCE,
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700748 (mSustainedPerformanceModeEnabled ? 1 : 0));
749 }
750
751 if (mService.mTurnOnScreen) {
752 if (mService.mAllowTheaterModeWakeFromLayout
753 || Settings.Global.getInt(mService.mContext.getContentResolver(),
754 Settings.Global.THEATER_MODE_ON, 0) == 0) {
755 if (DEBUG_VISIBILITY || DEBUG_POWER) {
756 Slog.v(TAG, "Turning screen on after layout!");
757 }
758 mService.mPowerManager.wakeUp(SystemClock.uptimeMillis(),
759 "android.server.wm:TURN_ON");
760 }
761 mService.mTurnOnScreen = false;
762 }
763
764 if (mUpdateRotation) {
765 if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation");
Andrii Kulian48146fd2017-08-07 11:22:50 -0700766 // TODO(multi-display): Update rotation for different displays separately.
767 final int displayId = defaultDisplay.getDisplayId();
768 if (defaultDisplay.updateRotationUnchecked(false /* inTransaction */)) {
769 mService.mH.obtainMessage(SEND_NEW_CONFIGURATION, displayId).sendToTarget();
770 } else {
771 mUpdateRotation = false;
772 }
773 // Update rotation of VR virtual display separately. Currently this is the only kind of
774 // secondary display that can be rotated because of the single-display limitations in
775 // PhoneWindowManager.
776 final DisplayContent vrDisplay = mService.mVr2dDisplayId != INVALID_DISPLAY
777 ? getDisplayContent(mService.mVr2dDisplayId) : null;
778 if (vrDisplay != null && vrDisplay.updateRotationUnchecked(false /* inTransaction */)) {
779 mService.mH.obtainMessage(SEND_NEW_CONFIGURATION, mService.mVr2dDisplayId)
780 .sendToTarget();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700781 }
782 }
783
784 if (mService.mWaitingForDrawnCallback != null ||
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -0700785 (mOrientationChangeComplete && !defaultDisplay.isLayoutNeeded()
786 && !mUpdateRotation)) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700787 mService.checkDrawnWindowsLocked();
788 }
789
790 final int N = mService.mPendingRemove.size();
791 if (N > 0) {
792 if (mService.mPendingRemoveTmp.length < N) {
793 mService.mPendingRemoveTmp = new WindowState[N+10];
794 }
795 mService.mPendingRemove.toArray(mService.mPendingRemoveTmp);
796 mService.mPendingRemove.clear();
Wale Ogunwale19e452e2016-10-12 12:36:29 -0700797 ArrayList<DisplayContent> displayList = new ArrayList();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700798 for (i = 0; i < N; i++) {
799 final WindowState w = mService.mPendingRemoveTmp[i];
800 w.removeImmediately();
801 final DisplayContent displayContent = w.getDisplayContent();
802 if (displayContent != null && !displayList.contains(displayContent)) {
803 displayList.add(displayContent);
804 }
805 }
806
Wale Ogunwalec69694a2016-10-18 13:51:15 -0700807 for (int j = displayList.size() - 1; j >= 0; --j) {
808 final DisplayContent dc = displayList.get(j);
809 dc.assignWindowLayers(true /*setLayoutNeeded*/);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700810 }
811 }
812
813 // Remove all deferred displays stacks, tasks, and activities.
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700814 for (int displayNdx = mChildren.size() - 1; displayNdx >= 0; --displayNdx) {
815 mChildren.get(displayNdx).checkCompleteDeferredRemoval();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700816 }
817
818 if (updateInputWindowsNeeded) {
819 mService.mInputMonitor.updateInputWindowsLw(false /*force*/);
820 }
David Stevensee9e2772017-02-09 16:30:27 -0800821 mService.setFocusTaskRegionLocked(null);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700822
823 // Check to see if we are now in a state where the screen should
824 // be enabled, because the window obscured flags have changed.
825 mService.enableScreenIfNeededLocked();
826
827 mService.scheduleAnimationLocked();
828 mService.mWindowPlacerLocked.destroyPendingSurfaces();
829
830 if (DEBUG_WINDOW_TRACE) Slog.e(TAG,
831 "performSurfacePlacementInner exit: animating=" + mService.mAnimator.isAnimating());
832 }
833
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700834 private void applySurfaceChangesTransaction(boolean recoveringMemory, int defaultDw,
835 int defaultDh) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700836 mHoldScreenWindow = null;
Wale Ogunwaled4a00a02016-10-10 11:29:17 -0700837 mObscuringWindow = null;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700838
Andrii Kulian8ee72852017-03-10 10:36:45 -0800839 // TODO(multi-display): Support these features on secondary screens.
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700840 if (mService.mWatermark != null) {
841 mService.mWatermark.positionSurface(defaultDw, defaultDh);
842 }
843 if (mService.mStrictModeFlash != null) {
844 mService.mStrictModeFlash.positionSurface(defaultDw, defaultDh);
845 }
846 if (mService.mCircularDisplayMask != null) {
Andrii Kulian8ee72852017-03-10 10:36:45 -0800847 mService.mCircularDisplayMask.positionSurface(defaultDw, defaultDh,
848 mService.getDefaultDisplayRotation());
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700849 }
850 if (mService.mEmulatorDisplayOverlay != null) {
851 mService.mEmulatorDisplayOverlay.positionSurface(defaultDw, defaultDh,
Andrii Kulian8ee72852017-03-10 10:36:45 -0800852 mService.getDefaultDisplayRotation());
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700853 }
854
855 boolean focusDisplayed = false;
856
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700857 final int count = mChildren.size();
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700858 for (int j = 0; j < count; ++j) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700859 final DisplayContent dc = mChildren.get(j);
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700860 focusDisplayed |= dc.applySurfaceChangesTransaction(recoveringMemory);
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700861 }
862
863 if (focusDisplayed) {
864 mService.mH.sendEmptyMessage(REPORT_LOSING_FOCUS);
865 }
866
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700867 // Give the display manager a chance to adjust properties like display rotation if it needs
868 // to.
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700869 mService.mDisplayManagerInternal.performTraversalInTransactionFromWindowManager();
870 }
871
872 /**
873 * @param w WindowState this method is applied to.
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700874 * @param obscured True if there is a window on top of this obscuring the display.
875 * @param syswin System window?
876 * @return True when the display contains content to show the user. When false, the display
877 * manager may choose to mirror or blank the display.
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700878 */
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700879 boolean handleNotObscuredLocked(WindowState w, boolean obscured, boolean syswin) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700880 final WindowManager.LayoutParams attrs = w.mAttrs;
881 final int attrFlags = attrs.flags;
882 final boolean canBeSeen = w.isDisplayedLw();
883 final int privateflags = attrs.privateFlags;
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700884 boolean displayHasContent = false;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700885
886 if (w.mHasSurface && canBeSeen) {
887 if ((attrFlags & FLAG_KEEP_SCREEN_ON) != 0) {
888 mHoldScreen = w.mSession;
889 mHoldScreenWindow = w;
890 } else if (DEBUG_KEEP_SCREEN_ON && w == mService.mLastWakeLockHoldingWindow) {
891 Slog.d(TAG_KEEP_SCREEN_ON, "handleNotObscuredLocked: " + w + " was holding "
Wale Ogunwale743fcc12017-06-06 21:36:50 +0000892 + "screen wakelock but no longer has FLAG_KEEP_SCREEN_ON!!! called by"
893 + Debug.getCallers(10));
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700894 }
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700895 if (!syswin && w.mAttrs.screenBrightness >= 0 && mScreenBrightness < 0) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700896 mScreenBrightness = w.mAttrs.screenBrightness;
897 }
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700898 if (!syswin && w.mAttrs.userActivityTimeout >= 0 && mUserActivityTimeout < 0) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700899 mUserActivityTimeout = w.mAttrs.userActivityTimeout;
900 }
901
902 final int type = attrs.type;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700903 // This function assumes that the contents of the default display are processed first
904 // before secondary displays.
905 final DisplayContent displayContent = w.getDisplayContent();
906 if (displayContent != null && displayContent.isDefaultDisplay) {
907 // While a dream or keyguard is showing, obscure ordinary application content on
908 // secondary displays (by forcibly enabling mirroring unless there is other content
909 // we want to show) but still allow opaque keyguard dialogs to be shown.
910 if (type == TYPE_DREAM || (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) {
911 mObscureApplicationContentOnSecondaryDisplays = true;
912 }
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700913 displayHasContent = true;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700914 } else if (displayContent != null &&
915 (!mObscureApplicationContentOnSecondaryDisplays
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700916 || (obscured && type == TYPE_KEYGUARD_DIALOG))) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700917 // Allow full screen keyguard presentation dialogs to be seen.
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700918 displayHasContent = true;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700919 }
920 if ((privateflags & PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE) != 0) {
921 mSustainedPerformanceModeCurrent = true;
922 }
923 }
Wale Ogunwalef7cab102016-10-25 15:25:14 -0700924
925 return displayHasContent;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700926 }
927
928 boolean copyAnimToLayoutParams() {
929 boolean doRequest = false;
930
931 final int bulkUpdateParams = mService.mAnimator.mBulkUpdateParams;
932 if ((bulkUpdateParams & SET_UPDATE_ROTATION) != 0) {
933 mUpdateRotation = true;
934 doRequest = true;
935 }
936 if ((bulkUpdateParams & SET_WALLPAPER_MAY_CHANGE) != 0) {
937 mWallpaperMayChange = true;
938 doRequest = true;
939 }
940 if ((bulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0) {
941 mWallpaperForceHidingChanged = true;
942 doRequest = true;
943 }
944 if ((bulkUpdateParams & SET_ORIENTATION_CHANGE_COMPLETE) == 0) {
945 mOrientationChangeComplete = false;
946 } else {
947 mOrientationChangeComplete = true;
948 mLastWindowFreezeSource = mService.mAnimator.mLastWindowFreezeSource;
949 if (mService.mWindowsFreezingScreen != WINDOWS_FREEZING_SCREENS_NONE) {
950 doRequest = true;
951 }
952 }
953 if ((bulkUpdateParams & SET_TURN_ON_SCREEN) != 0) {
954 mService.mTurnOnScreen = true;
955 }
956 if ((bulkUpdateParams & SET_WALLPAPER_ACTION_PENDING) != 0) {
957 mWallpaperActionPending = true;
958 }
959
960 return doRequest;
961 }
962
963 private static int toBrightnessOverride(float value) {
964 return (int)(value * PowerManager.BRIGHTNESS_ON);
965 }
966
Jorim Jaggi86c39f92017-05-02 18:02:46 +0200967 private final class MyHandler extends Handler {
968
969 public MyHandler(Looper looper) {
970 super(looper);
971 }
972
973 @Override
974 public void handleMessage(Message msg) {
975 switch (msg.what) {
976 case SET_SCREEN_BRIGHTNESS_OVERRIDE:
977 mService.mPowerManagerInternal.setScreenBrightnessOverrideFromWindowManager(
978 msg.arg1);
979 break;
980 case SET_USER_ACTIVITY_TIMEOUT:
981 mService.mPowerManagerInternal.setUserActivityTimeoutOverrideFromWindowManager(
982 (Long) msg.obj);
983 break;
984 default:
985 break;
986 }
987 }
988 }
989
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700990 void enableSurfaceTrace(ParcelFileDescriptor pfd) {
991 final FileDescriptor fd = pfd.getFileDescriptor();
992 if (mSurfaceTraceEnabled) {
993 disableSurfaceTrace();
994 }
995 mSurfaceTraceEnabled = true;
996 mRemoteEventTrace = new RemoteEventTrace(mService, fd);
997 mSurfaceTraceFd = pfd;
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -0700998 for (int displayNdx = mChildren.size() - 1; displayNdx >= 0; --displayNdx) {
999 final DisplayContent dc = mChildren.get(displayNdx);
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001000 dc.enableSurfaceTrace(fd);
1001 }
1002 }
1003
1004 void disableSurfaceTrace() {
1005 mSurfaceTraceEnabled = false;
1006 mRemoteEventTrace = null;
1007 mSurfaceTraceFd = null;
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -07001008 for (int displayNdx = mChildren.size() - 1; displayNdx >= 0; --displayNdx) {
1009 final DisplayContent dc = mChildren.get(displayNdx);
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001010 dc.disableSurfaceTrace();
1011 }
1012 }
1013
1014 void dumpDisplayContents(PrintWriter pw) {
1015 pw.println("WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)");
1016 if (mService.mDisplayReady) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -07001017 final int count = mChildren.size();
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001018 for (int i = 0; i < count; ++i) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -07001019 final DisplayContent displayContent = mChildren.get(i);
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001020 displayContent.dump(" ", pw);
1021 }
1022 } else {
1023 pw.println(" NO DISPLAY");
1024 }
1025 }
1026
1027 void dumpLayoutNeededDisplayIds(PrintWriter pw) {
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -07001028 if (!isLayoutNeeded()) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001029 return;
1030 }
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -07001031 pw.print(" mLayoutNeeded on displays=");
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -07001032 final int count = mChildren.size();
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001033 for (int displayNdx = 0; displayNdx < count; ++displayNdx) {
Wale Ogunwaleeaabfab2016-09-16 17:19:52 -07001034 final DisplayContent displayContent = mChildren.get(displayNdx);
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -07001035 if (displayContent.isLayoutNeeded()) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001036 pw.print(displayContent.getDisplayId());
1037 }
1038 }
1039 pw.println();
1040 }
1041
1042 void dumpWindowsNoHeader(PrintWriter pw, boolean dumpAll, ArrayList<WindowState> windows) {
Wale Ogunwaled1880962016-11-08 10:31:59 -08001043 final int[] index = new int[1];
1044 forAllWindows((w) -> {
1045 if (windows == null || windows.contains(w)) {
1046 pw.println(" Window #" + index[0] + " " + w + ":");
1047 w.dump(pw, " ", dumpAll || windows != null);
1048 index[0] = index[0] + 1;
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001049 }
Wale Ogunwaled1880962016-11-08 10:31:59 -08001050 }, true /* traverseTopToBottom */);
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001051 }
Wale Ogunwaleba51ca22016-09-23 06:06:54 -07001052
Wale Ogunwale02319a62016-09-26 15:21:22 -07001053 void dumpTokens(PrintWriter pw, boolean dumpAll) {
1054 pw.println(" All tokens:");
1055 for (int i = mChildren.size() - 1; i >= 0; --i) {
1056 mChildren.get(i).dumpTokens(pw, dumpAll);
1057 }
1058 }
1059
Steven Timotiusaf03df62017-07-18 16:56:43 -07001060 void writeToProto(ProtoOutputStream proto) {
1061 if (mService.mDisplayReady) {
1062 final int count = mChildren.size();
1063 for (int i = 0; i < count; ++i) {
1064 final DisplayContent displayContent = mChildren.get(i);
1065 displayContent.writeToProto(proto, DISPLAYS);
1066 }
1067 }
1068 forAllWindows((w) -> {
1069 w.writeIdentifierToProto(proto, WINDOWS);
1070 }, true);
1071 }
1072
Wale Ogunwaleba51ca22016-09-23 06:06:54 -07001073 @Override
1074 String getName() {
1075 return "ROOT";
1076 }
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001077}