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
196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport com.android.internal.view.IInputContext;
206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport com.android.internal.view.IInputMethodClient;
216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport com.android.internal.view.IInputMethodManager;
226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport com.android.server.wm.WindowManagerService.H;
236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.content.ClipData;
256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.content.Context;
266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.content.res.Configuration;
276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.Rect;
286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.Region;
296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.Binder;
306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.Bundle;
316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.IBinder;
326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.Parcel;
335fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackbornimport android.os.Process;
346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.RemoteException;
356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.ServiceManager;
365fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackbornimport android.os.UserHandle;
376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.util.Slog;
386881a10557acf3b0270de54799d6f19437acf584Craig Mautnerimport android.view.Display;
396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.IWindow;
406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.IWindowSession;
416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.InputChannel;
426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.Surface;
436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.SurfaceSession;
446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.WindowManager;
456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport java.io.PrintWriter;
476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn/**
496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * This class represents an active client session.  There is generally one
506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Session object per process that is interacting with the window manager.
516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */
526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornfinal class Session extends IWindowSession.Stub
536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        implements IBinder.DeathRecipient {
546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final WindowManagerService mService;
556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final IInputMethodClient mClient;
566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final IInputContext mInputContext;
576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final int mUid;
586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final int mPid;
596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final String mStringName;
606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    SurfaceSession mSurfaceSession;
616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mNumWindow = 0;
626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mClientDead = false;
636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public Session(WindowManagerService service, IInputMethodClient client,
656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            IInputContext inputContext) {
666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService = service;
676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mClient = client;
686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mInputContext = inputContext;
696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mUid = Binder.getCallingUid();
706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mPid = Binder.getCallingPid();
716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        StringBuilder sb = new StringBuilder();
726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        sb.append("Session{");
736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        sb.append(Integer.toHexString(System.identityHashCode(this)));
745fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn        sb.append(" ");
755fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn        sb.append(mPid);
765fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn        if (mUid < Process.FIRST_APPLICATION_UID) {
775fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn            sb.append(":");
785fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn            sb.append(mUid);
795fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn        } else {
805fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn            sb.append(":u");
815fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn            sb.append(UserHandle.getUserId(mUid));
825fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn            sb.append('a');
835fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn            sb.append(UserHandle.getAppId(mUid));
845fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn        }
856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        sb.append("}");
866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mStringName = sb.toString();
876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        synchronized (mService.mWindowMap) {
896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (mService.mInputMethodManager == null && mService.mHaveInputMethods) {
906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                IBinder b = ServiceManager.getService(
916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        Context.INPUT_METHOD_SERVICE);
926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mInputMethodManager = IInputMethodManager.Stub.asInterface(b);
936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        long ident = Binder.clearCallingIdentity();
966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        try {
976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // Note: it is safe to call in to the input method manager
986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // here because we are not holding our lock.
996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (mService.mInputMethodManager != null) {
1006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mInputMethodManager.addClient(client, inputContext,
1016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        mUid, mPid);
1026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } else {
1036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                client.setUsingInputMethod(false);
1046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
1056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            client.asBinder().linkToDeath(this, 0);
1066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } catch (RemoteException e) {
1076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // The caller has died, so we can just forget about this.
1086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            try {
1096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                if (mService.mInputMethodManager != null) {
1106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    mService.mInputMethodManager.removeClient(client);
1116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
1126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } catch (RemoteException ee) {
1136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
1146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } finally {
1156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            Binder.restoreCallingIdentity(ident);
1166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    @Override
1206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
1216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            throws RemoteException {
1226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        try {
1236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return super.onTransact(code, data, reply, flags);
1246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } catch (RuntimeException e) {
1256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // Log all 'real' exceptions thrown to the caller
1266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (!(e instanceof SecurityException)) {
1276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Slog.e(WindowManagerService.TAG, "Window Session Crash", e);
1286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
1296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            throw e;
1306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void binderDied() {
1346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // Note: it is safe to call in to the input method manager
1356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // here because we are not holding our lock.
1366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        try {
1376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (mService.mInputMethodManager != null) {
1386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mInputMethodManager.removeClient(mClient);
1396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
1406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } catch (RemoteException e) {
1416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        synchronized(mService.mWindowMap) {
1436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mClient.asBinder().unlinkToDeath(this, 0);
1446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mClientDead = true;
1456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            killSessionLocked();
1466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1496881a10557acf3b0270de54799d6f19437acf584Craig Mautner    @Override
1509a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    public int add(IWindow window, int seq, WindowManager.LayoutParams attrs,
1516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            int viewVisibility, Rect outContentInsets, InputChannel outInputChannel) {
1526881a10557acf3b0270de54799d6f19437acf584Craig Mautner        return addToDisplay(window, seq, attrs, viewVisibility, Display.DEFAULT_DISPLAY,
1536881a10557acf3b0270de54799d6f19437acf584Craig Mautner                outContentInsets, outInputChannel);
1546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1556881a10557acf3b0270de54799d6f19437acf584Craig Mautner
1566881a10557acf3b0270de54799d6f19437acf584Craig Mautner    @Override
1576881a10557acf3b0270de54799d6f19437acf584Craig Mautner    public int addToDisplay(IWindow window, int seq, WindowManager.LayoutParams attrs,
1586881a10557acf3b0270de54799d6f19437acf584Craig Mautner            int viewVisibility, int displayId, Rect outContentInsets,
1596881a10557acf3b0270de54799d6f19437acf584Craig Mautner            InputChannel outInputChannel) {
1606881a10557acf3b0270de54799d6f19437acf584Craig Mautner        return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
1616881a10557acf3b0270de54799d6f19437acf584Craig Mautner                outContentInsets, outInputChannel);
1626881a10557acf3b0270de54799d6f19437acf584Craig Mautner    }
1636881a10557acf3b0270de54799d6f19437acf584Craig Mautner
1646881a10557acf3b0270de54799d6f19437acf584Craig Mautner    @Override
1659a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    public int addWithoutInputChannel(IWindow window, int seq, WindowManager.LayoutParams attrs,
1666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            int viewVisibility, Rect outContentInsets) {
1676881a10557acf3b0270de54799d6f19437acf584Craig Mautner        return addToDisplayWithoutInputChannel(window, seq, attrs, viewVisibility,
1686881a10557acf3b0270de54799d6f19437acf584Craig Mautner                Display.DEFAULT_DISPLAY, outContentInsets);
1696881a10557acf3b0270de54799d6f19437acf584Craig Mautner    }
1706881a10557acf3b0270de54799d6f19437acf584Craig Mautner
1716881a10557acf3b0270de54799d6f19437acf584Craig Mautner    @Override
1726881a10557acf3b0270de54799d6f19437acf584Craig Mautner    public int addToDisplayWithoutInputChannel(IWindow window, int seq, WindowManager.LayoutParams attrs,
1736881a10557acf3b0270de54799d6f19437acf584Craig Mautner            int viewVisibility, int displayId, Rect outContentInsets) {
1746881a10557acf3b0270de54799d6f19437acf584Craig Mautner        return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
1756881a10557acf3b0270de54799d6f19437acf584Craig Mautner            outContentInsets, null);
1766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void remove(IWindow window) {
1796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService.removeWindow(this, window);
1806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1829a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    public int relayout(IWindow window, int seq, WindowManager.LayoutParams attrs,
1836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            int requestedWidth, int requestedHeight, int viewFlags,
18485afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn            int flags, Rect outFrame, Rect outContentInsets,
1856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            Rect outVisibleInsets, Configuration outConfig, Surface outSurface) {
186b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn        if (false) Slog.d(WindowManagerService.TAG, ">>>>>> ENTERED relayout from "
187b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                + Binder.getCallingPid());
1889a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        int res = mService.relayoutWindow(this, window, seq, attrs,
1896d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                requestedWidth, requestedHeight, viewFlags, flags,
19085afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn                outFrame, outContentInsets, outVisibleInsets,
1915c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn                outConfig, outSurface);
192b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn        if (false) Slog.d(WindowManagerService.TAG, "<<<<<< EXITING relayout to "
193b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                + Binder.getCallingPid());
1946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return res;
1956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1976d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn    public void performDeferredDestroy(IWindow window) {
1986d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn        mService.performDeferredDestroyWindow(this, window);
1996d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn    }
2006d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn
201648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn    public boolean outOfMemory(IWindow window) {
202648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        return mService.outOfMemoryWindow(this, window);
203648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn    }
204648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn
2056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void setTransparentRegion(IWindow window, Region region) {
2066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService.setTransparentRegionWindow(this, window, region);
2076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void setInsets(IWindow window, int touchableInsets,
2106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            Rect contentInsets, Rect visibleInsets, Region touchableArea) {
2116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService.setInsetsWindow(this, window, touchableInsets, contentInsets,
2126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                visibleInsets, touchableArea);
2136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void getDisplayFrame(IWindow window, Rect outDisplayFrame) {
2166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService.getWindowDisplayFrame(this, window, outDisplayFrame);
2176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void finishDrawing(IWindow window) {
2206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.localLOGV) Slog.v(
2216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            WindowManagerService.TAG, "IWindow finishDrawing called for " + window);
2226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService.finishDrawingWindow(this, window);
2236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void setInTouchMode(boolean mode) {
2266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        synchronized(mService.mWindowMap) {
2276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mInTouchMode = mode;
2286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean getInTouchMode() {
2326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        synchronized(mService.mWindowMap) {
2336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return mService.mInTouchMode;
2346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean performHapticFeedback(IWindow window, int effectId,
2386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            boolean always) {
2396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        synchronized(mService.mWindowMap) {
2406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            long ident = Binder.clearCallingIdentity();
2416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            try {
2426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                return mService.mPolicy.performHapticFeedbackLw(
2436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        mService.windowForClientLocked(this, window, true),
2446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        effectId, always);
2456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } finally {
2466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Binder.restoreCallingIdentity(ident);
2476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
2486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /* Drag/drop */
2526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public IBinder prepareDrag(IWindow window, int flags,
2536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            int width, int height, Surface outSurface) {
2546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mService.prepareDragSurface(window, mSurfaceSession, flags,
2556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                width, height, outSurface);
2566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean performDrag(IWindow window, IBinder dragToken,
2596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            float touchX, float touchY, float thumbCenterX, float thumbCenterY,
2606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            ClipData data) {
2616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.DEBUG_DRAG) {
2626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            Slog.d(WindowManagerService.TAG, "perform drag: win=" + window + " data=" + data);
2636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        synchronized (mService.mWindowMap) {
2666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (mService.mDragState == null) {
2676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Slog.w(WindowManagerService.TAG, "No drag prepared");
2686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                throw new IllegalStateException("performDrag() without prepareDrag()");
2696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
2706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (dragToken != mService.mDragState.mToken) {
2726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Slog.w(WindowManagerService.TAG, "Performing mismatched drag");
2736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                throw new IllegalStateException("performDrag() does not match prepareDrag()");
2746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
2756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            WindowState callingWin = mService.windowForClientLocked(null, window, false);
2776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (callingWin == null) {
2786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Slog.w(WindowManagerService.TAG, "Bad requesting window " + window);
2796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                return false;  // !!! TODO: throw here?
2806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
2816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // !!! TODO: if input is not still focused on the initiating window, fail
2836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // the drag initiation (e.g. an alarm window popped up just as the application
2846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // called performDrag()
2856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mH.removeMessages(H.DRAG_START_TIMEOUT, window.asBinder());
2876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // !!! TODO: extract the current touch (x, y) in screen coordinates.  That
2896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // will let us eliminate the (touchX,touchY) parameters from the API.
2906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // !!! FIXME: put all this heavy stuff onto the mH looper, as well as
2926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // the actual drag event dispatch stuff in the dragstate
2936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
29414a9f2b9d23976b7aae5330b56c633a03181c710Jeff Brown            Display display = callingWin.mDisplayContent.getDisplay();
29514a9f2b9d23976b7aae5330b56c633a03181c710Jeff Brown            mService.mDragState.register(display);
2966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mInputMonitor.updateInputWindowsLw(true /*force*/);
2976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (!mService.mInputManager.transferTouchFocus(callingWin.mInputChannel,
2986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    mService.mDragState.mServerChannel)) {
2996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Slog.e(WindowManagerService.TAG, "Unable to transfer touch focus");
3006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mDragState.unregister();
3016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mDragState = null;
3026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mInputMonitor.updateInputWindowsLw(true /*force*/);
3036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                return false;
3046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
3056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mDragState.mData = data;
3076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mDragState.mCurrentX = touchX;
3086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mDragState.mCurrentY = touchY;
3096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mDragState.broadcastDragStartedLw(touchX, touchY);
3106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // remember the thumb offsets for later
3126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mDragState.mThumbOffsetX = thumbCenterX;
3136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mDragState.mThumbOffsetY = thumbCenterY;
3146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // Make the surface visible at the proper location
3166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            final Surface surface = mService.mDragState.mSurface;
31736991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn            if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS) Slog.i(
31836991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn                    WindowManagerService.TAG, ">>> OPEN TRANSACTION performDrag");
3196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            Surface.openTransaction();
3206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            try {
321d040edbae968d826aa2c82d382345811a45c646bDianne Hackborn                surface.setPosition(touchX - thumbCenterX,
322d040edbae968d826aa2c82d382345811a45c646bDianne Hackborn                        touchY - thumbCenterY);
3236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                surface.setAlpha(.7071f);
3246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                surface.setLayer(mService.mDragState.getDragLayerLw());
32514a9f2b9d23976b7aae5330b56c633a03181c710Jeff Brown                surface.setLayerStack(display.getLayerStack());
3266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                surface.show();
3276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } finally {
3286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Surface.closeTransaction();
32936991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn                if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS) Slog.i(
33036991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn                        WindowManagerService.TAG, "<<< CLOSE TRANSACTION performDrag");
3316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
3326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return true;    // success!
3356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void reportDropResult(IWindow window, boolean consumed) {
3386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        IBinder token = window.asBinder();
3396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.DEBUG_DRAG) {
3406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            Slog.d(WindowManagerService.TAG, "Drop result=" + consumed + " reported by " + token);
3416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        synchronized (mService.mWindowMap) {
3446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            long ident = Binder.clearCallingIdentity();
3456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            try {
34605e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate                if (mService.mDragState == null) {
34705e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate                    // Most likely the drop recipient ANRed and we ended the drag
34805e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate                    // out from under it.  Log the issue and move on.
34905e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate                    Slog.w(WindowManagerService.TAG, "Drop result given but no drag in progress");
35005e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate                    return;
35105e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate                }
35205e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate
35305e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate                if (mService.mDragState.mToken != token) {
35405e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate                    // We're in a drag, but the wrong window has responded.
3556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    Slog.w(WindowManagerService.TAG, "Invalid drop-result claim by " + window);
3566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    throw new IllegalStateException("reportDropResult() by non-recipient");
3576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
3586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // The right window has responded, even if it's no longer around,
3606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // so be sure to halt the timeout even if the later WindowState
3616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // lookup fails.
3626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mH.removeMessages(H.DRAG_END_TIMEOUT, window.asBinder());
3636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                WindowState callingWin = mService.windowForClientLocked(null, window, false);
3646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                if (callingWin == null) {
3656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    Slog.w(WindowManagerService.TAG, "Bad result-reporting window " + window);
3666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    return;  // !!! TODO: throw here?
3676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
3686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mDragState.mDragResult = consumed;
3706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mDragState.endDragLw();
3716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } finally {
3726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Binder.restoreCallingIdentity(ident);
3736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
3746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void dragRecipientEntered(IWindow window) {
3786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.DEBUG_DRAG) {
3796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            Slog.d(WindowManagerService.TAG, "Drag into new candidate view @ " + window.asBinder());
3806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void dragRecipientExited(IWindow window) {
3846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.DEBUG_DRAG) {
3856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            Slog.d(WindowManagerService.TAG, "Drag from old candidate view @ " + window.asBinder());
3866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void setWallpaperPosition(IBinder window, float x, float y, float xStep, float yStep) {
3906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        synchronized(mService.mWindowMap) {
3916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            long ident = Binder.clearCallingIdentity();
3926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            try {
3936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.setWindowWallpaperPositionLocked(
3946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        mService.windowForClientLocked(this, window, true),
3956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        x, y, xStep, yStep);
3966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } finally {
3976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Binder.restoreCallingIdentity(ident);
3986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
3996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void wallpaperOffsetsComplete(IBinder window) {
4036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService.wallpaperOffsetsComplete(window);
4046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public Bundle sendWallpaperCommand(IBinder window, String action, int x, int y,
4076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            int z, Bundle extras, boolean sync) {
4086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        synchronized(mService.mWindowMap) {
4096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            long ident = Binder.clearCallingIdentity();
4106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            try {
4116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                return mService.sendWindowWallpaperCommandLocked(
4126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        mService.windowForClientLocked(this, window, true),
4136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        action, x, y, z, extras, sync);
4146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } finally {
4156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Binder.restoreCallingIdentity(ident);
4166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void wallpaperCommandComplete(IBinder window, Bundle result) {
4216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService.wallpaperCommandComplete(window, result);
4226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
424a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn    public void setUniverseTransform(IBinder window, float alpha, float offx, float offy,
425a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            float dsdx, float dtdx, float dsdy, float dtdy) {
426a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        synchronized(mService.mWindowMap) {
427a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            long ident = Binder.clearCallingIdentity();
428a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            try {
429a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                mService.setUniverseTransformLocked(
430a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                        mService.windowForClientLocked(this, window, true),
431a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                        alpha, offx, offy, dsdx, dtdx, dsdy, dtdy);
432a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            } finally {
433a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                Binder.restoreCallingIdentity(ident);
434a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            }
435a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        }
436a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn    }
437a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn
4381cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov    public void onRectangleOnScreenRequested(IBinder token, Rect rectangle, boolean immediate) {
4391cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov        synchronized(mService.mWindowMap) {
4401cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov            final long identity = Binder.clearCallingIdentity();
4411cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov            try {
4421cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov                mService.onRectangleOnScreenRequested(token, rectangle, immediate);
4431cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov            } finally {
4441cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov                Binder.restoreCallingIdentity(identity);
4451cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov            }
4461cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov        }
4471cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov    }
4481cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov
4496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void windowAddedLocked() {
4506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mSurfaceSession == null) {
4516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (WindowManagerService.localLOGV) Slog.v(
4526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                WindowManagerService.TAG, "First window added to " + this + ", creating SurfaceSession");
4536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mSurfaceSession = new SurfaceSession();
4546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
4556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    WindowManagerService.TAG, "  NEW SURFACE SESSION " + mSurfaceSession);
4566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mSessions.add(this);
4576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mNumWindow++;
4596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void windowRemovedLocked() {
4626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mNumWindow--;
4636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        killSessionLocked();
4646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void killSessionLocked() {
4676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mNumWindow <= 0 && mClientDead) {
4686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mSessions.remove(this);
4696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (mSurfaceSession != null) {
4706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                if (WindowManagerService.localLOGV) Slog.v(
4716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    WindowManagerService.TAG, "Last window removed from " + this
4726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    + ", destroying " + mSurfaceSession);
4736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
4746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        WindowManagerService.TAG, "  KILL SURFACE SESSION " + mSurfaceSession);
4756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                try {
4766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    mSurfaceSession.kill();
4776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                } catch (Exception e) {
4786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    Slog.w(WindowManagerService.TAG, "Exception thrown when killing surface session "
4796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        + mSurfaceSession + " in session " + this
4806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        + ": " + e.toString());
4816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
4826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mSurfaceSession = null;
4836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void dump(PrintWriter pw, String prefix) {
4886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        pw.print(prefix); pw.print("mNumWindow="); pw.print(mNumWindow);
4896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                pw.print(" mClientDead="); pw.print(mClientDead);
4906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                pw.print(" mSurfaceSession="); pw.println(mSurfaceSession);
4916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    @Override
4946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public String toString() {
4956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mStringName;
4966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn}