blob: b5cf40ca0e2c14d2978226e45895a9e503d2784c [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
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080019import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DRAG;
20import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_POSITIONING;
21import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS;
22import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS;
23import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080024
25import android.content.ClipData;
26import android.content.Context;
27import android.content.res.Configuration;
28import android.graphics.Rect;
29import android.graphics.Region;
30import android.os.Binder;
31import android.os.Bundle;
32import android.os.IBinder;
33import android.os.Parcel;
Dianne Hackborn5fe7e2a2012-10-04 11:58:16 -070034import android.os.Process;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080035import android.os.RemoteException;
36import android.os.ServiceManager;
Dianne Hackborn5fe7e2a2012-10-04 11:58:16 -070037import android.os.UserHandle;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080038import android.util.Slog;
Craig Mautner6881a102012-07-27 13:04:51 -070039import android.view.Display;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080040import android.view.IWindow;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080041import android.view.IWindowId;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080042import android.view.IWindowSession;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080043import android.view.IWindowSessionCallback;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080044import android.view.InputChannel;
45import android.view.Surface;
Mathias Agopian3866f0d2013-02-11 22:08:48 -080046import android.view.SurfaceControl;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080047import android.view.SurfaceSession;
48import android.view.WindowManager;
49
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080050import com.android.internal.view.IInputContext;
51import com.android.internal.view.IInputMethodClient;
52import com.android.internal.view.IInputMethodManager;
53import com.android.server.wm.WindowManagerService.H;
54
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080055import java.io.PrintWriter;
56
57/**
58 * This class represents an active client session. There is generally one
59 * Session object per process that is interacting with the window manager.
60 */
61final class Session extends IWindowSession.Stub
62 implements IBinder.DeathRecipient {
63 final WindowManagerService mService;
Dianne Hackborneb94fa72014-06-03 17:48:12 -070064 final IWindowSessionCallback mCallback;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080065 final IInputMethodClient mClient;
66 final IInputContext mInputContext;
67 final int mUid;
68 final int mPid;
69 final String mStringName;
70 SurfaceSession mSurfaceSession;
71 int mNumWindow = 0;
72 boolean mClientDead = false;
Dianne Hackborneb94fa72014-06-03 17:48:12 -070073 float mLastReportedAnimatorScale;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080074
Dianne Hackborneb94fa72014-06-03 17:48:12 -070075 public Session(WindowManagerService service, IWindowSessionCallback callback,
76 IInputMethodClient client, IInputContext inputContext) {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080077 mService = service;
Dianne Hackborneb94fa72014-06-03 17:48:12 -070078 mCallback = callback;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080079 mClient = client;
80 mInputContext = inputContext;
81 mUid = Binder.getCallingUid();
82 mPid = Binder.getCallingPid();
Dianne Hackborneb94fa72014-06-03 17:48:12 -070083 mLastReportedAnimatorScale = service.getCurrentAnimatorScale();
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080084 StringBuilder sb = new StringBuilder();
85 sb.append("Session{");
86 sb.append(Integer.toHexString(System.identityHashCode(this)));
Dianne Hackborn5fe7e2a2012-10-04 11:58:16 -070087 sb.append(" ");
88 sb.append(mPid);
89 if (mUid < Process.FIRST_APPLICATION_UID) {
90 sb.append(":");
91 sb.append(mUid);
92 } else {
93 sb.append(":u");
94 sb.append(UserHandle.getUserId(mUid));
95 sb.append('a');
96 sb.append(UserHandle.getAppId(mUid));
97 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080098 sb.append("}");
99 mStringName = sb.toString();
100
101 synchronized (mService.mWindowMap) {
102 if (mService.mInputMethodManager == null && mService.mHaveInputMethods) {
103 IBinder b = ServiceManager.getService(
104 Context.INPUT_METHOD_SERVICE);
105 mService.mInputMethodManager = IInputMethodManager.Stub.asInterface(b);
106 }
107 }
108 long ident = Binder.clearCallingIdentity();
109 try {
110 // Note: it is safe to call in to the input method manager
111 // here because we are not holding our lock.
112 if (mService.mInputMethodManager != null) {
113 mService.mInputMethodManager.addClient(client, inputContext,
114 mUid, mPid);
115 } else {
116 client.setUsingInputMethod(false);
117 }
118 client.asBinder().linkToDeath(this, 0);
119 } catch (RemoteException e) {
120 // The caller has died, so we can just forget about this.
121 try {
122 if (mService.mInputMethodManager != null) {
123 mService.mInputMethodManager.removeClient(client);
124 }
125 } catch (RemoteException ee) {
126 }
127 } finally {
128 Binder.restoreCallingIdentity(ident);
129 }
130 }
131
132 @Override
133 public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
134 throws RemoteException {
135 try {
136 return super.onTransact(code, data, reply, flags);
137 } catch (RuntimeException e) {
138 // Log all 'real' exceptions thrown to the caller
139 if (!(e instanceof SecurityException)) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800140 Slog.wtf(TAG_WM, "Window Session Crash", e);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800141 }
142 throw e;
143 }
144 }
145
146 public void binderDied() {
147 // Note: it is safe to call in to the input method manager
148 // here because we are not holding our lock.
149 try {
150 if (mService.mInputMethodManager != null) {
151 mService.mInputMethodManager.removeClient(mClient);
152 }
153 } catch (RemoteException e) {
154 }
155 synchronized(mService.mWindowMap) {
156 mClient.asBinder().unlinkToDeath(this, 0);
157 mClientDead = true;
158 killSessionLocked();
159 }
160 }
161
Craig Mautner6881a102012-07-27 13:04:51 -0700162 @Override
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700163 public int add(IWindow window, int seq, WindowManager.LayoutParams attrs,
Adrian Roos37d7a682014-11-06 18:15:16 +0100164 int viewVisibility, Rect outContentInsets, Rect outStableInsets,
165 InputChannel outInputChannel) {
Craig Mautner6881a102012-07-27 13:04:51 -0700166 return addToDisplay(window, seq, attrs, viewVisibility, Display.DEFAULT_DISPLAY,
Filip Gruszczynski0ec13282015-06-25 11:26:01 -0700167 outContentInsets, outStableInsets, null /* outOutsets */, outInputChannel);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800168 }
Craig Mautner6881a102012-07-27 13:04:51 -0700169
170 @Override
171 public int addToDisplay(IWindow window, int seq, WindowManager.LayoutParams attrs,
Adrian Roos37d7a682014-11-06 18:15:16 +0100172 int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets,
Filip Gruszczynski0ec13282015-06-25 11:26:01 -0700173 Rect outOutsets, InputChannel outInputChannel) {
Craig Mautner6881a102012-07-27 13:04:51 -0700174 return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
Filip Gruszczynski0ec13282015-06-25 11:26:01 -0700175 outContentInsets, outStableInsets, outOutsets, outInputChannel);
Craig Mautner6881a102012-07-27 13:04:51 -0700176 }
177
178 @Override
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700179 public int addWithoutInputChannel(IWindow window, int seq, WindowManager.LayoutParams attrs,
Adrian Roos37d7a682014-11-06 18:15:16 +0100180 int viewVisibility, Rect outContentInsets, Rect outStableInsets) {
Craig Mautner6881a102012-07-27 13:04:51 -0700181 return addToDisplayWithoutInputChannel(window, seq, attrs, viewVisibility,
Adrian Roos37d7a682014-11-06 18:15:16 +0100182 Display.DEFAULT_DISPLAY, outContentInsets, outStableInsets);
Craig Mautner6881a102012-07-27 13:04:51 -0700183 }
184
185 @Override
186 public int addToDisplayWithoutInputChannel(IWindow window, int seq, WindowManager.LayoutParams attrs,
Adrian Roos37d7a682014-11-06 18:15:16 +0100187 int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets) {
Craig Mautner6881a102012-07-27 13:04:51 -0700188 return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
Filip Gruszczynski0ec13282015-06-25 11:26:01 -0700189 outContentInsets, outStableInsets, null /* outOutsets */, null);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800190 }
191
192 public void remove(IWindow window) {
193 mService.removeWindow(this, window);
194 }
195
Rob Carr64e516f2015-10-29 00:20:45 +0000196 @Override
Robert Carr64aadd02015-11-06 13:54:20 -0800197 public void repositionChild(IWindow window, int left, int top, int right, int bottom,
198 long deferTransactionUntilFrame, Rect outFrame) {
199 mService.repositionChild(this, window, left, top, right, bottom,
200 deferTransactionUntilFrame, outFrame);
Rob Carr64e516f2015-10-29 00:20:45 +0000201 }
202
Robert Carr23fa16b2016-01-13 13:19:58 -0800203 @Override
204 public void prepareToReplaceChildren(IBinder appToken) {
205 mService.setReplacingChildren(appToken);
206 }
207
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700208 public int relayout(IWindow window, int seq, WindowManager.LayoutParams attrs,
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800209 int requestedWidth, int requestedHeight, int viewFlags,
Dianne Hackbornc4aad012013-02-22 15:05:25 -0800210 int flags, Rect outFrame, Rect outOverscanInsets, Rect outContentInsets,
Filip Gruszczynski2217f612015-05-26 11:32:08 -0700211 Rect outVisibleInsets, Rect outStableInsets, Rect outsets, Configuration
212 outConfig,
Adrian Roosfa104232014-06-20 16:10:14 -0700213 Surface outSurface) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800214 if (false) Slog.d(TAG_WM, ">>>>>> ENTERED relayout from "
Dianne Hackbornb961cd22011-06-21 12:13:37 -0700215 + Binder.getCallingPid());
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700216 int res = mService.relayoutWindow(this, window, seq, attrs,
Dianne Hackborn6d05fd32011-11-19 14:36:15 -0800217 requestedWidth, requestedHeight, viewFlags, flags,
Dianne Hackbornc4aad012013-02-22 15:05:25 -0800218 outFrame, outOverscanInsets, outContentInsets, outVisibleInsets,
Filip Gruszczynski2217f612015-05-26 11:32:08 -0700219 outStableInsets, outsets, outConfig, outSurface);
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800220 if (false) Slog.d(TAG_WM, "<<<<<< EXITING relayout to "
Dianne Hackbornb961cd22011-06-21 12:13:37 -0700221 + Binder.getCallingPid());
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800222 return res;
223 }
224
Dianne Hackborn6d05fd32011-11-19 14:36:15 -0800225 public void performDeferredDestroy(IWindow window) {
226 mService.performDeferredDestroyWindow(this, window);
227 }
228
Dianne Hackborn64825172011-03-02 21:32:58 -0800229 public boolean outOfMemory(IWindow window) {
230 return mService.outOfMemoryWindow(this, window);
231 }
232
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800233 public void setTransparentRegion(IWindow window, Region region) {
234 mService.setTransparentRegionWindow(this, window, region);
235 }
236
237 public void setInsets(IWindow window, int touchableInsets,
238 Rect contentInsets, Rect visibleInsets, Region touchableArea) {
239 mService.setInsetsWindow(this, window, touchableInsets, contentInsets,
240 visibleInsets, touchableArea);
241 }
242
243 public void getDisplayFrame(IWindow window, Rect outDisplayFrame) {
244 mService.getWindowDisplayFrame(this, window, outDisplayFrame);
245 }
246
247 public void finishDrawing(IWindow window) {
248 if (WindowManagerService.localLOGV) Slog.v(
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800249 TAG_WM, "IWindow finishDrawing called for " + window);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800250 mService.finishDrawingWindow(this, window);
251 }
252
253 public void setInTouchMode(boolean mode) {
254 synchronized(mService.mWindowMap) {
255 mService.mInTouchMode = mode;
256 }
257 }
258
259 public boolean getInTouchMode() {
260 synchronized(mService.mWindowMap) {
261 return mService.mInTouchMode;
262 }
263 }
264
265 public boolean performHapticFeedback(IWindow window, int effectId,
266 boolean always) {
267 synchronized(mService.mWindowMap) {
268 long ident = Binder.clearCallingIdentity();
269 try {
270 return mService.mPolicy.performHapticFeedbackLw(
271 mService.windowForClientLocked(this, window, true),
272 effectId, always);
273 } finally {
274 Binder.restoreCallingIdentity(ident);
275 }
276 }
277 }
278
279 /* Drag/drop */
280 public IBinder prepareDrag(IWindow window, int flags,
281 int width, int height, Surface outSurface) {
282 return mService.prepareDragSurface(window, mSurfaceSession, flags,
283 width, height, outSurface);
284 }
285
286 public boolean performDrag(IWindow window, IBinder dragToken,
287 float touchX, float touchY, float thumbCenterX, float thumbCenterY,
288 ClipData data) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800289 if (DEBUG_DRAG) {
290 Slog.d(TAG_WM, "perform drag: win=" + window + " data=" + data);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800291 }
292
293 synchronized (mService.mWindowMap) {
294 if (mService.mDragState == null) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800295 Slog.w(TAG_WM, "No drag prepared");
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800296 throw new IllegalStateException("performDrag() without prepareDrag()");
297 }
298
299 if (dragToken != mService.mDragState.mToken) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800300 Slog.w(TAG_WM, "Performing mismatched drag");
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800301 throw new IllegalStateException("performDrag() does not match prepareDrag()");
302 }
303
304 WindowState callingWin = mService.windowForClientLocked(null, window, false);
305 if (callingWin == null) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800306 Slog.w(TAG_WM, "Bad requesting window " + window);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800307 return false; // !!! TODO: throw here?
308 }
309
310 // !!! TODO: if input is not still focused on the initiating window, fail
311 // the drag initiation (e.g. an alarm window popped up just as the application
312 // called performDrag()
313
314 mService.mH.removeMessages(H.DRAG_START_TIMEOUT, window.asBinder());
315
316 // !!! TODO: extract the current touch (x, y) in screen coordinates. That
317 // will let us eliminate the (touchX,touchY) parameters from the API.
318
319 // !!! FIXME: put all this heavy stuff onto the mH looper, as well as
320 // the actual drag event dispatch stuff in the dragstate
321
Craig Mautnerdf88d732014-01-27 09:21:32 -0800322 final DisplayContent displayContent = callingWin.getDisplayContent();
323 if (displayContent == null) {
324 return false;
325 }
326 Display display = displayContent.getDisplay();
Jeff Brown14a9f2b2012-09-24 14:36:44 -0700327 mService.mDragState.register(display);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800328 mService.mInputMonitor.updateInputWindowsLw(true /*force*/);
329 if (!mService.mInputManager.transferTouchFocus(callingWin.mInputChannel,
330 mService.mDragState.mServerChannel)) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800331 Slog.e(TAG_WM, "Unable to transfer touch focus");
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800332 mService.mDragState.unregister();
333 mService.mDragState = null;
334 mService.mInputMonitor.updateInputWindowsLw(true /*force*/);
335 return false;
336 }
337
338 mService.mDragState.mData = data;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800339 mService.mDragState.broadcastDragStartedLw(touchX, touchY);
340
341 // remember the thumb offsets for later
342 mService.mDragState.mThumbOffsetX = thumbCenterX;
343 mService.mDragState.mThumbOffsetY = thumbCenterY;
344
345 // Make the surface visible at the proper location
Mathias Agopian29479eb2013-02-14 14:36:04 -0800346 final SurfaceControl surfaceControl = mService.mDragState.mSurfaceControl;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800347 if (SHOW_LIGHT_TRANSACTIONS) Slog.i(
348 TAG_WM, ">>> OPEN TRANSACTION performDrag");
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800349 SurfaceControl.openTransaction();
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800350 try {
Mathias Agopian29479eb2013-02-14 14:36:04 -0800351 surfaceControl.setPosition(touchX - thumbCenterX,
Dianne Hackbornd040edb2011-08-31 12:47:58 -0700352 touchY - thumbCenterY);
Mathias Agopian29479eb2013-02-14 14:36:04 -0800353 surfaceControl.setLayer(mService.mDragState.getDragLayerLw());
354 surfaceControl.setLayerStack(display.getLayerStack());
355 surfaceControl.show();
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800356 } finally {
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800357 SurfaceControl.closeTransaction();
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800358 if (SHOW_LIGHT_TRANSACTIONS) Slog.i(
359 TAG_WM, "<<< CLOSE TRANSACTION performDrag");
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800360 }
361 }
362
363 return true; // success!
364 }
365
Chong Zhang8e89b312015-09-09 15:09:30 -0700366 public boolean startMovingTask(IWindow window, float startX, float startY) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800367 if (DEBUG_TASK_POSITIONING) Slog.d(
368 TAG_WM, "startMovingTask: {" + startX + "," + startY + "}");
Chong Zhang8e89b312015-09-09 15:09:30 -0700369
370 return mService.startMovingTask(window, startX, startY);
371 }
372
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800373 public void reportDropResult(IWindow window, boolean consumed) {
374 IBinder token = window.asBinder();
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800375 if (DEBUG_DRAG) {
376 Slog.d(TAG_WM, "Drop result=" + consumed + " reported by " + token);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800377 }
378
379 synchronized (mService.mWindowMap) {
380 long ident = Binder.clearCallingIdentity();
381 try {
Christopher Tate05e9c652011-10-20 12:34:36 -0700382 if (mService.mDragState == null) {
383 // Most likely the drop recipient ANRed and we ended the drag
384 // out from under it. Log the issue and move on.
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800385 Slog.w(TAG_WM, "Drop result given but no drag in progress");
Christopher Tate05e9c652011-10-20 12:34:36 -0700386 return;
387 }
388
389 if (mService.mDragState.mToken != token) {
390 // We're in a drag, but the wrong window has responded.
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800391 Slog.w(TAG_WM, "Invalid drop-result claim by " + window);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800392 throw new IllegalStateException("reportDropResult() by non-recipient");
393 }
394
395 // The right window has responded, even if it's no longer around,
396 // so be sure to halt the timeout even if the later WindowState
397 // lookup fails.
398 mService.mH.removeMessages(H.DRAG_END_TIMEOUT, window.asBinder());
399 WindowState callingWin = mService.windowForClientLocked(null, window, false);
400 if (callingWin == null) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800401 Slog.w(TAG_WM, "Bad result-reporting window " + window);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800402 return; // !!! TODO: throw here?
403 }
404
405 mService.mDragState.mDragResult = consumed;
406 mService.mDragState.endDragLw();
407 } finally {
408 Binder.restoreCallingIdentity(ident);
409 }
410 }
411 }
412
Vladislav Kaznacheev82063912015-11-20 14:20:13 -0800413 public void cancelDragAndDrop(IBinder dragToken) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800414 if (DEBUG_DRAG) {
415 Slog.d(TAG_WM, "cancelDragAndDrop");
Vladislav Kaznacheev82063912015-11-20 14:20:13 -0800416 }
417
418 synchronized (mService.mWindowMap) {
419 long ident = Binder.clearCallingIdentity();
420 try {
421 if (mService.mDragState == null) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800422 Slog.w(TAG_WM, "cancelDragAndDrop() without prepareDrag()");
Vladislav Kaznacheev82063912015-11-20 14:20:13 -0800423 throw new IllegalStateException("cancelDragAndDrop() without prepareDrag()");
424 }
425
426 if (mService.mDragState.mToken != dragToken) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800427 Slog.w(TAG_WM,
Vladislav Kaznacheev82063912015-11-20 14:20:13 -0800428 "cancelDragAndDrop() does not match prepareDrag()");
429 throw new IllegalStateException(
430 "cancelDragAndDrop() does not match prepareDrag()");
431 }
432
433 mService.mDragState.mDragResult = false;
Vladislav Kaznacheevce2aef92015-11-20 18:49:59 -0800434 mService.mDragState.cancelDragLw();
Vladislav Kaznacheev82063912015-11-20 14:20:13 -0800435 } finally {
436 Binder.restoreCallingIdentity(ident);
437 }
438 }
439 }
440
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800441 public void dragRecipientEntered(IWindow window) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800442 if (DEBUG_DRAG) {
443 Slog.d(TAG_WM, "Drag into new candidate view @ " + window.asBinder());
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800444 }
445 }
446
447 public void dragRecipientExited(IWindow window) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800448 if (DEBUG_DRAG) {
449 Slog.d(TAG_WM, "Drag from old candidate view @ " + window.asBinder());
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800450 }
451 }
452
453 public void setWallpaperPosition(IBinder window, float x, float y, float xStep, float yStep) {
454 synchronized(mService.mWindowMap) {
455 long ident = Binder.clearCallingIdentity();
456 try {
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700457 mService.mWallpaperControllerLocked.setWindowWallpaperPosition(
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800458 mService.windowForClientLocked(this, window, true),
459 x, y, xStep, yStep);
460 } finally {
461 Binder.restoreCallingIdentity(ident);
462 }
463 }
464 }
465
466 public void wallpaperOffsetsComplete(IBinder window) {
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700467 synchronized (mService.mWindowMap) {
468 mService.mWallpaperControllerLocked.wallpaperOffsetsComplete(window);
469 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800470 }
471
Dianne Hackborn067e5f62014-09-07 23:14:30 -0700472 public void setWallpaperDisplayOffset(IBinder window, int x, int y) {
473 synchronized(mService.mWindowMap) {
474 long ident = Binder.clearCallingIdentity();
475 try {
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700476 mService.mWallpaperControllerLocked.setWindowWallpaperDisplayOffset(
Dianne Hackborn067e5f62014-09-07 23:14:30 -0700477 mService.windowForClientLocked(this, window, true), x, y);
478 } finally {
479 Binder.restoreCallingIdentity(ident);
480 }
481 }
482 }
483
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800484 public Bundle sendWallpaperCommand(IBinder window, String action, int x, int y,
485 int z, Bundle extras, boolean sync) {
486 synchronized(mService.mWindowMap) {
487 long ident = Binder.clearCallingIdentity();
488 try {
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700489 return mService.mWallpaperControllerLocked.sendWindowWallpaperCommand(
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800490 mService.windowForClientLocked(this, window, true),
491 action, x, y, z, extras, sync);
492 } finally {
493 Binder.restoreCallingIdentity(ident);
494 }
495 }
496 }
497
498 public void wallpaperCommandComplete(IBinder window, Bundle result) {
Wale Ogunwalee8069dc2015-08-18 09:52:01 -0700499 synchronized (mService.mWindowMap) {
500 mService.mWallpaperControllerLocked.wallpaperCommandComplete(window);
501 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800502 }
503
Svetoslavf7174e82014-06-12 11:29:35 -0700504 public void onRectangleOnScreenRequested(IBinder token, Rect rectangle) {
Svetoslav Ganov1cf70bb2012-08-06 10:53:34 -0700505 synchronized(mService.mWindowMap) {
506 final long identity = Binder.clearCallingIdentity();
507 try {
Svetoslavf7174e82014-06-12 11:29:35 -0700508 mService.onRectangleOnScreenRequested(token, rectangle);
Svetoslav Ganov1cf70bb2012-08-06 10:53:34 -0700509 } finally {
510 Binder.restoreCallingIdentity(identity);
511 }
512 }
513 }
514
Dianne Hackborne3f23a32013-03-01 13:25:35 -0800515 public IWindowId getWindowId(IBinder window) {
516 return mService.getWindowId(window);
517 }
518
Jeff Brownc2932a12014-11-20 18:04:05 -0800519 @Override
520 public void pokeDrawLock(IBinder window) {
521 final long identity = Binder.clearCallingIdentity();
522 try {
523 mService.pokeDrawLock(this, window);
524 } finally {
525 Binder.restoreCallingIdentity(identity);
526 }
527 }
528
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800529 void windowAddedLocked() {
530 if (mSurfaceSession == null) {
531 if (WindowManagerService.localLOGV) Slog.v(
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800532 TAG_WM, "First window added to " + this + ", creating SurfaceSession");
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800533 mSurfaceSession = new SurfaceSession();
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800534 if (SHOW_TRANSACTIONS) Slog.i(
535 TAG_WM, " NEW SURFACE SESSION " + mSurfaceSession);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800536 mService.mSessions.add(this);
Dianne Hackborneb94fa72014-06-03 17:48:12 -0700537 if (mLastReportedAnimatorScale != mService.getCurrentAnimatorScale()) {
538 mService.dispatchNewAnimatorScaleLocked(this);
539 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800540 }
541 mNumWindow++;
542 }
543
544 void windowRemovedLocked() {
545 mNumWindow--;
546 killSessionLocked();
547 }
548
549 void killSessionLocked() {
550 if (mNumWindow <= 0 && mClientDead) {
551 mService.mSessions.remove(this);
552 if (mSurfaceSession != null) {
553 if (WindowManagerService.localLOGV) Slog.v(
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800554 TAG_WM, "Last window removed from " + this
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800555 + ", destroying " + mSurfaceSession);
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800556 if (SHOW_TRANSACTIONS) Slog.i(
557 TAG_WM, " KILL SURFACE SESSION " + mSurfaceSession);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800558 try {
559 mSurfaceSession.kill();
560 } catch (Exception e) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800561 Slog.w(TAG_WM, "Exception thrown when killing surface session "
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800562 + mSurfaceSession + " in session " + this
563 + ": " + e.toString());
564 }
565 mSurfaceSession = null;
566 }
567 }
568 }
569
570 void dump(PrintWriter pw, String prefix) {
571 pw.print(prefix); pw.print("mNumWindow="); pw.print(mNumWindow);
572 pw.print(" mClientDead="); pw.print(mClientDead);
573 pw.print(" mSurfaceSession="); pw.println(mSurfaceSession);
574 }
575
576 @Override
577 public String toString() {
578 return mStringName;
579 }
Filip Gruszczynski2217f612015-05-26 11:32:08 -0700580}