blob: 5babdafc856dfd8b7008408a6ca5d3316ed5fdaf [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
Adrian Roosb125e0b2019-10-02 14:55:14 +020027import static com.android.server.wm.ProtoLogGroup.WM_SHOW_TRANSACTIONS;
Adam Pardyl8c2d19c2019-09-16 17:15:38 +020028import static com.android.server.wm.WindowManagerDebugConfig.DEBUG;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080029import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_POSITIONING;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080030import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080031
Vishnu Nairf7645aa2019-06-18 11:14:01 -070032import android.annotation.Nullable;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080033import android.content.ClipData;
Valerie Hau30360552020-01-14 16:12:01 -080034import android.graphics.Point;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080035import android.graphics.Rect;
36import android.graphics.Region;
37import android.os.Binder;
38import android.os.Bundle;
39import android.os.IBinder;
40import android.os.Parcel;
Dianne Hackborn5fe7e2a2012-10-04 11:58:16 -070041import android.os.Process;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080042import android.os.RemoteException;
Wale Ogunwale4958ad22017-06-22 09:08:14 -070043import android.os.Trace;
Dianne Hackborn5fe7e2a2012-10-04 11:58:16 -070044import android.os.UserHandle;
Riddle Hsuccf09402019-08-13 00:33:06 +080045import android.util.ArraySet;
Andrii Kulian44607962017-03-16 11:06:24 -070046import android.util.MergedConfiguration;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080047import android.util.Slog;
Adrian Roos5c6b6222017-11-07 17:36:10 +010048import android.view.DisplayCutout;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080049import android.view.IWindow;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080050import android.view.IWindowId;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080051import android.view.IWindowSession;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080052import android.view.IWindowSessionCallback;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080053import android.view.InputChannel;
Tiger Huangdda14a72019-01-10 17:20:27 +080054import android.view.InsetsState;
Daichi Hironoa1fb9be2017-12-18 17:02:54 +090055import android.view.SurfaceControl;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080056import android.view.SurfaceSession;
57import android.view.WindowManager;
58
Chenjie Yue8904192017-12-08 19:12:57 -080059import com.android.internal.os.logging.MetricsLoggerWrapper;
Adrian Roosb125e0b2019-10-02 14:55:14 +020060import com.android.server.protolog.common.ProtoLog;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080061import com.android.server.wm.WindowManagerService.H;
62
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080063import java.io.PrintWriter;
Adrian Roos4ffc8972019-02-07 20:45:11 +010064import java.util.List;
wilsonshihc32538e2018-11-07 17:27:34 +080065import java.util.function.BiConsumer;
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 int mUid;
75 final int mPid;
Wale Ogunwalecfca2582016-10-19 09:53:25 -070076 private final String mStringName;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080077 SurfaceSession mSurfaceSession;
Wale Ogunwalecfca2582016-10-19 09:53:25 -070078 private int mNumWindow = 0;
Wale Ogunwale943002b2017-02-15 19:34:01 -080079 // Set of visible application overlay window surfaces connected to this session.
Riddle Hsuccf09402019-08-13 00:33:06 +080080 private final ArraySet<WindowSurfaceController> mAppOverlaySurfaces = new ArraySet<>();
Wale Ogunwale943002b2017-02-15 19:34:01 -080081 // Set of visible alert window surfaces connected to this session.
Riddle Hsuccf09402019-08-13 00:33:06 +080082 private final ArraySet<WindowSurfaceController> mAlertWindowSurfaces = new ArraySet<>();
Daichi Hironodf5cf622017-09-11 14:59:26 +090083 private final DragDropController mDragDropController;
Wale Ogunwale943002b2017-02-15 19:34:01 -080084 final boolean mCanAddInternalSystemWindow;
Wale Ogunwale01ad4342017-06-30 07:07:01 -070085 final boolean mCanHideNonSystemOverlayWindows;
Jorim Jaggif12ec0f2017-08-23 16:14:10 +020086 final boolean mCanAcquireSleepToken;
Wale Ogunwale387e4c62017-02-13 09:50:02 -080087 private AlertWindowNotification mAlertWindowNotification;
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -070088 private boolean mShowingAlertWindowNotificationAllowed;
Wale Ogunwalecfca2582016-10-19 09:53:25 -070089 private boolean mClientDead = false;
90 private float mLastReportedAnimatorScale;
Wale Ogunwale387e4c62017-02-13 09:50:02 -080091 private String mPackageName;
Wale Ogunwale4958ad22017-06-22 09:08:14 -070092 private String mRelayoutTag;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080093
Yohei Yukawaa71bb252018-09-19 19:21:24 -070094 public Session(WindowManagerService service, IWindowSessionCallback callback) {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080095 mService = service;
Dianne Hackborneb94fa72014-06-03 17:48:12 -070096 mCallback = callback;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080097 mUid = Binder.getCallingUid();
98 mPid = Binder.getCallingPid();
Dianne Hackborneb94fa72014-06-03 17:48:12 -070099 mLastReportedAnimatorScale = service.getCurrentAnimatorScale();
Wale Ogunwale5aa86832017-02-28 10:40:27 -0800100 mCanAddInternalSystemWindow = service.mContext.checkCallingOrSelfPermission(
Wale Ogunwale943002b2017-02-15 19:34:01 -0800101 INTERNAL_SYSTEM_WINDOW) == PERMISSION_GRANTED;
Wale Ogunwale01ad4342017-06-30 07:07:01 -0700102 mCanHideNonSystemOverlayWindows = service.mContext.checkCallingOrSelfPermission(
103 HIDE_NON_SYSTEM_OVERLAY_WINDOWS) == PERMISSION_GRANTED;
Jorim Jaggif12ec0f2017-08-23 16:14:10 +0200104 mCanAcquireSleepToken = service.mContext.checkCallingOrSelfPermission(DEVICE_POWER)
105 == PERMISSION_GRANTED;
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700106 mShowingAlertWindowNotificationAllowed = mService.mShowAlertWindowNotifications;
Daichi Hironodf5cf622017-09-11 14:59:26 +0900107 mDragDropController = mService.mDragDropController;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800108 StringBuilder sb = new StringBuilder();
109 sb.append("Session{");
110 sb.append(Integer.toHexString(System.identityHashCode(this)));
Dianne Hackborn5fe7e2a2012-10-04 11:58:16 -0700111 sb.append(" ");
112 sb.append(mPid);
113 if (mUid < Process.FIRST_APPLICATION_UID) {
114 sb.append(":");
115 sb.append(mUid);
116 } else {
117 sb.append(":u");
118 sb.append(UserHandle.getUserId(mUid));
119 sb.append('a');
120 sb.append(UserHandle.getAppId(mUid));
121 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800122 sb.append("}");
123 mStringName = sb.toString();
124
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800125 try {
Yohei Yukawaa71bb252018-09-19 19:21:24 -0700126 mCallback.asBinder().linkToDeath(this, 0);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800127 } catch (RemoteException e) {
128 // The caller has died, so we can just forget about this.
Yohei Yukawaa71bb252018-09-19 19:21:24 -0700129 // Hmmm, should we call killSessionLocked()??
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800130 }
131 }
132
133 @Override
134 public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
135 throws RemoteException {
136 try {
137 return super.onTransact(code, data, reply, flags);
138 } catch (RuntimeException e) {
139 // Log all 'real' exceptions thrown to the caller
140 if (!(e instanceof SecurityException)) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800141 Slog.wtf(TAG_WM, "Window Session Crash", e);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800142 }
143 throw e;
144 }
145 }
146
Andrew Scull26f830d2017-05-19 12:16:10 +0100147 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800148 public void binderDied() {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700149 synchronized (mService.mGlobalLock) {
Yohei Yukawaa71bb252018-09-19 19:21:24 -0700150 mCallback.asBinder().unlinkToDeath(this, 0);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800151 mClientDead = true;
152 killSessionLocked();
153 }
154 }
155
Craig Mautner6881a102012-07-27 13:04:51 -0700156 @Override
Craig Mautner6881a102012-07-27 13:04:51 -0700157 public int addToDisplay(IWindow window, int seq, WindowManager.LayoutParams attrs,
Adrian Roos9e370f22018-03-06 18:19:45 +0100158 int viewVisibility, int displayId, Rect outFrame, Rect outContentInsets,
Jorim Jaggif081f062019-10-24 16:24:54 +0200159 Rect outStableInsets,
Jorim Jaggif96c90a2018-09-26 16:55:15 +0200160 DisplayCutout.ParcelableWrapper outDisplayCutout, InputChannel outInputChannel,
161 InsetsState outInsetsState) {
Adrian Roos9e370f22018-03-06 18:19:45 +0100162 return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId, outFrame,
Jorim Jaggif081f062019-10-24 16:24:54 +0200163 outContentInsets, outStableInsets, outDisplayCutout, outInputChannel,
Jorim Jaggif96c90a2018-09-26 16:55:15 +0200164 outInsetsState);
Craig Mautner6881a102012-07-27 13:04:51 -0700165 }
166
167 @Override
Craig Mautner6881a102012-07-27 13:04:51 -0700168 public int addToDisplayWithoutInputChannel(IWindow window, int seq, WindowManager.LayoutParams attrs,
Jorim Jaggif96c90a2018-09-26 16:55:15 +0200169 int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets,
170 InsetsState outInsetsState) {
Craig Mautner6881a102012-07-27 13:04:51 -0700171 return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
Jorim Jaggif081f062019-10-24 16:24:54 +0200172 new Rect() /* outFrame */, outContentInsets, outStableInsets,
Jorim Jaggif96c90a2018-09-26 16:55:15 +0200173 new DisplayCutout.ParcelableWrapper() /* cutout */, null /* outInputChannel */,
174 outInsetsState);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800175 }
176
Andrew Scull26f830d2017-05-19 12:16:10 +0100177 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800178 public void remove(IWindow window) {
179 mService.removeWindow(this, window);
180 }
181
Rob Carr64e516f2015-10-29 00:20:45 +0000182 @Override
Robert Carr77bdfb52016-05-02 18:18:31 -0700183 public void prepareToReplaceWindows(IBinder appToken, boolean childrenOnly) {
Wale Ogunwale9bc47732016-08-10 14:44:22 -0700184 mService.setWillReplaceWindows(appToken, childrenOnly);
Robert Carr23fa16b2016-01-13 13:19:58 -0800185 }
186
Andrew Scull26f830d2017-05-19 12:16:10 +0100187 @Override
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700188 public int relayout(IWindow window, int seq, WindowManager.LayoutParams attrs,
chaviwbe43ac82018-04-04 15:14:49 -0700189 int requestedWidth, int requestedHeight, int viewFlags, int flags, long frameNumber,
Jorim Jaggif081f062019-10-24 16:24:54 +0200190 Rect outFrame, Rect outContentInsets, Rect outVisibleInsets,
191 Rect outStableInsets, Rect outBackdropFrame,
chaviwbe43ac82018-04-04 15:14:49 -0700192 DisplayCutout.ParcelableWrapper cutout, MergedConfiguration mergedConfiguration,
Valerie Hau30360552020-01-14 16:12:01 -0800193 SurfaceControl outSurfaceControl, InsetsState outInsetsState,
194 Point outSurfaceSize) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800195 if (false) Slog.d(TAG_WM, ">>>>>> ENTERED relayout from "
Dianne Hackbornb961cd22011-06-21 12:13:37 -0700196 + Binder.getCallingPid());
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700197 Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, mRelayoutTag);
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700198 int res = mService.relayoutWindow(this, window, seq, attrs,
chaviwbe43ac82018-04-04 15:14:49 -0700199 requestedWidth, requestedHeight, viewFlags, flags, frameNumber,
Jorim Jaggif081f062019-10-24 16:24:54 +0200200 outFrame, outContentInsets, outVisibleInsets,
201 outStableInsets, outBackdropFrame, cutout,
Valerie Hau30360552020-01-14 16:12:01 -0800202 mergedConfiguration, outSurfaceControl, outInsetsState, outSurfaceSize);
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700203 Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800204 if (false) Slog.d(TAG_WM, "<<<<<< EXITING relayout to "
Dianne Hackbornb961cd22011-06-21 12:13:37 -0700205 + Binder.getCallingPid());
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800206 return res;
207 }
208
Andrew Scull26f830d2017-05-19 12:16:10 +0100209 @Override
Dianne Hackborn64825172011-03-02 21:32:58 -0800210 public boolean outOfMemory(IWindow window) {
211 return mService.outOfMemoryWindow(this, window);
212 }
213
Andrew Scull26f830d2017-05-19 12:16:10 +0100214 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800215 public void setTransparentRegion(IWindow window, Region region) {
216 mService.setTransparentRegionWindow(this, window, region);
217 }
218
Andrew Scull26f830d2017-05-19 12:16:10 +0100219 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800220 public void setInsets(IWindow window, int touchableInsets,
221 Rect contentInsets, Rect visibleInsets, Region touchableArea) {
222 mService.setInsetsWindow(this, window, touchableInsets, contentInsets,
223 visibleInsets, touchableArea);
224 }
225
Andrew Scull26f830d2017-05-19 12:16:10 +0100226 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800227 public void getDisplayFrame(IWindow window, Rect outDisplayFrame) {
228 mService.getWindowDisplayFrame(this, window, outDisplayFrame);
229 }
230
Andrew Scull26f830d2017-05-19 12:16:10 +0100231 @Override
Vishnu Nairf7645aa2019-06-18 11:14:01 -0700232 public void finishDrawing(IWindow window,
233 @Nullable SurfaceControl.Transaction postDrawTransaction) {
Adam Pardyl8c2d19c2019-09-16 17:15:38 +0200234 if (DEBUG) Slog.v(TAG_WM, "IWindow finishDrawing called for " + window);
Vishnu Nairf7645aa2019-06-18 11:14:01 -0700235 mService.finishDrawingWindow(this, window, postDrawTransaction);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800236 }
237
Andrew Scull26f830d2017-05-19 12:16:10 +0100238 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800239 public void setInTouchMode(boolean mode) {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700240 synchronized (mService.mGlobalLock) {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800241 mService.mInTouchMode = mode;
242 }
243 }
244
Andrew Scull26f830d2017-05-19 12:16:10 +0100245 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800246 public boolean getInTouchMode() {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700247 synchronized (mService.mGlobalLock) {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800248 return mService.mInTouchMode;
249 }
250 }
251
Andrew Scull26f830d2017-05-19 12:16:10 +0100252 @Override
Arthur Hunga4c52062019-02-19 11:31:44 +0800253 public boolean performHapticFeedback(int effectId, boolean always) {
254 long ident = Binder.clearCallingIdentity();
255 try {
256 return mService.mPolicy.performHapticFeedback(mUid, mPackageName,
Alexey Kuzmine1f06b82018-06-20 17:48:43 +0100257 effectId, always, null);
Arthur Hunga4c52062019-02-19 11:31:44 +0800258 } finally {
259 Binder.restoreCallingIdentity(ident);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800260 }
261 }
262
263 /* Drag/drop */
Daichi Hironofabca092017-12-19 15:02:50 +0900264
Andrew Scull26f830d2017-05-19 12:16:10 +0100265 @Override
Daichi Hironofabca092017-12-19 15:02:50 +0900266 public IBinder performDrag(IWindow window, int flags, SurfaceControl surface, int touchSource,
267 float touchX, float touchY, float thumbCenterX, float thumbCenterY, ClipData data) {
Daichi Hironodf5cf622017-09-11 14:59:26 +0900268 final long ident = Binder.clearCallingIdentity();
269 try {
Vishnu Nair0e7536c2019-11-07 14:18:47 -0800270 return mDragDropController.performDrag(mSurfaceSession, mPid, mUid, window,
Daichi Hironofabca092017-12-19 15:02:50 +0900271 flags, surface, touchSource, touchX, touchY, thumbCenterX, thumbCenterY, data);
Daichi Hironodf5cf622017-09-11 14:59:26 +0900272 } finally {
273 Binder.restoreCallingIdentity(ident);
274 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800275 }
276
Andrew Scull26f830d2017-05-19 12:16:10 +0100277 @Override
Daichi Hironodf5cf622017-09-11 14:59:26 +0900278 public void reportDropResult(IWindow window, boolean consumed) {
279 final long ident = Binder.clearCallingIdentity();
280 try {
Daichi Hirono58e25e12017-10-25 15:48:08 +0900281 mDragDropController.reportDropResult(window, consumed);
Daichi Hironodf5cf622017-09-11 14:59:26 +0900282 } finally {
283 Binder.restoreCallingIdentity(ident);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800284 }
Daichi Hironodf5cf622017-09-11 14:59:26 +0900285 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800286
Daichi Hironodf5cf622017-09-11 14:59:26 +0900287 @Override
Daichi Hirono3e9d5102019-04-15 15:58:11 +0900288 public void cancelDragAndDrop(IBinder dragToken, boolean skipAnimation) {
Daichi Hironodf5cf622017-09-11 14:59:26 +0900289 final long ident = Binder.clearCallingIdentity();
290 try {
Daichi Hirono3e9d5102019-04-15 15:58:11 +0900291 mDragDropController.cancelDragAndDrop(dragToken, skipAnimation);
Daichi Hironodf5cf622017-09-11 14:59:26 +0900292 } finally {
293 Binder.restoreCallingIdentity(ident);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800294 }
Daichi Hironodf5cf622017-09-11 14:59:26 +0900295 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800296
Daichi Hironodf5cf622017-09-11 14:59:26 +0900297 @Override
298 public void dragRecipientEntered(IWindow window) {
299 mDragDropController.dragRecipientEntered(window);
300 }
301
302 @Override
303 public void dragRecipientExited(IWindow window) {
304 mDragDropController.dragRecipientExited(window);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800305 }
306
Andrew Scull26f830d2017-05-19 12:16:10 +0100307 @Override
Chong Zhang8e89b312015-09-09 15:09:30 -0700308 public boolean startMovingTask(IWindow window, float startX, float startY) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800309 if (DEBUG_TASK_POSITIONING) Slog.d(
310 TAG_WM, "startMovingTask: {" + startX + "," + startY + "}");
Chong Zhang8e89b312015-09-09 15:09:30 -0700311
Wale Ogunwale09e1b8d2016-02-23 10:38:35 -0800312 long ident = Binder.clearCallingIdentity();
313 try {
Daichi Hirono34fb7312017-12-04 10:00:24 +0900314 return mService.mTaskPositioningController.startMovingTask(window, startX, startY);
Wale Ogunwale09e1b8d2016-02-23 10:38:35 -0800315 } finally {
316 Binder.restoreCallingIdentity(ident);
317 }
Chong Zhang8e89b312015-09-09 15:09:30 -0700318 }
319
Adrian Roos4ffc8972019-02-07 20:45:11 +0100320 @Override
yj81.kwon19585ff2019-04-23 18:53:57 -0700321 public void finishMovingTask(IWindow window) {
322 if (DEBUG_TASK_POSITIONING) Slog.d(TAG_WM, "finishMovingTask");
323
324 long ident = Binder.clearCallingIdentity();
325 try {
326 mService.mTaskPositioningController.finishTaskPositioning(window);
327 } finally {
328 Binder.restoreCallingIdentity(ident);
329 }
330 }
331
332 @Override
Adrian Roos4ffc8972019-02-07 20:45:11 +0100333 public void reportSystemGestureExclusionChanged(IWindow window, List<Rect> exclusionRects) {
334 long ident = Binder.clearCallingIdentity();
335 try {
336 mService.reportSystemGestureExclusionChanged(this, window, exclusionRects);
337 } finally {
338 Binder.restoreCallingIdentity(ident);
339 }
340 }
341
wilsonshihc32538e2018-11-07 17:27:34 +0800342 private void actionOnWallpaper(IBinder window,
343 BiConsumer<WallpaperController, WindowState> action) {
344 final WindowState windowState = mService.windowForClientLocked(this, window, true);
345 action.accept(windowState.getDisplayContent().mWallpaperController, windowState);
346 }
347
Andrew Scull26f830d2017-05-19 12:16:10 +0100348 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800349 public void setWallpaperPosition(IBinder window, float x, float y, float xStep, float yStep) {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700350 synchronized (mService.mGlobalLock) {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800351 long ident = Binder.clearCallingIdentity();
352 try {
wilsonshihc32538e2018-11-07 17:27:34 +0800353 actionOnWallpaper(window, (wpController, windowState) ->
354 wpController.setWindowWallpaperPosition(windowState, x, y, xStep, yStep));
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800355 } finally {
356 Binder.restoreCallingIdentity(ident);
357 }
358 }
359 }
360
Andrew Scull26f830d2017-05-19 12:16:10 +0100361 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800362 public void wallpaperOffsetsComplete(IBinder window) {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700363 synchronized (mService.mGlobalLock) {
wilsonshihc32538e2018-11-07 17:27:34 +0800364 actionOnWallpaper(window, (wpController, windowState) ->
365 wpController.wallpaperOffsetsComplete(window));
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700366 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800367 }
368
Andrew Scull26f830d2017-05-19 12:16:10 +0100369 @Override
Dianne Hackborn067e5f62014-09-07 23:14:30 -0700370 public void setWallpaperDisplayOffset(IBinder window, int x, int y) {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700371 synchronized (mService.mGlobalLock) {
Dianne Hackborn067e5f62014-09-07 23:14:30 -0700372 long ident = Binder.clearCallingIdentity();
373 try {
wilsonshihc32538e2018-11-07 17:27:34 +0800374 actionOnWallpaper(window, (wpController, windowState) ->
375 wpController.setWindowWallpaperDisplayOffset(windowState, x, y));
Dianne Hackborn067e5f62014-09-07 23:14:30 -0700376 } finally {
377 Binder.restoreCallingIdentity(ident);
378 }
379 }
380 }
381
Andrew Scull26f830d2017-05-19 12:16:10 +0100382 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800383 public Bundle sendWallpaperCommand(IBinder window, String action, int x, int y,
384 int z, Bundle extras, boolean sync) {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700385 synchronized (mService.mGlobalLock) {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800386 long ident = Binder.clearCallingIdentity();
387 try {
wilsonshihc32538e2018-11-07 17:27:34 +0800388 final WindowState windowState = mService.windowForClientLocked(this, window, true);
389 return windowState.getDisplayContent().mWallpaperController
390 .sendWindowWallpaperCommand(windowState, action, x, y, z, extras, sync);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800391 } finally {
392 Binder.restoreCallingIdentity(ident);
393 }
394 }
395 }
396
Andrew Scull26f830d2017-05-19 12:16:10 +0100397 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800398 public void wallpaperCommandComplete(IBinder window, Bundle result) {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700399 synchronized (mService.mGlobalLock) {
wilsonshihc32538e2018-11-07 17:27:34 +0800400 actionOnWallpaper(window, (wpController, windowState) ->
401 wpController.wallpaperCommandComplete(window));
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700402 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800403 }
404
Andrew Scull26f830d2017-05-19 12:16:10 +0100405 @Override
Svetoslavf7174e82014-06-12 11:29:35 -0700406 public void onRectangleOnScreenRequested(IBinder token, Rect rectangle) {
Wale Ogunwaledb485de2018-10-29 09:47:07 -0700407 synchronized (mService.mGlobalLock) {
Svetoslav Ganov1cf70bb2012-08-06 10:53:34 -0700408 final long identity = Binder.clearCallingIdentity();
409 try {
Svetoslavf7174e82014-06-12 11:29:35 -0700410 mService.onRectangleOnScreenRequested(token, rectangle);
Svetoslav Ganov1cf70bb2012-08-06 10:53:34 -0700411 } finally {
412 Binder.restoreCallingIdentity(identity);
413 }
414 }
415 }
416
Andrew Scull26f830d2017-05-19 12:16:10 +0100417 @Override
Dianne Hackborne3f23a32013-03-01 13:25:35 -0800418 public IWindowId getWindowId(IBinder window) {
419 return mService.getWindowId(window);
420 }
421
Jeff Brownc2932a12014-11-20 18:04:05 -0800422 @Override
423 public void pokeDrawLock(IBinder window) {
424 final long identity = Binder.clearCallingIdentity();
425 try {
426 mService.pokeDrawLock(this, window);
427 } finally {
428 Binder.restoreCallingIdentity(identity);
429 }
430 }
431
Vladislav Kaznacheev989b58a2016-02-10 12:19:33 -0800432 @Override
433 public void updatePointerIcon(IWindow window) {
434 final long identity = Binder.clearCallingIdentity();
435 try {
436 mService.updatePointerIcon(window);
437 } finally {
438 Binder.restoreCallingIdentity(identity);
439 }
440 }
441
Andrii Kulian4b6599e2018-01-15 17:24:08 -0800442 @Override
Tiger Huangd8ec9382019-04-18 14:35:09 -0700443 public void reparentDisplayContent(IWindow window, SurfaceControl sc, int displayId) {
444 mService.reparentDisplayContent(window, sc, displayId);
445 }
446
447 @Override
448 public void updateDisplayContentLocation(IWindow window, int x, int y, int displayId) {
449 mService.updateDisplayContentLocation(window, x, y, displayId);
450 }
451
452 @Override
chaviwaa0d74e2019-12-26 14:13:40 -0800453 public void updateTapExcludeRegion(IWindow window, Region region) {
Andrii Kulian4b6599e2018-01-15 17:24:08 -0800454 final long identity = Binder.clearCallingIdentity();
455 try {
chaviwaa0d74e2019-12-26 14:13:40 -0800456 mService.updateTapExcludeRegion(window, region);
Andrii Kulian4b6599e2018-01-15 17:24:08 -0800457 } finally {
458 Binder.restoreCallingIdentity(identity);
459 }
460 }
461
Jorim Jaggie35c0592018-11-06 16:21:08 +0100462 @Override
463 public void insetsModified(IWindow window, InsetsState state) {
Tiger Huangdda14a72019-01-10 17:20:27 +0800464 synchronized (mService.mGlobalLock) {
Jorim Jaggie35c0592018-11-06 16:21:08 +0100465 final WindowState windowState = mService.windowForClientLocked(this, window,
466 false /* throwOnError */);
467 if (windowState != null) {
Jorim Jaggi0dd0cf92019-12-27 15:17:44 +0100468 windowState.updateRequestedInsetsState(state);
Jorim Jaggi956ca412019-01-07 14:49:14 +0100469 windowState.getDisplayContent().getInsetsPolicy().onInsetsModified(
Jorim Jaggie35c0592018-11-06 16:21:08 +0100470 windowState, state);
471 }
472 }
473 }
474
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800475 void windowAddedLocked(String packageName) {
476 mPackageName = packageName;
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700477 mRelayoutTag = "relayoutWindow: " + mPackageName;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800478 if (mSurfaceSession == null) {
Adam Pardyl8c2d19c2019-09-16 17:15:38 +0200479 if (DEBUG) {
480 Slog.v(TAG_WM, "First window added to " + this + ", creating SurfaceSession");
481 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800482 mSurfaceSession = new SurfaceSession();
Adrian Roosb125e0b2019-10-02 14:55:14 +0200483 ProtoLog.i(WM_SHOW_TRANSACTIONS, " NEW SURFACE SESSION %s", mSurfaceSession);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800484 mService.mSessions.add(this);
Dianne Hackborneb94fa72014-06-03 17:48:12 -0700485 if (mLastReportedAnimatorScale != mService.getCurrentAnimatorScale()) {
486 mService.dispatchNewAnimatorScaleLocked(this);
487 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800488 }
489 mNumWindow++;
490 }
491
Wale Ogunwale943002b2017-02-15 19:34:01 -0800492 void windowRemovedLocked() {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800493 mNumWindow--;
Wale Ogunwale943002b2017-02-15 19:34:01 -0800494 killSessionLocked();
495 }
496
497
498 void onWindowSurfaceVisibilityChanged(WindowSurfaceController surfaceController,
499 boolean visible, int type) {
500
501 if (!isSystemAlertWindowType(type)) {
502 return;
503 }
504
505 boolean changed;
506
507 if (!mCanAddInternalSystemWindow) {
508 // We want to track non-system signature apps adding alert windows so we can post an
509 // on-going notification for the user to control their visibility.
510 if (visible) {
511 changed = mAlertWindowSurfaces.add(surfaceController);
Chenjie Yu08d6d722018-02-28 10:19:54 -0800512 MetricsLoggerWrapper.logAppOverlayEnter(mUid, mPackageName, changed, type, true);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800513 } else {
514 changed = mAlertWindowSurfaces.remove(surfaceController);
Chenjie Yu08d6d722018-02-28 10:19:54 -0800515 MetricsLoggerWrapper.logAppOverlayExit(mUid, mPackageName, changed, type, true);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800516 }
517
518 if (changed) {
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800519 if (mAlertWindowSurfaces.isEmpty()) {
520 cancelAlertWindowNotification();
521 } else if (mAlertWindowNotification == null){
Wale Ogunwaled76881e2017-03-10 13:17:56 -0800522 mAlertWindowNotification = new AlertWindowNotification(mService, mPackageName);
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700523 if (mShowingAlertWindowNotificationAllowed) {
524 mAlertWindowNotification.post();
525 }
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800526 }
Wale Ogunwaled993a572017-02-05 13:52:09 -0800527 }
528 }
Wale Ogunwale943002b2017-02-15 19:34:01 -0800529
530 if (type != TYPE_APPLICATION_OVERLAY) {
531 return;
532 }
533
534 if (visible) {
535 changed = mAppOverlaySurfaces.add(surfaceController);
Chenjie Yu08d6d722018-02-28 10:19:54 -0800536 MetricsLoggerWrapper.logAppOverlayEnter(mUid, mPackageName, changed, type, false);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800537 } else {
538 changed = mAppOverlaySurfaces.remove(surfaceController);
Chenjie Yu08d6d722018-02-28 10:19:54 -0800539 MetricsLoggerWrapper.logAppOverlayExit(mUid, mPackageName, changed, type, false);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800540 }
541
542 if (changed) {
543 // Notify activity manager of changes to app overlay windows so it can adjust the
544 // importance score for the process.
545 setHasOverlayUi(!mAppOverlaySurfaces.isEmpty());
546 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800547 }
548
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700549 void setShowingAlertWindowNotificationAllowed(boolean allowed) {
550 mShowingAlertWindowNotificationAllowed = allowed;
551 if (mAlertWindowNotification != null) {
552 if (allowed) {
553 mAlertWindowNotification.post();
554 } else {
Wale Ogunwale6c8f2e42018-02-01 09:07:34 -0800555 mAlertWindowNotification.cancel(false /* deleteChannel */);
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700556 }
557 }
558 }
559
Wale Ogunwaled993a572017-02-05 13:52:09 -0800560 private void killSessionLocked() {
561 if (mNumWindow > 0 || !mClientDead) {
562 return;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800563 }
Wale Ogunwaled993a572017-02-05 13:52:09 -0800564
565 mService.mSessions.remove(this);
566 if (mSurfaceSession == null) {
567 return;
568 }
569
Adam Pardyl8c2d19c2019-09-16 17:15:38 +0200570 if (DEBUG) {
571 Slog.v(TAG_WM, "Last window removed from " + this
572 + ", destroying " + mSurfaceSession);
573 }
Adrian Roosb125e0b2019-10-02 14:55:14 +0200574 ProtoLog.i(WM_SHOW_TRANSACTIONS, " KILL SURFACE SESSION %s", mSurfaceSession);
Wale Ogunwaled993a572017-02-05 13:52:09 -0800575 try {
576 mSurfaceSession.kill();
577 } catch (Exception e) {
578 Slog.w(TAG_WM, "Exception thrown when killing surface session " + mSurfaceSession
579 + " in session " + this + ": " + e.toString());
580 }
581 mSurfaceSession = null;
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800582 mAlertWindowSurfaces.clear();
583 mAppOverlaySurfaces.clear();
Wale Ogunwaled993a572017-02-05 13:52:09 -0800584 setHasOverlayUi(false);
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800585 cancelAlertWindowNotification();
Wale Ogunwaled993a572017-02-05 13:52:09 -0800586 }
587
588 private void setHasOverlayUi(boolean hasOverlayUi) {
589 mService.mH.obtainMessage(H.SET_HAS_OVERLAY_UI, mPid, hasOverlayUi ? 1 : 0).sendToTarget();
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800590 }
591
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800592 private void cancelAlertWindowNotification() {
593 if (mAlertWindowNotification == null) {
594 return;
595 }
Wale Ogunwale6c8f2e42018-02-01 09:07:34 -0800596 mAlertWindowNotification.cancel(true /* deleteChannel */);
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800597 mAlertWindowNotification = null;
598 }
599
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800600 void dump(PrintWriter pw, String prefix) {
601 pw.print(prefix); pw.print("mNumWindow="); pw.print(mNumWindow);
Wale Ogunwale5aa86832017-02-28 10:40:27 -0800602 pw.print(" mCanAddInternalSystemWindow="); pw.print(mCanAddInternalSystemWindow);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800603 pw.print(" mAppOverlaySurfaces="); pw.print(mAppOverlaySurfaces);
604 pw.print(" mAlertWindowSurfaces="); pw.print(mAlertWindowSurfaces);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800605 pw.print(" mClientDead="); pw.print(mClientDead);
606 pw.print(" mSurfaceSession="); pw.println(mSurfaceSession);
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700607 pw.print(prefix); pw.print("mPackageName="); pw.println(mPackageName);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800608 }
609
610 @Override
611 public String toString() {
612 return mStringName;
613 }
Robert Carr0e007272017-10-02 13:00:55 -0700614
Riddle Hsuccf09402019-08-13 00:33:06 +0800615 /** @return {@code true} if there is an alert window surface on the given display. */
616 boolean hasAlertWindowSurfaces(DisplayContent displayContent) {
617 for (int i = mAlertWindowSurfaces.size() - 1; i >= 0; i--) {
618 final WindowSurfaceController surfaceController = mAlertWindowSurfaces.valueAt(i);
619 if (surfaceController.mAnimator.mWin.getDisplayContent() == displayContent) {
620 return true;
621 }
622 }
623 return false;
Robert Carr0e007272017-10-02 13:00:55 -0700624 }
Robert Carr9d431e12018-12-17 13:11:48 -0800625
Vishnu Nairddbd2512019-11-12 14:39:43 -0800626 @Override
Vishnu Nair5cf253192019-11-07 15:33:20 -0800627 public void grantInputChannel(int displayId, SurfaceControl surface,
628 IWindow window, IBinder hostInputToken, InputChannel outInputChannel) {
Vishnu Nairddbd2512019-11-12 14:39:43 -0800629 if (hostInputToken == null && !mCanAddInternalSystemWindow) {
630 // Callers without INTERNAL_SYSTEM_WINDOW permission cannot grant input channel to
631 // embedded windows without providing a host window input token
632 throw new SecurityException("Requires INTERNAL_SYSTEM_WINDOW permission");
633 }
634
Robert Carr9d431e12018-12-17 13:11:48 -0800635 final long identity = Binder.clearCallingIdentity();
636 try {
Vishnu Nair0e7536c2019-11-07 14:18:47 -0800637 mService.grantInputChannel(mUid, mPid, displayId, surface, window,
Vishnu Nair5cf253192019-11-07 15:33:20 -0800638 hostInputToken, outInputChannel);
Robert Carr9d431e12018-12-17 13:11:48 -0800639 } finally {
640 Binder.restoreCallingIdentity(identity);
641 }
642 }
Filip Gruszczynski2217f612015-05-26 11:32:08 -0700643}