blob: 662d51d6e0e56d885bdc84336fb62a2097be579d [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 */,
197 null /* 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 */,
221 null /* 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,
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800236 int requestedWidth, int requestedHeight, int viewFlags,
Dianne Hackbornc4aad012013-02-22 15:05:25 -0800237 int flags, Rect outFrame, Rect outOverscanInsets, Rect outContentInsets,
Jorim Jaggi2e95a482016-01-14 17:36:55 -0800238 Rect outVisibleInsets, Rect outStableInsets, Rect outsets, Rect outBackdropFrame,
Adrian Roos5c6b6222017-11-07 17:36:10 +0100239 DisplayCutout.ParcelableWrapper cutout,
Andrii Kulian44607962017-03-16 11:06:24 -0700240 MergedConfiguration mergedConfiguration, 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,
Dianne Hackborn6d05fd32011-11-19 14:36:15 -0800245 requestedWidth, requestedHeight, viewFlags, flags,
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}