blob: 928062086d777a0db0c3d5da11c14646f8ea00db [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
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080058import com.android.internal.view.IInputContext;
59import com.android.internal.view.IInputMethodClient;
60import com.android.internal.view.IInputMethodManager;
61import com.android.server.wm.WindowManagerService.H;
62
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080063import java.io.PrintWriter;
Wale Ogunwale943002b2017-02-15 19:34:01 -080064import java.util.HashSet;
65import java.util.Set;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080066
67/**
68 * This class represents an active client session. There is generally one
69 * Session object per process that is interacting with the window manager.
70 */
Bryce Leea5592862017-10-23 12:57:37 -070071class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080072 final WindowManagerService mService;
Dianne Hackborneb94fa72014-06-03 17:48:12 -070073 final IWindowSessionCallback mCallback;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080074 final IInputMethodClient mClient;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080075 final int mUid;
76 final int mPid;
Wale Ogunwalecfca2582016-10-19 09:53:25 -070077 private final String mStringName;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080078 SurfaceSession mSurfaceSession;
Wale Ogunwalecfca2582016-10-19 09:53:25 -070079 private int mNumWindow = 0;
Wale Ogunwale943002b2017-02-15 19:34:01 -080080 // Set of visible application overlay window surfaces connected to this session.
81 private final Set<WindowSurfaceController> mAppOverlaySurfaces = new HashSet<>();
82 // Set of visible alert window surfaces connected to this session.
83 private final Set<WindowSurfaceController> mAlertWindowSurfaces = new HashSet<>();
Daichi Hironodf5cf622017-09-11 14:59:26 +090084 private final DragDropController mDragDropController;
Wale Ogunwale943002b2017-02-15 19:34:01 -080085 final boolean mCanAddInternalSystemWindow;
Wale Ogunwale01ad4342017-06-30 07:07:01 -070086 final boolean mCanHideNonSystemOverlayWindows;
Jorim Jaggif12ec0f2017-08-23 16:14:10 +020087 final boolean mCanAcquireSleepToken;
Wale Ogunwale387e4c62017-02-13 09:50:02 -080088 private AlertWindowNotification mAlertWindowNotification;
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -070089 private boolean mShowingAlertWindowNotificationAllowed;
Wale Ogunwalecfca2582016-10-19 09:53:25 -070090 private boolean mClientDead = false;
91 private float mLastReportedAnimatorScale;
Wale Ogunwale387e4c62017-02-13 09:50:02 -080092 private String mPackageName;
Wale Ogunwale4958ad22017-06-22 09:08:14 -070093 private String mRelayoutTag;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080094
Dianne Hackborneb94fa72014-06-03 17:48:12 -070095 public Session(WindowManagerService service, IWindowSessionCallback callback,
96 IInputMethodClient client, IInputContext inputContext) {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080097 mService = service;
Dianne Hackborneb94fa72014-06-03 17:48:12 -070098 mCallback = callback;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080099 mClient = client;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800100 mUid = Binder.getCallingUid();
101 mPid = Binder.getCallingPid();
Dianne Hackborneb94fa72014-06-03 17:48:12 -0700102 mLastReportedAnimatorScale = service.getCurrentAnimatorScale();
Wale Ogunwale5aa86832017-02-28 10:40:27 -0800103 mCanAddInternalSystemWindow = service.mContext.checkCallingOrSelfPermission(
Wale Ogunwale943002b2017-02-15 19:34:01 -0800104 INTERNAL_SYSTEM_WINDOW) == PERMISSION_GRANTED;
Wale Ogunwale01ad4342017-06-30 07:07:01 -0700105 mCanHideNonSystemOverlayWindows = service.mContext.checkCallingOrSelfPermission(
106 HIDE_NON_SYSTEM_OVERLAY_WINDOWS) == PERMISSION_GRANTED;
Jorim Jaggif12ec0f2017-08-23 16:14:10 +0200107 mCanAcquireSleepToken = service.mContext.checkCallingOrSelfPermission(DEVICE_POWER)
108 == PERMISSION_GRANTED;
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700109 mShowingAlertWindowNotificationAllowed = mService.mShowAlertWindowNotifications;
Daichi Hironodf5cf622017-09-11 14:59:26 +0900110 mDragDropController = mService.mDragDropController;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800111 StringBuilder sb = new StringBuilder();
112 sb.append("Session{");
113 sb.append(Integer.toHexString(System.identityHashCode(this)));
Dianne Hackborn5fe7e2a2012-10-04 11:58:16 -0700114 sb.append(" ");
115 sb.append(mPid);
116 if (mUid < Process.FIRST_APPLICATION_UID) {
117 sb.append(":");
118 sb.append(mUid);
119 } else {
120 sb.append(":u");
121 sb.append(UserHandle.getUserId(mUid));
122 sb.append('a');
123 sb.append(UserHandle.getAppId(mUid));
124 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800125 sb.append("}");
126 mStringName = sb.toString();
127
128 synchronized (mService.mWindowMap) {
129 if (mService.mInputMethodManager == null && mService.mHaveInputMethods) {
130 IBinder b = ServiceManager.getService(
131 Context.INPUT_METHOD_SERVICE);
132 mService.mInputMethodManager = IInputMethodManager.Stub.asInterface(b);
133 }
134 }
135 long ident = Binder.clearCallingIdentity();
136 try {
137 // Note: it is safe to call in to the input method manager
138 // here because we are not holding our lock.
139 if (mService.mInputMethodManager != null) {
140 mService.mInputMethodManager.addClient(client, inputContext,
141 mUid, mPid);
142 } else {
143 client.setUsingInputMethod(false);
144 }
145 client.asBinder().linkToDeath(this, 0);
146 } catch (RemoteException e) {
147 // The caller has died, so we can just forget about this.
148 try {
149 if (mService.mInputMethodManager != null) {
150 mService.mInputMethodManager.removeClient(client);
151 }
152 } catch (RemoteException ee) {
153 }
154 } finally {
155 Binder.restoreCallingIdentity(ident);
156 }
157 }
158
159 @Override
160 public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
161 throws RemoteException {
162 try {
163 return super.onTransact(code, data, reply, flags);
164 } catch (RuntimeException e) {
165 // Log all 'real' exceptions thrown to the caller
166 if (!(e instanceof SecurityException)) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800167 Slog.wtf(TAG_WM, "Window Session Crash", e);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800168 }
169 throw e;
170 }
171 }
172
Andrew Scull26f830d2017-05-19 12:16:10 +0100173 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800174 public void binderDied() {
175 // Note: it is safe to call in to the input method manager
176 // here because we are not holding our lock.
177 try {
178 if (mService.mInputMethodManager != null) {
179 mService.mInputMethodManager.removeClient(mClient);
180 }
181 } catch (RemoteException e) {
182 }
183 synchronized(mService.mWindowMap) {
184 mClient.asBinder().unlinkToDeath(this, 0);
185 mClientDead = true;
186 killSessionLocked();
187 }
188 }
189
Craig Mautner6881a102012-07-27 13:04:51 -0700190 @Override
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700191 public int add(IWindow window, int seq, WindowManager.LayoutParams attrs,
Adrian Roos37d7a682014-11-06 18:15:16 +0100192 int viewVisibility, Rect outContentInsets, Rect outStableInsets,
193 InputChannel outInputChannel) {
Craig Mautner6881a102012-07-27 13:04:51 -0700194 return addToDisplay(window, seq, attrs, viewVisibility, Display.DEFAULT_DISPLAY,
Adrian Roos5c6b6222017-11-07 17:36:10 +0100195 outContentInsets, outStableInsets, null /* outOutsets */, null /* cutout */,
196 outInputChannel);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800197 }
Craig Mautner6881a102012-07-27 13:04:51 -0700198
199 @Override
200 public int addToDisplay(IWindow window, int seq, WindowManager.LayoutParams attrs,
Adrian Roos37d7a682014-11-06 18:15:16 +0100201 int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets,
Adrian Roos5c6b6222017-11-07 17:36:10 +0100202 Rect outOutsets, DisplayCutout.ParcelableWrapper outDisplayCutout,
203 InputChannel outInputChannel) {
Craig Mautner6881a102012-07-27 13:04:51 -0700204 return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
Adrian Roos5c6b6222017-11-07 17:36:10 +0100205 outContentInsets, outStableInsets, outOutsets, outDisplayCutout, outInputChannel);
Craig Mautner6881a102012-07-27 13:04:51 -0700206 }
207
208 @Override
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700209 public int addWithoutInputChannel(IWindow window, int seq, WindowManager.LayoutParams attrs,
Adrian Roos37d7a682014-11-06 18:15:16 +0100210 int viewVisibility, Rect outContentInsets, Rect outStableInsets) {
Craig Mautner6881a102012-07-27 13:04:51 -0700211 return addToDisplayWithoutInputChannel(window, seq, attrs, viewVisibility,
Adrian Roos37d7a682014-11-06 18:15:16 +0100212 Display.DEFAULT_DISPLAY, outContentInsets, outStableInsets);
Craig Mautner6881a102012-07-27 13:04:51 -0700213 }
214
215 @Override
216 public int addToDisplayWithoutInputChannel(IWindow window, int seq, WindowManager.LayoutParams attrs,
Adrian Roos37d7a682014-11-06 18:15:16 +0100217 int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets) {
Craig Mautner6881a102012-07-27 13:04:51 -0700218 return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
Adrian Roos5c6b6222017-11-07 17:36:10 +0100219 outContentInsets, outStableInsets, null /* outOutsets */, null /* cutout */, null);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800220 }
221
Andrew Scull26f830d2017-05-19 12:16:10 +0100222 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800223 public void remove(IWindow window) {
224 mService.removeWindow(this, window);
225 }
226
Rob Carr64e516f2015-10-29 00:20:45 +0000227 @Override
Robert Carr77bdfb52016-05-02 18:18:31 -0700228 public void prepareToReplaceWindows(IBinder appToken, boolean childrenOnly) {
Wale Ogunwale9bc47732016-08-10 14:44:22 -0700229 mService.setWillReplaceWindows(appToken, childrenOnly);
Robert Carr23fa16b2016-01-13 13:19:58 -0800230 }
231
Andrew Scull26f830d2017-05-19 12:16:10 +0100232 @Override
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700233 public int relayout(IWindow window, int seq, WindowManager.LayoutParams attrs,
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800234 int requestedWidth, int requestedHeight, int viewFlags,
Dianne Hackbornc4aad012013-02-22 15:05:25 -0800235 int flags, Rect outFrame, Rect outOverscanInsets, Rect outContentInsets,
Jorim Jaggi2e95a482016-01-14 17:36:55 -0800236 Rect outVisibleInsets, Rect outStableInsets, Rect outsets, Rect outBackdropFrame,
Adrian Roos5c6b6222017-11-07 17:36:10 +0100237 DisplayCutout.ParcelableWrapper cutout,
Andrii Kulian44607962017-03-16 11:06:24 -0700238 MergedConfiguration mergedConfiguration, Surface outSurface) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800239 if (false) Slog.d(TAG_WM, ">>>>>> ENTERED relayout from "
Dianne Hackbornb961cd22011-06-21 12:13:37 -0700240 + Binder.getCallingPid());
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700241 Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, mRelayoutTag);
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700242 int res = mService.relayoutWindow(this, window, seq, attrs,
Dianne Hackborn6d05fd32011-11-19 14:36:15 -0800243 requestedWidth, requestedHeight, viewFlags, flags,
Dianne Hackbornc4aad012013-02-22 15:05:25 -0800244 outFrame, outOverscanInsets, outContentInsets, outVisibleInsets,
Adrian Roos5c6b6222017-11-07 17:36:10 +0100245 outStableInsets, outsets, outBackdropFrame, cutout,
246 mergedConfiguration, outSurface);
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700247 Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800248 if (false) Slog.d(TAG_WM, "<<<<<< EXITING relayout to "
Dianne Hackbornb961cd22011-06-21 12:13:37 -0700249 + Binder.getCallingPid());
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800250 return res;
251 }
252
Andrew Scull26f830d2017-05-19 12:16:10 +0100253 @Override
Dianne Hackborn64825172011-03-02 21:32:58 -0800254 public boolean outOfMemory(IWindow window) {
255 return mService.outOfMemoryWindow(this, window);
256 }
257
Andrew Scull26f830d2017-05-19 12:16:10 +0100258 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800259 public void setTransparentRegion(IWindow window, Region region) {
260 mService.setTransparentRegionWindow(this, window, region);
261 }
262
Andrew Scull26f830d2017-05-19 12:16:10 +0100263 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800264 public void setInsets(IWindow window, int touchableInsets,
265 Rect contentInsets, Rect visibleInsets, Region touchableArea) {
266 mService.setInsetsWindow(this, window, touchableInsets, contentInsets,
267 visibleInsets, touchableArea);
268 }
269
Andrew Scull26f830d2017-05-19 12:16:10 +0100270 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800271 public void getDisplayFrame(IWindow window, Rect outDisplayFrame) {
272 mService.getWindowDisplayFrame(this, window, outDisplayFrame);
273 }
274
Andrew Scull26f830d2017-05-19 12:16:10 +0100275 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800276 public void finishDrawing(IWindow window) {
277 if (WindowManagerService.localLOGV) Slog.v(
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800278 TAG_WM, "IWindow finishDrawing called for " + window);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800279 mService.finishDrawingWindow(this, window);
280 }
281
Andrew Scull26f830d2017-05-19 12:16:10 +0100282 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800283 public void setInTouchMode(boolean mode) {
284 synchronized(mService.mWindowMap) {
285 mService.mInTouchMode = mode;
286 }
287 }
288
Andrew Scull26f830d2017-05-19 12:16:10 +0100289 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800290 public boolean getInTouchMode() {
291 synchronized(mService.mWindowMap) {
292 return mService.mInTouchMode;
293 }
294 }
295
Andrew Scull26f830d2017-05-19 12:16:10 +0100296 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800297 public boolean performHapticFeedback(IWindow window, int effectId,
298 boolean always) {
299 synchronized(mService.mWindowMap) {
300 long ident = Binder.clearCallingIdentity();
301 try {
302 return mService.mPolicy.performHapticFeedbackLw(
303 mService.windowForClientLocked(this, window, true),
304 effectId, always);
305 } finally {
306 Binder.restoreCallingIdentity(ident);
307 }
308 }
309 }
310
311 /* Drag/drop */
Andrew Scull26f830d2017-05-19 12:16:10 +0100312 @Override
Daichi Hironoa1fb9be2017-12-18 17:02:54 +0900313 public IBinder prepareDrag(IWindow window, int flags, int width, int height) {
Daichi Hironodf5cf622017-09-11 14:59:26 +0900314 final int callerPid = Binder.getCallingPid();
315 final int callerUid = Binder.getCallingUid();
316 final long ident = Binder.clearCallingIdentity();
317 try {
Daichi Hironoa1fb9be2017-12-18 17:02:54 +0900318 return mDragDropController.prepareDrag(mSurfaceSession, callerPid, callerUid, window,
319 flags, width, height);
Daichi Hironodf5cf622017-09-11 14:59:26 +0900320 } finally {
321 Binder.restoreCallingIdentity(ident);
322 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800323 }
324
Andrew Scull26f830d2017-05-19 12:16:10 +0100325 @Override
Daichi Hironoa1fb9be2017-12-18 17:02:54 +0900326 public boolean performDrag(IWindow window, IBinder dragToken, SurfaceControl surface,
Vladislav Kaznacheevba761122016-01-22 12:09:45 -0800327 int touchSource, float touchX, float touchY, float thumbCenterX, float thumbCenterY,
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800328 ClipData data) {
Daichi Hironoa1fb9be2017-12-18 17:02:54 +0900329 return mDragDropController.performDrag(mSurfaceSession, window, dragToken, surface,
330 touchSource, touchX, touchY, thumbCenterX, thumbCenterY, data);
Daichi Hironodf5cf622017-09-11 14:59:26 +0900331 }
332
333 @Override
334 public void reportDropResult(IWindow window, boolean consumed) {
335 final long ident = Binder.clearCallingIdentity();
336 try {
Daichi Hirono58e25e12017-10-25 15:48:08 +0900337 mDragDropController.reportDropResult(window, consumed);
Daichi Hironodf5cf622017-09-11 14:59:26 +0900338 } finally {
339 Binder.restoreCallingIdentity(ident);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800340 }
Daichi Hironodf5cf622017-09-11 14:59:26 +0900341 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800342
Daichi Hironodf5cf622017-09-11 14:59:26 +0900343 @Override
344 public void cancelDragAndDrop(IBinder dragToken) {
345 final long ident = Binder.clearCallingIdentity();
346 try {
Daichi Hirono58e25e12017-10-25 15:48:08 +0900347 mDragDropController.cancelDragAndDrop(dragToken);
Daichi Hironodf5cf622017-09-11 14:59:26 +0900348 } finally {
349 Binder.restoreCallingIdentity(ident);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800350 }
Daichi Hironodf5cf622017-09-11 14:59:26 +0900351 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800352
Daichi Hironodf5cf622017-09-11 14:59:26 +0900353 @Override
354 public void dragRecipientEntered(IWindow window) {
355 mDragDropController.dragRecipientEntered(window);
356 }
357
358 @Override
359 public void dragRecipientExited(IWindow window) {
360 mDragDropController.dragRecipientExited(window);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800361 }
362
Andrew Scull26f830d2017-05-19 12:16:10 +0100363 @Override
Chong Zhang8e89b312015-09-09 15:09:30 -0700364 public boolean startMovingTask(IWindow window, float startX, float startY) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800365 if (DEBUG_TASK_POSITIONING) Slog.d(
366 TAG_WM, "startMovingTask: {" + startX + "," + startY + "}");
Chong Zhang8e89b312015-09-09 15:09:30 -0700367
Wale Ogunwale09e1b8d2016-02-23 10:38:35 -0800368 long ident = Binder.clearCallingIdentity();
369 try {
Daichi Hirono34fb7312017-12-04 10:00:24 +0900370 return mService.mTaskPositioningController.startMovingTask(window, startX, startY);
Wale Ogunwale09e1b8d2016-02-23 10:38:35 -0800371 } finally {
372 Binder.restoreCallingIdentity(ident);
373 }
Chong Zhang8e89b312015-09-09 15:09:30 -0700374 }
375
Andrew Scull26f830d2017-05-19 12:16:10 +0100376 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800377 public void setWallpaperPosition(IBinder window, float x, float y, float xStep, float yStep) {
378 synchronized(mService.mWindowMap) {
379 long ident = Binder.clearCallingIdentity();
380 try {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700381 mService.mRoot.mWallpaperController.setWindowWallpaperPosition(
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800382 mService.windowForClientLocked(this, window, true),
383 x, y, xStep, yStep);
384 } finally {
385 Binder.restoreCallingIdentity(ident);
386 }
387 }
388 }
389
Andrew Scull26f830d2017-05-19 12:16:10 +0100390 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800391 public void wallpaperOffsetsComplete(IBinder window) {
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700392 synchronized (mService.mWindowMap) {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700393 mService.mRoot.mWallpaperController.wallpaperOffsetsComplete(window);
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700394 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800395 }
396
Andrew Scull26f830d2017-05-19 12:16:10 +0100397 @Override
Dianne Hackborn067e5f62014-09-07 23:14:30 -0700398 public void setWallpaperDisplayOffset(IBinder window, int x, int y) {
399 synchronized(mService.mWindowMap) {
400 long ident = Binder.clearCallingIdentity();
401 try {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700402 mService.mRoot.mWallpaperController.setWindowWallpaperDisplayOffset(
Dianne Hackborn067e5f62014-09-07 23:14:30 -0700403 mService.windowForClientLocked(this, window, true), x, y);
404 } finally {
405 Binder.restoreCallingIdentity(ident);
406 }
407 }
408 }
409
Andrew Scull26f830d2017-05-19 12:16:10 +0100410 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800411 public Bundle sendWallpaperCommand(IBinder window, String action, int x, int y,
412 int z, Bundle extras, boolean sync) {
413 synchronized(mService.mWindowMap) {
414 long ident = Binder.clearCallingIdentity();
415 try {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700416 return mService.mRoot.mWallpaperController.sendWindowWallpaperCommand(
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800417 mService.windowForClientLocked(this, window, true),
418 action, x, y, z, extras, sync);
419 } finally {
420 Binder.restoreCallingIdentity(ident);
421 }
422 }
423 }
424
Andrew Scull26f830d2017-05-19 12:16:10 +0100425 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800426 public void wallpaperCommandComplete(IBinder window, Bundle result) {
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700427 synchronized (mService.mWindowMap) {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700428 mService.mRoot.mWallpaperController.wallpaperCommandComplete(window);
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700429 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800430 }
431
Andrew Scull26f830d2017-05-19 12:16:10 +0100432 @Override
Svetoslavf7174e82014-06-12 11:29:35 -0700433 public void onRectangleOnScreenRequested(IBinder token, Rect rectangle) {
Svetoslav Ganov1cf70bb2012-08-06 10:53:34 -0700434 synchronized(mService.mWindowMap) {
435 final long identity = Binder.clearCallingIdentity();
436 try {
Svetoslavf7174e82014-06-12 11:29:35 -0700437 mService.onRectangleOnScreenRequested(token, rectangle);
Svetoslav Ganov1cf70bb2012-08-06 10:53:34 -0700438 } finally {
439 Binder.restoreCallingIdentity(identity);
440 }
441 }
442 }
443
Andrew Scull26f830d2017-05-19 12:16:10 +0100444 @Override
Dianne Hackborne3f23a32013-03-01 13:25:35 -0800445 public IWindowId getWindowId(IBinder window) {
446 return mService.getWindowId(window);
447 }
448
Jeff Brownc2932a12014-11-20 18:04:05 -0800449 @Override
450 public void pokeDrawLock(IBinder window) {
451 final long identity = Binder.clearCallingIdentity();
452 try {
453 mService.pokeDrawLock(this, window);
454 } finally {
455 Binder.restoreCallingIdentity(identity);
456 }
457 }
458
Vladislav Kaznacheev989b58a2016-02-10 12:19:33 -0800459 @Override
460 public void updatePointerIcon(IWindow window) {
461 final long identity = Binder.clearCallingIdentity();
462 try {
463 mService.updatePointerIcon(window);
464 } finally {
465 Binder.restoreCallingIdentity(identity);
466 }
467 }
468
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800469 void windowAddedLocked(String packageName) {
470 mPackageName = packageName;
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700471 mRelayoutTag = "relayoutWindow: " + mPackageName;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800472 if (mSurfaceSession == null) {
473 if (WindowManagerService.localLOGV) Slog.v(
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800474 TAG_WM, "First window added to " + this + ", creating SurfaceSession");
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800475 mSurfaceSession = new SurfaceSession();
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800476 if (SHOW_TRANSACTIONS) Slog.i(
477 TAG_WM, " NEW SURFACE SESSION " + mSurfaceSession);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800478 mService.mSessions.add(this);
Dianne Hackborneb94fa72014-06-03 17:48:12 -0700479 if (mLastReportedAnimatorScale != mService.getCurrentAnimatorScale()) {
480 mService.dispatchNewAnimatorScaleLocked(this);
481 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800482 }
483 mNumWindow++;
484 }
485
Wale Ogunwale943002b2017-02-15 19:34:01 -0800486 void windowRemovedLocked() {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800487 mNumWindow--;
Wale Ogunwale943002b2017-02-15 19:34:01 -0800488 killSessionLocked();
489 }
490
491
492 void onWindowSurfaceVisibilityChanged(WindowSurfaceController surfaceController,
493 boolean visible, int type) {
494
495 if (!isSystemAlertWindowType(type)) {
496 return;
497 }
498
499 boolean changed;
500
501 if (!mCanAddInternalSystemWindow) {
502 // We want to track non-system signature apps adding alert windows so we can post an
503 // on-going notification for the user to control their visibility.
504 if (visible) {
505 changed = mAlertWindowSurfaces.add(surfaceController);
506 } else {
507 changed = mAlertWindowSurfaces.remove(surfaceController);
508 }
509
510 if (changed) {
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800511 if (mAlertWindowSurfaces.isEmpty()) {
512 cancelAlertWindowNotification();
513 } else if (mAlertWindowNotification == null){
Wale Ogunwaled76881e2017-03-10 13:17:56 -0800514 mAlertWindowNotification = new AlertWindowNotification(mService, mPackageName);
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700515 if (mShowingAlertWindowNotificationAllowed) {
516 mAlertWindowNotification.post();
517 }
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800518 }
Wale Ogunwaled993a572017-02-05 13:52:09 -0800519 }
520 }
Wale Ogunwale943002b2017-02-15 19:34:01 -0800521
522 if (type != TYPE_APPLICATION_OVERLAY) {
523 return;
524 }
525
526 if (visible) {
527 changed = mAppOverlaySurfaces.add(surfaceController);
528 } else {
529 changed = mAppOverlaySurfaces.remove(surfaceController);
530 }
531
532 if (changed) {
533 // Notify activity manager of changes to app overlay windows so it can adjust the
534 // importance score for the process.
535 setHasOverlayUi(!mAppOverlaySurfaces.isEmpty());
536 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800537 }
538
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700539 void setShowingAlertWindowNotificationAllowed(boolean allowed) {
540 mShowingAlertWindowNotificationAllowed = allowed;
541 if (mAlertWindowNotification != null) {
542 if (allowed) {
543 mAlertWindowNotification.post();
544 } else {
545 mAlertWindowNotification.cancel();
546 }
547 }
548 }
549
Wale Ogunwaled993a572017-02-05 13:52:09 -0800550 private void killSessionLocked() {
551 if (mNumWindow > 0 || !mClientDead) {
552 return;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800553 }
Wale Ogunwaled993a572017-02-05 13:52:09 -0800554
555 mService.mSessions.remove(this);
556 if (mSurfaceSession == null) {
557 return;
558 }
559
560 if (WindowManagerService.localLOGV) Slog.v(TAG_WM, "Last window removed from " + this
561 + ", destroying " + mSurfaceSession);
562 if (SHOW_TRANSACTIONS) Slog.i(TAG_WM, " KILL SURFACE SESSION " + mSurfaceSession);
563 try {
564 mSurfaceSession.kill();
565 } catch (Exception e) {
566 Slog.w(TAG_WM, "Exception thrown when killing surface session " + mSurfaceSession
567 + " in session " + this + ": " + e.toString());
568 }
569 mSurfaceSession = null;
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800570 mAlertWindowSurfaces.clear();
571 mAppOverlaySurfaces.clear();
Wale Ogunwaled993a572017-02-05 13:52:09 -0800572 setHasOverlayUi(false);
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800573 cancelAlertWindowNotification();
Wale Ogunwaled993a572017-02-05 13:52:09 -0800574 }
575
576 private void setHasOverlayUi(boolean hasOverlayUi) {
577 mService.mH.obtainMessage(H.SET_HAS_OVERLAY_UI, mPid, hasOverlayUi ? 1 : 0).sendToTarget();
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800578 }
579
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800580 private void cancelAlertWindowNotification() {
581 if (mAlertWindowNotification == null) {
582 return;
583 }
584 mAlertWindowNotification.cancel();
585 mAlertWindowNotification = null;
586 }
587
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800588 void dump(PrintWriter pw, String prefix) {
589 pw.print(prefix); pw.print("mNumWindow="); pw.print(mNumWindow);
Wale Ogunwale5aa86832017-02-28 10:40:27 -0800590 pw.print(" mCanAddInternalSystemWindow="); pw.print(mCanAddInternalSystemWindow);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800591 pw.print(" mAppOverlaySurfaces="); pw.print(mAppOverlaySurfaces);
592 pw.print(" mAlertWindowSurfaces="); pw.print(mAlertWindowSurfaces);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800593 pw.print(" mClientDead="); pw.print(mClientDead);
594 pw.print(" mSurfaceSession="); pw.println(mSurfaceSession);
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700595 pw.print(prefix); pw.print("mPackageName="); pw.println(mPackageName);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800596 }
597
598 @Override
599 public String toString() {
600 return mStringName;
601 }
Robert Carr0e007272017-10-02 13:00:55 -0700602
603 boolean hasAlertWindowSurfaces() {
604 return !mAlertWindowSurfaces.isEmpty();
605 }
Filip Gruszczynski2217f612015-05-26 11:32:08 -0700606}