blob: acc9c038bd9c11b61fc443966c113722435bbeea [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;
32import android.content.Context;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080033import android.graphics.Rect;
34import android.graphics.Region;
35import android.os.Binder;
36import android.os.Bundle;
37import android.os.IBinder;
38import android.os.Parcel;
Dianne Hackborn5fe7e2a2012-10-04 11:58:16 -070039import android.os.Process;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080040import android.os.RemoteException;
Wale Ogunwale4958ad22017-06-22 09:08:14 -070041import android.os.Trace;
Dianne Hackborn5fe7e2a2012-10-04 11:58:16 -070042import android.os.UserHandle;
Andrii Kulian44607962017-03-16 11:06:24 -070043import android.util.MergedConfiguration;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080044import android.util.Slog;
Craig Mautner6881a102012-07-27 13:04:51 -070045import android.view.Display;
Adrian Roos5c6b6222017-11-07 17:36:10 +010046import android.view.DisplayCutout;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080047import android.view.IWindow;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080048import android.view.IWindowId;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080049import android.view.IWindowSession;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080050import android.view.IWindowSessionCallback;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080051import android.view.InputChannel;
52import android.view.Surface;
Daichi Hironoa1fb9be2017-12-18 17:02:54 +090053import android.view.SurfaceControl;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080054import android.view.SurfaceSession;
55import android.view.WindowManager;
56
Chenjie Yue8904192017-12-08 19:12:57 -080057import com.android.internal.os.logging.MetricsLoggerWrapper;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080058import com.android.server.wm.WindowManagerService.H;
59
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080060import java.io.PrintWriter;
Wale Ogunwale943002b2017-02-15 19:34:01 -080061import java.util.HashSet;
62import java.util.Set;
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() {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800146 synchronized(mService.mWindowMap) {
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,
157 DisplayCutout.ParcelableWrapper outDisplayCutout, InputChannel outInputChannel) {
158 return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId, outFrame,
Adrian Roos5c6b6222017-11-07 17:36:10 +0100159 outContentInsets, outStableInsets, outOutsets, outDisplayCutout, outInputChannel);
Craig Mautner6881a102012-07-27 13:04:51 -0700160 }
161
162 @Override
Craig Mautner6881a102012-07-27 13:04:51 -0700163 public int addToDisplayWithoutInputChannel(IWindow window, int seq, WindowManager.LayoutParams attrs,
Adrian Roos37d7a682014-11-06 18:15:16 +0100164 int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets) {
Craig Mautner6881a102012-07-27 13:04:51 -0700165 return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
Adrian Roos9e370f22018-03-06 18:19:45 +0100166 new Rect() /* outFrame */, outContentInsets, outStableInsets, null /* outOutsets */,
Daichi Hirono4ab9e822018-04-11 13:29:20 +0900167 new DisplayCutout.ParcelableWrapper() /* cutout */, null /* outInputChannel */);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800168 }
169
Andrew Scull26f830d2017-05-19 12:16:10 +0100170 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800171 public void remove(IWindow window) {
172 mService.removeWindow(this, window);
173 }
174
Rob Carr64e516f2015-10-29 00:20:45 +0000175 @Override
Robert Carr77bdfb52016-05-02 18:18:31 -0700176 public void prepareToReplaceWindows(IBinder appToken, boolean childrenOnly) {
Wale Ogunwale9bc47732016-08-10 14:44:22 -0700177 mService.setWillReplaceWindows(appToken, childrenOnly);
Robert Carr23fa16b2016-01-13 13:19:58 -0800178 }
179
Andrew Scull26f830d2017-05-19 12:16:10 +0100180 @Override
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700181 public int relayout(IWindow window, int seq, WindowManager.LayoutParams attrs,
chaviwbe43ac82018-04-04 15:14:49 -0700182 int requestedWidth, int requestedHeight, int viewFlags, int flags, long frameNumber,
183 Rect outFrame, Rect outOverscanInsets, Rect outContentInsets, Rect outVisibleInsets,
184 Rect outStableInsets, Rect outsets, Rect outBackdropFrame,
185 DisplayCutout.ParcelableWrapper cutout, MergedConfiguration mergedConfiguration,
186 Surface outSurface) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800187 if (false) Slog.d(TAG_WM, ">>>>>> ENTERED relayout from "
Dianne Hackbornb961cd22011-06-21 12:13:37 -0700188 + Binder.getCallingPid());
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700189 Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, mRelayoutTag);
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700190 int res = mService.relayoutWindow(this, window, seq, attrs,
chaviwbe43ac82018-04-04 15:14:49 -0700191 requestedWidth, requestedHeight, viewFlags, flags, frameNumber,
Dianne Hackbornc4aad012013-02-22 15:05:25 -0800192 outFrame, outOverscanInsets, outContentInsets, outVisibleInsets,
Adrian Roos5c6b6222017-11-07 17:36:10 +0100193 outStableInsets, outsets, outBackdropFrame, cutout,
194 mergedConfiguration, outSurface);
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700195 Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800196 if (false) Slog.d(TAG_WM, "<<<<<< EXITING relayout to "
Dianne Hackbornb961cd22011-06-21 12:13:37 -0700197 + Binder.getCallingPid());
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800198 return res;
199 }
200
Andrew Scull26f830d2017-05-19 12:16:10 +0100201 @Override
Dianne Hackborn64825172011-03-02 21:32:58 -0800202 public boolean outOfMemory(IWindow window) {
203 return mService.outOfMemoryWindow(this, window);
204 }
205
Andrew Scull26f830d2017-05-19 12:16:10 +0100206 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800207 public void setTransparentRegion(IWindow window, Region region) {
208 mService.setTransparentRegionWindow(this, window, region);
209 }
210
Andrew Scull26f830d2017-05-19 12:16:10 +0100211 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800212 public void setInsets(IWindow window, int touchableInsets,
213 Rect contentInsets, Rect visibleInsets, Region touchableArea) {
214 mService.setInsetsWindow(this, window, touchableInsets, contentInsets,
215 visibleInsets, touchableArea);
216 }
217
Andrew Scull26f830d2017-05-19 12:16:10 +0100218 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800219 public void getDisplayFrame(IWindow window, Rect outDisplayFrame) {
220 mService.getWindowDisplayFrame(this, window, outDisplayFrame);
221 }
222
Andrew Scull26f830d2017-05-19 12:16:10 +0100223 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800224 public void finishDrawing(IWindow window) {
225 if (WindowManagerService.localLOGV) Slog.v(
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800226 TAG_WM, "IWindow finishDrawing called for " + window);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800227 mService.finishDrawingWindow(this, window);
228 }
229
Andrew Scull26f830d2017-05-19 12:16:10 +0100230 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800231 public void setInTouchMode(boolean mode) {
232 synchronized(mService.mWindowMap) {
233 mService.mInTouchMode = mode;
234 }
235 }
236
Andrew Scull26f830d2017-05-19 12:16:10 +0100237 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800238 public boolean getInTouchMode() {
239 synchronized(mService.mWindowMap) {
240 return mService.mInTouchMode;
241 }
242 }
243
Andrew Scull26f830d2017-05-19 12:16:10 +0100244 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800245 public boolean performHapticFeedback(IWindow window, int effectId,
246 boolean always) {
247 synchronized(mService.mWindowMap) {
248 long ident = Binder.clearCallingIdentity();
249 try {
250 return mService.mPolicy.performHapticFeedbackLw(
251 mService.windowForClientLocked(this, window, true),
Alexey Kuzmine1f06b82018-06-20 17:48:43 +0100252 effectId, always, null);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800253 } finally {
254 Binder.restoreCallingIdentity(ident);
255 }
256 }
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
286 public void cancelDragAndDrop(IBinder dragToken) {
287 final long ident = Binder.clearCallingIdentity();
288 try {
Daichi Hirono58e25e12017-10-25 15:48:08 +0900289 mDragDropController.cancelDragAndDrop(dragToken);
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
Andrew Scull26f830d2017-05-19 12:16:10 +0100318 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800319 public void setWallpaperPosition(IBinder window, float x, float y, float xStep, float yStep) {
320 synchronized(mService.mWindowMap) {
321 long ident = Binder.clearCallingIdentity();
322 try {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700323 mService.mRoot.mWallpaperController.setWindowWallpaperPosition(
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800324 mService.windowForClientLocked(this, window, true),
325 x, y, xStep, yStep);
326 } finally {
327 Binder.restoreCallingIdentity(ident);
328 }
329 }
330 }
331
Andrew Scull26f830d2017-05-19 12:16:10 +0100332 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800333 public void wallpaperOffsetsComplete(IBinder window) {
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700334 synchronized (mService.mWindowMap) {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700335 mService.mRoot.mWallpaperController.wallpaperOffsetsComplete(window);
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700336 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800337 }
338
Andrew Scull26f830d2017-05-19 12:16:10 +0100339 @Override
Dianne Hackborn067e5f62014-09-07 23:14:30 -0700340 public void setWallpaperDisplayOffset(IBinder window, int x, int y) {
341 synchronized(mService.mWindowMap) {
342 long ident = Binder.clearCallingIdentity();
343 try {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700344 mService.mRoot.mWallpaperController.setWindowWallpaperDisplayOffset(
Dianne Hackborn067e5f62014-09-07 23:14:30 -0700345 mService.windowForClientLocked(this, window, true), x, y);
346 } finally {
347 Binder.restoreCallingIdentity(ident);
348 }
349 }
350 }
351
Andrew Scull26f830d2017-05-19 12:16:10 +0100352 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800353 public Bundle sendWallpaperCommand(IBinder window, String action, int x, int y,
354 int z, Bundle extras, boolean sync) {
355 synchronized(mService.mWindowMap) {
356 long ident = Binder.clearCallingIdentity();
357 try {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700358 return mService.mRoot.mWallpaperController.sendWindowWallpaperCommand(
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800359 mService.windowForClientLocked(this, window, true),
360 action, x, y, z, extras, sync);
361 } finally {
362 Binder.restoreCallingIdentity(ident);
363 }
364 }
365 }
366
Andrew Scull26f830d2017-05-19 12:16:10 +0100367 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800368 public void wallpaperCommandComplete(IBinder window, Bundle result) {
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700369 synchronized (mService.mWindowMap) {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700370 mService.mRoot.mWallpaperController.wallpaperCommandComplete(window);
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700371 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800372 }
373
Andrew Scull26f830d2017-05-19 12:16:10 +0100374 @Override
Svetoslavf7174e82014-06-12 11:29:35 -0700375 public void onRectangleOnScreenRequested(IBinder token, Rect rectangle) {
Svetoslav Ganov1cf70bb2012-08-06 10:53:34 -0700376 synchronized(mService.mWindowMap) {
377 final long identity = Binder.clearCallingIdentity();
378 try {
Svetoslavf7174e82014-06-12 11:29:35 -0700379 mService.onRectangleOnScreenRequested(token, rectangle);
Svetoslav Ganov1cf70bb2012-08-06 10:53:34 -0700380 } finally {
381 Binder.restoreCallingIdentity(identity);
382 }
383 }
384 }
385
Andrew Scull26f830d2017-05-19 12:16:10 +0100386 @Override
Dianne Hackborne3f23a32013-03-01 13:25:35 -0800387 public IWindowId getWindowId(IBinder window) {
388 return mService.getWindowId(window);
389 }
390
Jeff Brownc2932a12014-11-20 18:04:05 -0800391 @Override
392 public void pokeDrawLock(IBinder window) {
393 final long identity = Binder.clearCallingIdentity();
394 try {
395 mService.pokeDrawLock(this, window);
396 } finally {
397 Binder.restoreCallingIdentity(identity);
398 }
399 }
400
Vladislav Kaznacheev989b58a2016-02-10 12:19:33 -0800401 @Override
402 public void updatePointerIcon(IWindow window) {
403 final long identity = Binder.clearCallingIdentity();
404 try {
405 mService.updatePointerIcon(window);
406 } finally {
407 Binder.restoreCallingIdentity(identity);
408 }
409 }
410
Andrii Kulian4b6599e2018-01-15 17:24:08 -0800411 @Override
412 public void updateTapExcludeRegion(IWindow window, int regionId, int left, int top, int width,
413 int height) {
414 final long identity = Binder.clearCallingIdentity();
415 try {
416 mService.updateTapExcludeRegion(window, regionId, left, top, width, height);
417 } finally {
418 Binder.restoreCallingIdentity(identity);
419 }
420 }
421
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800422 void windowAddedLocked(String packageName) {
423 mPackageName = packageName;
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700424 mRelayoutTag = "relayoutWindow: " + mPackageName;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800425 if (mSurfaceSession == null) {
426 if (WindowManagerService.localLOGV) Slog.v(
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800427 TAG_WM, "First window added to " + this + ", creating SurfaceSession");
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800428 mSurfaceSession = new SurfaceSession();
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800429 if (SHOW_TRANSACTIONS) Slog.i(
430 TAG_WM, " NEW SURFACE SESSION " + mSurfaceSession);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800431 mService.mSessions.add(this);
Dianne Hackborneb94fa72014-06-03 17:48:12 -0700432 if (mLastReportedAnimatorScale != mService.getCurrentAnimatorScale()) {
433 mService.dispatchNewAnimatorScaleLocked(this);
434 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800435 }
436 mNumWindow++;
437 }
438
Wale Ogunwale943002b2017-02-15 19:34:01 -0800439 void windowRemovedLocked() {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800440 mNumWindow--;
Wale Ogunwale943002b2017-02-15 19:34:01 -0800441 killSessionLocked();
442 }
443
444
445 void onWindowSurfaceVisibilityChanged(WindowSurfaceController surfaceController,
446 boolean visible, int type) {
447
448 if (!isSystemAlertWindowType(type)) {
449 return;
450 }
451
452 boolean changed;
453
454 if (!mCanAddInternalSystemWindow) {
455 // We want to track non-system signature apps adding alert windows so we can post an
456 // on-going notification for the user to control their visibility.
457 if (visible) {
458 changed = mAlertWindowSurfaces.add(surfaceController);
Chenjie Yu08d6d722018-02-28 10:19:54 -0800459 MetricsLoggerWrapper.logAppOverlayEnter(mUid, mPackageName, changed, type, true);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800460 } else {
461 changed = mAlertWindowSurfaces.remove(surfaceController);
Chenjie Yu08d6d722018-02-28 10:19:54 -0800462 MetricsLoggerWrapper.logAppOverlayExit(mUid, mPackageName, changed, type, true);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800463 }
464
465 if (changed) {
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800466 if (mAlertWindowSurfaces.isEmpty()) {
467 cancelAlertWindowNotification();
468 } else if (mAlertWindowNotification == null){
Wale Ogunwaled76881e2017-03-10 13:17:56 -0800469 mAlertWindowNotification = new AlertWindowNotification(mService, mPackageName);
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700470 if (mShowingAlertWindowNotificationAllowed) {
471 mAlertWindowNotification.post();
472 }
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800473 }
Wale Ogunwaled993a572017-02-05 13:52:09 -0800474 }
475 }
Wale Ogunwale943002b2017-02-15 19:34:01 -0800476
477 if (type != TYPE_APPLICATION_OVERLAY) {
478 return;
479 }
480
481 if (visible) {
482 changed = mAppOverlaySurfaces.add(surfaceController);
Chenjie Yu08d6d722018-02-28 10:19:54 -0800483 MetricsLoggerWrapper.logAppOverlayEnter(mUid, mPackageName, changed, type, false);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800484 } else {
485 changed = mAppOverlaySurfaces.remove(surfaceController);
Chenjie Yu08d6d722018-02-28 10:19:54 -0800486 MetricsLoggerWrapper.logAppOverlayExit(mUid, mPackageName, changed, type, false);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800487 }
488
489 if (changed) {
490 // Notify activity manager of changes to app overlay windows so it can adjust the
491 // importance score for the process.
492 setHasOverlayUi(!mAppOverlaySurfaces.isEmpty());
493 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800494 }
495
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700496 void setShowingAlertWindowNotificationAllowed(boolean allowed) {
497 mShowingAlertWindowNotificationAllowed = allowed;
498 if (mAlertWindowNotification != null) {
499 if (allowed) {
500 mAlertWindowNotification.post();
501 } else {
Wale Ogunwale6c8f2e42018-02-01 09:07:34 -0800502 mAlertWindowNotification.cancel(false /* deleteChannel */);
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700503 }
504 }
505 }
506
Wale Ogunwaled993a572017-02-05 13:52:09 -0800507 private void killSessionLocked() {
508 if (mNumWindow > 0 || !mClientDead) {
509 return;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800510 }
Wale Ogunwaled993a572017-02-05 13:52:09 -0800511
512 mService.mSessions.remove(this);
513 if (mSurfaceSession == null) {
514 return;
515 }
516
517 if (WindowManagerService.localLOGV) Slog.v(TAG_WM, "Last window removed from " + this
518 + ", destroying " + mSurfaceSession);
519 if (SHOW_TRANSACTIONS) Slog.i(TAG_WM, " KILL SURFACE SESSION " + mSurfaceSession);
520 try {
521 mSurfaceSession.kill();
522 } catch (Exception e) {
523 Slog.w(TAG_WM, "Exception thrown when killing surface session " + mSurfaceSession
524 + " in session " + this + ": " + e.toString());
525 }
526 mSurfaceSession = null;
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800527 mAlertWindowSurfaces.clear();
528 mAppOverlaySurfaces.clear();
Wale Ogunwaled993a572017-02-05 13:52:09 -0800529 setHasOverlayUi(false);
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800530 cancelAlertWindowNotification();
Wale Ogunwaled993a572017-02-05 13:52:09 -0800531 }
532
533 private void setHasOverlayUi(boolean hasOverlayUi) {
534 mService.mH.obtainMessage(H.SET_HAS_OVERLAY_UI, mPid, hasOverlayUi ? 1 : 0).sendToTarget();
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800535 }
536
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800537 private void cancelAlertWindowNotification() {
538 if (mAlertWindowNotification == null) {
539 return;
540 }
Wale Ogunwale6c8f2e42018-02-01 09:07:34 -0800541 mAlertWindowNotification.cancel(true /* deleteChannel */);
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800542 mAlertWindowNotification = null;
543 }
544
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800545 void dump(PrintWriter pw, String prefix) {
546 pw.print(prefix); pw.print("mNumWindow="); pw.print(mNumWindow);
Wale Ogunwale5aa86832017-02-28 10:40:27 -0800547 pw.print(" mCanAddInternalSystemWindow="); pw.print(mCanAddInternalSystemWindow);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800548 pw.print(" mAppOverlaySurfaces="); pw.print(mAppOverlaySurfaces);
549 pw.print(" mAlertWindowSurfaces="); pw.print(mAlertWindowSurfaces);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800550 pw.print(" mClientDead="); pw.print(mClientDead);
551 pw.print(" mSurfaceSession="); pw.println(mSurfaceSession);
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700552 pw.print(prefix); pw.print("mPackageName="); pw.println(mPackageName);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800553 }
554
555 @Override
556 public String toString() {
557 return mStringName;
558 }
Robert Carr0e007272017-10-02 13:00:55 -0700559
560 boolean hasAlertWindowSurfaces() {
561 return !mAlertWindowSurfaces.isEmpty();
562 }
Filip Gruszczynski2217f612015-05-26 11:32:08 -0700563}