16e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn/* 26e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Copyright (C) 2011 The Android Open Source Project 36e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * 46e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 56e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * you may not use this file except in compliance with the License. 66e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * You may obtain a copy of the License at 76e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * 86e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 96e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * 106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Unless required by applicable law or agreed to in writing, software 116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * See the License for the specific language governing permissions and 146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * limitations under the License. 156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornpackage com.android.server.wm; 186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 19e3f23a36d86fedf6c8c6503378cd6d2190c5ab23Dianne Hackbornimport android.view.IWindowId; 206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport com.android.internal.view.IInputContext; 216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport com.android.internal.view.IInputMethodClient; 226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport com.android.internal.view.IInputMethodManager; 236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport com.android.server.wm.WindowManagerService.H; 246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.content.ClipData; 266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.content.Context; 276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.content.res.Configuration; 286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.Rect; 296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.Region; 306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.Binder; 316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.Bundle; 326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.IBinder; 336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.Parcel; 345fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackbornimport android.os.Process; 356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.RemoteException; 366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.ServiceManager; 375fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackbornimport android.os.UserHandle; 386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.util.Slog; 396881a10557acf3b0270de54799d6f19437acf584Craig Mautnerimport android.view.Display; 406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.IWindow; 416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.IWindowSession; 426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.InputChannel; 436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.Surface; 443866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport android.view.SurfaceControl; 456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.SurfaceSession; 466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.WindowManager; 476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport java.io.PrintWriter; 496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn/** 516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * This class represents an active client session. There is generally one 526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Session object per process that is interacting with the window manager. 536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornfinal class Session extends IWindowSession.Stub 556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn implements IBinder.DeathRecipient { 566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final WindowManagerService mService; 576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final IInputMethodClient mClient; 586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final IInputContext mInputContext; 596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final int mUid; 606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final int mPid; 616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final String mStringName; 626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn SurfaceSession mSurfaceSession; 636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int mNumWindow = 0; 646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mClientDead = false; 656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public Session(WindowManagerService service, IInputMethodClient client, 676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn IInputContext inputContext) { 686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService = service; 696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mClient = client; 706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mInputContext = inputContext; 716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mUid = Binder.getCallingUid(); 726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mPid = Binder.getCallingPid(); 736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn StringBuilder sb = new StringBuilder(); 746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn sb.append("Session{"); 756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn sb.append(Integer.toHexString(System.identityHashCode(this))); 765fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn sb.append(" "); 775fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn sb.append(mPid); 785fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn if (mUid < Process.FIRST_APPLICATION_UID) { 795fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn sb.append(":"); 805fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn sb.append(mUid); 815fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn } else { 825fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn sb.append(":u"); 835fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn sb.append(UserHandle.getUserId(mUid)); 845fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn sb.append('a'); 855fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn sb.append(UserHandle.getAppId(mUid)); 865fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn } 876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn sb.append("}"); 886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mStringName = sb.toString(); 896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn synchronized (mService.mWindowMap) { 916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mService.mInputMethodManager == null && mService.mHaveInputMethods) { 926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn IBinder b = ServiceManager.getService( 936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Context.INPUT_METHOD_SERVICE); 946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mInputMethodManager = IInputMethodManager.Stub.asInterface(b); 956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn long ident = Binder.clearCallingIdentity(); 986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Note: it is safe to call in to the input method manager 1006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // here because we are not holding our lock. 1016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mService.mInputMethodManager != null) { 1026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mInputMethodManager.addClient(client, inputContext, 1036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mUid, mPid); 1046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } else { 1056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn client.setUsingInputMethod(false); 1066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn client.asBinder().linkToDeath(this, 0); 1086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } catch (RemoteException e) { 1096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // The caller has died, so we can just forget about this. 1106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 1116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mService.mInputMethodManager != null) { 1126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mInputMethodManager.removeClient(client); 1136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } catch (RemoteException ee) { 1156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } finally { 1176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Binder.restoreCallingIdentity(ident); 1186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn @Override 1226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public boolean onTransact(int code, Parcel data, Parcel reply, int flags) 1236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn throws RemoteException { 1246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 1256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return super.onTransact(code, data, reply, flags); 1266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } catch (RuntimeException e) { 1276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Log all 'real' exceptions thrown to the caller 1286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (!(e instanceof SecurityException)) { 129164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn Slog.wtf(WindowManagerService.TAG, "Window Session Crash", e); 1306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn throw e; 1326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void binderDied() { 1366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Note: it is safe to call in to the input method manager 1376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // here because we are not holding our lock. 1386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 1396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mService.mInputMethodManager != null) { 1406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mInputMethodManager.removeClient(mClient); 1416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } catch (RemoteException e) { 1436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn synchronized(mService.mWindowMap) { 1456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mClient.asBinder().unlinkToDeath(this, 0); 1466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mClientDead = true; 1476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn killSessionLocked(); 1486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1516881a10557acf3b0270de54799d6f19437acf584Craig Mautner @Override 1529a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn public int add(IWindow window, int seq, WindowManager.LayoutParams attrs, 1536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int viewVisibility, Rect outContentInsets, InputChannel outInputChannel) { 1546881a10557acf3b0270de54799d6f19437acf584Craig Mautner return addToDisplay(window, seq, attrs, viewVisibility, Display.DEFAULT_DISPLAY, 1556881a10557acf3b0270de54799d6f19437acf584Craig Mautner outContentInsets, outInputChannel); 1566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1576881a10557acf3b0270de54799d6f19437acf584Craig Mautner 1586881a10557acf3b0270de54799d6f19437acf584Craig Mautner @Override 1596881a10557acf3b0270de54799d6f19437acf584Craig Mautner public int addToDisplay(IWindow window, int seq, WindowManager.LayoutParams attrs, 1606881a10557acf3b0270de54799d6f19437acf584Craig Mautner int viewVisibility, int displayId, Rect outContentInsets, 1616881a10557acf3b0270de54799d6f19437acf584Craig Mautner InputChannel outInputChannel) { 1626881a10557acf3b0270de54799d6f19437acf584Craig Mautner return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId, 1636881a10557acf3b0270de54799d6f19437acf584Craig Mautner outContentInsets, outInputChannel); 1646881a10557acf3b0270de54799d6f19437acf584Craig Mautner } 1656881a10557acf3b0270de54799d6f19437acf584Craig Mautner 1666881a10557acf3b0270de54799d6f19437acf584Craig Mautner @Override 1679a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn public int addWithoutInputChannel(IWindow window, int seq, WindowManager.LayoutParams attrs, 1686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int viewVisibility, Rect outContentInsets) { 1696881a10557acf3b0270de54799d6f19437acf584Craig Mautner return addToDisplayWithoutInputChannel(window, seq, attrs, viewVisibility, 1706881a10557acf3b0270de54799d6f19437acf584Craig Mautner Display.DEFAULT_DISPLAY, outContentInsets); 1716881a10557acf3b0270de54799d6f19437acf584Craig Mautner } 1726881a10557acf3b0270de54799d6f19437acf584Craig Mautner 1736881a10557acf3b0270de54799d6f19437acf584Craig Mautner @Override 1746881a10557acf3b0270de54799d6f19437acf584Craig Mautner public int addToDisplayWithoutInputChannel(IWindow window, int seq, WindowManager.LayoutParams attrs, 1756881a10557acf3b0270de54799d6f19437acf584Craig Mautner int viewVisibility, int displayId, Rect outContentInsets) { 1766881a10557acf3b0270de54799d6f19437acf584Craig Mautner return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId, 1776881a10557acf3b0270de54799d6f19437acf584Craig Mautner outContentInsets, null); 1786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void remove(IWindow window) { 1816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.removeWindow(this, window); 1826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1849a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn public int relayout(IWindow window, int seq, WindowManager.LayoutParams attrs, 1856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int requestedWidth, int requestedHeight, int viewFlags, 186c4aad01cbbb69c916ef323693e1fd0560b0eccbaDianne Hackborn int flags, Rect outFrame, Rect outOverscanInsets, Rect outContentInsets, 1876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Rect outVisibleInsets, Configuration outConfig, Surface outSurface) { 188b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn if (false) Slog.d(WindowManagerService.TAG, ">>>>>> ENTERED relayout from " 189b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn + Binder.getCallingPid()); 1909a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn int res = mService.relayoutWindow(this, window, seq, attrs, 1916d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn requestedWidth, requestedHeight, viewFlags, flags, 192c4aad01cbbb69c916ef323693e1fd0560b0eccbaDianne Hackborn outFrame, outOverscanInsets, outContentInsets, outVisibleInsets, 1935c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn outConfig, outSurface); 194b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn if (false) Slog.d(WindowManagerService.TAG, "<<<<<< EXITING relayout to " 195b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn + Binder.getCallingPid()); 1966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return res; 1976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1996d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn public void performDeferredDestroy(IWindow window) { 2006d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn mService.performDeferredDestroyWindow(this, window); 2016d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 2026d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn 203648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn public boolean outOfMemory(IWindow window) { 204648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn return mService.outOfMemoryWindow(this, window); 205648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn } 206648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn 2076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void setTransparentRegion(IWindow window, Region region) { 2086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.setTransparentRegionWindow(this, window, region); 2096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void setInsets(IWindow window, int touchableInsets, 2126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Rect contentInsets, Rect visibleInsets, Region touchableArea) { 2136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.setInsetsWindow(this, window, touchableInsets, contentInsets, 2146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn visibleInsets, touchableArea); 2156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void getDisplayFrame(IWindow window, Rect outDisplayFrame) { 2186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.getWindowDisplayFrame(this, window, outDisplayFrame); 2196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void finishDrawing(IWindow window) { 2226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.localLOGV) Slog.v( 2236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowManagerService.TAG, "IWindow finishDrawing called for " + window); 2246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.finishDrawingWindow(this, window); 2256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void setInTouchMode(boolean mode) { 2286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn synchronized(mService.mWindowMap) { 2296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mInTouchMode = mode; 2306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public boolean getInTouchMode() { 2346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn synchronized(mService.mWindowMap) { 2356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mService.mInTouchMode; 2366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public boolean performHapticFeedback(IWindow window, int effectId, 2406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean always) { 2416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn synchronized(mService.mWindowMap) { 2426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn long ident = Binder.clearCallingIdentity(); 2436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 2446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mService.mPolicy.performHapticFeedbackLw( 2456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.windowForClientLocked(this, window, true), 2466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn effectId, always); 2476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } finally { 2486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Binder.restoreCallingIdentity(ident); 2496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* Drag/drop */ 2546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public IBinder prepareDrag(IWindow window, int flags, 2556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int width, int height, Surface outSurface) { 2566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mService.prepareDragSurface(window, mSurfaceSession, flags, 2576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn width, height, outSurface); 2586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public boolean performDrag(IWindow window, IBinder dragToken, 2616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn float touchX, float touchY, float thumbCenterX, float thumbCenterY, 2626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn ClipData data) { 2636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_DRAG) { 2646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.d(WindowManagerService.TAG, "perform drag: win=" + window + " data=" + data); 2656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn synchronized (mService.mWindowMap) { 2686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mService.mDragState == null) { 2696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.w(WindowManagerService.TAG, "No drag prepared"); 2706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn throw new IllegalStateException("performDrag() without prepareDrag()"); 2716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (dragToken != mService.mDragState.mToken) { 2746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.w(WindowManagerService.TAG, "Performing mismatched drag"); 2756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn throw new IllegalStateException("performDrag() does not match prepareDrag()"); 2766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowState callingWin = mService.windowForClientLocked(null, window, false); 2796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (callingWin == null) { 2806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.w(WindowManagerService.TAG, "Bad requesting window " + window); 2816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return false; // !!! TODO: throw here? 2826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // !!! TODO: if input is not still focused on the initiating window, fail 2856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // the drag initiation (e.g. an alarm window popped up just as the application 2866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // called performDrag() 2876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mH.removeMessages(H.DRAG_START_TIMEOUT, window.asBinder()); 2896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // !!! TODO: extract the current touch (x, y) in screen coordinates. That 2916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // will let us eliminate the (touchX,touchY) parameters from the API. 2926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // !!! FIXME: put all this heavy stuff onto the mH looper, as well as 2946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // the actual drag event dispatch stuff in the dragstate 2956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 29614a9f2b9d23976b7aae5330b56c633a03181c710Jeff Brown Display display = callingWin.mDisplayContent.getDisplay(); 29714a9f2b9d23976b7aae5330b56c633a03181c710Jeff Brown mService.mDragState.register(display); 2986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mInputMonitor.updateInputWindowsLw(true /*force*/); 2996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (!mService.mInputManager.transferTouchFocus(callingWin.mInputChannel, 3006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mDragState.mServerChannel)) { 3016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.e(WindowManagerService.TAG, "Unable to transfer touch focus"); 3026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mDragState.unregister(); 3036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mDragState = null; 3046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mInputMonitor.updateInputWindowsLw(true /*force*/); 3056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return false; 3066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mDragState.mData = data; 3096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mDragState.mCurrentX = touchX; 3106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mDragState.mCurrentY = touchY; 3116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mDragState.broadcastDragStartedLw(touchX, touchY); 3126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // remember the thumb offsets for later 3146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mDragState.mThumbOffsetX = thumbCenterX; 3156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mDragState.mThumbOffsetY = thumbCenterY; 3166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Make the surface visible at the proper location 31829479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian final SurfaceControl surfaceControl = mService.mDragState.mSurfaceControl; 31936991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS) Slog.i( 32036991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn WindowManagerService.TAG, ">>> OPEN TRANSACTION performDrag"); 3213866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl.openTransaction(); 3226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 32329479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian surfaceControl.setPosition(touchX - thumbCenterX, 324d040edbae968d826aa2c82d382345811a45c646bDianne Hackborn touchY - thumbCenterY); 32529479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian surfaceControl.setAlpha(.7071f); 32629479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian surfaceControl.setLayer(mService.mDragState.getDragLayerLw()); 32729479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian surfaceControl.setLayerStack(display.getLayerStack()); 32829479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian surfaceControl.show(); 3296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } finally { 3303866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl.closeTransaction(); 33136991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS) Slog.i( 33236991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn WindowManagerService.TAG, "<<< CLOSE TRANSACTION performDrag"); 3336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return true; // success! 3376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void reportDropResult(IWindow window, boolean consumed) { 3406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn IBinder token = window.asBinder(); 3416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_DRAG) { 3426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.d(WindowManagerService.TAG, "Drop result=" + consumed + " reported by " + token); 3436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn synchronized (mService.mWindowMap) { 3466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn long ident = Binder.clearCallingIdentity(); 3476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 34805e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate if (mService.mDragState == null) { 34905e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate // Most likely the drop recipient ANRed and we ended the drag 35005e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate // out from under it. Log the issue and move on. 35105e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate Slog.w(WindowManagerService.TAG, "Drop result given but no drag in progress"); 35205e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate return; 35305e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate } 35405e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate 35505e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate if (mService.mDragState.mToken != token) { 35605e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate // We're in a drag, but the wrong window has responded. 3576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.w(WindowManagerService.TAG, "Invalid drop-result claim by " + window); 3586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn throw new IllegalStateException("reportDropResult() by non-recipient"); 3596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // The right window has responded, even if it's no longer around, 3626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // so be sure to halt the timeout even if the later WindowState 3636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // lookup fails. 3646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mH.removeMessages(H.DRAG_END_TIMEOUT, window.asBinder()); 3656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowState callingWin = mService.windowForClientLocked(null, window, false); 3666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (callingWin == null) { 3676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.w(WindowManagerService.TAG, "Bad result-reporting window " + window); 3686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return; // !!! TODO: throw here? 3696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mDragState.mDragResult = consumed; 3726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mDragState.endDragLw(); 3736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } finally { 3746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Binder.restoreCallingIdentity(ident); 3756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void dragRecipientEntered(IWindow window) { 3806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_DRAG) { 3816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.d(WindowManagerService.TAG, "Drag into new candidate view @ " + window.asBinder()); 3826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void dragRecipientExited(IWindow window) { 3866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_DRAG) { 3876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.d(WindowManagerService.TAG, "Drag from old candidate view @ " + window.asBinder()); 3886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void setWallpaperPosition(IBinder window, float x, float y, float xStep, float yStep) { 3926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn synchronized(mService.mWindowMap) { 3936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn long ident = Binder.clearCallingIdentity(); 3946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 3956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.setWindowWallpaperPositionLocked( 3966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.windowForClientLocked(this, window, true), 3976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn x, y, xStep, yStep); 3986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } finally { 3996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Binder.restoreCallingIdentity(ident); 4006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void wallpaperOffsetsComplete(IBinder window) { 4056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.wallpaperOffsetsComplete(window); 4066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public Bundle sendWallpaperCommand(IBinder window, String action, int x, int y, 4096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int z, Bundle extras, boolean sync) { 4106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn synchronized(mService.mWindowMap) { 4116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn long ident = Binder.clearCallingIdentity(); 4126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 4136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mService.sendWindowWallpaperCommandLocked( 4146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.windowForClientLocked(this, window, true), 4156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn action, x, y, z, extras, sync); 4166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } finally { 4176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Binder.restoreCallingIdentity(ident); 4186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void wallpaperCommandComplete(IBinder window, Bundle result) { 4236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.wallpaperCommandComplete(window, result); 4246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 426a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn public void setUniverseTransform(IBinder window, float alpha, float offx, float offy, 427a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn float dsdx, float dtdx, float dsdy, float dtdy) { 428a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn synchronized(mService.mWindowMap) { 429a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn long ident = Binder.clearCallingIdentity(); 430a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn try { 431a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mService.setUniverseTransformLocked( 432a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mService.windowForClientLocked(this, window, true), 433a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn alpha, offx, offy, dsdx, dtdx, dsdy, dtdy); 434a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } finally { 435a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn Binder.restoreCallingIdentity(ident); 436a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 437a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 438a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 439a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn 4401cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov public void onRectangleOnScreenRequested(IBinder token, Rect rectangle, boolean immediate) { 4411cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov synchronized(mService.mWindowMap) { 4421cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov final long identity = Binder.clearCallingIdentity(); 4431cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov try { 4441cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov mService.onRectangleOnScreenRequested(token, rectangle, immediate); 4451cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } finally { 4461cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov Binder.restoreCallingIdentity(identity); 4471cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 4481cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 4491cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 4501cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 451e3f23a36d86fedf6c8c6503378cd6d2190c5ab23Dianne Hackborn public IWindowId getWindowId(IBinder window) { 452e3f23a36d86fedf6c8c6503378cd6d2190c5ab23Dianne Hackborn return mService.getWindowId(window); 453e3f23a36d86fedf6c8c6503378cd6d2190c5ab23Dianne Hackborn } 454e3f23a36d86fedf6c8c6503378cd6d2190c5ab23Dianne Hackborn 4556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void windowAddedLocked() { 4566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mSurfaceSession == null) { 4576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.localLOGV) Slog.v( 4586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowManagerService.TAG, "First window added to " + this + ", creating SurfaceSession"); 4596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurfaceSession = new SurfaceSession(); 4606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i( 4616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowManagerService.TAG, " NEW SURFACE SESSION " + mSurfaceSession); 4626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mSessions.add(this); 4636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mNumWindow++; 4656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void windowRemovedLocked() { 4686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mNumWindow--; 4696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn killSessionLocked(); 4706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void killSessionLocked() { 4736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mNumWindow <= 0 && mClientDead) { 4746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mSessions.remove(this); 4756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mSurfaceSession != null) { 4766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.localLOGV) Slog.v( 4776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowManagerService.TAG, "Last window removed from " + this 4786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + ", destroying " + mSurfaceSession); 4796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i( 4806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowManagerService.TAG, " KILL SURFACE SESSION " + mSurfaceSession); 4816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 4826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurfaceSession.kill(); 4836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } catch (Exception e) { 4846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.w(WindowManagerService.TAG, "Exception thrown when killing surface session " 4856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + mSurfaceSession + " in session " + this 4866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + ": " + e.toString()); 4876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurfaceSession = null; 4896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void dump(PrintWriter pw, String prefix) { 4946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(prefix); pw.print("mNumWindow="); pw.print(mNumWindow); 4956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mClientDead="); pw.print(mClientDead); 4966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mSurfaceSession="); pw.println(mSurfaceSession); 4976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn @Override 5006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public String toString() { 5016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mStringName; 5026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 5036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn}