blob: 1a5e535fff385260f3f82d70737a9025d4d9d948 [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;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080026import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DRAG;
27import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_POSITIONING;
28import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS;
29import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS;
30import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080031
32import android.content.ClipData;
33import android.content.Context;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080034import android.graphics.Rect;
35import android.graphics.Region;
36import android.os.Binder;
37import android.os.Bundle;
38import android.os.IBinder;
39import android.os.Parcel;
Dianne Hackborn5fe7e2a2012-10-04 11:58:16 -070040import android.os.Process;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080041import android.os.RemoteException;
42import android.os.ServiceManager;
Wale Ogunwale4958ad22017-06-22 09:08:14 -070043import android.os.Trace;
Dianne Hackborn5fe7e2a2012-10-04 11:58:16 -070044import android.os.UserHandle;
Andrii Kulian44607962017-03-16 11:06:24 -070045import android.util.MergedConfiguration;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080046import android.util.Slog;
Craig Mautner6881a102012-07-27 13:04:51 -070047import android.view.Display;
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;
Mathias Agopian3866f0d2013-02-11 22:08:48 -080054import 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,
Filip Gruszczynski0ec13282015-06-25 11:26:01 -0700195 outContentInsets, outStableInsets, null /* outOutsets */, outInputChannel);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800196 }
Craig Mautner6881a102012-07-27 13:04:51 -0700197
198 @Override
199 public int addToDisplay(IWindow window, int seq, WindowManager.LayoutParams attrs,
Adrian Roos37d7a682014-11-06 18:15:16 +0100200 int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets,
Filip Gruszczynski0ec13282015-06-25 11:26:01 -0700201 Rect outOutsets, InputChannel outInputChannel) {
Craig Mautner6881a102012-07-27 13:04:51 -0700202 return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
Filip Gruszczynski0ec13282015-06-25 11:26:01 -0700203 outContentInsets, outStableInsets, outOutsets, outInputChannel);
Craig Mautner6881a102012-07-27 13:04:51 -0700204 }
205
206 @Override
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700207 public int addWithoutInputChannel(IWindow window, int seq, WindowManager.LayoutParams attrs,
Adrian Roos37d7a682014-11-06 18:15:16 +0100208 int viewVisibility, Rect outContentInsets, Rect outStableInsets) {
Craig Mautner6881a102012-07-27 13:04:51 -0700209 return addToDisplayWithoutInputChannel(window, seq, attrs, viewVisibility,
Adrian Roos37d7a682014-11-06 18:15:16 +0100210 Display.DEFAULT_DISPLAY, outContentInsets, outStableInsets);
Craig Mautner6881a102012-07-27 13:04:51 -0700211 }
212
213 @Override
214 public int addToDisplayWithoutInputChannel(IWindow window, int seq, WindowManager.LayoutParams attrs,
Adrian Roos37d7a682014-11-06 18:15:16 +0100215 int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets) {
Craig Mautner6881a102012-07-27 13:04:51 -0700216 return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
Filip Gruszczynski0ec13282015-06-25 11:26:01 -0700217 outContentInsets, outStableInsets, null /* outOutsets */, null);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800218 }
219
Andrew Scull26f830d2017-05-19 12:16:10 +0100220 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800221 public void remove(IWindow window) {
222 mService.removeWindow(this, window);
223 }
224
Rob Carr64e516f2015-10-29 00:20:45 +0000225 @Override
Robert Carr77bdfb52016-05-02 18:18:31 -0700226 public void prepareToReplaceWindows(IBinder appToken, boolean childrenOnly) {
Wale Ogunwale9bc47732016-08-10 14:44:22 -0700227 mService.setWillReplaceWindows(appToken, childrenOnly);
Robert Carr23fa16b2016-01-13 13:19:58 -0800228 }
229
Andrew Scull26f830d2017-05-19 12:16:10 +0100230 @Override
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700231 public int relayout(IWindow window, int seq, WindowManager.LayoutParams attrs,
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800232 int requestedWidth, int requestedHeight, int viewFlags,
Dianne Hackbornc4aad012013-02-22 15:05:25 -0800233 int flags, Rect outFrame, Rect outOverscanInsets, Rect outContentInsets,
Jorim Jaggi2e95a482016-01-14 17:36:55 -0800234 Rect outVisibleInsets, Rect outStableInsets, Rect outsets, Rect outBackdropFrame,
Andrii Kulian44607962017-03-16 11:06:24 -0700235 MergedConfiguration mergedConfiguration, Surface outSurface) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800236 if (false) Slog.d(TAG_WM, ">>>>>> ENTERED relayout from "
Dianne Hackbornb961cd22011-06-21 12:13:37 -0700237 + Binder.getCallingPid());
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700238 Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, mRelayoutTag);
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700239 int res = mService.relayoutWindow(this, window, seq, attrs,
Dianne Hackborn6d05fd32011-11-19 14:36:15 -0800240 requestedWidth, requestedHeight, viewFlags, flags,
Dianne Hackbornc4aad012013-02-22 15:05:25 -0800241 outFrame, outOverscanInsets, outContentInsets, outVisibleInsets,
Andrii Kulian44607962017-03-16 11:06:24 -0700242 outStableInsets, outsets, outBackdropFrame, mergedConfiguration, outSurface);
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700243 Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800244 if (false) Slog.d(TAG_WM, "<<<<<< EXITING relayout to "
Dianne Hackbornb961cd22011-06-21 12:13:37 -0700245 + Binder.getCallingPid());
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800246 return res;
247 }
248
Andrew Scull26f830d2017-05-19 12:16:10 +0100249 @Override
Dianne Hackborn64825172011-03-02 21:32:58 -0800250 public boolean outOfMemory(IWindow window) {
251 return mService.outOfMemoryWindow(this, window);
252 }
253
Andrew Scull26f830d2017-05-19 12:16:10 +0100254 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800255 public void setTransparentRegion(IWindow window, Region region) {
256 mService.setTransparentRegionWindow(this, window, region);
257 }
258
Andrew Scull26f830d2017-05-19 12:16:10 +0100259 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800260 public void setInsets(IWindow window, int touchableInsets,
261 Rect contentInsets, Rect visibleInsets, Region touchableArea) {
262 mService.setInsetsWindow(this, window, touchableInsets, contentInsets,
263 visibleInsets, touchableArea);
264 }
265
Andrew Scull26f830d2017-05-19 12:16:10 +0100266 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800267 public void getDisplayFrame(IWindow window, Rect outDisplayFrame) {
268 mService.getWindowDisplayFrame(this, window, outDisplayFrame);
269 }
270
Andrew Scull26f830d2017-05-19 12:16:10 +0100271 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800272 public void finishDrawing(IWindow window) {
273 if (WindowManagerService.localLOGV) Slog.v(
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800274 TAG_WM, "IWindow finishDrawing called for " + window);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800275 mService.finishDrawingWindow(this, window);
276 }
277
Andrew Scull26f830d2017-05-19 12:16:10 +0100278 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800279 public void setInTouchMode(boolean mode) {
280 synchronized(mService.mWindowMap) {
281 mService.mInTouchMode = mode;
282 }
283 }
284
Andrew Scull26f830d2017-05-19 12:16:10 +0100285 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800286 public boolean getInTouchMode() {
287 synchronized(mService.mWindowMap) {
288 return mService.mInTouchMode;
289 }
290 }
291
Andrew Scull26f830d2017-05-19 12:16:10 +0100292 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800293 public boolean performHapticFeedback(IWindow window, int effectId,
294 boolean always) {
295 synchronized(mService.mWindowMap) {
296 long ident = Binder.clearCallingIdentity();
297 try {
298 return mService.mPolicy.performHapticFeedbackLw(
299 mService.windowForClientLocked(this, window, true),
300 effectId, always);
301 } finally {
302 Binder.restoreCallingIdentity(ident);
303 }
304 }
305 }
306
307 /* Drag/drop */
Andrew Scull26f830d2017-05-19 12:16:10 +0100308 @Override
Daichi Hironodf5cf622017-09-11 14:59:26 +0900309 public IBinder prepareDrag(IWindow window, int flags, int width, int height,
310 Surface outSurface) {
311 final int callerPid = Binder.getCallingPid();
312 final int callerUid = Binder.getCallingUid();
313 final long ident = Binder.clearCallingIdentity();
314 try {
315 return mDragDropController.prepareDrag(
Daichi Hirono58e25e12017-10-25 15:48:08 +0900316 mSurfaceSession, callerPid, callerUid, window, flags, width, height,
Daichi Hironodf5cf622017-09-11 14:59:26 +0900317 outSurface);
318 } finally {
319 Binder.restoreCallingIdentity(ident);
320 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800321 }
322
Andrew Scull26f830d2017-05-19 12:16:10 +0100323 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800324 public boolean performDrag(IWindow window, IBinder dragToken,
Vladislav Kaznacheevba761122016-01-22 12:09:45 -0800325 int touchSource, float touchX, float touchY, float thumbCenterX, float thumbCenterY,
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800326 ClipData data) {
Daichi Hirono58e25e12017-10-25 15:48:08 +0900327 return mDragDropController.performDrag(window, dragToken, touchSource,
Daichi Hironodf5cf622017-09-11 14:59:26 +0900328 touchX, touchY, thumbCenterX, thumbCenterY, data);
329 }
330
331 @Override
332 public void reportDropResult(IWindow window, boolean consumed) {
333 final long ident = Binder.clearCallingIdentity();
334 try {
Daichi Hirono58e25e12017-10-25 15:48:08 +0900335 mDragDropController.reportDropResult(window, consumed);
Daichi Hironodf5cf622017-09-11 14:59:26 +0900336 } finally {
337 Binder.restoreCallingIdentity(ident);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800338 }
Daichi Hironodf5cf622017-09-11 14:59:26 +0900339 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800340
Daichi Hironodf5cf622017-09-11 14:59:26 +0900341 @Override
342 public void cancelDragAndDrop(IBinder dragToken) {
343 final long ident = Binder.clearCallingIdentity();
344 try {
Daichi Hirono58e25e12017-10-25 15:48:08 +0900345 mDragDropController.cancelDragAndDrop(dragToken);
Daichi Hironodf5cf622017-09-11 14:59:26 +0900346 } finally {
347 Binder.restoreCallingIdentity(ident);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800348 }
Daichi Hironodf5cf622017-09-11 14:59:26 +0900349 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800350
Daichi Hironodf5cf622017-09-11 14:59:26 +0900351 @Override
352 public void dragRecipientEntered(IWindow window) {
353 mDragDropController.dragRecipientEntered(window);
354 }
355
356 @Override
357 public void dragRecipientExited(IWindow window) {
358 mDragDropController.dragRecipientExited(window);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800359 }
360
Andrew Scull26f830d2017-05-19 12:16:10 +0100361 @Override
Chong Zhang8e89b312015-09-09 15:09:30 -0700362 public boolean startMovingTask(IWindow window, float startX, float startY) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800363 if (DEBUG_TASK_POSITIONING) Slog.d(
364 TAG_WM, "startMovingTask: {" + startX + "," + startY + "}");
Chong Zhang8e89b312015-09-09 15:09:30 -0700365
Wale Ogunwale09e1b8d2016-02-23 10:38:35 -0800366 long ident = Binder.clearCallingIdentity();
367 try {
Daichi Hirono34fb7312017-12-04 10:00:24 +0900368 return mService.mTaskPositioningController.startMovingTask(window, startX, startY);
Wale Ogunwale09e1b8d2016-02-23 10:38:35 -0800369 } finally {
370 Binder.restoreCallingIdentity(ident);
371 }
Chong Zhang8e89b312015-09-09 15:09:30 -0700372 }
373
Andrew Scull26f830d2017-05-19 12:16:10 +0100374 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800375 public void setWallpaperPosition(IBinder window, float x, float y, float xStep, float yStep) {
376 synchronized(mService.mWindowMap) {
377 long ident = Binder.clearCallingIdentity();
378 try {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700379 mService.mRoot.mWallpaperController.setWindowWallpaperPosition(
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800380 mService.windowForClientLocked(this, window, true),
381 x, y, xStep, yStep);
382 } finally {
383 Binder.restoreCallingIdentity(ident);
384 }
385 }
386 }
387
Andrew Scull26f830d2017-05-19 12:16:10 +0100388 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800389 public void wallpaperOffsetsComplete(IBinder window) {
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700390 synchronized (mService.mWindowMap) {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700391 mService.mRoot.mWallpaperController.wallpaperOffsetsComplete(window);
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700392 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800393 }
394
Andrew Scull26f830d2017-05-19 12:16:10 +0100395 @Override
Dianne Hackborn067e5f62014-09-07 23:14:30 -0700396 public void setWallpaperDisplayOffset(IBinder window, int x, int y) {
397 synchronized(mService.mWindowMap) {
398 long ident = Binder.clearCallingIdentity();
399 try {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700400 mService.mRoot.mWallpaperController.setWindowWallpaperDisplayOffset(
Dianne Hackborn067e5f62014-09-07 23:14:30 -0700401 mService.windowForClientLocked(this, window, true), x, y);
402 } finally {
403 Binder.restoreCallingIdentity(ident);
404 }
405 }
406 }
407
Andrew Scull26f830d2017-05-19 12:16:10 +0100408 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800409 public Bundle sendWallpaperCommand(IBinder window, String action, int x, int y,
410 int z, Bundle extras, boolean sync) {
411 synchronized(mService.mWindowMap) {
412 long ident = Binder.clearCallingIdentity();
413 try {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700414 return mService.mRoot.mWallpaperController.sendWindowWallpaperCommand(
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800415 mService.windowForClientLocked(this, window, true),
416 action, x, y, z, extras, sync);
417 } finally {
418 Binder.restoreCallingIdentity(ident);
419 }
420 }
421 }
422
Andrew Scull26f830d2017-05-19 12:16:10 +0100423 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800424 public void wallpaperCommandComplete(IBinder window, Bundle result) {
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700425 synchronized (mService.mWindowMap) {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700426 mService.mRoot.mWallpaperController.wallpaperCommandComplete(window);
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700427 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800428 }
429
Andrew Scull26f830d2017-05-19 12:16:10 +0100430 @Override
Svetoslavf7174e82014-06-12 11:29:35 -0700431 public void onRectangleOnScreenRequested(IBinder token, Rect rectangle) {
Svetoslav Ganov1cf70bb2012-08-06 10:53:34 -0700432 synchronized(mService.mWindowMap) {
433 final long identity = Binder.clearCallingIdentity();
434 try {
Svetoslavf7174e82014-06-12 11:29:35 -0700435 mService.onRectangleOnScreenRequested(token, rectangle);
Svetoslav Ganov1cf70bb2012-08-06 10:53:34 -0700436 } finally {
437 Binder.restoreCallingIdentity(identity);
438 }
439 }
440 }
441
Andrew Scull26f830d2017-05-19 12:16:10 +0100442 @Override
Dianne Hackborne3f23a32013-03-01 13:25:35 -0800443 public IWindowId getWindowId(IBinder window) {
444 return mService.getWindowId(window);
445 }
446
Jeff Brownc2932a12014-11-20 18:04:05 -0800447 @Override
448 public void pokeDrawLock(IBinder window) {
449 final long identity = Binder.clearCallingIdentity();
450 try {
451 mService.pokeDrawLock(this, window);
452 } finally {
453 Binder.restoreCallingIdentity(identity);
454 }
455 }
456
Vladislav Kaznacheev989b58a2016-02-10 12:19:33 -0800457 @Override
458 public void updatePointerIcon(IWindow window) {
459 final long identity = Binder.clearCallingIdentity();
460 try {
461 mService.updatePointerIcon(window);
462 } finally {
463 Binder.restoreCallingIdentity(identity);
464 }
465 }
466
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800467 void windowAddedLocked(String packageName) {
468 mPackageName = packageName;
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700469 mRelayoutTag = "relayoutWindow: " + mPackageName;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800470 if (mSurfaceSession == null) {
471 if (WindowManagerService.localLOGV) Slog.v(
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800472 TAG_WM, "First window added to " + this + ", creating SurfaceSession");
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800473 mSurfaceSession = new SurfaceSession();
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800474 if (SHOW_TRANSACTIONS) Slog.i(
475 TAG_WM, " NEW SURFACE SESSION " + mSurfaceSession);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800476 mService.mSessions.add(this);
Dianne Hackborneb94fa72014-06-03 17:48:12 -0700477 if (mLastReportedAnimatorScale != mService.getCurrentAnimatorScale()) {
478 mService.dispatchNewAnimatorScaleLocked(this);
479 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800480 }
481 mNumWindow++;
482 }
483
Wale Ogunwale943002b2017-02-15 19:34:01 -0800484 void windowRemovedLocked() {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800485 mNumWindow--;
Wale Ogunwale943002b2017-02-15 19:34:01 -0800486 killSessionLocked();
487 }
488
489
490 void onWindowSurfaceVisibilityChanged(WindowSurfaceController surfaceController,
491 boolean visible, int type) {
492
493 if (!isSystemAlertWindowType(type)) {
494 return;
495 }
496
497 boolean changed;
498
499 if (!mCanAddInternalSystemWindow) {
500 // We want to track non-system signature apps adding alert windows so we can post an
501 // on-going notification for the user to control their visibility.
502 if (visible) {
503 changed = mAlertWindowSurfaces.add(surfaceController);
504 } else {
505 changed = mAlertWindowSurfaces.remove(surfaceController);
506 }
507
508 if (changed) {
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800509 if (mAlertWindowSurfaces.isEmpty()) {
510 cancelAlertWindowNotification();
511 } else if (mAlertWindowNotification == null){
Wale Ogunwaled76881e2017-03-10 13:17:56 -0800512 mAlertWindowNotification = new AlertWindowNotification(mService, mPackageName);
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700513 if (mShowingAlertWindowNotificationAllowed) {
514 mAlertWindowNotification.post();
515 }
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800516 }
Wale Ogunwaled993a572017-02-05 13:52:09 -0800517 }
518 }
Wale Ogunwale943002b2017-02-15 19:34:01 -0800519
520 if (type != TYPE_APPLICATION_OVERLAY) {
521 return;
522 }
523
524 if (visible) {
525 changed = mAppOverlaySurfaces.add(surfaceController);
526 } else {
527 changed = mAppOverlaySurfaces.remove(surfaceController);
528 }
529
530 if (changed) {
531 // Notify activity manager of changes to app overlay windows so it can adjust the
532 // importance score for the process.
533 setHasOverlayUi(!mAppOverlaySurfaces.isEmpty());
534 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800535 }
536
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700537 void setShowingAlertWindowNotificationAllowed(boolean allowed) {
538 mShowingAlertWindowNotificationAllowed = allowed;
539 if (mAlertWindowNotification != null) {
540 if (allowed) {
541 mAlertWindowNotification.post();
542 } else {
543 mAlertWindowNotification.cancel();
544 }
545 }
546 }
547
Wale Ogunwaled993a572017-02-05 13:52:09 -0800548 private void killSessionLocked() {
549 if (mNumWindow > 0 || !mClientDead) {
550 return;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800551 }
Wale Ogunwaled993a572017-02-05 13:52:09 -0800552
553 mService.mSessions.remove(this);
554 if (mSurfaceSession == null) {
555 return;
556 }
557
558 if (WindowManagerService.localLOGV) Slog.v(TAG_WM, "Last window removed from " + this
559 + ", destroying " + mSurfaceSession);
560 if (SHOW_TRANSACTIONS) Slog.i(TAG_WM, " KILL SURFACE SESSION " + mSurfaceSession);
561 try {
562 mSurfaceSession.kill();
563 } catch (Exception e) {
564 Slog.w(TAG_WM, "Exception thrown when killing surface session " + mSurfaceSession
565 + " in session " + this + ": " + e.toString());
566 }
567 mSurfaceSession = null;
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800568 mAlertWindowSurfaces.clear();
569 mAppOverlaySurfaces.clear();
Wale Ogunwaled993a572017-02-05 13:52:09 -0800570 setHasOverlayUi(false);
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800571 cancelAlertWindowNotification();
Wale Ogunwaled993a572017-02-05 13:52:09 -0800572 }
573
574 private void setHasOverlayUi(boolean hasOverlayUi) {
575 mService.mH.obtainMessage(H.SET_HAS_OVERLAY_UI, mPid, hasOverlayUi ? 1 : 0).sendToTarget();
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800576 }
577
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800578 private void cancelAlertWindowNotification() {
579 if (mAlertWindowNotification == null) {
580 return;
581 }
582 mAlertWindowNotification.cancel();
583 mAlertWindowNotification = null;
584 }
585
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800586 void dump(PrintWriter pw, String prefix) {
587 pw.print(prefix); pw.print("mNumWindow="); pw.print(mNumWindow);
Wale Ogunwale5aa86832017-02-28 10:40:27 -0800588 pw.print(" mCanAddInternalSystemWindow="); pw.print(mCanAddInternalSystemWindow);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800589 pw.print(" mAppOverlaySurfaces="); pw.print(mAppOverlaySurfaces);
590 pw.print(" mAlertWindowSurfaces="); pw.print(mAlertWindowSurfaces);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800591 pw.print(" mClientDead="); pw.print(mClientDead);
592 pw.print(" mSurfaceSession="); pw.println(mSurfaceSession);
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700593 pw.print(prefix); pw.print("mPackageName="); pw.println(mPackageName);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800594 }
595
596 @Override
597 public String toString() {
598 return mStringName;
599 }
Robert Carr0e007272017-10-02 13:00:55 -0700600
601 boolean hasAlertWindowSurfaces() {
602 return !mAlertWindowSurfaces.isEmpty();
603 }
Filip Gruszczynski2217f612015-05-26 11:32:08 -0700604}