blob: 4003d5a1fe024882a2f5012fab57ff6b74c2215f [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;
41import android.os.ServiceManager;
Wale Ogunwale4958ad22017-06-22 09:08:14 -070042import android.os.Trace;
Dianne Hackborn5fe7e2a2012-10-04 11:58:16 -070043import android.os.UserHandle;
Andrii Kulian44607962017-03-16 11:06:24 -070044import android.util.MergedConfiguration;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080045import android.util.Slog;
Craig Mautner6881a102012-07-27 13:04:51 -070046import android.view.Display;
Adrian Roos5c6b6222017-11-07 17:36:10 +010047import android.view.DisplayCutout;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080048import android.view.IWindow;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080049import android.view.IWindowId;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080050import android.view.IWindowSession;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080051import android.view.IWindowSessionCallback;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080052import android.view.InputChannel;
53import android.view.Surface;
Daichi Hironoa1fb9be2017-12-18 17:02:54 +090054import android.view.SurfaceControl;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080055import android.view.SurfaceSession;
56import android.view.WindowManager;
57
Chenjie Yue8904192017-12-08 19:12:57 -080058import com.android.internal.os.logging.MetricsLoggerWrapper;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080059import com.android.internal.view.IInputContext;
60import com.android.internal.view.IInputMethodClient;
61import com.android.internal.view.IInputMethodManager;
62import com.android.server.wm.WindowManagerService.H;
63
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080064import java.io.PrintWriter;
Wale Ogunwale943002b2017-02-15 19:34:01 -080065import java.util.HashSet;
66import java.util.Set;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080067
68/**
69 * This class represents an active client session. There is generally one
70 * Session object per process that is interacting with the window manager.
71 */
Bryce Leea5592862017-10-23 12:57:37 -070072class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080073 final WindowManagerService mService;
Dianne Hackborneb94fa72014-06-03 17:48:12 -070074 final IWindowSessionCallback mCallback;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080075 final IInputMethodClient mClient;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080076 final int mUid;
77 final int mPid;
Wale Ogunwalecfca2582016-10-19 09:53:25 -070078 private final String mStringName;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080079 SurfaceSession mSurfaceSession;
Wale Ogunwalecfca2582016-10-19 09:53:25 -070080 private int mNumWindow = 0;
Wale Ogunwale943002b2017-02-15 19:34:01 -080081 // Set of visible application overlay window surfaces connected to this session.
82 private final Set<WindowSurfaceController> mAppOverlaySurfaces = new HashSet<>();
83 // Set of visible alert window surfaces connected to this session.
84 private final Set<WindowSurfaceController> mAlertWindowSurfaces = new HashSet<>();
Daichi Hironodf5cf622017-09-11 14:59:26 +090085 private final DragDropController mDragDropController;
Wale Ogunwale943002b2017-02-15 19:34:01 -080086 final boolean mCanAddInternalSystemWindow;
Wale Ogunwale01ad4342017-06-30 07:07:01 -070087 final boolean mCanHideNonSystemOverlayWindows;
Jorim Jaggif12ec0f2017-08-23 16:14:10 +020088 final boolean mCanAcquireSleepToken;
Wale Ogunwale387e4c62017-02-13 09:50:02 -080089 private AlertWindowNotification mAlertWindowNotification;
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -070090 private boolean mShowingAlertWindowNotificationAllowed;
Wale Ogunwalecfca2582016-10-19 09:53:25 -070091 private boolean mClientDead = false;
92 private float mLastReportedAnimatorScale;
Wale Ogunwale387e4c62017-02-13 09:50:02 -080093 private String mPackageName;
Wale Ogunwale4958ad22017-06-22 09:08:14 -070094 private String mRelayoutTag;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080095
Dianne Hackborneb94fa72014-06-03 17:48:12 -070096 public Session(WindowManagerService service, IWindowSessionCallback callback,
97 IInputMethodClient client, IInputContext inputContext) {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080098 mService = service;
Dianne Hackborneb94fa72014-06-03 17:48:12 -070099 mCallback = callback;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800100 mClient = client;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800101 mUid = Binder.getCallingUid();
102 mPid = Binder.getCallingPid();
Dianne Hackborneb94fa72014-06-03 17:48:12 -0700103 mLastReportedAnimatorScale = service.getCurrentAnimatorScale();
Wale Ogunwale5aa86832017-02-28 10:40:27 -0800104 mCanAddInternalSystemWindow = service.mContext.checkCallingOrSelfPermission(
Wale Ogunwale943002b2017-02-15 19:34:01 -0800105 INTERNAL_SYSTEM_WINDOW) == PERMISSION_GRANTED;
Wale Ogunwale01ad4342017-06-30 07:07:01 -0700106 mCanHideNonSystemOverlayWindows = service.mContext.checkCallingOrSelfPermission(
107 HIDE_NON_SYSTEM_OVERLAY_WINDOWS) == PERMISSION_GRANTED;
Jorim Jaggif12ec0f2017-08-23 16:14:10 +0200108 mCanAcquireSleepToken = service.mContext.checkCallingOrSelfPermission(DEVICE_POWER)
109 == PERMISSION_GRANTED;
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700110 mShowingAlertWindowNotificationAllowed = mService.mShowAlertWindowNotifications;
Daichi Hironodf5cf622017-09-11 14:59:26 +0900111 mDragDropController = mService.mDragDropController;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800112 StringBuilder sb = new StringBuilder();
113 sb.append("Session{");
114 sb.append(Integer.toHexString(System.identityHashCode(this)));
Dianne Hackborn5fe7e2a2012-10-04 11:58:16 -0700115 sb.append(" ");
116 sb.append(mPid);
117 if (mUid < Process.FIRST_APPLICATION_UID) {
118 sb.append(":");
119 sb.append(mUid);
120 } else {
121 sb.append(":u");
122 sb.append(UserHandle.getUserId(mUid));
123 sb.append('a');
124 sb.append(UserHandle.getAppId(mUid));
125 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800126 sb.append("}");
127 mStringName = sb.toString();
128
129 synchronized (mService.mWindowMap) {
130 if (mService.mInputMethodManager == null && mService.mHaveInputMethods) {
131 IBinder b = ServiceManager.getService(
132 Context.INPUT_METHOD_SERVICE);
133 mService.mInputMethodManager = IInputMethodManager.Stub.asInterface(b);
134 }
135 }
136 long ident = Binder.clearCallingIdentity();
137 try {
138 // Note: it is safe to call in to the input method manager
139 // here because we are not holding our lock.
140 if (mService.mInputMethodManager != null) {
141 mService.mInputMethodManager.addClient(client, inputContext,
142 mUid, mPid);
143 } else {
144 client.setUsingInputMethod(false);
145 }
146 client.asBinder().linkToDeath(this, 0);
147 } catch (RemoteException e) {
148 // The caller has died, so we can just forget about this.
149 try {
150 if (mService.mInputMethodManager != null) {
151 mService.mInputMethodManager.removeClient(client);
152 }
153 } catch (RemoteException ee) {
154 }
155 } finally {
156 Binder.restoreCallingIdentity(ident);
157 }
158 }
159
160 @Override
161 public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
162 throws RemoteException {
163 try {
164 return super.onTransact(code, data, reply, flags);
165 } catch (RuntimeException e) {
166 // Log all 'real' exceptions thrown to the caller
167 if (!(e instanceof SecurityException)) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800168 Slog.wtf(TAG_WM, "Window Session Crash", e);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800169 }
170 throw e;
171 }
172 }
173
Andrew Scull26f830d2017-05-19 12:16:10 +0100174 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800175 public void binderDied() {
176 // Note: it is safe to call in to the input method manager
177 // here because we are not holding our lock.
178 try {
179 if (mService.mInputMethodManager != null) {
180 mService.mInputMethodManager.removeClient(mClient);
181 }
182 } catch (RemoteException e) {
183 }
184 synchronized(mService.mWindowMap) {
185 mClient.asBinder().unlinkToDeath(this, 0);
186 mClientDead = true;
187 killSessionLocked();
188 }
189 }
190
Craig Mautner6881a102012-07-27 13:04:51 -0700191 @Override
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700192 public int add(IWindow window, int seq, WindowManager.LayoutParams attrs,
Adrian Roos37d7a682014-11-06 18:15:16 +0100193 int viewVisibility, Rect outContentInsets, Rect outStableInsets,
194 InputChannel outInputChannel) {
Craig Mautner6881a102012-07-27 13:04:51 -0700195 return addToDisplay(window, seq, attrs, viewVisibility, Display.DEFAULT_DISPLAY,
Adrian Roos9e370f22018-03-06 18:19:45 +0100196 new Rect() /* outFrame */, outContentInsets, outStableInsets, null /* outOutsets */,
Daichi Hirono4ab9e822018-04-11 13:29:20 +0900197 new DisplayCutout.ParcelableWrapper() /* cutout */, outInputChannel);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800198 }
Craig Mautner6881a102012-07-27 13:04:51 -0700199
200 @Override
201 public int addToDisplay(IWindow window, int seq, WindowManager.LayoutParams attrs,
Adrian Roos9e370f22018-03-06 18:19:45 +0100202 int viewVisibility, int displayId, Rect outFrame, Rect outContentInsets,
203 Rect outStableInsets, Rect outOutsets,
204 DisplayCutout.ParcelableWrapper outDisplayCutout, InputChannel outInputChannel) {
205 return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId, outFrame,
Adrian Roos5c6b6222017-11-07 17:36:10 +0100206 outContentInsets, outStableInsets, outOutsets, outDisplayCutout, outInputChannel);
Craig Mautner6881a102012-07-27 13:04:51 -0700207 }
208
209 @Override
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700210 public int addWithoutInputChannel(IWindow window, int seq, WindowManager.LayoutParams attrs,
Adrian Roos37d7a682014-11-06 18:15:16 +0100211 int viewVisibility, Rect outContentInsets, Rect outStableInsets) {
Craig Mautner6881a102012-07-27 13:04:51 -0700212 return addToDisplayWithoutInputChannel(window, seq, attrs, viewVisibility,
Adrian Roos37d7a682014-11-06 18:15:16 +0100213 Display.DEFAULT_DISPLAY, outContentInsets, outStableInsets);
Craig Mautner6881a102012-07-27 13:04:51 -0700214 }
215
216 @Override
217 public int addToDisplayWithoutInputChannel(IWindow window, int seq, WindowManager.LayoutParams attrs,
Adrian Roos37d7a682014-11-06 18:15:16 +0100218 int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets) {
Craig Mautner6881a102012-07-27 13:04:51 -0700219 return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
Adrian Roos9e370f22018-03-06 18:19:45 +0100220 new Rect() /* outFrame */, outContentInsets, outStableInsets, null /* outOutsets */,
Daichi Hirono4ab9e822018-04-11 13:29:20 +0900221 new DisplayCutout.ParcelableWrapper() /* cutout */, null /* outInputChannel */);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800222 }
223
Andrew Scull26f830d2017-05-19 12:16:10 +0100224 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800225 public void remove(IWindow window) {
226 mService.removeWindow(this, window);
227 }
228
Rob Carr64e516f2015-10-29 00:20:45 +0000229 @Override
Robert Carr77bdfb52016-05-02 18:18:31 -0700230 public void prepareToReplaceWindows(IBinder appToken, boolean childrenOnly) {
Wale Ogunwale9bc47732016-08-10 14:44:22 -0700231 mService.setWillReplaceWindows(appToken, childrenOnly);
Robert Carr23fa16b2016-01-13 13:19:58 -0800232 }
233
Andrew Scull26f830d2017-05-19 12:16:10 +0100234 @Override
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700235 public int relayout(IWindow window, int seq, WindowManager.LayoutParams attrs,
chaviwbe43ac82018-04-04 15:14:49 -0700236 int requestedWidth, int requestedHeight, int viewFlags, int flags, long frameNumber,
237 Rect outFrame, Rect outOverscanInsets, Rect outContentInsets, Rect outVisibleInsets,
238 Rect outStableInsets, Rect outsets, Rect outBackdropFrame,
239 DisplayCutout.ParcelableWrapper cutout, MergedConfiguration mergedConfiguration,
240 Surface outSurface) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800241 if (false) Slog.d(TAG_WM, ">>>>>> ENTERED relayout from "
Dianne Hackbornb961cd22011-06-21 12:13:37 -0700242 + Binder.getCallingPid());
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700243 Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, mRelayoutTag);
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700244 int res = mService.relayoutWindow(this, window, seq, attrs,
chaviwbe43ac82018-04-04 15:14:49 -0700245 requestedWidth, requestedHeight, viewFlags, flags, frameNumber,
Dianne Hackbornc4aad012013-02-22 15:05:25 -0800246 outFrame, outOverscanInsets, outContentInsets, outVisibleInsets,
Adrian Roos5c6b6222017-11-07 17:36:10 +0100247 outStableInsets, outsets, outBackdropFrame, cutout,
248 mergedConfiguration, outSurface);
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700249 Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800250 if (false) Slog.d(TAG_WM, "<<<<<< EXITING relayout to "
Dianne Hackbornb961cd22011-06-21 12:13:37 -0700251 + Binder.getCallingPid());
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800252 return res;
253 }
254
Andrew Scull26f830d2017-05-19 12:16:10 +0100255 @Override
Dianne Hackborn64825172011-03-02 21:32:58 -0800256 public boolean outOfMemory(IWindow window) {
257 return mService.outOfMemoryWindow(this, window);
258 }
259
Andrew Scull26f830d2017-05-19 12:16:10 +0100260 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800261 public void setTransparentRegion(IWindow window, Region region) {
262 mService.setTransparentRegionWindow(this, window, region);
263 }
264
Andrew Scull26f830d2017-05-19 12:16:10 +0100265 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800266 public void setInsets(IWindow window, int touchableInsets,
267 Rect contentInsets, Rect visibleInsets, Region touchableArea) {
268 mService.setInsetsWindow(this, window, touchableInsets, contentInsets,
269 visibleInsets, touchableArea);
270 }
271
Andrew Scull26f830d2017-05-19 12:16:10 +0100272 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800273 public void getDisplayFrame(IWindow window, Rect outDisplayFrame) {
274 mService.getWindowDisplayFrame(this, window, outDisplayFrame);
275 }
276
Andrew Scull26f830d2017-05-19 12:16:10 +0100277 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800278 public void finishDrawing(IWindow window) {
279 if (WindowManagerService.localLOGV) Slog.v(
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800280 TAG_WM, "IWindow finishDrawing called for " + window);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800281 mService.finishDrawingWindow(this, window);
282 }
283
Andrew Scull26f830d2017-05-19 12:16:10 +0100284 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800285 public void setInTouchMode(boolean mode) {
286 synchronized(mService.mWindowMap) {
287 mService.mInTouchMode = mode;
288 }
289 }
290
Andrew Scull26f830d2017-05-19 12:16:10 +0100291 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800292 public boolean getInTouchMode() {
293 synchronized(mService.mWindowMap) {
294 return mService.mInTouchMode;
295 }
296 }
297
Andrew Scull26f830d2017-05-19 12:16:10 +0100298 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800299 public boolean performHapticFeedback(IWindow window, int effectId,
300 boolean always) {
301 synchronized(mService.mWindowMap) {
302 long ident = Binder.clearCallingIdentity();
303 try {
304 return mService.mPolicy.performHapticFeedbackLw(
305 mService.windowForClientLocked(this, window, true),
306 effectId, always);
307 } finally {
308 Binder.restoreCallingIdentity(ident);
309 }
310 }
311 }
312
313 /* Drag/drop */
Daichi Hironofabca092017-12-19 15:02:50 +0900314
Andrew Scull26f830d2017-05-19 12:16:10 +0100315 @Override
Daichi Hironofabca092017-12-19 15:02:50 +0900316 public IBinder performDrag(IWindow window, int flags, SurfaceControl surface, int touchSource,
317 float touchX, float touchY, float thumbCenterX, float thumbCenterY, ClipData data) {
Daichi Hironodf5cf622017-09-11 14:59:26 +0900318 final int callerPid = Binder.getCallingPid();
319 final int callerUid = Binder.getCallingUid();
320 final long ident = Binder.clearCallingIdentity();
321 try {
Daichi Hironofabca092017-12-19 15:02:50 +0900322 return mDragDropController.performDrag(mSurfaceSession, callerPid, callerUid, window,
323 flags, surface, touchSource, touchX, touchY, thumbCenterX, thumbCenterY, data);
Daichi Hironodf5cf622017-09-11 14:59:26 +0900324 } finally {
325 Binder.restoreCallingIdentity(ident);
326 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800327 }
328
Andrew Scull26f830d2017-05-19 12:16:10 +0100329 @Override
Daichi Hironodf5cf622017-09-11 14:59:26 +0900330 public void reportDropResult(IWindow window, boolean consumed) {
331 final long ident = Binder.clearCallingIdentity();
332 try {
Daichi Hirono58e25e12017-10-25 15:48:08 +0900333 mDragDropController.reportDropResult(window, consumed);
Daichi Hironodf5cf622017-09-11 14:59:26 +0900334 } finally {
335 Binder.restoreCallingIdentity(ident);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800336 }
Daichi Hironodf5cf622017-09-11 14:59:26 +0900337 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800338
Daichi Hironodf5cf622017-09-11 14:59:26 +0900339 @Override
340 public void cancelDragAndDrop(IBinder dragToken) {
341 final long ident = Binder.clearCallingIdentity();
342 try {
Daichi Hirono58e25e12017-10-25 15:48:08 +0900343 mDragDropController.cancelDragAndDrop(dragToken);
Daichi Hironodf5cf622017-09-11 14:59:26 +0900344 } finally {
345 Binder.restoreCallingIdentity(ident);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800346 }
Daichi Hironodf5cf622017-09-11 14:59:26 +0900347 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800348
Daichi Hironodf5cf622017-09-11 14:59:26 +0900349 @Override
350 public void dragRecipientEntered(IWindow window) {
351 mDragDropController.dragRecipientEntered(window);
352 }
353
354 @Override
355 public void dragRecipientExited(IWindow window) {
356 mDragDropController.dragRecipientExited(window);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800357 }
358
Andrew Scull26f830d2017-05-19 12:16:10 +0100359 @Override
Chong Zhang8e89b312015-09-09 15:09:30 -0700360 public boolean startMovingTask(IWindow window, float startX, float startY) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800361 if (DEBUG_TASK_POSITIONING) Slog.d(
362 TAG_WM, "startMovingTask: {" + startX + "," + startY + "}");
Chong Zhang8e89b312015-09-09 15:09:30 -0700363
Wale Ogunwale09e1b8d2016-02-23 10:38:35 -0800364 long ident = Binder.clearCallingIdentity();
365 try {
Daichi Hirono34fb7312017-12-04 10:00:24 +0900366 return mService.mTaskPositioningController.startMovingTask(window, startX, startY);
Wale Ogunwale09e1b8d2016-02-23 10:38:35 -0800367 } finally {
368 Binder.restoreCallingIdentity(ident);
369 }
Chong Zhang8e89b312015-09-09 15:09:30 -0700370 }
371
Andrew Scull26f830d2017-05-19 12:16:10 +0100372 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800373 public void setWallpaperPosition(IBinder window, float x, float y, float xStep, float yStep) {
374 synchronized(mService.mWindowMap) {
375 long ident = Binder.clearCallingIdentity();
376 try {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700377 mService.mRoot.mWallpaperController.setWindowWallpaperPosition(
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800378 mService.windowForClientLocked(this, window, true),
379 x, y, xStep, yStep);
380 } finally {
381 Binder.restoreCallingIdentity(ident);
382 }
383 }
384 }
385
Andrew Scull26f830d2017-05-19 12:16:10 +0100386 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800387 public void wallpaperOffsetsComplete(IBinder window) {
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700388 synchronized (mService.mWindowMap) {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700389 mService.mRoot.mWallpaperController.wallpaperOffsetsComplete(window);
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700390 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800391 }
392
Andrew Scull26f830d2017-05-19 12:16:10 +0100393 @Override
Dianne Hackborn067e5f62014-09-07 23:14:30 -0700394 public void setWallpaperDisplayOffset(IBinder window, int x, int y) {
395 synchronized(mService.mWindowMap) {
396 long ident = Binder.clearCallingIdentity();
397 try {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700398 mService.mRoot.mWallpaperController.setWindowWallpaperDisplayOffset(
Dianne Hackborn067e5f62014-09-07 23:14:30 -0700399 mService.windowForClientLocked(this, window, true), x, y);
400 } finally {
401 Binder.restoreCallingIdentity(ident);
402 }
403 }
404 }
405
Andrew Scull26f830d2017-05-19 12:16:10 +0100406 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800407 public Bundle sendWallpaperCommand(IBinder window, String action, int x, int y,
408 int z, Bundle extras, boolean sync) {
409 synchronized(mService.mWindowMap) {
410 long ident = Binder.clearCallingIdentity();
411 try {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700412 return mService.mRoot.mWallpaperController.sendWindowWallpaperCommand(
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800413 mService.windowForClientLocked(this, window, true),
414 action, x, y, z, extras, sync);
415 } finally {
416 Binder.restoreCallingIdentity(ident);
417 }
418 }
419 }
420
Andrew Scull26f830d2017-05-19 12:16:10 +0100421 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800422 public void wallpaperCommandComplete(IBinder window, Bundle result) {
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700423 synchronized (mService.mWindowMap) {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700424 mService.mRoot.mWallpaperController.wallpaperCommandComplete(window);
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700425 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800426 }
427
Andrew Scull26f830d2017-05-19 12:16:10 +0100428 @Override
Svetoslavf7174e82014-06-12 11:29:35 -0700429 public void onRectangleOnScreenRequested(IBinder token, Rect rectangle) {
Svetoslav Ganov1cf70bb2012-08-06 10:53:34 -0700430 synchronized(mService.mWindowMap) {
431 final long identity = Binder.clearCallingIdentity();
432 try {
Svetoslavf7174e82014-06-12 11:29:35 -0700433 mService.onRectangleOnScreenRequested(token, rectangle);
Svetoslav Ganov1cf70bb2012-08-06 10:53:34 -0700434 } finally {
435 Binder.restoreCallingIdentity(identity);
436 }
437 }
438 }
439
Andrew Scull26f830d2017-05-19 12:16:10 +0100440 @Override
Dianne Hackborne3f23a32013-03-01 13:25:35 -0800441 public IWindowId getWindowId(IBinder window) {
442 return mService.getWindowId(window);
443 }
444
Jeff Brownc2932a12014-11-20 18:04:05 -0800445 @Override
446 public void pokeDrawLock(IBinder window) {
447 final long identity = Binder.clearCallingIdentity();
448 try {
449 mService.pokeDrawLock(this, window);
450 } finally {
451 Binder.restoreCallingIdentity(identity);
452 }
453 }
454
Vladislav Kaznacheev989b58a2016-02-10 12:19:33 -0800455 @Override
456 public void updatePointerIcon(IWindow window) {
457 final long identity = Binder.clearCallingIdentity();
458 try {
459 mService.updatePointerIcon(window);
460 } finally {
461 Binder.restoreCallingIdentity(identity);
462 }
463 }
464
Andrii Kulian4b6599e2018-01-15 17:24:08 -0800465 @Override
466 public void updateTapExcludeRegion(IWindow window, int regionId, int left, int top, int width,
467 int height) {
468 final long identity = Binder.clearCallingIdentity();
469 try {
470 mService.updateTapExcludeRegion(window, regionId, left, top, width, height);
471 } finally {
472 Binder.restoreCallingIdentity(identity);
473 }
474 }
475
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800476 void windowAddedLocked(String packageName) {
477 mPackageName = packageName;
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700478 mRelayoutTag = "relayoutWindow: " + mPackageName;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800479 if (mSurfaceSession == null) {
480 if (WindowManagerService.localLOGV) Slog.v(
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800481 TAG_WM, "First window added to " + this + ", creating SurfaceSession");
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800482 mSurfaceSession = new SurfaceSession();
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800483 if (SHOW_TRANSACTIONS) Slog.i(
484 TAG_WM, " NEW SURFACE SESSION " + mSurfaceSession);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800485 mService.mSessions.add(this);
Dianne Hackborneb94fa72014-06-03 17:48:12 -0700486 if (mLastReportedAnimatorScale != mService.getCurrentAnimatorScale()) {
487 mService.dispatchNewAnimatorScaleLocked(this);
488 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800489 }
490 mNumWindow++;
491 }
492
Wale Ogunwale943002b2017-02-15 19:34:01 -0800493 void windowRemovedLocked() {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800494 mNumWindow--;
Wale Ogunwale943002b2017-02-15 19:34:01 -0800495 killSessionLocked();
496 }
497
498
499 void onWindowSurfaceVisibilityChanged(WindowSurfaceController surfaceController,
500 boolean visible, int type) {
501
502 if (!isSystemAlertWindowType(type)) {
503 return;
504 }
505
506 boolean changed;
507
508 if (!mCanAddInternalSystemWindow) {
509 // We want to track non-system signature apps adding alert windows so we can post an
510 // on-going notification for the user to control their visibility.
511 if (visible) {
512 changed = mAlertWindowSurfaces.add(surfaceController);
Chenjie Yu08d6d722018-02-28 10:19:54 -0800513 MetricsLoggerWrapper.logAppOverlayEnter(mUid, mPackageName, changed, type, true);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800514 } else {
515 changed = mAlertWindowSurfaces.remove(surfaceController);
Chenjie Yu08d6d722018-02-28 10:19:54 -0800516 MetricsLoggerWrapper.logAppOverlayExit(mUid, mPackageName, changed, type, true);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800517 }
518
519 if (changed) {
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800520 if (mAlertWindowSurfaces.isEmpty()) {
521 cancelAlertWindowNotification();
522 } else if (mAlertWindowNotification == null){
Wale Ogunwaled76881e2017-03-10 13:17:56 -0800523 mAlertWindowNotification = new AlertWindowNotification(mService, mPackageName);
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700524 if (mShowingAlertWindowNotificationAllowed) {
525 mAlertWindowNotification.post();
526 }
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800527 }
Wale Ogunwaled993a572017-02-05 13:52:09 -0800528 }
529 }
Wale Ogunwale943002b2017-02-15 19:34:01 -0800530
531 if (type != TYPE_APPLICATION_OVERLAY) {
532 return;
533 }
534
535 if (visible) {
536 changed = mAppOverlaySurfaces.add(surfaceController);
Chenjie Yu08d6d722018-02-28 10:19:54 -0800537 MetricsLoggerWrapper.logAppOverlayEnter(mUid, mPackageName, changed, type, false);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800538 } else {
539 changed = mAppOverlaySurfaces.remove(surfaceController);
Chenjie Yu08d6d722018-02-28 10:19:54 -0800540 MetricsLoggerWrapper.logAppOverlayExit(mUid, mPackageName, changed, type, false);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800541 }
542
543 if (changed) {
544 // Notify activity manager of changes to app overlay windows so it can adjust the
545 // importance score for the process.
546 setHasOverlayUi(!mAppOverlaySurfaces.isEmpty());
547 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800548 }
549
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700550 void setShowingAlertWindowNotificationAllowed(boolean allowed) {
551 mShowingAlertWindowNotificationAllowed = allowed;
552 if (mAlertWindowNotification != null) {
553 if (allowed) {
554 mAlertWindowNotification.post();
555 } else {
Wale Ogunwale6c8f2e42018-02-01 09:07:34 -0800556 mAlertWindowNotification.cancel(false /* deleteChannel */);
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700557 }
558 }
559 }
560
Wale Ogunwaled993a572017-02-05 13:52:09 -0800561 private void killSessionLocked() {
562 if (mNumWindow > 0 || !mClientDead) {
563 return;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800564 }
Wale Ogunwaled993a572017-02-05 13:52:09 -0800565
566 mService.mSessions.remove(this);
567 if (mSurfaceSession == null) {
568 return;
569 }
570
571 if (WindowManagerService.localLOGV) Slog.v(TAG_WM, "Last window removed from " + this
572 + ", destroying " + mSurfaceSession);
573 if (SHOW_TRANSACTIONS) Slog.i(TAG_WM, " KILL SURFACE SESSION " + mSurfaceSession);
574 try {
575 mSurfaceSession.kill();
576 } catch (Exception e) {
577 Slog.w(TAG_WM, "Exception thrown when killing surface session " + mSurfaceSession
578 + " in session " + this + ": " + e.toString());
579 }
580 mSurfaceSession = null;
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800581 mAlertWindowSurfaces.clear();
582 mAppOverlaySurfaces.clear();
Wale Ogunwaled993a572017-02-05 13:52:09 -0800583 setHasOverlayUi(false);
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800584 cancelAlertWindowNotification();
Wale Ogunwaled993a572017-02-05 13:52:09 -0800585 }
586
587 private void setHasOverlayUi(boolean hasOverlayUi) {
588 mService.mH.obtainMessage(H.SET_HAS_OVERLAY_UI, mPid, hasOverlayUi ? 1 : 0).sendToTarget();
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800589 }
590
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800591 private void cancelAlertWindowNotification() {
592 if (mAlertWindowNotification == null) {
593 return;
594 }
Wale Ogunwale6c8f2e42018-02-01 09:07:34 -0800595 mAlertWindowNotification.cancel(true /* deleteChannel */);
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800596 mAlertWindowNotification = null;
597 }
598
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800599 void dump(PrintWriter pw, String prefix) {
600 pw.print(prefix); pw.print("mNumWindow="); pw.print(mNumWindow);
Wale Ogunwale5aa86832017-02-28 10:40:27 -0800601 pw.print(" mCanAddInternalSystemWindow="); pw.print(mCanAddInternalSystemWindow);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800602 pw.print(" mAppOverlaySurfaces="); pw.print(mAppOverlaySurfaces);
603 pw.print(" mAlertWindowSurfaces="); pw.print(mAlertWindowSurfaces);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800604 pw.print(" mClientDead="); pw.print(mClientDead);
605 pw.print(" mSurfaceSession="); pw.println(mSurfaceSession);
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700606 pw.print(prefix); pw.print("mPackageName="); pw.println(mPackageName);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800607 }
608
609 @Override
610 public String toString() {
611 return mStringName;
612 }
Robert Carr0e007272017-10-02 13:00:55 -0700613
614 boolean hasAlertWindowSurfaces() {
615 return !mAlertWindowSurfaces.isEmpty();
616 }
Filip Gruszczynski2217f612015-05-26 11:32:08 -0700617}