blob: a1d145c0bbaffe0c457a4e1730296127a8235b5a [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
Dianne Hackborne3f23a32013-03-01 13:25:35 -080019import android.view.IWindowId;
Dianne Hackborneb94fa72014-06-03 17:48:12 -070020import android.view.IWindowSessionCallback;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080021import com.android.internal.view.IInputContext;
22import com.android.internal.view.IInputMethodClient;
23import com.android.internal.view.IInputMethodManager;
24import com.android.server.wm.WindowManagerService.H;
25
26import android.content.ClipData;
27import android.content.Context;
28import android.content.res.Configuration;
29import android.graphics.Rect;
30import android.graphics.Region;
31import android.os.Binder;
32import android.os.Bundle;
33import android.os.IBinder;
34import android.os.Parcel;
Dianne Hackborn5fe7e2a2012-10-04 11:58:16 -070035import android.os.Process;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080036import android.os.RemoteException;
37import android.os.ServiceManager;
Dianne Hackborn5fe7e2a2012-10-04 11:58:16 -070038import android.os.UserHandle;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080039import android.util.Slog;
Craig Mautner6881a102012-07-27 13:04:51 -070040import android.view.Display;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080041import android.view.IWindow;
42import android.view.IWindowSession;
43import android.view.InputChannel;
44import android.view.Surface;
Mathias Agopian3866f0d2013-02-11 22:08:48 -080045import android.view.SurfaceControl;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080046import android.view.SurfaceSession;
47import android.view.WindowManager;
48
49import java.io.PrintWriter;
50
51/**
52 * This class represents an active client session. There is generally one
53 * Session object per process that is interacting with the window manager.
54 */
55final class Session extends IWindowSession.Stub
56 implements IBinder.DeathRecipient {
57 final WindowManagerService mService;
Dianne Hackborneb94fa72014-06-03 17:48:12 -070058 final IWindowSessionCallback mCallback;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080059 final IInputMethodClient mClient;
60 final IInputContext mInputContext;
61 final int mUid;
62 final int mPid;
63 final String mStringName;
64 SurfaceSession mSurfaceSession;
65 int mNumWindow = 0;
66 boolean mClientDead = false;
Dianne Hackborneb94fa72014-06-03 17:48:12 -070067 float mLastReportedAnimatorScale;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080068
Dianne Hackborneb94fa72014-06-03 17:48:12 -070069 public Session(WindowManagerService service, IWindowSessionCallback callback,
70 IInputMethodClient client, IInputContext inputContext) {
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080071 mService = service;
Dianne Hackborneb94fa72014-06-03 17:48:12 -070072 mCallback = callback;
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080073 mClient = client;
74 mInputContext = inputContext;
75 mUid = Binder.getCallingUid();
76 mPid = Binder.getCallingPid();
Dianne Hackborneb94fa72014-06-03 17:48:12 -070077 mLastReportedAnimatorScale = service.getCurrentAnimatorScale();
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080078 StringBuilder sb = new StringBuilder();
79 sb.append("Session{");
80 sb.append(Integer.toHexString(System.identityHashCode(this)));
Dianne Hackborn5fe7e2a2012-10-04 11:58:16 -070081 sb.append(" ");
82 sb.append(mPid);
83 if (mUid < Process.FIRST_APPLICATION_UID) {
84 sb.append(":");
85 sb.append(mUid);
86 } else {
87 sb.append(":u");
88 sb.append(UserHandle.getUserId(mUid));
89 sb.append('a');
90 sb.append(UserHandle.getAppId(mUid));
91 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080092 sb.append("}");
93 mStringName = sb.toString();
94
95 synchronized (mService.mWindowMap) {
96 if (mService.mInputMethodManager == null && mService.mHaveInputMethods) {
97 IBinder b = ServiceManager.getService(
98 Context.INPUT_METHOD_SERVICE);
99 mService.mInputMethodManager = IInputMethodManager.Stub.asInterface(b);
100 }
101 }
102 long ident = Binder.clearCallingIdentity();
103 try {
104 // Note: it is safe to call in to the input method manager
105 // here because we are not holding our lock.
106 if (mService.mInputMethodManager != null) {
107 mService.mInputMethodManager.addClient(client, inputContext,
108 mUid, mPid);
109 } else {
110 client.setUsingInputMethod(false);
111 }
112 client.asBinder().linkToDeath(this, 0);
113 } catch (RemoteException e) {
114 // The caller has died, so we can just forget about this.
115 try {
116 if (mService.mInputMethodManager != null) {
117 mService.mInputMethodManager.removeClient(client);
118 }
119 } catch (RemoteException ee) {
120 }
121 } finally {
122 Binder.restoreCallingIdentity(ident);
123 }
124 }
125
126 @Override
127 public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
128 throws RemoteException {
129 try {
130 return super.onTransact(code, data, reply, flags);
131 } catch (RuntimeException e) {
132 // Log all 'real' exceptions thrown to the caller
133 if (!(e instanceof SecurityException)) {
Dianne Hackborn164371f2013-10-01 19:10:13 -0700134 Slog.wtf(WindowManagerService.TAG, "Window Session Crash", e);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800135 }
136 throw e;
137 }
138 }
139
140 public void binderDied() {
141 // Note: it is safe to call in to the input method manager
142 // here because we are not holding our lock.
143 try {
144 if (mService.mInputMethodManager != null) {
145 mService.mInputMethodManager.removeClient(mClient);
146 }
147 } catch (RemoteException e) {
148 }
149 synchronized(mService.mWindowMap) {
150 mClient.asBinder().unlinkToDeath(this, 0);
151 mClientDead = true;
152 killSessionLocked();
153 }
154 }
155
Craig Mautner6881a102012-07-27 13:04:51 -0700156 @Override
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700157 public int add(IWindow window, int seq, WindowManager.LayoutParams attrs,
Adrian Roos37d7a682014-11-06 18:15:16 +0100158 int viewVisibility, Rect outContentInsets, Rect outStableInsets,
159 InputChannel outInputChannel) {
Craig Mautner6881a102012-07-27 13:04:51 -0700160 return addToDisplay(window, seq, attrs, viewVisibility, Display.DEFAULT_DISPLAY,
Adrian Roos37d7a682014-11-06 18:15:16 +0100161 outContentInsets, outStableInsets, outInputChannel);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800162 }
Craig Mautner6881a102012-07-27 13:04:51 -0700163
164 @Override
165 public int addToDisplay(IWindow window, int seq, WindowManager.LayoutParams attrs,
Adrian Roos37d7a682014-11-06 18:15:16 +0100166 int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets,
Craig Mautner6881a102012-07-27 13:04:51 -0700167 InputChannel outInputChannel) {
168 return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
Adrian Roos37d7a682014-11-06 18:15:16 +0100169 outContentInsets, outStableInsets, outInputChannel);
Craig Mautner6881a102012-07-27 13:04:51 -0700170 }
171
172 @Override
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700173 public int addWithoutInputChannel(IWindow window, int seq, WindowManager.LayoutParams attrs,
Adrian Roos37d7a682014-11-06 18:15:16 +0100174 int viewVisibility, Rect outContentInsets, Rect outStableInsets) {
Craig Mautner6881a102012-07-27 13:04:51 -0700175 return addToDisplayWithoutInputChannel(window, seq, attrs, viewVisibility,
Adrian Roos37d7a682014-11-06 18:15:16 +0100176 Display.DEFAULT_DISPLAY, outContentInsets, outStableInsets);
Craig Mautner6881a102012-07-27 13:04:51 -0700177 }
178
179 @Override
180 public int addToDisplayWithoutInputChannel(IWindow window, int seq, WindowManager.LayoutParams attrs,
Adrian Roos37d7a682014-11-06 18:15:16 +0100181 int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets) {
Craig Mautner6881a102012-07-27 13:04:51 -0700182 return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
Adrian Roos37d7a682014-11-06 18:15:16 +0100183 outContentInsets, outStableInsets, null);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800184 }
185
186 public void remove(IWindow window) {
187 mService.removeWindow(this, window);
188 }
189
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700190 public int relayout(IWindow window, int seq, WindowManager.LayoutParams attrs,
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800191 int requestedWidth, int requestedHeight, int viewFlags,
Dianne Hackbornc4aad012013-02-22 15:05:25 -0800192 int flags, Rect outFrame, Rect outOverscanInsets, Rect outContentInsets,
Adrian Roosfa104232014-06-20 16:10:14 -0700193 Rect outVisibleInsets, Rect outStableInsets, Configuration outConfig,
194 Surface outSurface) {
Dianne Hackbornb961cd22011-06-21 12:13:37 -0700195 if (false) Slog.d(WindowManagerService.TAG, ">>>>>> ENTERED relayout from "
196 + Binder.getCallingPid());
Dianne Hackborn9a230e02011-10-06 11:51:27 -0700197 int res = mService.relayoutWindow(this, window, seq, attrs,
Dianne Hackborn6d05fd32011-11-19 14:36:15 -0800198 requestedWidth, requestedHeight, viewFlags, flags,
Dianne Hackbornc4aad012013-02-22 15:05:25 -0800199 outFrame, outOverscanInsets, outContentInsets, outVisibleInsets,
Adrian Roosfa104232014-06-20 16:10:14 -0700200 outStableInsets, outConfig, outSurface);
Dianne Hackbornb961cd22011-06-21 12:13:37 -0700201 if (false) Slog.d(WindowManagerService.TAG, "<<<<<< EXITING relayout to "
202 + Binder.getCallingPid());
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800203 return res;
204 }
205
Dianne Hackborn6d05fd32011-11-19 14:36:15 -0800206 public void performDeferredDestroy(IWindow window) {
207 mService.performDeferredDestroyWindow(this, window);
208 }
209
Dianne Hackborn64825172011-03-02 21:32:58 -0800210 public boolean outOfMemory(IWindow window) {
211 return mService.outOfMemoryWindow(this, window);
212 }
213
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800214 public void setTransparentRegion(IWindow window, Region region) {
215 mService.setTransparentRegionWindow(this, window, region);
216 }
217
218 public void setInsets(IWindow window, int touchableInsets,
219 Rect contentInsets, Rect visibleInsets, Region touchableArea) {
220 mService.setInsetsWindow(this, window, touchableInsets, contentInsets,
221 visibleInsets, touchableArea);
222 }
223
224 public void getDisplayFrame(IWindow window, Rect outDisplayFrame) {
225 mService.getWindowDisplayFrame(this, window, outDisplayFrame);
226 }
227
228 public void finishDrawing(IWindow window) {
229 if (WindowManagerService.localLOGV) Slog.v(
230 WindowManagerService.TAG, "IWindow finishDrawing called for " + window);
231 mService.finishDrawingWindow(this, window);
232 }
233
234 public void setInTouchMode(boolean mode) {
235 synchronized(mService.mWindowMap) {
236 mService.mInTouchMode = mode;
237 }
238 }
239
240 public boolean getInTouchMode() {
241 synchronized(mService.mWindowMap) {
242 return mService.mInTouchMode;
243 }
244 }
245
246 public boolean performHapticFeedback(IWindow window, int effectId,
247 boolean always) {
248 synchronized(mService.mWindowMap) {
249 long ident = Binder.clearCallingIdentity();
250 try {
251 return mService.mPolicy.performHapticFeedbackLw(
252 mService.windowForClientLocked(this, window, true),
253 effectId, always);
254 } finally {
255 Binder.restoreCallingIdentity(ident);
256 }
257 }
258 }
259
260 /* Drag/drop */
261 public IBinder prepareDrag(IWindow window, int flags,
262 int width, int height, Surface outSurface) {
263 return mService.prepareDragSurface(window, mSurfaceSession, flags,
264 width, height, outSurface);
265 }
266
267 public boolean performDrag(IWindow window, IBinder dragToken,
268 float touchX, float touchY, float thumbCenterX, float thumbCenterY,
269 ClipData data) {
270 if (WindowManagerService.DEBUG_DRAG) {
271 Slog.d(WindowManagerService.TAG, "perform drag: win=" + window + " data=" + data);
272 }
273
274 synchronized (mService.mWindowMap) {
275 if (mService.mDragState == null) {
276 Slog.w(WindowManagerService.TAG, "No drag prepared");
277 throw new IllegalStateException("performDrag() without prepareDrag()");
278 }
279
280 if (dragToken != mService.mDragState.mToken) {
281 Slog.w(WindowManagerService.TAG, "Performing mismatched drag");
282 throw new IllegalStateException("performDrag() does not match prepareDrag()");
283 }
284
285 WindowState callingWin = mService.windowForClientLocked(null, window, false);
286 if (callingWin == null) {
287 Slog.w(WindowManagerService.TAG, "Bad requesting window " + window);
288 return false; // !!! TODO: throw here?
289 }
290
291 // !!! TODO: if input is not still focused on the initiating window, fail
292 // the drag initiation (e.g. an alarm window popped up just as the application
293 // called performDrag()
294
295 mService.mH.removeMessages(H.DRAG_START_TIMEOUT, window.asBinder());
296
297 // !!! TODO: extract the current touch (x, y) in screen coordinates. That
298 // will let us eliminate the (touchX,touchY) parameters from the API.
299
300 // !!! FIXME: put all this heavy stuff onto the mH looper, as well as
301 // the actual drag event dispatch stuff in the dragstate
302
Craig Mautnerdf88d732014-01-27 09:21:32 -0800303 final DisplayContent displayContent = callingWin.getDisplayContent();
304 if (displayContent == null) {
305 return false;
306 }
307 Display display = displayContent.getDisplay();
Jeff Brown14a9f2b2012-09-24 14:36:44 -0700308 mService.mDragState.register(display);
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800309 mService.mInputMonitor.updateInputWindowsLw(true /*force*/);
310 if (!mService.mInputManager.transferTouchFocus(callingWin.mInputChannel,
311 mService.mDragState.mServerChannel)) {
312 Slog.e(WindowManagerService.TAG, "Unable to transfer touch focus");
313 mService.mDragState.unregister();
314 mService.mDragState = null;
315 mService.mInputMonitor.updateInputWindowsLw(true /*force*/);
316 return false;
317 }
318
319 mService.mDragState.mData = data;
320 mService.mDragState.mCurrentX = touchX;
321 mService.mDragState.mCurrentY = touchY;
322 mService.mDragState.broadcastDragStartedLw(touchX, touchY);
323
324 // remember the thumb offsets for later
325 mService.mDragState.mThumbOffsetX = thumbCenterX;
326 mService.mDragState.mThumbOffsetY = thumbCenterY;
327
328 // Make the surface visible at the proper location
Mathias Agopian29479eb2013-02-14 14:36:04 -0800329 final SurfaceControl surfaceControl = mService.mDragState.mSurfaceControl;
Dianne Hackborn36991742011-10-11 21:35:26 -0700330 if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS) Slog.i(
331 WindowManagerService.TAG, ">>> OPEN TRANSACTION performDrag");
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800332 SurfaceControl.openTransaction();
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800333 try {
Mathias Agopian29479eb2013-02-14 14:36:04 -0800334 surfaceControl.setPosition(touchX - thumbCenterX,
Dianne Hackbornd040edb2011-08-31 12:47:58 -0700335 touchY - thumbCenterY);
Mathias Agopian29479eb2013-02-14 14:36:04 -0800336 surfaceControl.setAlpha(.7071f);
337 surfaceControl.setLayer(mService.mDragState.getDragLayerLw());
338 surfaceControl.setLayerStack(display.getLayerStack());
339 surfaceControl.show();
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800340 } finally {
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800341 SurfaceControl.closeTransaction();
Dianne Hackborn36991742011-10-11 21:35:26 -0700342 if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS) Slog.i(
343 WindowManagerService.TAG, "<<< CLOSE TRANSACTION performDrag");
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800344 }
345 }
346
347 return true; // success!
348 }
349
350 public void reportDropResult(IWindow window, boolean consumed) {
351 IBinder token = window.asBinder();
352 if (WindowManagerService.DEBUG_DRAG) {
353 Slog.d(WindowManagerService.TAG, "Drop result=" + consumed + " reported by " + token);
354 }
355
356 synchronized (mService.mWindowMap) {
357 long ident = Binder.clearCallingIdentity();
358 try {
Christopher Tate05e9c652011-10-20 12:34:36 -0700359 if (mService.mDragState == null) {
360 // Most likely the drop recipient ANRed and we ended the drag
361 // out from under it. Log the issue and move on.
362 Slog.w(WindowManagerService.TAG, "Drop result given but no drag in progress");
363 return;
364 }
365
366 if (mService.mDragState.mToken != token) {
367 // We're in a drag, but the wrong window has responded.
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800368 Slog.w(WindowManagerService.TAG, "Invalid drop-result claim by " + window);
369 throw new IllegalStateException("reportDropResult() by non-recipient");
370 }
371
372 // The right window has responded, even if it's no longer around,
373 // so be sure to halt the timeout even if the later WindowState
374 // lookup fails.
375 mService.mH.removeMessages(H.DRAG_END_TIMEOUT, window.asBinder());
376 WindowState callingWin = mService.windowForClientLocked(null, window, false);
377 if (callingWin == null) {
378 Slog.w(WindowManagerService.TAG, "Bad result-reporting window " + window);
379 return; // !!! TODO: throw here?
380 }
381
382 mService.mDragState.mDragResult = consumed;
383 mService.mDragState.endDragLw();
384 } finally {
385 Binder.restoreCallingIdentity(ident);
386 }
387 }
388 }
389
390 public void dragRecipientEntered(IWindow window) {
391 if (WindowManagerService.DEBUG_DRAG) {
392 Slog.d(WindowManagerService.TAG, "Drag into new candidate view @ " + window.asBinder());
393 }
394 }
395
396 public void dragRecipientExited(IWindow window) {
397 if (WindowManagerService.DEBUG_DRAG) {
398 Slog.d(WindowManagerService.TAG, "Drag from old candidate view @ " + window.asBinder());
399 }
400 }
401
402 public void setWallpaperPosition(IBinder window, float x, float y, float xStep, float yStep) {
403 synchronized(mService.mWindowMap) {
404 long ident = Binder.clearCallingIdentity();
405 try {
406 mService.setWindowWallpaperPositionLocked(
407 mService.windowForClientLocked(this, window, true),
408 x, y, xStep, yStep);
409 } finally {
410 Binder.restoreCallingIdentity(ident);
411 }
412 }
413 }
414
415 public void wallpaperOffsetsComplete(IBinder window) {
416 mService.wallpaperOffsetsComplete(window);
417 }
418
Dianne Hackborn067e5f62014-09-07 23:14:30 -0700419 public void setWallpaperDisplayOffset(IBinder window, int x, int y) {
420 synchronized(mService.mWindowMap) {
421 long ident = Binder.clearCallingIdentity();
422 try {
423 mService.setWindowWallpaperDisplayOffsetLocked(
424 mService.windowForClientLocked(this, window, true), x, y);
425 } finally {
426 Binder.restoreCallingIdentity(ident);
427 }
428 }
429 }
430
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800431 public Bundle sendWallpaperCommand(IBinder window, String action, int x, int y,
432 int z, Bundle extras, boolean sync) {
433 synchronized(mService.mWindowMap) {
434 long ident = Binder.clearCallingIdentity();
435 try {
436 return mService.sendWindowWallpaperCommandLocked(
437 mService.windowForClientLocked(this, window, true),
438 action, x, y, z, extras, sync);
439 } finally {
440 Binder.restoreCallingIdentity(ident);
441 }
442 }
443 }
444
445 public void wallpaperCommandComplete(IBinder window, Bundle result) {
446 mService.wallpaperCommandComplete(window, result);
447 }
448
Dianne Hackborna4b7f2f2012-05-21 11:28:41 -0700449 public void setUniverseTransform(IBinder window, float alpha, float offx, float offy,
450 float dsdx, float dtdx, float dsdy, float dtdy) {
451 synchronized(mService.mWindowMap) {
452 long ident = Binder.clearCallingIdentity();
453 try {
454 mService.setUniverseTransformLocked(
455 mService.windowForClientLocked(this, window, true),
456 alpha, offx, offy, dsdx, dtdx, dsdy, dtdy);
457 } finally {
458 Binder.restoreCallingIdentity(ident);
459 }
460 }
461 }
462
Svetoslavf7174e82014-06-12 11:29:35 -0700463 public void onRectangleOnScreenRequested(IBinder token, Rect rectangle) {
Svetoslav Ganov1cf70bb2012-08-06 10:53:34 -0700464 synchronized(mService.mWindowMap) {
465 final long identity = Binder.clearCallingIdentity();
466 try {
Svetoslavf7174e82014-06-12 11:29:35 -0700467 mService.onRectangleOnScreenRequested(token, rectangle);
Svetoslav Ganov1cf70bb2012-08-06 10:53:34 -0700468 } finally {
469 Binder.restoreCallingIdentity(identity);
470 }
471 }
472 }
473
Dianne Hackborne3f23a32013-03-01 13:25:35 -0800474 public IWindowId getWindowId(IBinder window) {
475 return mService.getWindowId(window);
476 }
477
Jeff Brownc2932a12014-11-20 18:04:05 -0800478 @Override
479 public void pokeDrawLock(IBinder window) {
480 final long identity = Binder.clearCallingIdentity();
481 try {
482 mService.pokeDrawLock(this, window);
483 } finally {
484 Binder.restoreCallingIdentity(identity);
485 }
486 }
487
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800488 void windowAddedLocked() {
489 if (mSurfaceSession == null) {
490 if (WindowManagerService.localLOGV) Slog.v(
491 WindowManagerService.TAG, "First window added to " + this + ", creating SurfaceSession");
492 mSurfaceSession = new SurfaceSession();
493 if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
494 WindowManagerService.TAG, " NEW SURFACE SESSION " + mSurfaceSession);
495 mService.mSessions.add(this);
Dianne Hackborneb94fa72014-06-03 17:48:12 -0700496 if (mLastReportedAnimatorScale != mService.getCurrentAnimatorScale()) {
497 mService.dispatchNewAnimatorScaleLocked(this);
498 }
Dianne Hackborn6e1eb762011-02-17 16:07:28 -0800499 }
500 mNumWindow++;
501 }
502
503 void windowRemovedLocked() {
504 mNumWindow--;
505 killSessionLocked();
506 }
507
508 void killSessionLocked() {
509 if (mNumWindow <= 0 && mClientDead) {
510 mService.mSessions.remove(this);
511 if (mSurfaceSession != null) {
512 if (WindowManagerService.localLOGV) Slog.v(
513 WindowManagerService.TAG, "Last window removed from " + this
514 + ", destroying " + mSurfaceSession);
515 if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
516 WindowManagerService.TAG, " KILL SURFACE SESSION " + mSurfaceSession);
517 try {
518 mSurfaceSession.kill();
519 } catch (Exception e) {
520 Slog.w(WindowManagerService.TAG, "Exception thrown when killing surface session "
521 + mSurfaceSession + " in session " + this
522 + ": " + e.toString());
523 }
524 mSurfaceSession = null;
525 }
526 }
527 }
528
529 void dump(PrintWriter pw, String prefix) {
530 pw.print(prefix); pw.print("mNumWindow="); pw.print(mNumWindow);
531 pw.print(" mClientDead="); pw.print(mClientDead);
532 pw.print(" mSurfaceSession="); pw.println(mSurfaceSession);
533 }
534
535 @Override
536 public String toString() {
537 return mStringName;
538 }
539}