blob: dc8c7b79feefd1595a6e682d5708349739b527b0 [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;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080032import android.graphics.Rect;
33import android.graphics.Region;
34import android.os.Binder;
35import android.os.Bundle;
36import android.os.IBinder;
37import android.os.Parcel;
Dianne Hackborn5fe7e2a2012-10-04 11:58:16 -070038import android.os.Process;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080039import android.os.RemoteException;
Wale Ogunwale4958ad22017-06-22 09:08:14 -070040import android.os.Trace;
Dianne Hackborn5fe7e2a2012-10-04 11:58:16 -070041import android.os.UserHandle;
Andrii Kulian44607962017-03-16 11:06:24 -070042import android.util.MergedConfiguration;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080043import android.util.Slog;
Adrian Roos5c6b6222017-11-07 17:36:10 +010044import android.view.DisplayCutout;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080045import android.view.IWindow;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080046import android.view.IWindowId;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080047import android.view.IWindowSession;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080048import android.view.IWindowSessionCallback;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080049import android.view.InputChannel;
Tiger Huangdda14a72019-01-10 17:20:27 +080050import android.view.InsetsState;
Daichi Hironoa1fb9be2017-12-18 17:02:54 +090051import android.view.SurfaceControl;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080052import android.view.SurfaceSession;
53import android.view.WindowManager;
54
Chenjie Yue8904192017-12-08 19:12:57 -080055import com.android.internal.os.logging.MetricsLoggerWrapper;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080056import com.android.server.wm.WindowManagerService.H;
57
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080058import java.io.PrintWriter;
Wale Ogunwale943002b2017-02-15 19:34:01 -080059import java.util.HashSet;
60import java.util.Set;
wilsonshihc32538e2018-11-07 17:27:34 +080061import java.util.function.BiConsumer;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080062
63/**
64 * This class represents an active client session. There is generally one
65 * Session object per process that is interacting with the window manager.
66 */
Bryce Leea5592862017-10-23 12:57:37 -070067class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080068 final WindowManagerService mService;
Dianne Hackborneb94fa72014-06-03 17:48:12 -070069 final IWindowSessionCallback mCallback;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080070 final int mUid;
71 final int mPid;
Wale Ogunwalecfca2582016-10-19 09:53:25 -070072 private final String mStringName;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080073 SurfaceSession mSurfaceSession;
Wale Ogunwalecfca2582016-10-19 09:53:25 -070074 private int mNumWindow = 0;
Wale Ogunwale943002b2017-02-15 19:34:01 -080075 // Set of visible application overlay window surfaces connected to this session.
76 private final Set<WindowSurfaceController> mAppOverlaySurfaces = new HashSet<>();
77 // Set of visible alert window surfaces connected to this session.
78 private final Set<WindowSurfaceController> mAlertWindowSurfaces = new HashSet<>();
Daichi Hironodf5cf622017-09-11 14:59:26 +090079 private final DragDropController mDragDropController;
Wale Ogunwale943002b2017-02-15 19:34:01 -080080 final boolean mCanAddInternalSystemWindow;
Wale Ogunwale01ad4342017-06-30 07:07:01 -070081 final boolean mCanHideNonSystemOverlayWindows;
Jorim Jaggif12ec0f2017-08-23 16:14:10 +020082 final boolean mCanAcquireSleepToken;
Wale Ogunwale387e4c62017-02-13 09:50:02 -080083 private AlertWindowNotification mAlertWindowNotification;
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -070084 private boolean mShowingAlertWindowNotificationAllowed;
Wale Ogunwalecfca2582016-10-19 09:53:25 -070085 private boolean mClientDead = false;
86 private float mLastReportedAnimatorScale;
Wale Ogunwale387e4c62017-02-13 09:50:02 -080087 private String mPackageName;
Wale Ogunwale4958ad22017-06-22 09:08:14 -070088 private String mRelayoutTag;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080089
Yohei Yukawaa71bb252018-09-19 19:21:24 -070090 public Session(WindowManagerService service, IWindowSessionCallback callback) {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080091 mService = service;
Dianne Hackborneb94fa72014-06-03 17:48:12 -070092 mCallback = callback;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080093 mUid = Binder.getCallingUid();
94 mPid = Binder.getCallingPid();
Dianne Hackborneb94fa72014-06-03 17:48:12 -070095 mLastReportedAnimatorScale = service.getCurrentAnimatorScale();
Wale Ogunwale5aa86832017-02-28 10:40:27 -080096 mCanAddInternalSystemWindow = service.mContext.checkCallingOrSelfPermission(
Wale Ogunwale943002b2017-02-15 19:34:01 -080097 INTERNAL_SYSTEM_WINDOW) == PERMISSION_GRANTED;
Wale Ogunwale01ad4342017-06-30 07:07:01 -070098 mCanHideNonSystemOverlayWindows = service.mContext.checkCallingOrSelfPermission(
99 HIDE_NON_SYSTEM_OVERLAY_WINDOWS) == PERMISSION_GRANTED;
Jorim Jaggif12ec0f2017-08-23 16:14:10 +0200100 mCanAcquireSleepToken = service.mContext.checkCallingOrSelfPermission(DEVICE_POWER)
101 == PERMISSION_GRANTED;
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700102 mShowingAlertWindowNotificationAllowed = mService.mShowAlertWindowNotifications;
Daichi Hironodf5cf622017-09-11 14:59:26 +0900103 mDragDropController = mService.mDragDropController;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800104 StringBuilder sb = new StringBuilder();
105 sb.append("Session{");
106 sb.append(Integer.toHexString(System.identityHashCode(this)));
Dianne Hackborn5fe7e2a2012-10-04 11:58:16 -0700107 sb.append(" ");
108 sb.append(mPid);
109 if (mUid < Process.FIRST_APPLICATION_UID) {
110 sb.append(":");
111 sb.append(mUid);
112 } else {
113 sb.append(":u");
114 sb.append(UserHandle.getUserId(mUid));
115 sb.append('a');
116 sb.append(UserHandle.getAppId(mUid));
117 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800118 sb.append("}");
119 mStringName = sb.toString();
120
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800121 try {
Yohei Yukawaa71bb252018-09-19 19:21:24 -0700122 mCallback.asBinder().linkToDeath(this, 0);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800123 } catch (RemoteException e) {
124 // The caller has died, so we can just forget about this.
Yohei Yukawaa71bb252018-09-19 19:21:24 -0700125 // Hmmm, should we call killSessionLocked()??
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800126 }
127 }
128
129 @Override
130 public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
131 throws RemoteException {
132 try {
133 return super.onTransact(code, data, reply, flags);
134 } catch (RuntimeException e) {
135 // Log all 'real' exceptions thrown to the caller
136 if (!(e instanceof SecurityException)) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800137 Slog.wtf(TAG_WM, "Window Session Crash", e);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800138 }
139 throw e;
140 }
141 }
142
Andrew Scull26f830d2017-05-19 12:16:10 +0100143 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800144 public void binderDied() {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700145 synchronized (mService.mGlobalLock) {
Yohei Yukawaa71bb252018-09-19 19:21:24 -0700146 mCallback.asBinder().unlinkToDeath(this, 0);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800147 mClientDead = true;
148 killSessionLocked();
149 }
150 }
151
Craig Mautner6881a102012-07-27 13:04:51 -0700152 @Override
Craig Mautner6881a102012-07-27 13:04:51 -0700153 public int addToDisplay(IWindow window, int seq, WindowManager.LayoutParams attrs,
Adrian Roos9e370f22018-03-06 18:19:45 +0100154 int viewVisibility, int displayId, Rect outFrame, Rect outContentInsets,
155 Rect outStableInsets, Rect outOutsets,
Jorim Jaggif96c90a2018-09-26 16:55:15 +0200156 DisplayCutout.ParcelableWrapper outDisplayCutout, InputChannel outInputChannel,
157 InsetsState outInsetsState) {
Adrian Roos9e370f22018-03-06 18:19:45 +0100158 return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId, outFrame,
Jorim Jaggif96c90a2018-09-26 16:55:15 +0200159 outContentInsets, outStableInsets, outOutsets, outDisplayCutout, outInputChannel,
160 outInsetsState);
Craig Mautner6881a102012-07-27 13:04:51 -0700161 }
162
163 @Override
Craig Mautner6881a102012-07-27 13:04:51 -0700164 public int addToDisplayWithoutInputChannel(IWindow window, int seq, WindowManager.LayoutParams attrs,
Jorim Jaggif96c90a2018-09-26 16:55:15 +0200165 int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets,
166 InsetsState outInsetsState) {
Craig Mautner6881a102012-07-27 13:04:51 -0700167 return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
Adrian Roos9e370f22018-03-06 18:19:45 +0100168 new Rect() /* outFrame */, outContentInsets, outStableInsets, null /* outOutsets */,
Jorim Jaggif96c90a2018-09-26 16:55:15 +0200169 new DisplayCutout.ParcelableWrapper() /* cutout */, null /* outInputChannel */,
170 outInsetsState);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800171 }
172
Andrew Scull26f830d2017-05-19 12:16:10 +0100173 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800174 public void remove(IWindow window) {
175 mService.removeWindow(this, window);
176 }
177
Rob Carr64e516f2015-10-29 00:20:45 +0000178 @Override
Robert Carr77bdfb52016-05-02 18:18:31 -0700179 public void prepareToReplaceWindows(IBinder appToken, boolean childrenOnly) {
Wale Ogunwale9bc47732016-08-10 14:44:22 -0700180 mService.setWillReplaceWindows(appToken, childrenOnly);
Robert Carr23fa16b2016-01-13 13:19:58 -0800181 }
182
Andrew Scull26f830d2017-05-19 12:16:10 +0100183 @Override
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700184 public int relayout(IWindow window, int seq, WindowManager.LayoutParams attrs,
chaviwbe43ac82018-04-04 15:14:49 -0700185 int requestedWidth, int requestedHeight, int viewFlags, int flags, long frameNumber,
186 Rect outFrame, Rect outOverscanInsets, Rect outContentInsets, Rect outVisibleInsets,
187 Rect outStableInsets, Rect outsets, Rect outBackdropFrame,
188 DisplayCutout.ParcelableWrapper cutout, MergedConfiguration mergedConfiguration,
Robert Carr5fea55b2018-12-10 13:05:52 -0800189 SurfaceControl outSurfaceControl, InsetsState outInsetsState) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800190 if (false) Slog.d(TAG_WM, ">>>>>> ENTERED relayout from "
Dianne Hackbornb961cd22011-06-21 12:13:37 -0700191 + Binder.getCallingPid());
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700192 Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, mRelayoutTag);
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700193 int res = mService.relayoutWindow(this, window, seq, attrs,
chaviwbe43ac82018-04-04 15:14:49 -0700194 requestedWidth, requestedHeight, viewFlags, flags, frameNumber,
Dianne Hackbornc4aad012013-02-22 15:05:25 -0800195 outFrame, outOverscanInsets, outContentInsets, outVisibleInsets,
Adrian Roos5c6b6222017-11-07 17:36:10 +0100196 outStableInsets, outsets, outBackdropFrame, cutout,
Robert Carr5fea55b2018-12-10 13:05:52 -0800197 mergedConfiguration, outSurfaceControl, outInsetsState);
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700198 Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800199 if (false) Slog.d(TAG_WM, "<<<<<< EXITING relayout to "
Dianne Hackbornb961cd22011-06-21 12:13:37 -0700200 + Binder.getCallingPid());
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800201 return res;
202 }
203
Andrew Scull26f830d2017-05-19 12:16:10 +0100204 @Override
Dianne Hackborn64825172011-03-02 21:32:58 -0800205 public boolean outOfMemory(IWindow window) {
206 return mService.outOfMemoryWindow(this, window);
207 }
208
Andrew Scull26f830d2017-05-19 12:16:10 +0100209 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800210 public void setTransparentRegion(IWindow window, Region region) {
211 mService.setTransparentRegionWindow(this, window, region);
212 }
213
Andrew Scull26f830d2017-05-19 12:16:10 +0100214 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800215 public void setInsets(IWindow window, int touchableInsets,
216 Rect contentInsets, Rect visibleInsets, Region touchableArea) {
217 mService.setInsetsWindow(this, window, touchableInsets, contentInsets,
218 visibleInsets, touchableArea);
219 }
220
Andrew Scull26f830d2017-05-19 12:16:10 +0100221 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800222 public void getDisplayFrame(IWindow window, Rect outDisplayFrame) {
223 mService.getWindowDisplayFrame(this, window, outDisplayFrame);
224 }
225
Andrew Scull26f830d2017-05-19 12:16:10 +0100226 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800227 public void finishDrawing(IWindow window) {
228 if (WindowManagerService.localLOGV) Slog.v(
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800229 TAG_WM, "IWindow finishDrawing called for " + window);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800230 mService.finishDrawingWindow(this, window);
231 }
232
Andrew Scull26f830d2017-05-19 12:16:10 +0100233 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800234 public void setInTouchMode(boolean mode) {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700235 synchronized (mService.mGlobalLock) {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800236 mService.mInTouchMode = mode;
237 }
238 }
239
Andrew Scull26f830d2017-05-19 12:16:10 +0100240 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800241 public boolean getInTouchMode() {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700242 synchronized (mService.mGlobalLock) {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800243 return mService.mInTouchMode;
244 }
245 }
246
Andrew Scull26f830d2017-05-19 12:16:10 +0100247 @Override
Arthur Hunga4c52062019-02-19 11:31:44 +0800248 public boolean performHapticFeedback(int effectId, boolean always) {
249 long ident = Binder.clearCallingIdentity();
250 try {
251 return mService.mPolicy.performHapticFeedback(mUid, mPackageName,
Alexey Kuzmine1f06b82018-06-20 17:48:43 +0100252 effectId, always, null);
Arthur Hunga4c52062019-02-19 11:31:44 +0800253 } finally {
254 Binder.restoreCallingIdentity(ident);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800255 }
256 }
257
258 /* Drag/drop */
Daichi Hironofabca092017-12-19 15:02:50 +0900259
Andrew Scull26f830d2017-05-19 12:16:10 +0100260 @Override
Daichi Hironofabca092017-12-19 15:02:50 +0900261 public IBinder performDrag(IWindow window, int flags, SurfaceControl surface, int touchSource,
262 float touchX, float touchY, float thumbCenterX, float thumbCenterY, ClipData data) {
Daichi Hironodf5cf622017-09-11 14:59:26 +0900263 final int callerPid = Binder.getCallingPid();
264 final int callerUid = Binder.getCallingUid();
265 final long ident = Binder.clearCallingIdentity();
266 try {
Daichi Hironofabca092017-12-19 15:02:50 +0900267 return mDragDropController.performDrag(mSurfaceSession, callerPid, callerUid, window,
268 flags, surface, touchSource, touchX, touchY, thumbCenterX, thumbCenterY, data);
Daichi Hironodf5cf622017-09-11 14:59:26 +0900269 } finally {
270 Binder.restoreCallingIdentity(ident);
271 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800272 }
273
Andrew Scull26f830d2017-05-19 12:16:10 +0100274 @Override
Daichi Hironodf5cf622017-09-11 14:59:26 +0900275 public void reportDropResult(IWindow window, boolean consumed) {
276 final long ident = Binder.clearCallingIdentity();
277 try {
Daichi Hirono58e25e12017-10-25 15:48:08 +0900278 mDragDropController.reportDropResult(window, consumed);
Daichi Hironodf5cf622017-09-11 14:59:26 +0900279 } finally {
280 Binder.restoreCallingIdentity(ident);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800281 }
Daichi Hironodf5cf622017-09-11 14:59:26 +0900282 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800283
Daichi Hironodf5cf622017-09-11 14:59:26 +0900284 @Override
285 public void cancelDragAndDrop(IBinder dragToken) {
286 final long ident = Binder.clearCallingIdentity();
287 try {
Daichi Hirono58e25e12017-10-25 15:48:08 +0900288 mDragDropController.cancelDragAndDrop(dragToken);
Daichi Hironodf5cf622017-09-11 14:59:26 +0900289 } finally {
290 Binder.restoreCallingIdentity(ident);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800291 }
Daichi Hironodf5cf622017-09-11 14:59:26 +0900292 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800293
Daichi Hironodf5cf622017-09-11 14:59:26 +0900294 @Override
295 public void dragRecipientEntered(IWindow window) {
296 mDragDropController.dragRecipientEntered(window);
297 }
298
299 @Override
300 public void dragRecipientExited(IWindow window) {
301 mDragDropController.dragRecipientExited(window);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800302 }
303
Andrew Scull26f830d2017-05-19 12:16:10 +0100304 @Override
Chong Zhang8e89b312015-09-09 15:09:30 -0700305 public boolean startMovingTask(IWindow window, float startX, float startY) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800306 if (DEBUG_TASK_POSITIONING) Slog.d(
307 TAG_WM, "startMovingTask: {" + startX + "," + startY + "}");
Chong Zhang8e89b312015-09-09 15:09:30 -0700308
Wale Ogunwale09e1b8d2016-02-23 10:38:35 -0800309 long ident = Binder.clearCallingIdentity();
310 try {
Daichi Hirono34fb7312017-12-04 10:00:24 +0900311 return mService.mTaskPositioningController.startMovingTask(window, startX, startY);
Wale Ogunwale09e1b8d2016-02-23 10:38:35 -0800312 } finally {
313 Binder.restoreCallingIdentity(ident);
314 }
Chong Zhang8e89b312015-09-09 15:09:30 -0700315 }
316
wilsonshihc32538e2018-11-07 17:27:34 +0800317 private void actionOnWallpaper(IBinder window,
318 BiConsumer<WallpaperController, WindowState> action) {
319 final WindowState windowState = mService.windowForClientLocked(this, window, true);
320 action.accept(windowState.getDisplayContent().mWallpaperController, windowState);
321 }
322
Andrew Scull26f830d2017-05-19 12:16:10 +0100323 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800324 public void setWallpaperPosition(IBinder window, float x, float y, float xStep, float yStep) {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700325 synchronized (mService.mGlobalLock) {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800326 long ident = Binder.clearCallingIdentity();
327 try {
wilsonshihc32538e2018-11-07 17:27:34 +0800328 actionOnWallpaper(window, (wpController, windowState) ->
329 wpController.setWindowWallpaperPosition(windowState, x, y, xStep, yStep));
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800330 } finally {
331 Binder.restoreCallingIdentity(ident);
332 }
333 }
334 }
335
Andrew Scull26f830d2017-05-19 12:16:10 +0100336 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800337 public void wallpaperOffsetsComplete(IBinder window) {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700338 synchronized (mService.mGlobalLock) {
wilsonshihc32538e2018-11-07 17:27:34 +0800339 actionOnWallpaper(window, (wpController, windowState) ->
340 wpController.wallpaperOffsetsComplete(window));
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700341 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800342 }
343
Andrew Scull26f830d2017-05-19 12:16:10 +0100344 @Override
Dianne Hackborn067e5f62014-09-07 23:14:30 -0700345 public void setWallpaperDisplayOffset(IBinder window, int x, int y) {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700346 synchronized (mService.mGlobalLock) {
Dianne Hackborn067e5f62014-09-07 23:14:30 -0700347 long ident = Binder.clearCallingIdentity();
348 try {
wilsonshihc32538e2018-11-07 17:27:34 +0800349 actionOnWallpaper(window, (wpController, windowState) ->
350 wpController.setWindowWallpaperDisplayOffset(windowState, x, y));
Dianne Hackborn067e5f62014-09-07 23:14:30 -0700351 } finally {
352 Binder.restoreCallingIdentity(ident);
353 }
354 }
355 }
356
Andrew Scull26f830d2017-05-19 12:16:10 +0100357 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800358 public Bundle sendWallpaperCommand(IBinder window, String action, int x, int y,
359 int z, Bundle extras, boolean sync) {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700360 synchronized (mService.mGlobalLock) {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800361 long ident = Binder.clearCallingIdentity();
362 try {
wilsonshihc32538e2018-11-07 17:27:34 +0800363 final WindowState windowState = mService.windowForClientLocked(this, window, true);
364 return windowState.getDisplayContent().mWallpaperController
365 .sendWindowWallpaperCommand(windowState, action, x, y, z, extras, sync);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800366 } finally {
367 Binder.restoreCallingIdentity(ident);
368 }
369 }
370 }
371
Andrew Scull26f830d2017-05-19 12:16:10 +0100372 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800373 public void wallpaperCommandComplete(IBinder window, Bundle result) {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700374 synchronized (mService.mGlobalLock) {
wilsonshihc32538e2018-11-07 17:27:34 +0800375 actionOnWallpaper(window, (wpController, windowState) ->
376 wpController.wallpaperCommandComplete(window));
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700377 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800378 }
379
Andrew Scull26f830d2017-05-19 12:16:10 +0100380 @Override
Svetoslavf7174e82014-06-12 11:29:35 -0700381 public void onRectangleOnScreenRequested(IBinder token, Rect rectangle) {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700382 synchronized (mService.mGlobalLock) {
Svetoslav Ganov1cf70bb2012-08-06 10:53:34 -0700383 final long identity = Binder.clearCallingIdentity();
384 try {
Svetoslavf7174e82014-06-12 11:29:35 -0700385 mService.onRectangleOnScreenRequested(token, rectangle);
Svetoslav Ganov1cf70bb2012-08-06 10:53:34 -0700386 } finally {
387 Binder.restoreCallingIdentity(identity);
388 }
389 }
390 }
391
Andrew Scull26f830d2017-05-19 12:16:10 +0100392 @Override
Dianne Hackborne3f23a32013-03-01 13:25:35 -0800393 public IWindowId getWindowId(IBinder window) {
394 return mService.getWindowId(window);
395 }
396
Jeff Brownc2932a12014-11-20 18:04:05 -0800397 @Override
398 public void pokeDrawLock(IBinder window) {
399 final long identity = Binder.clearCallingIdentity();
400 try {
401 mService.pokeDrawLock(this, window);
402 } finally {
403 Binder.restoreCallingIdentity(identity);
404 }
405 }
406
Vladislav Kaznacheev989b58a2016-02-10 12:19:33 -0800407 @Override
408 public void updatePointerIcon(IWindow window) {
409 final long identity = Binder.clearCallingIdentity();
410 try {
411 mService.updatePointerIcon(window);
412 } finally {
413 Binder.restoreCallingIdentity(identity);
414 }
415 }
416
Andrii Kulian4b6599e2018-01-15 17:24:08 -0800417 @Override
418 public void updateTapExcludeRegion(IWindow window, int regionId, int left, int top, int width,
419 int height) {
420 final long identity = Binder.clearCallingIdentity();
421 try {
422 mService.updateTapExcludeRegion(window, regionId, left, top, width, height);
423 } finally {
424 Binder.restoreCallingIdentity(identity);
425 }
426 }
427
Jorim Jaggie35c0592018-11-06 16:21:08 +0100428 @Override
429 public void insetsModified(IWindow window, InsetsState state) {
Tiger Huangdda14a72019-01-10 17:20:27 +0800430 synchronized (mService.mGlobalLock) {
Jorim Jaggie35c0592018-11-06 16:21:08 +0100431 final WindowState windowState = mService.windowForClientLocked(this, window,
432 false /* throwOnError */);
433 if (windowState != null) {
434 windowState.getDisplayContent().getInsetsStateController().onInsetsModified(
435 windowState, state);
436 }
437 }
438 }
439
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800440 void windowAddedLocked(String packageName) {
441 mPackageName = packageName;
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700442 mRelayoutTag = "relayoutWindow: " + mPackageName;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800443 if (mSurfaceSession == null) {
444 if (WindowManagerService.localLOGV) Slog.v(
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800445 TAG_WM, "First window added to " + this + ", creating SurfaceSession");
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800446 mSurfaceSession = new SurfaceSession();
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800447 if (SHOW_TRANSACTIONS) Slog.i(
448 TAG_WM, " NEW SURFACE SESSION " + mSurfaceSession);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800449 mService.mSessions.add(this);
Dianne Hackborneb94fa72014-06-03 17:48:12 -0700450 if (mLastReportedAnimatorScale != mService.getCurrentAnimatorScale()) {
451 mService.dispatchNewAnimatorScaleLocked(this);
452 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800453 }
454 mNumWindow++;
455 }
456
Wale Ogunwale943002b2017-02-15 19:34:01 -0800457 void windowRemovedLocked() {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800458 mNumWindow--;
Wale Ogunwale943002b2017-02-15 19:34:01 -0800459 killSessionLocked();
460 }
461
462
463 void onWindowSurfaceVisibilityChanged(WindowSurfaceController surfaceController,
464 boolean visible, int type) {
465
466 if (!isSystemAlertWindowType(type)) {
467 return;
468 }
469
470 boolean changed;
471
472 if (!mCanAddInternalSystemWindow) {
473 // We want to track non-system signature apps adding alert windows so we can post an
474 // on-going notification for the user to control their visibility.
475 if (visible) {
476 changed = mAlertWindowSurfaces.add(surfaceController);
Chenjie Yu08d6d722018-02-28 10:19:54 -0800477 MetricsLoggerWrapper.logAppOverlayEnter(mUid, mPackageName, changed, type, true);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800478 } else {
479 changed = mAlertWindowSurfaces.remove(surfaceController);
Chenjie Yu08d6d722018-02-28 10:19:54 -0800480 MetricsLoggerWrapper.logAppOverlayExit(mUid, mPackageName, changed, type, true);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800481 }
482
483 if (changed) {
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800484 if (mAlertWindowSurfaces.isEmpty()) {
485 cancelAlertWindowNotification();
486 } else if (mAlertWindowNotification == null){
Wale Ogunwaled76881e2017-03-10 13:17:56 -0800487 mAlertWindowNotification = new AlertWindowNotification(mService, mPackageName);
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700488 if (mShowingAlertWindowNotificationAllowed) {
489 mAlertWindowNotification.post();
490 }
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800491 }
Wale Ogunwaled993a572017-02-05 13:52:09 -0800492 }
493 }
Wale Ogunwale943002b2017-02-15 19:34:01 -0800494
495 if (type != TYPE_APPLICATION_OVERLAY) {
496 return;
497 }
498
499 if (visible) {
500 changed = mAppOverlaySurfaces.add(surfaceController);
Chenjie Yu08d6d722018-02-28 10:19:54 -0800501 MetricsLoggerWrapper.logAppOverlayEnter(mUid, mPackageName, changed, type, false);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800502 } else {
503 changed = mAppOverlaySurfaces.remove(surfaceController);
Chenjie Yu08d6d722018-02-28 10:19:54 -0800504 MetricsLoggerWrapper.logAppOverlayExit(mUid, mPackageName, changed, type, false);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800505 }
506
507 if (changed) {
508 // Notify activity manager of changes to app overlay windows so it can adjust the
509 // importance score for the process.
510 setHasOverlayUi(!mAppOverlaySurfaces.isEmpty());
511 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800512 }
513
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700514 void setShowingAlertWindowNotificationAllowed(boolean allowed) {
515 mShowingAlertWindowNotificationAllowed = allowed;
516 if (mAlertWindowNotification != null) {
517 if (allowed) {
518 mAlertWindowNotification.post();
519 } else {
Wale Ogunwale6c8f2e42018-02-01 09:07:34 -0800520 mAlertWindowNotification.cancel(false /* deleteChannel */);
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700521 }
522 }
523 }
524
Wale Ogunwaled993a572017-02-05 13:52:09 -0800525 private void killSessionLocked() {
526 if (mNumWindow > 0 || !mClientDead) {
527 return;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800528 }
Wale Ogunwaled993a572017-02-05 13:52:09 -0800529
530 mService.mSessions.remove(this);
531 if (mSurfaceSession == null) {
532 return;
533 }
534
535 if (WindowManagerService.localLOGV) Slog.v(TAG_WM, "Last window removed from " + this
536 + ", destroying " + mSurfaceSession);
537 if (SHOW_TRANSACTIONS) Slog.i(TAG_WM, " KILL SURFACE SESSION " + mSurfaceSession);
538 try {
539 mSurfaceSession.kill();
540 } catch (Exception e) {
541 Slog.w(TAG_WM, "Exception thrown when killing surface session " + mSurfaceSession
542 + " in session " + this + ": " + e.toString());
543 }
544 mSurfaceSession = null;
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800545 mAlertWindowSurfaces.clear();
546 mAppOverlaySurfaces.clear();
Wale Ogunwaled993a572017-02-05 13:52:09 -0800547 setHasOverlayUi(false);
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800548 cancelAlertWindowNotification();
Wale Ogunwaled993a572017-02-05 13:52:09 -0800549 }
550
551 private void setHasOverlayUi(boolean hasOverlayUi) {
552 mService.mH.obtainMessage(H.SET_HAS_OVERLAY_UI, mPid, hasOverlayUi ? 1 : 0).sendToTarget();
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800553 }
554
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800555 private void cancelAlertWindowNotification() {
556 if (mAlertWindowNotification == null) {
557 return;
558 }
Wale Ogunwale6c8f2e42018-02-01 09:07:34 -0800559 mAlertWindowNotification.cancel(true /* deleteChannel */);
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800560 mAlertWindowNotification = null;
561 }
562
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800563 void dump(PrintWriter pw, String prefix) {
564 pw.print(prefix); pw.print("mNumWindow="); pw.print(mNumWindow);
Wale Ogunwale5aa86832017-02-28 10:40:27 -0800565 pw.print(" mCanAddInternalSystemWindow="); pw.print(mCanAddInternalSystemWindow);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800566 pw.print(" mAppOverlaySurfaces="); pw.print(mAppOverlaySurfaces);
567 pw.print(" mAlertWindowSurfaces="); pw.print(mAlertWindowSurfaces);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800568 pw.print(" mClientDead="); pw.print(mClientDead);
569 pw.print(" mSurfaceSession="); pw.println(mSurfaceSession);
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700570 pw.print(prefix); pw.print("mPackageName="); pw.println(mPackageName);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800571 }
572
573 @Override
574 public String toString() {
575 return mStringName;
576 }
Robert Carr0e007272017-10-02 13:00:55 -0700577
578 boolean hasAlertWindowSurfaces() {
579 return !mAlertWindowSurfaces.isEmpty();
580 }
Filip Gruszczynski2217f612015-05-26 11:32:08 -0700581}