blob: b33f8c7ad658f6dd1440403531a0b6e4f7d203ec [file] [log] [blame]
Dianne Hackborn6e1eb762011-02-17 16:07:28 -08001/*
2 * Copyright (C) 2011 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
Jorim Jaggif12ec0f2017-08-23 16:14:10 +020019import static android.Manifest.permission.DEVICE_POWER;
Wale Ogunwale01ad4342017-06-30 07:07:01 -070020import static android.Manifest.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
Wale Ogunwale943002b2017-02-15 19:34:01 -080021import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
22import static android.content.pm.PackageManager.PERMISSION_GRANTED;
Wale Ogunwale4958ad22017-06-22 09:08:14 -070023import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
Wale Ogunwaled993a572017-02-05 13:52:09 -080024import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
Wale Ogunwale943002b2017-02-15 19:34:01 -080025import static android.view.WindowManager.LayoutParams.isSystemAlertWindowType;
Adrian Roos5c6b6222017-11-07 17:36:10 +010026
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080027import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_POSITIONING;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080028import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS;
29import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080030
31import android.content.ClipData;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080032import android.graphics.Rect;
33import android.graphics.Region;
34import android.os.Binder;
35import android.os.Bundle;
36import android.os.IBinder;
37import android.os.Parcel;
Dianne Hackborn5fe7e2a2012-10-04 11:58:16 -070038import android.os.Process;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080039import android.os.RemoteException;
Wale Ogunwale4958ad22017-06-22 09:08:14 -070040import android.os.Trace;
Dianne Hackborn5fe7e2a2012-10-04 11:58:16 -070041import android.os.UserHandle;
Andrii Kulian44607962017-03-16 11:06:24 -070042import android.util.MergedConfiguration;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080043import android.util.Slog;
Adrian Roos5c6b6222017-11-07 17:36:10 +010044import android.view.DisplayCutout;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080045import android.view.IWindow;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080046import android.view.IWindowId;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080047import android.view.IWindowSession;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080048import android.view.IWindowSessionCallback;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080049import android.view.InputChannel;
Tiger Huangdda14a72019-01-10 17:20:27 +080050import android.view.InsetsState;
Daichi Hironoa1fb9be2017-12-18 17:02:54 +090051import android.view.SurfaceControl;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080052import android.view.SurfaceSession;
53import android.view.WindowManager;
54
Chenjie Yue8904192017-12-08 19:12:57 -080055import com.android.internal.os.logging.MetricsLoggerWrapper;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080056import com.android.server.wm.WindowManagerService.H;
57
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080058import java.io.PrintWriter;
Wale Ogunwale943002b2017-02-15 19:34:01 -080059import java.util.HashSet;
Adrian Roos4ffc8972019-02-07 20:45:11 +010060import java.util.List;
Wale Ogunwale943002b2017-02-15 19:34:01 -080061import java.util.Set;
wilsonshihc32538e2018-11-07 17:27:34 +080062import java.util.function.BiConsumer;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080063
64/**
65 * This class represents an active client session. There is generally one
66 * Session object per process that is interacting with the window manager.
67 */
Bryce Leea5592862017-10-23 12:57:37 -070068class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080069 final WindowManagerService mService;
Dianne Hackborneb94fa72014-06-03 17:48:12 -070070 final IWindowSessionCallback mCallback;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080071 final int mUid;
72 final int mPid;
Wale Ogunwalecfca2582016-10-19 09:53:25 -070073 private final String mStringName;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080074 SurfaceSession mSurfaceSession;
Wale Ogunwalecfca2582016-10-19 09:53:25 -070075 private int mNumWindow = 0;
Wale Ogunwale943002b2017-02-15 19:34:01 -080076 // Set of visible application overlay window surfaces connected to this session.
77 private final Set<WindowSurfaceController> mAppOverlaySurfaces = new HashSet<>();
78 // Set of visible alert window surfaces connected to this session.
79 private final Set<WindowSurfaceController> mAlertWindowSurfaces = new HashSet<>();
Daichi Hironodf5cf622017-09-11 14:59:26 +090080 private final DragDropController mDragDropController;
Wale Ogunwale943002b2017-02-15 19:34:01 -080081 final boolean mCanAddInternalSystemWindow;
Wale Ogunwale01ad4342017-06-30 07:07:01 -070082 final boolean mCanHideNonSystemOverlayWindows;
Jorim Jaggif12ec0f2017-08-23 16:14:10 +020083 final boolean mCanAcquireSleepToken;
Wale Ogunwale387e4c62017-02-13 09:50:02 -080084 private AlertWindowNotification mAlertWindowNotification;
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -070085 private boolean mShowingAlertWindowNotificationAllowed;
Wale Ogunwalecfca2582016-10-19 09:53:25 -070086 private boolean mClientDead = false;
87 private float mLastReportedAnimatorScale;
Wale Ogunwale387e4c62017-02-13 09:50:02 -080088 private String mPackageName;
Wale Ogunwale4958ad22017-06-22 09:08:14 -070089 private String mRelayoutTag;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080090
Yohei Yukawaa71bb252018-09-19 19:21:24 -070091 public Session(WindowManagerService service, IWindowSessionCallback callback) {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080092 mService = service;
Dianne Hackborneb94fa72014-06-03 17:48:12 -070093 mCallback = callback;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080094 mUid = Binder.getCallingUid();
95 mPid = Binder.getCallingPid();
Dianne Hackborneb94fa72014-06-03 17:48:12 -070096 mLastReportedAnimatorScale = service.getCurrentAnimatorScale();
Wale Ogunwale5aa86832017-02-28 10:40:27 -080097 mCanAddInternalSystemWindow = service.mContext.checkCallingOrSelfPermission(
Wale Ogunwale943002b2017-02-15 19:34:01 -080098 INTERNAL_SYSTEM_WINDOW) == PERMISSION_GRANTED;
Wale Ogunwale01ad4342017-06-30 07:07:01 -070099 mCanHideNonSystemOverlayWindows = service.mContext.checkCallingOrSelfPermission(
100 HIDE_NON_SYSTEM_OVERLAY_WINDOWS) == PERMISSION_GRANTED;
Jorim Jaggif12ec0f2017-08-23 16:14:10 +0200101 mCanAcquireSleepToken = service.mContext.checkCallingOrSelfPermission(DEVICE_POWER)
102 == PERMISSION_GRANTED;
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700103 mShowingAlertWindowNotificationAllowed = mService.mShowAlertWindowNotifications;
Daichi Hironodf5cf622017-09-11 14:59:26 +0900104 mDragDropController = mService.mDragDropController;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800105 StringBuilder sb = new StringBuilder();
106 sb.append("Session{");
107 sb.append(Integer.toHexString(System.identityHashCode(this)));
Dianne Hackborn5fe7e2a2012-10-04 11:58:16 -0700108 sb.append(" ");
109 sb.append(mPid);
110 if (mUid < Process.FIRST_APPLICATION_UID) {
111 sb.append(":");
112 sb.append(mUid);
113 } else {
114 sb.append(":u");
115 sb.append(UserHandle.getUserId(mUid));
116 sb.append('a');
117 sb.append(UserHandle.getAppId(mUid));
118 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800119 sb.append("}");
120 mStringName = sb.toString();
121
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800122 try {
Yohei Yukawaa71bb252018-09-19 19:21:24 -0700123 mCallback.asBinder().linkToDeath(this, 0);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800124 } catch (RemoteException e) {
125 // The caller has died, so we can just forget about this.
Yohei Yukawaa71bb252018-09-19 19:21:24 -0700126 // Hmmm, should we call killSessionLocked()??
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800127 }
128 }
129
130 @Override
131 public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
132 throws RemoteException {
133 try {
134 return super.onTransact(code, data, reply, flags);
135 } catch (RuntimeException e) {
136 // Log all 'real' exceptions thrown to the caller
137 if (!(e instanceof SecurityException)) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800138 Slog.wtf(TAG_WM, "Window Session Crash", e);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800139 }
140 throw e;
141 }
142 }
143
Andrew Scull26f830d2017-05-19 12:16:10 +0100144 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800145 public void binderDied() {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700146 synchronized (mService.mGlobalLock) {
Yohei Yukawaa71bb252018-09-19 19:21:24 -0700147 mCallback.asBinder().unlinkToDeath(this, 0);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800148 mClientDead = true;
149 killSessionLocked();
150 }
151 }
152
Craig Mautner6881a102012-07-27 13:04:51 -0700153 @Override
Craig Mautner6881a102012-07-27 13:04:51 -0700154 public int addToDisplay(IWindow window, int seq, WindowManager.LayoutParams attrs,
Adrian Roos9e370f22018-03-06 18:19:45 +0100155 int viewVisibility, int displayId, Rect outFrame, Rect outContentInsets,
156 Rect outStableInsets, Rect outOutsets,
Jorim Jaggif96c90a2018-09-26 16:55:15 +0200157 DisplayCutout.ParcelableWrapper outDisplayCutout, InputChannel outInputChannel,
158 InsetsState outInsetsState) {
Adrian Roos9e370f22018-03-06 18:19:45 +0100159 return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId, outFrame,
Jorim Jaggif96c90a2018-09-26 16:55:15 +0200160 outContentInsets, outStableInsets, outOutsets, outDisplayCutout, outInputChannel,
161 outInsetsState);
Craig Mautner6881a102012-07-27 13:04:51 -0700162 }
163
164 @Override
Craig Mautner6881a102012-07-27 13:04:51 -0700165 public int addToDisplayWithoutInputChannel(IWindow window, int seq, WindowManager.LayoutParams attrs,
Jorim Jaggif96c90a2018-09-26 16:55:15 +0200166 int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets,
167 InsetsState outInsetsState) {
Craig Mautner6881a102012-07-27 13:04:51 -0700168 return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
Adrian Roos9e370f22018-03-06 18:19:45 +0100169 new Rect() /* outFrame */, outContentInsets, outStableInsets, null /* outOutsets */,
Jorim Jaggif96c90a2018-09-26 16:55:15 +0200170 new DisplayCutout.ParcelableWrapper() /* cutout */, null /* outInputChannel */,
171 outInsetsState);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800172 }
173
Andrew Scull26f830d2017-05-19 12:16:10 +0100174 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800175 public void remove(IWindow window) {
176 mService.removeWindow(this, window);
177 }
178
Rob Carr64e516f2015-10-29 00:20:45 +0000179 @Override
Robert Carr77bdfb52016-05-02 18:18:31 -0700180 public void prepareToReplaceWindows(IBinder appToken, boolean childrenOnly) {
Wale Ogunwale9bc47732016-08-10 14:44:22 -0700181 mService.setWillReplaceWindows(appToken, childrenOnly);
Robert Carr23fa16b2016-01-13 13:19:58 -0800182 }
183
Andrew Scull26f830d2017-05-19 12:16:10 +0100184 @Override
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700185 public int relayout(IWindow window, int seq, WindowManager.LayoutParams attrs,
chaviwbe43ac82018-04-04 15:14:49 -0700186 int requestedWidth, int requestedHeight, int viewFlags, int flags, long frameNumber,
187 Rect outFrame, Rect outOverscanInsets, Rect outContentInsets, Rect outVisibleInsets,
188 Rect outStableInsets, Rect outsets, Rect outBackdropFrame,
189 DisplayCutout.ParcelableWrapper cutout, MergedConfiguration mergedConfiguration,
Robert Carr5fea55b2018-12-10 13:05:52 -0800190 SurfaceControl outSurfaceControl, InsetsState outInsetsState) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800191 if (false) Slog.d(TAG_WM, ">>>>>> ENTERED relayout from "
Dianne Hackbornb961cd22011-06-21 12:13:37 -0700192 + Binder.getCallingPid());
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700193 Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, mRelayoutTag);
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700194 int res = mService.relayoutWindow(this, window, seq, attrs,
chaviwbe43ac82018-04-04 15:14:49 -0700195 requestedWidth, requestedHeight, viewFlags, flags, frameNumber,
Dianne Hackbornc4aad012013-02-22 15:05:25 -0800196 outFrame, outOverscanInsets, outContentInsets, outVisibleInsets,
Adrian Roos5c6b6222017-11-07 17:36:10 +0100197 outStableInsets, outsets, outBackdropFrame, cutout,
Robert Carr5fea55b2018-12-10 13:05:52 -0800198 mergedConfiguration, outSurfaceControl, outInsetsState);
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700199 Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800200 if (false) Slog.d(TAG_WM, "<<<<<< EXITING relayout to "
Dianne Hackbornb961cd22011-06-21 12:13:37 -0700201 + Binder.getCallingPid());
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800202 return res;
203 }
204
Andrew Scull26f830d2017-05-19 12:16:10 +0100205 @Override
Dianne Hackborn64825172011-03-02 21:32:58 -0800206 public boolean outOfMemory(IWindow window) {
207 return mService.outOfMemoryWindow(this, window);
208 }
209
Andrew Scull26f830d2017-05-19 12:16:10 +0100210 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800211 public void setTransparentRegion(IWindow window, Region region) {
212 mService.setTransparentRegionWindow(this, window, region);
213 }
214
Andrew Scull26f830d2017-05-19 12:16:10 +0100215 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800216 public void setInsets(IWindow window, int touchableInsets,
217 Rect contentInsets, Rect visibleInsets, Region touchableArea) {
218 mService.setInsetsWindow(this, window, touchableInsets, contentInsets,
219 visibleInsets, touchableArea);
220 }
221
Andrew Scull26f830d2017-05-19 12:16:10 +0100222 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800223 public void getDisplayFrame(IWindow window, Rect outDisplayFrame) {
224 mService.getWindowDisplayFrame(this, window, outDisplayFrame);
225 }
226
Andrew Scull26f830d2017-05-19 12:16:10 +0100227 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800228 public void finishDrawing(IWindow window) {
229 if (WindowManagerService.localLOGV) Slog.v(
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800230 TAG_WM, "IWindow finishDrawing called for " + window);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800231 mService.finishDrawingWindow(this, window);
232 }
233
Andrew Scull26f830d2017-05-19 12:16:10 +0100234 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800235 public void setInTouchMode(boolean mode) {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700236 synchronized (mService.mGlobalLock) {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800237 mService.mInTouchMode = mode;
238 }
239 }
240
Andrew Scull26f830d2017-05-19 12:16:10 +0100241 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800242 public boolean getInTouchMode() {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700243 synchronized (mService.mGlobalLock) {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800244 return mService.mInTouchMode;
245 }
246 }
247
Andrew Scull26f830d2017-05-19 12:16:10 +0100248 @Override
Arthur Hunga4c52062019-02-19 11:31:44 +0800249 public boolean performHapticFeedback(int effectId, boolean always) {
250 long ident = Binder.clearCallingIdentity();
251 try {
252 return mService.mPolicy.performHapticFeedback(mUid, mPackageName,
Alexey Kuzmine1f06b82018-06-20 17:48:43 +0100253 effectId, always, null);
Arthur Hunga4c52062019-02-19 11:31:44 +0800254 } finally {
255 Binder.restoreCallingIdentity(ident);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800256 }
257 }
258
259 /* Drag/drop */
Daichi Hironofabca092017-12-19 15:02:50 +0900260
Andrew Scull26f830d2017-05-19 12:16:10 +0100261 @Override
Daichi Hironofabca092017-12-19 15:02:50 +0900262 public IBinder performDrag(IWindow window, int flags, SurfaceControl surface, int touchSource,
263 float touchX, float touchY, float thumbCenterX, float thumbCenterY, ClipData data) {
Daichi Hironodf5cf622017-09-11 14:59:26 +0900264 final int callerPid = Binder.getCallingPid();
265 final int callerUid = Binder.getCallingUid();
266 final long ident = Binder.clearCallingIdentity();
267 try {
Daichi Hironofabca092017-12-19 15:02:50 +0900268 return mDragDropController.performDrag(mSurfaceSession, callerPid, callerUid, window,
269 flags, surface, touchSource, touchX, touchY, thumbCenterX, thumbCenterY, data);
Daichi Hironodf5cf622017-09-11 14:59:26 +0900270 } finally {
271 Binder.restoreCallingIdentity(ident);
272 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800273 }
274
Andrew Scull26f830d2017-05-19 12:16:10 +0100275 @Override
Daichi Hironodf5cf622017-09-11 14:59:26 +0900276 public void reportDropResult(IWindow window, boolean consumed) {
277 final long ident = Binder.clearCallingIdentity();
278 try {
Daichi Hirono58e25e12017-10-25 15:48:08 +0900279 mDragDropController.reportDropResult(window, consumed);
Daichi Hironodf5cf622017-09-11 14:59:26 +0900280 } finally {
281 Binder.restoreCallingIdentity(ident);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800282 }
Daichi Hironodf5cf622017-09-11 14:59:26 +0900283 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800284
Daichi Hironodf5cf622017-09-11 14:59:26 +0900285 @Override
Daichi Hirono3e9d5102019-04-15 15:58:11 +0900286 public void cancelDragAndDrop(IBinder dragToken, boolean skipAnimation) {
Daichi Hironodf5cf622017-09-11 14:59:26 +0900287 final long ident = Binder.clearCallingIdentity();
288 try {
Daichi Hirono3e9d5102019-04-15 15:58:11 +0900289 mDragDropController.cancelDragAndDrop(dragToken, skipAnimation);
Daichi Hironodf5cf622017-09-11 14:59:26 +0900290 } finally {
291 Binder.restoreCallingIdentity(ident);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800292 }
Daichi Hironodf5cf622017-09-11 14:59:26 +0900293 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800294
Daichi Hironodf5cf622017-09-11 14:59:26 +0900295 @Override
296 public void dragRecipientEntered(IWindow window) {
297 mDragDropController.dragRecipientEntered(window);
298 }
299
300 @Override
301 public void dragRecipientExited(IWindow window) {
302 mDragDropController.dragRecipientExited(window);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800303 }
304
Andrew Scull26f830d2017-05-19 12:16:10 +0100305 @Override
Chong Zhang8e89b312015-09-09 15:09:30 -0700306 public boolean startMovingTask(IWindow window, float startX, float startY) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800307 if (DEBUG_TASK_POSITIONING) Slog.d(
308 TAG_WM, "startMovingTask: {" + startX + "," + startY + "}");
Chong Zhang8e89b312015-09-09 15:09:30 -0700309
Wale Ogunwale09e1b8d2016-02-23 10:38:35 -0800310 long ident = Binder.clearCallingIdentity();
311 try {
Daichi Hirono34fb7312017-12-04 10:00:24 +0900312 return mService.mTaskPositioningController.startMovingTask(window, startX, startY);
Wale Ogunwale09e1b8d2016-02-23 10:38:35 -0800313 } finally {
314 Binder.restoreCallingIdentity(ident);
315 }
Chong Zhang8e89b312015-09-09 15:09:30 -0700316 }
317
Adrian Roos4ffc8972019-02-07 20:45:11 +0100318 @Override
319 public void reportSystemGestureExclusionChanged(IWindow window, List<Rect> exclusionRects) {
320 long ident = Binder.clearCallingIdentity();
321 try {
322 mService.reportSystemGestureExclusionChanged(this, window, exclusionRects);
323 } finally {
324 Binder.restoreCallingIdentity(ident);
325 }
326 }
327
wilsonshihc32538e2018-11-07 17:27:34 +0800328 private void actionOnWallpaper(IBinder window,
329 BiConsumer<WallpaperController, WindowState> action) {
330 final WindowState windowState = mService.windowForClientLocked(this, window, true);
331 action.accept(windowState.getDisplayContent().mWallpaperController, windowState);
332 }
333
Andrew Scull26f830d2017-05-19 12:16:10 +0100334 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800335 public void setWallpaperPosition(IBinder window, float x, float y, float xStep, float yStep) {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700336 synchronized (mService.mGlobalLock) {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800337 long ident = Binder.clearCallingIdentity();
338 try {
wilsonshihc32538e2018-11-07 17:27:34 +0800339 actionOnWallpaper(window, (wpController, windowState) ->
340 wpController.setWindowWallpaperPosition(windowState, x, y, xStep, yStep));
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800341 } finally {
342 Binder.restoreCallingIdentity(ident);
343 }
344 }
345 }
346
Andrew Scull26f830d2017-05-19 12:16:10 +0100347 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800348 public void wallpaperOffsetsComplete(IBinder window) {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700349 synchronized (mService.mGlobalLock) {
wilsonshihc32538e2018-11-07 17:27:34 +0800350 actionOnWallpaper(window, (wpController, windowState) ->
351 wpController.wallpaperOffsetsComplete(window));
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700352 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800353 }
354
Andrew Scull26f830d2017-05-19 12:16:10 +0100355 @Override
Dianne Hackborn067e5f62014-09-07 23:14:30 -0700356 public void setWallpaperDisplayOffset(IBinder window, int x, int y) {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700357 synchronized (mService.mGlobalLock) {
Dianne Hackborn067e5f62014-09-07 23:14:30 -0700358 long ident = Binder.clearCallingIdentity();
359 try {
wilsonshihc32538e2018-11-07 17:27:34 +0800360 actionOnWallpaper(window, (wpController, windowState) ->
361 wpController.setWindowWallpaperDisplayOffset(windowState, x, y));
Dianne Hackborn067e5f62014-09-07 23:14:30 -0700362 } finally {
363 Binder.restoreCallingIdentity(ident);
364 }
365 }
366 }
367
Andrew Scull26f830d2017-05-19 12:16:10 +0100368 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800369 public Bundle sendWallpaperCommand(IBinder window, String action, int x, int y,
370 int z, Bundle extras, boolean sync) {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700371 synchronized (mService.mGlobalLock) {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800372 long ident = Binder.clearCallingIdentity();
373 try {
wilsonshihc32538e2018-11-07 17:27:34 +0800374 final WindowState windowState = mService.windowForClientLocked(this, window, true);
375 return windowState.getDisplayContent().mWallpaperController
376 .sendWindowWallpaperCommand(windowState, action, x, y, z, extras, sync);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800377 } finally {
378 Binder.restoreCallingIdentity(ident);
379 }
380 }
381 }
382
Andrew Scull26f830d2017-05-19 12:16:10 +0100383 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800384 public void wallpaperCommandComplete(IBinder window, Bundle result) {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700385 synchronized (mService.mGlobalLock) {
wilsonshihc32538e2018-11-07 17:27:34 +0800386 actionOnWallpaper(window, (wpController, windowState) ->
387 wpController.wallpaperCommandComplete(window));
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700388 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800389 }
390
Andrew Scull26f830d2017-05-19 12:16:10 +0100391 @Override
Svetoslavf7174e82014-06-12 11:29:35 -0700392 public void onRectangleOnScreenRequested(IBinder token, Rect rectangle) {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700393 synchronized (mService.mGlobalLock) {
Svetoslav Ganov1cf70bb2012-08-06 10:53:34 -0700394 final long identity = Binder.clearCallingIdentity();
395 try {
Svetoslavf7174e82014-06-12 11:29:35 -0700396 mService.onRectangleOnScreenRequested(token, rectangle);
Svetoslav Ganov1cf70bb2012-08-06 10:53:34 -0700397 } finally {
398 Binder.restoreCallingIdentity(identity);
399 }
400 }
401 }
402
Andrew Scull26f830d2017-05-19 12:16:10 +0100403 @Override
Dianne Hackborne3f23a32013-03-01 13:25:35 -0800404 public IWindowId getWindowId(IBinder window) {
405 return mService.getWindowId(window);
406 }
407
Jeff Brownc2932a12014-11-20 18:04:05 -0800408 @Override
409 public void pokeDrawLock(IBinder window) {
410 final long identity = Binder.clearCallingIdentity();
411 try {
412 mService.pokeDrawLock(this, window);
413 } finally {
414 Binder.restoreCallingIdentity(identity);
415 }
416 }
417
Vladislav Kaznacheev989b58a2016-02-10 12:19:33 -0800418 @Override
419 public void updatePointerIcon(IWindow window) {
420 final long identity = Binder.clearCallingIdentity();
421 try {
422 mService.updatePointerIcon(window);
423 } finally {
424 Binder.restoreCallingIdentity(identity);
425 }
426 }
427
Andrii Kulian4b6599e2018-01-15 17:24:08 -0800428 @Override
Tiger Huang2b210c22019-03-18 21:21:26 +0800429 public void updateTapExcludeRegion(IWindow window, int regionId, Region region) {
Andrii Kulian4b6599e2018-01-15 17:24:08 -0800430 final long identity = Binder.clearCallingIdentity();
431 try {
Tiger Huang2b210c22019-03-18 21:21:26 +0800432 mService.updateTapExcludeRegion(window, regionId, region);
Andrii Kulian4b6599e2018-01-15 17:24:08 -0800433 } finally {
434 Binder.restoreCallingIdentity(identity);
435 }
436 }
437
Jorim Jaggie35c0592018-11-06 16:21:08 +0100438 @Override
439 public void insetsModified(IWindow window, InsetsState state) {
Tiger Huangdda14a72019-01-10 17:20:27 +0800440 synchronized (mService.mGlobalLock) {
Jorim Jaggie35c0592018-11-06 16:21:08 +0100441 final WindowState windowState = mService.windowForClientLocked(this, window,
442 false /* throwOnError */);
443 if (windowState != null) {
444 windowState.getDisplayContent().getInsetsStateController().onInsetsModified(
445 windowState, state);
446 }
447 }
448 }
449
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800450 void windowAddedLocked(String packageName) {
451 mPackageName = packageName;
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700452 mRelayoutTag = "relayoutWindow: " + mPackageName;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800453 if (mSurfaceSession == null) {
454 if (WindowManagerService.localLOGV) Slog.v(
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800455 TAG_WM, "First window added to " + this + ", creating SurfaceSession");
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800456 mSurfaceSession = new SurfaceSession();
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800457 if (SHOW_TRANSACTIONS) Slog.i(
458 TAG_WM, " NEW SURFACE SESSION " + mSurfaceSession);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800459 mService.mSessions.add(this);
Dianne Hackborneb94fa72014-06-03 17:48:12 -0700460 if (mLastReportedAnimatorScale != mService.getCurrentAnimatorScale()) {
461 mService.dispatchNewAnimatorScaleLocked(this);
462 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800463 }
464 mNumWindow++;
465 }
466
Wale Ogunwale943002b2017-02-15 19:34:01 -0800467 void windowRemovedLocked() {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800468 mNumWindow--;
Wale Ogunwale943002b2017-02-15 19:34:01 -0800469 killSessionLocked();
470 }
471
472
473 void onWindowSurfaceVisibilityChanged(WindowSurfaceController surfaceController,
474 boolean visible, int type) {
475
476 if (!isSystemAlertWindowType(type)) {
477 return;
478 }
479
480 boolean changed;
481
482 if (!mCanAddInternalSystemWindow) {
483 // We want to track non-system signature apps adding alert windows so we can post an
484 // on-going notification for the user to control their visibility.
485 if (visible) {
486 changed = mAlertWindowSurfaces.add(surfaceController);
Chenjie Yu08d6d722018-02-28 10:19:54 -0800487 MetricsLoggerWrapper.logAppOverlayEnter(mUid, mPackageName, changed, type, true);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800488 } else {
489 changed = mAlertWindowSurfaces.remove(surfaceController);
Chenjie Yu08d6d722018-02-28 10:19:54 -0800490 MetricsLoggerWrapper.logAppOverlayExit(mUid, mPackageName, changed, type, true);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800491 }
492
493 if (changed) {
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800494 if (mAlertWindowSurfaces.isEmpty()) {
495 cancelAlertWindowNotification();
496 } else if (mAlertWindowNotification == null){
Wale Ogunwaled76881e2017-03-10 13:17:56 -0800497 mAlertWindowNotification = new AlertWindowNotification(mService, mPackageName);
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700498 if (mShowingAlertWindowNotificationAllowed) {
499 mAlertWindowNotification.post();
500 }
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800501 }
Wale Ogunwaled993a572017-02-05 13:52:09 -0800502 }
503 }
Wale Ogunwale943002b2017-02-15 19:34:01 -0800504
505 if (type != TYPE_APPLICATION_OVERLAY) {
506 return;
507 }
508
509 if (visible) {
510 changed = mAppOverlaySurfaces.add(surfaceController);
Chenjie Yu08d6d722018-02-28 10:19:54 -0800511 MetricsLoggerWrapper.logAppOverlayEnter(mUid, mPackageName, changed, type, false);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800512 } else {
513 changed = mAppOverlaySurfaces.remove(surfaceController);
Chenjie Yu08d6d722018-02-28 10:19:54 -0800514 MetricsLoggerWrapper.logAppOverlayExit(mUid, mPackageName, changed, type, false);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800515 }
516
517 if (changed) {
518 // Notify activity manager of changes to app overlay windows so it can adjust the
519 // importance score for the process.
520 setHasOverlayUi(!mAppOverlaySurfaces.isEmpty());
521 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800522 }
523
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700524 void setShowingAlertWindowNotificationAllowed(boolean allowed) {
525 mShowingAlertWindowNotificationAllowed = allowed;
526 if (mAlertWindowNotification != null) {
527 if (allowed) {
528 mAlertWindowNotification.post();
529 } else {
Wale Ogunwale6c8f2e42018-02-01 09:07:34 -0800530 mAlertWindowNotification.cancel(false /* deleteChannel */);
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700531 }
532 }
533 }
534
Wale Ogunwaled993a572017-02-05 13:52:09 -0800535 private void killSessionLocked() {
536 if (mNumWindow > 0 || !mClientDead) {
537 return;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800538 }
Wale Ogunwaled993a572017-02-05 13:52:09 -0800539
540 mService.mSessions.remove(this);
541 if (mSurfaceSession == null) {
542 return;
543 }
544
545 if (WindowManagerService.localLOGV) Slog.v(TAG_WM, "Last window removed from " + this
546 + ", destroying " + mSurfaceSession);
547 if (SHOW_TRANSACTIONS) Slog.i(TAG_WM, " KILL SURFACE SESSION " + mSurfaceSession);
548 try {
549 mSurfaceSession.kill();
550 } catch (Exception e) {
551 Slog.w(TAG_WM, "Exception thrown when killing surface session " + mSurfaceSession
552 + " in session " + this + ": " + e.toString());
553 }
554 mSurfaceSession = null;
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800555 mAlertWindowSurfaces.clear();
556 mAppOverlaySurfaces.clear();
Wale Ogunwaled993a572017-02-05 13:52:09 -0800557 setHasOverlayUi(false);
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800558 cancelAlertWindowNotification();
Wale Ogunwaled993a572017-02-05 13:52:09 -0800559 }
560
561 private void setHasOverlayUi(boolean hasOverlayUi) {
562 mService.mH.obtainMessage(H.SET_HAS_OVERLAY_UI, mPid, hasOverlayUi ? 1 : 0).sendToTarget();
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800563 }
564
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800565 private void cancelAlertWindowNotification() {
566 if (mAlertWindowNotification == null) {
567 return;
568 }
Wale Ogunwale6c8f2e42018-02-01 09:07:34 -0800569 mAlertWindowNotification.cancel(true /* deleteChannel */);
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800570 mAlertWindowNotification = null;
571 }
572
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800573 void dump(PrintWriter pw, String prefix) {
574 pw.print(prefix); pw.print("mNumWindow="); pw.print(mNumWindow);
Wale Ogunwale5aa86832017-02-28 10:40:27 -0800575 pw.print(" mCanAddInternalSystemWindow="); pw.print(mCanAddInternalSystemWindow);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800576 pw.print(" mAppOverlaySurfaces="); pw.print(mAppOverlaySurfaces);
577 pw.print(" mAlertWindowSurfaces="); pw.print(mAlertWindowSurfaces);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800578 pw.print(" mClientDead="); pw.print(mClientDead);
579 pw.print(" mSurfaceSession="); pw.println(mSurfaceSession);
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700580 pw.print(prefix); pw.print("mPackageName="); pw.println(mPackageName);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800581 }
582
583 @Override
584 public String toString() {
585 return mStringName;
586 }
Robert Carr0e007272017-10-02 13:00:55 -0700587
588 boolean hasAlertWindowSurfaces() {
589 return !mAlertWindowSurfaces.isEmpty();
590 }
Filip Gruszczynski2217f612015-05-26 11:32:08 -0700591}