blob: 4dd147e5358816dcc12d2792c5651feff8d231ba [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 */
Wale Ogunwalecfca2582016-10-19 09:53:25 -070071// Needs to be public and not final so we can mock during tests...sucks I know :(
72public class Session extends IWindowSession.Stub
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080073 implements IBinder.DeathRecipient {
74 final WindowManagerService mService;
Dianne Hackborneb94fa72014-06-03 17:48:12 -070075 final IWindowSessionCallback mCallback;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080076 final IInputMethodClient mClient;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080077 final int mUid;
78 final int mPid;
Wale Ogunwalecfca2582016-10-19 09:53:25 -070079 private final String mStringName;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080080 SurfaceSession mSurfaceSession;
Wale Ogunwalecfca2582016-10-19 09:53:25 -070081 private int mNumWindow = 0;
Wale Ogunwale943002b2017-02-15 19:34:01 -080082 // Set of visible application overlay window surfaces connected to this session.
83 private final Set<WindowSurfaceController> mAppOverlaySurfaces = new HashSet<>();
84 // Set of visible alert window surfaces connected to this session.
85 private final Set<WindowSurfaceController> mAlertWindowSurfaces = new HashSet<>();
86 final boolean mCanAddInternalSystemWindow;
Wale Ogunwale01ad4342017-06-30 07:07:01 -070087 final boolean mCanHideNonSystemOverlayWindows;
Jorim Jaggif12ec0f2017-08-23 16:14:10 +020088 final boolean mCanAcquireSleepToken;
Wale Ogunwale387e4c62017-02-13 09:50:02 -080089 private AlertWindowNotification mAlertWindowNotification;
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -070090 private boolean mShowingAlertWindowNotificationAllowed;
Wale Ogunwalecfca2582016-10-19 09:53:25 -070091 private boolean mClientDead = false;
92 private float mLastReportedAnimatorScale;
Wale Ogunwale387e4c62017-02-13 09:50:02 -080093 private String mPackageName;
Wale Ogunwale4958ad22017-06-22 09:08:14 -070094 private String mRelayoutTag;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080095
Dianne Hackborneb94fa72014-06-03 17:48:12 -070096 public Session(WindowManagerService service, IWindowSessionCallback callback,
97 IInputMethodClient client, IInputContext inputContext) {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080098 mService = service;
Dianne Hackborneb94fa72014-06-03 17:48:12 -070099 mCallback = callback;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800100 mClient = client;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800101 mUid = Binder.getCallingUid();
102 mPid = Binder.getCallingPid();
Dianne Hackborneb94fa72014-06-03 17:48:12 -0700103 mLastReportedAnimatorScale = service.getCurrentAnimatorScale();
Wale Ogunwale5aa86832017-02-28 10:40:27 -0800104 mCanAddInternalSystemWindow = service.mContext.checkCallingOrSelfPermission(
Wale Ogunwale943002b2017-02-15 19:34:01 -0800105 INTERNAL_SYSTEM_WINDOW) == PERMISSION_GRANTED;
Wale Ogunwale01ad4342017-06-30 07:07:01 -0700106 mCanHideNonSystemOverlayWindows = service.mContext.checkCallingOrSelfPermission(
107 HIDE_NON_SYSTEM_OVERLAY_WINDOWS) == PERMISSION_GRANTED;
Jorim Jaggif12ec0f2017-08-23 16:14:10 +0200108 mCanAcquireSleepToken = service.mContext.checkCallingOrSelfPermission(DEVICE_POWER)
109 == PERMISSION_GRANTED;
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700110 mShowingAlertWindowNotificationAllowed = mService.mShowAlertWindowNotifications;
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
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800309 public IBinder prepareDrag(IWindow window, int flags,
310 int width, int height, Surface outSurface) {
311 return mService.prepareDragSurface(window, mSurfaceSession, flags,
312 width, height, outSurface);
313 }
314
Andrew Scull26f830d2017-05-19 12:16:10 +0100315 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800316 public boolean performDrag(IWindow window, IBinder dragToken,
Vladislav Kaznacheevba761122016-01-22 12:09:45 -0800317 int touchSource, float touchX, float touchY, float thumbCenterX, float thumbCenterY,
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800318 ClipData data) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800319 if (DEBUG_DRAG) {
320 Slog.d(TAG_WM, "perform drag: win=" + window + " data=" + data);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800321 }
322
323 synchronized (mService.mWindowMap) {
324 if (mService.mDragState == null) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800325 Slog.w(TAG_WM, "No drag prepared");
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800326 throw new IllegalStateException("performDrag() without prepareDrag()");
327 }
328
329 if (dragToken != mService.mDragState.mToken) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800330 Slog.w(TAG_WM, "Performing mismatched drag");
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800331 throw new IllegalStateException("performDrag() does not match prepareDrag()");
332 }
333
334 WindowState callingWin = mService.windowForClientLocked(null, window, false);
335 if (callingWin == null) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800336 Slog.w(TAG_WM, "Bad requesting window " + window);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800337 return false; // !!! TODO: throw here?
338 }
339
340 // !!! TODO: if input is not still focused on the initiating window, fail
341 // the drag initiation (e.g. an alarm window popped up just as the application
342 // called performDrag()
343
344 mService.mH.removeMessages(H.DRAG_START_TIMEOUT, window.asBinder());
345
346 // !!! TODO: extract the current touch (x, y) in screen coordinates. That
347 // will let us eliminate the (touchX,touchY) parameters from the API.
348
349 // !!! FIXME: put all this heavy stuff onto the mH looper, as well as
350 // the actual drag event dispatch stuff in the dragstate
351
Craig Mautnerdf88d732014-01-27 09:21:32 -0800352 final DisplayContent displayContent = callingWin.getDisplayContent();
353 if (displayContent == null) {
354 return false;
355 }
356 Display display = displayContent.getDisplay();
Jeff Brown14a9f2b2012-09-24 14:36:44 -0700357 mService.mDragState.register(display);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800358 if (!mService.mInputManager.transferTouchFocus(callingWin.mInputChannel,
Vladislav Kaznacheev64b103a2016-08-10 11:49:08 -0700359 mService.mDragState.getInputChannel())) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800360 Slog.e(TAG_WM, "Unable to transfer touch focus");
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800361 mService.mDragState.unregister();
Vladislav Kaznacheev64b103a2016-08-10 11:49:08 -0700362 mService.mDragState.reset();
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800363 mService.mDragState = null;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800364 return false;
365 }
366
Vladislav Kaznacheev64b103a2016-08-10 11:49:08 -0700367 mService.mDragState.mDisplayContent = displayContent;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800368 mService.mDragState.mData = data;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800369 mService.mDragState.broadcastDragStartedLw(touchX, touchY);
Vladislav Kaznacheevba761122016-01-22 12:09:45 -0800370 mService.mDragState.overridePointerIconLw(touchSource);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800371
372 // remember the thumb offsets for later
373 mService.mDragState.mThumbOffsetX = thumbCenterX;
374 mService.mDragState.mThumbOffsetY = thumbCenterY;
375
376 // Make the surface visible at the proper location
Mathias Agopian29479eb2013-02-14 14:36:04 -0800377 final SurfaceControl surfaceControl = mService.mDragState.mSurfaceControl;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800378 if (SHOW_LIGHT_TRANSACTIONS) Slog.i(
379 TAG_WM, ">>> OPEN TRANSACTION performDrag");
Robert Carr68e5c9e2016-09-14 10:50:09 -0700380 mService.openSurfaceTransaction();
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800381 try {
Mathias Agopian29479eb2013-02-14 14:36:04 -0800382 surfaceControl.setPosition(touchX - thumbCenterX,
Dianne Hackbornd040edb2011-08-31 12:47:58 -0700383 touchY - thumbCenterY);
Mathias Agopian29479eb2013-02-14 14:36:04 -0800384 surfaceControl.setLayer(mService.mDragState.getDragLayerLw());
385 surfaceControl.setLayerStack(display.getLayerStack());
386 surfaceControl.show();
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800387 } finally {
Robert Carr68e5c9e2016-09-14 10:50:09 -0700388 mService.closeSurfaceTransaction();
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800389 if (SHOW_LIGHT_TRANSACTIONS) Slog.i(
390 TAG_WM, "<<< CLOSE TRANSACTION performDrag");
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800391 }
Vladislav Kaznacheevd0ed8932016-01-15 15:37:05 -0800392
393 mService.mDragState.notifyLocationLw(touchX, touchY);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800394 }
395
396 return true; // success!
397 }
398
Andrew Scull26f830d2017-05-19 12:16:10 +0100399 @Override
Chong Zhang8e89b312015-09-09 15:09:30 -0700400 public boolean startMovingTask(IWindow window, float startX, float startY) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800401 if (DEBUG_TASK_POSITIONING) Slog.d(
402 TAG_WM, "startMovingTask: {" + startX + "," + startY + "}");
Chong Zhang8e89b312015-09-09 15:09:30 -0700403
Wale Ogunwale09e1b8d2016-02-23 10:38:35 -0800404 long ident = Binder.clearCallingIdentity();
405 try {
406 return mService.startMovingTask(window, startX, startY);
407 } finally {
408 Binder.restoreCallingIdentity(ident);
409 }
Chong Zhang8e89b312015-09-09 15:09:30 -0700410 }
411
Andrew Scull26f830d2017-05-19 12:16:10 +0100412 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800413 public void reportDropResult(IWindow window, boolean consumed) {
414 IBinder token = window.asBinder();
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800415 if (DEBUG_DRAG) {
416 Slog.d(TAG_WM, "Drop result=" + consumed + " reported by " + token);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800417 }
418
419 synchronized (mService.mWindowMap) {
420 long ident = Binder.clearCallingIdentity();
421 try {
Christopher Tate05e9c652011-10-20 12:34:36 -0700422 if (mService.mDragState == null) {
423 // Most likely the drop recipient ANRed and we ended the drag
424 // out from under it. Log the issue and move on.
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800425 Slog.w(TAG_WM, "Drop result given but no drag in progress");
Christopher Tate05e9c652011-10-20 12:34:36 -0700426 return;
427 }
428
429 if (mService.mDragState.mToken != token) {
430 // We're in a drag, but the wrong window has responded.
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800431 Slog.w(TAG_WM, "Invalid drop-result claim by " + window);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800432 throw new IllegalStateException("reportDropResult() by non-recipient");
433 }
434
435 // The right window has responded, even if it's no longer around,
436 // so be sure to halt the timeout even if the later WindowState
437 // lookup fails.
438 mService.mH.removeMessages(H.DRAG_END_TIMEOUT, window.asBinder());
439 WindowState callingWin = mService.windowForClientLocked(null, window, false);
440 if (callingWin == null) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800441 Slog.w(TAG_WM, "Bad result-reporting window " + window);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800442 return; // !!! TODO: throw here?
443 }
444
445 mService.mDragState.mDragResult = consumed;
446 mService.mDragState.endDragLw();
447 } finally {
448 Binder.restoreCallingIdentity(ident);
449 }
450 }
451 }
452
Andrew Scull26f830d2017-05-19 12:16:10 +0100453 @Override
Vladislav Kaznacheev82063912015-11-20 14:20:13 -0800454 public void cancelDragAndDrop(IBinder dragToken) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800455 if (DEBUG_DRAG) {
456 Slog.d(TAG_WM, "cancelDragAndDrop");
Vladislav Kaznacheev82063912015-11-20 14:20:13 -0800457 }
458
459 synchronized (mService.mWindowMap) {
460 long ident = Binder.clearCallingIdentity();
461 try {
462 if (mService.mDragState == null) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800463 Slog.w(TAG_WM, "cancelDragAndDrop() without prepareDrag()");
Vladislav Kaznacheev82063912015-11-20 14:20:13 -0800464 throw new IllegalStateException("cancelDragAndDrop() without prepareDrag()");
465 }
466
467 if (mService.mDragState.mToken != dragToken) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800468 Slog.w(TAG_WM,
Vladislav Kaznacheev82063912015-11-20 14:20:13 -0800469 "cancelDragAndDrop() does not match prepareDrag()");
470 throw new IllegalStateException(
471 "cancelDragAndDrop() does not match prepareDrag()");
472 }
473
474 mService.mDragState.mDragResult = false;
Vladislav Kaznacheevce2aef92015-11-20 18:49:59 -0800475 mService.mDragState.cancelDragLw();
Vladislav Kaznacheev82063912015-11-20 14:20:13 -0800476 } finally {
477 Binder.restoreCallingIdentity(ident);
478 }
479 }
480 }
481
Andrew Scull26f830d2017-05-19 12:16:10 +0100482 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800483 public void dragRecipientEntered(IWindow window) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800484 if (DEBUG_DRAG) {
485 Slog.d(TAG_WM, "Drag into new candidate view @ " + window.asBinder());
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800486 }
487 }
488
Andrew Scull26f830d2017-05-19 12:16:10 +0100489 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800490 public void dragRecipientExited(IWindow window) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800491 if (DEBUG_DRAG) {
492 Slog.d(TAG_WM, "Drag from old candidate view @ " + window.asBinder());
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800493 }
494 }
495
Andrew Scull26f830d2017-05-19 12:16:10 +0100496 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800497 public void setWallpaperPosition(IBinder window, float x, float y, float xStep, float yStep) {
498 synchronized(mService.mWindowMap) {
499 long ident = Binder.clearCallingIdentity();
500 try {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700501 mService.mRoot.mWallpaperController.setWindowWallpaperPosition(
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800502 mService.windowForClientLocked(this, window, true),
503 x, y, xStep, yStep);
504 } finally {
505 Binder.restoreCallingIdentity(ident);
506 }
507 }
508 }
509
Andrew Scull26f830d2017-05-19 12:16:10 +0100510 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800511 public void wallpaperOffsetsComplete(IBinder window) {
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700512 synchronized (mService.mWindowMap) {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700513 mService.mRoot.mWallpaperController.wallpaperOffsetsComplete(window);
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700514 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800515 }
516
Andrew Scull26f830d2017-05-19 12:16:10 +0100517 @Override
Dianne Hackborn067e5f62014-09-07 23:14:30 -0700518 public void setWallpaperDisplayOffset(IBinder window, int x, int y) {
519 synchronized(mService.mWindowMap) {
520 long ident = Binder.clearCallingIdentity();
521 try {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700522 mService.mRoot.mWallpaperController.setWindowWallpaperDisplayOffset(
Dianne Hackborn067e5f62014-09-07 23:14:30 -0700523 mService.windowForClientLocked(this, window, true), x, y);
524 } finally {
525 Binder.restoreCallingIdentity(ident);
526 }
527 }
528 }
529
Andrew Scull26f830d2017-05-19 12:16:10 +0100530 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800531 public Bundle sendWallpaperCommand(IBinder window, String action, int x, int y,
532 int z, Bundle extras, boolean sync) {
533 synchronized(mService.mWindowMap) {
534 long ident = Binder.clearCallingIdentity();
535 try {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700536 return mService.mRoot.mWallpaperController.sendWindowWallpaperCommand(
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800537 mService.windowForClientLocked(this, window, true),
538 action, x, y, z, extras, sync);
539 } finally {
540 Binder.restoreCallingIdentity(ident);
541 }
542 }
543 }
544
Andrew Scull26f830d2017-05-19 12:16:10 +0100545 @Override
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800546 public void wallpaperCommandComplete(IBinder window, Bundle result) {
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700547 synchronized (mService.mWindowMap) {
Wale Ogunwale0303c572016-10-20 10:16:29 -0700548 mService.mRoot.mWallpaperController.wallpaperCommandComplete(window);
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700549 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800550 }
551
Andrew Scull26f830d2017-05-19 12:16:10 +0100552 @Override
Svetoslavf7174e82014-06-12 11:29:35 -0700553 public void onRectangleOnScreenRequested(IBinder token, Rect rectangle) {
Svetoslav Ganov1cf70bb2012-08-06 10:53:34 -0700554 synchronized(mService.mWindowMap) {
555 final long identity = Binder.clearCallingIdentity();
556 try {
Svetoslavf7174e82014-06-12 11:29:35 -0700557 mService.onRectangleOnScreenRequested(token, rectangle);
Svetoslav Ganov1cf70bb2012-08-06 10:53:34 -0700558 } finally {
559 Binder.restoreCallingIdentity(identity);
560 }
561 }
562 }
563
Andrew Scull26f830d2017-05-19 12:16:10 +0100564 @Override
Dianne Hackborne3f23a32013-03-01 13:25:35 -0800565 public IWindowId getWindowId(IBinder window) {
566 return mService.getWindowId(window);
567 }
568
Jeff Brownc2932a12014-11-20 18:04:05 -0800569 @Override
570 public void pokeDrawLock(IBinder window) {
571 final long identity = Binder.clearCallingIdentity();
572 try {
573 mService.pokeDrawLock(this, window);
574 } finally {
575 Binder.restoreCallingIdentity(identity);
576 }
577 }
578
Vladislav Kaznacheev989b58a2016-02-10 12:19:33 -0800579 @Override
580 public void updatePointerIcon(IWindow window) {
581 final long identity = Binder.clearCallingIdentity();
582 try {
583 mService.updatePointerIcon(window);
584 } finally {
585 Binder.restoreCallingIdentity(identity);
586 }
587 }
588
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800589 void windowAddedLocked(String packageName) {
590 mPackageName = packageName;
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700591 mRelayoutTag = "relayoutWindow: " + mPackageName;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800592 if (mSurfaceSession == null) {
593 if (WindowManagerService.localLOGV) Slog.v(
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800594 TAG_WM, "First window added to " + this + ", creating SurfaceSession");
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800595 mSurfaceSession = new SurfaceSession();
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800596 if (SHOW_TRANSACTIONS) Slog.i(
597 TAG_WM, " NEW SURFACE SESSION " + mSurfaceSession);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800598 mService.mSessions.add(this);
Dianne Hackborneb94fa72014-06-03 17:48:12 -0700599 if (mLastReportedAnimatorScale != mService.getCurrentAnimatorScale()) {
600 mService.dispatchNewAnimatorScaleLocked(this);
601 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800602 }
603 mNumWindow++;
604 }
605
Wale Ogunwale943002b2017-02-15 19:34:01 -0800606 void windowRemovedLocked() {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800607 mNumWindow--;
Wale Ogunwale943002b2017-02-15 19:34:01 -0800608 killSessionLocked();
609 }
610
611
612 void onWindowSurfaceVisibilityChanged(WindowSurfaceController surfaceController,
613 boolean visible, int type) {
614
615 if (!isSystemAlertWindowType(type)) {
616 return;
617 }
618
619 boolean changed;
620
621 if (!mCanAddInternalSystemWindow) {
622 // We want to track non-system signature apps adding alert windows so we can post an
623 // on-going notification for the user to control their visibility.
624 if (visible) {
625 changed = mAlertWindowSurfaces.add(surfaceController);
626 } else {
627 changed = mAlertWindowSurfaces.remove(surfaceController);
628 }
629
630 if (changed) {
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800631 if (mAlertWindowSurfaces.isEmpty()) {
632 cancelAlertWindowNotification();
633 } else if (mAlertWindowNotification == null){
Wale Ogunwaled76881e2017-03-10 13:17:56 -0800634 mAlertWindowNotification = new AlertWindowNotification(mService, mPackageName);
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700635 if (mShowingAlertWindowNotificationAllowed) {
636 mAlertWindowNotification.post();
637 }
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800638 }
Wale Ogunwaled993a572017-02-05 13:52:09 -0800639 }
640 }
Wale Ogunwale943002b2017-02-15 19:34:01 -0800641
642 if (type != TYPE_APPLICATION_OVERLAY) {
643 return;
644 }
645
646 if (visible) {
647 changed = mAppOverlaySurfaces.add(surfaceController);
648 } else {
649 changed = mAppOverlaySurfaces.remove(surfaceController);
650 }
651
652 if (changed) {
653 // Notify activity manager of changes to app overlay windows so it can adjust the
654 // importance score for the process.
655 setHasOverlayUi(!mAppOverlaySurfaces.isEmpty());
656 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800657 }
658
Wale Ogunwalea10fc7e2017-04-06 07:09:51 -0700659 void setShowingAlertWindowNotificationAllowed(boolean allowed) {
660 mShowingAlertWindowNotificationAllowed = allowed;
661 if (mAlertWindowNotification != null) {
662 if (allowed) {
663 mAlertWindowNotification.post();
664 } else {
665 mAlertWindowNotification.cancel();
666 }
667 }
668 }
669
Wale Ogunwaled993a572017-02-05 13:52:09 -0800670 private void killSessionLocked() {
671 if (mNumWindow > 0 || !mClientDead) {
672 return;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800673 }
Wale Ogunwaled993a572017-02-05 13:52:09 -0800674
675 mService.mSessions.remove(this);
676 if (mSurfaceSession == null) {
677 return;
678 }
679
680 if (WindowManagerService.localLOGV) Slog.v(TAG_WM, "Last window removed from " + this
681 + ", destroying " + mSurfaceSession);
682 if (SHOW_TRANSACTIONS) Slog.i(TAG_WM, " KILL SURFACE SESSION " + mSurfaceSession);
683 try {
684 mSurfaceSession.kill();
685 } catch (Exception e) {
686 Slog.w(TAG_WM, "Exception thrown when killing surface session " + mSurfaceSession
687 + " in session " + this + ": " + e.toString());
688 }
689 mSurfaceSession = null;
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800690 mAlertWindowSurfaces.clear();
691 mAppOverlaySurfaces.clear();
Wale Ogunwaled993a572017-02-05 13:52:09 -0800692 setHasOverlayUi(false);
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800693 cancelAlertWindowNotification();
Wale Ogunwaled993a572017-02-05 13:52:09 -0800694 }
695
696 private void setHasOverlayUi(boolean hasOverlayUi) {
697 mService.mH.obtainMessage(H.SET_HAS_OVERLAY_UI, mPid, hasOverlayUi ? 1 : 0).sendToTarget();
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800698 }
699
Wale Ogunwale387e4c62017-02-13 09:50:02 -0800700 private void cancelAlertWindowNotification() {
701 if (mAlertWindowNotification == null) {
702 return;
703 }
704 mAlertWindowNotification.cancel();
705 mAlertWindowNotification = null;
706 }
707
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800708 void dump(PrintWriter pw, String prefix) {
709 pw.print(prefix); pw.print("mNumWindow="); pw.print(mNumWindow);
Wale Ogunwale5aa86832017-02-28 10:40:27 -0800710 pw.print(" mCanAddInternalSystemWindow="); pw.print(mCanAddInternalSystemWindow);
Wale Ogunwale943002b2017-02-15 19:34:01 -0800711 pw.print(" mAppOverlaySurfaces="); pw.print(mAppOverlaySurfaces);
712 pw.print(" mAlertWindowSurfaces="); pw.print(mAlertWindowSurfaces);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800713 pw.print(" mClientDead="); pw.print(mClientDead);
714 pw.print(" mSurfaceSession="); pw.println(mSurfaceSession);
Wale Ogunwale4958ad22017-06-22 09:08:14 -0700715 pw.print(prefix); pw.print("mPackageName="); pw.println(mPackageName);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800716 }
717
718 @Override
719 public String toString() {
720 return mStringName;
721 }
Robert Carr0e007272017-10-02 13:00:55 -0700722
723 boolean hasAlertWindowSurfaces() {
724 return !mAlertWindowSurfaces.isEmpty();
725 }
Filip Gruszczynski2217f612015-05-26 11:32:08 -0700726}