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;
20eb94fa7975b1e8742f3b00cec6bd4f9d6b329e3aDianne Hackbornimport android.view.IWindowSessionCallback;
216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport com.android.internal.view.IInputContext;
226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport com.android.internal.view.IInputMethodClient;
236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport com.android.internal.view.IInputMethodManager;
246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport com.android.server.wm.WindowManagerService.H;
256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.content.ClipData;
276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.content.Context;
286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.content.res.Configuration;
296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.Rect;
306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.Region;
316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.Binder;
326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.Bundle;
336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.IBinder;
346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.Parcel;
355fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackbornimport android.os.Process;
366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.RemoteException;
376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.ServiceManager;
385fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackbornimport android.os.UserHandle;
396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.util.Slog;
406881a10557acf3b0270de54799d6f19437acf584Craig Mautnerimport android.view.Display;
416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.IWindow;
426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.IWindowSession;
436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.InputChannel;
446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.Surface;
453866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport android.view.SurfaceControl;
466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.SurfaceSession;
476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.WindowManager;
486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport java.io.PrintWriter;
506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn/**
526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * This class represents an active client session.  There is generally one
536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Session object per process that is interacting with the window manager.
546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */
556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornfinal class Session extends IWindowSession.Stub
566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        implements IBinder.DeathRecipient {
576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final WindowManagerService mService;
58eb94fa7975b1e8742f3b00cec6bd4f9d6b329e3aDianne Hackborn    final IWindowSessionCallback mCallback;
596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final IInputMethodClient mClient;
606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final IInputContext mInputContext;
616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final int mUid;
626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final int mPid;
636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final String mStringName;
646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    SurfaceSession mSurfaceSession;
656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mNumWindow = 0;
666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mClientDead = false;
67eb94fa7975b1e8742f3b00cec6bd4f9d6b329e3aDianne Hackborn    float mLastReportedAnimatorScale;
686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
69eb94fa7975b1e8742f3b00cec6bd4f9d6b329e3aDianne Hackborn    public Session(WindowManagerService service, IWindowSessionCallback callback,
70eb94fa7975b1e8742f3b00cec6bd4f9d6b329e3aDianne Hackborn            IInputMethodClient client, IInputContext inputContext) {
716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService = service;
72eb94fa7975b1e8742f3b00cec6bd4f9d6b329e3aDianne Hackborn        mCallback = callback;
736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mClient = client;
746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mInputContext = inputContext;
756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mUid = Binder.getCallingUid();
766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mPid = Binder.getCallingPid();
77eb94fa7975b1e8742f3b00cec6bd4f9d6b329e3aDianne Hackborn        mLastReportedAnimatorScale = service.getCurrentAnimatorScale();
786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        StringBuilder sb = new StringBuilder();
796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        sb.append("Session{");
806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        sb.append(Integer.toHexString(System.identityHashCode(this)));
815fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn        sb.append(" ");
825fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn        sb.append(mPid);
835fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn        if (mUid < Process.FIRST_APPLICATION_UID) {
845fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn            sb.append(":");
855fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn            sb.append(mUid);
865fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn        } else {
875fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn            sb.append(":u");
885fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn            sb.append(UserHandle.getUserId(mUid));
895fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn            sb.append('a');
905fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn            sb.append(UserHandle.getAppId(mUid));
915fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn        }
926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        sb.append("}");
936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mStringName = sb.toString();
946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        synchronized (mService.mWindowMap) {
966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (mService.mInputMethodManager == null && mService.mHaveInputMethods) {
976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                IBinder b = ServiceManager.getService(
986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        Context.INPUT_METHOD_SERVICE);
996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mInputMethodManager = IInputMethodManager.Stub.asInterface(b);
1006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
1016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        long ident = Binder.clearCallingIdentity();
1036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        try {
1046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // Note: it is safe to call in to the input method manager
1056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // here because we are not holding our lock.
1066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (mService.mInputMethodManager != null) {
1076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mInputMethodManager.addClient(client, inputContext,
1086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        mUid, mPid);
1096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } else {
1106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                client.setUsingInputMethod(false);
1116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
1126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            client.asBinder().linkToDeath(this, 0);
1136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } catch (RemoteException e) {
1146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // The caller has died, so we can just forget about this.
1156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            try {
1166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                if (mService.mInputMethodManager != null) {
1176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    mService.mInputMethodManager.removeClient(client);
1186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
1196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } catch (RemoteException ee) {
1206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
1216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } finally {
1226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            Binder.restoreCallingIdentity(ident);
1236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    @Override
1276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
1286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            throws RemoteException {
1296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        try {
1306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return super.onTransact(code, data, reply, flags);
1316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } catch (RuntimeException e) {
1326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // Log all 'real' exceptions thrown to the caller
1336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (!(e instanceof SecurityException)) {
134164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                Slog.wtf(WindowManagerService.TAG, "Window Session Crash", e);
1356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
1366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            throw e;
1376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void binderDied() {
1416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // Note: it is safe to call in to the input method manager
1426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // here because we are not holding our lock.
1436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        try {
1446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (mService.mInputMethodManager != null) {
1456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mInputMethodManager.removeClient(mClient);
1466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
1476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } catch (RemoteException e) {
1486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        synchronized(mService.mWindowMap) {
1506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mClient.asBinder().unlinkToDeath(this, 0);
1516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mClientDead = true;
1526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            killSessionLocked();
1536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1566881a10557acf3b0270de54799d6f19437acf584Craig Mautner    @Override
1579a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    public int add(IWindow window, int seq, WindowManager.LayoutParams attrs,
15837d7a68de7e353c31a3a4736054cd86f0e002eafAdrian Roos            int viewVisibility, Rect outContentInsets, Rect outStableInsets,
15937d7a68de7e353c31a3a4736054cd86f0e002eafAdrian Roos            InputChannel outInputChannel) {
1606881a10557acf3b0270de54799d6f19437acf584Craig Mautner        return addToDisplay(window, seq, attrs, viewVisibility, Display.DEFAULT_DISPLAY,
16137d7a68de7e353c31a3a4736054cd86f0e002eafAdrian Roos                outContentInsets, outStableInsets, outInputChannel);
1626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1636881a10557acf3b0270de54799d6f19437acf584Craig Mautner
1646881a10557acf3b0270de54799d6f19437acf584Craig Mautner    @Override
1656881a10557acf3b0270de54799d6f19437acf584Craig Mautner    public int addToDisplay(IWindow window, int seq, WindowManager.LayoutParams attrs,
16637d7a68de7e353c31a3a4736054cd86f0e002eafAdrian Roos            int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets,
1676881a10557acf3b0270de54799d6f19437acf584Craig Mautner            InputChannel outInputChannel) {
1686881a10557acf3b0270de54799d6f19437acf584Craig Mautner        return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
16937d7a68de7e353c31a3a4736054cd86f0e002eafAdrian Roos                outContentInsets, outStableInsets, outInputChannel);
1706881a10557acf3b0270de54799d6f19437acf584Craig Mautner    }
1716881a10557acf3b0270de54799d6f19437acf584Craig Mautner
1726881a10557acf3b0270de54799d6f19437acf584Craig Mautner    @Override
1739a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    public int addWithoutInputChannel(IWindow window, int seq, WindowManager.LayoutParams attrs,
17437d7a68de7e353c31a3a4736054cd86f0e002eafAdrian Roos            int viewVisibility, Rect outContentInsets, Rect outStableInsets) {
1756881a10557acf3b0270de54799d6f19437acf584Craig Mautner        return addToDisplayWithoutInputChannel(window, seq, attrs, viewVisibility,
17637d7a68de7e353c31a3a4736054cd86f0e002eafAdrian Roos                Display.DEFAULT_DISPLAY, outContentInsets, outStableInsets);
1776881a10557acf3b0270de54799d6f19437acf584Craig Mautner    }
1786881a10557acf3b0270de54799d6f19437acf584Craig Mautner
1796881a10557acf3b0270de54799d6f19437acf584Craig Mautner    @Override
1806881a10557acf3b0270de54799d6f19437acf584Craig Mautner    public int addToDisplayWithoutInputChannel(IWindow window, int seq, WindowManager.LayoutParams attrs,
18137d7a68de7e353c31a3a4736054cd86f0e002eafAdrian Roos            int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets) {
1826881a10557acf3b0270de54799d6f19437acf584Craig Mautner        return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
18337d7a68de7e353c31a3a4736054cd86f0e002eafAdrian Roos            outContentInsets, outStableInsets, null);
1846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void remove(IWindow window) {
1876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService.removeWindow(this, window);
1886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1909a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    public int relayout(IWindow window, int seq, WindowManager.LayoutParams attrs,
1916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            int requestedWidth, int requestedHeight, int viewFlags,
192c4aad01cbbb69c916ef323693e1fd0560b0eccbaDianne Hackborn            int flags, Rect outFrame, Rect outOverscanInsets, Rect outContentInsets,
193fa10423fa00f3495e451016acba9b6848eb995c9Adrian Roos            Rect outVisibleInsets, Rect outStableInsets, Configuration outConfig,
194fa10423fa00f3495e451016acba9b6848eb995c9Adrian Roos            Surface outSurface) {
195b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn        if (false) Slog.d(WindowManagerService.TAG, ">>>>>> ENTERED relayout from "
196b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                + Binder.getCallingPid());
1979a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        int res = mService.relayoutWindow(this, window, seq, attrs,
1986d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                requestedWidth, requestedHeight, viewFlags, flags,
199c4aad01cbbb69c916ef323693e1fd0560b0eccbaDianne Hackborn                outFrame, outOverscanInsets, outContentInsets, outVisibleInsets,
200fa10423fa00f3495e451016acba9b6848eb995c9Adrian Roos                outStableInsets, outConfig, outSurface);
201b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn        if (false) Slog.d(WindowManagerService.TAG, "<<<<<< EXITING relayout to "
202b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                + Binder.getCallingPid());
2036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return res;
2046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2066d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn    public void performDeferredDestroy(IWindow window) {
2076d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn        mService.performDeferredDestroyWindow(this, window);
2086d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn    }
2096d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn
210648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn    public boolean outOfMemory(IWindow window) {
211648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        return mService.outOfMemoryWindow(this, window);
212648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn    }
213648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn
2146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void setTransparentRegion(IWindow window, Region region) {
2156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService.setTransparentRegionWindow(this, window, region);
2166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void setInsets(IWindow window, int touchableInsets,
2196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            Rect contentInsets, Rect visibleInsets, Region touchableArea) {
2206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService.setInsetsWindow(this, window, touchableInsets, contentInsets,
2216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                visibleInsets, touchableArea);
2226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void getDisplayFrame(IWindow window, Rect outDisplayFrame) {
2256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService.getWindowDisplayFrame(this, window, outDisplayFrame);
2266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void finishDrawing(IWindow window) {
2296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.localLOGV) Slog.v(
2306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            WindowManagerService.TAG, "IWindow finishDrawing called for " + window);
2316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService.finishDrawingWindow(this, window);
2326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void setInTouchMode(boolean mode) {
2356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        synchronized(mService.mWindowMap) {
2366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mInTouchMode = mode;
2376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean getInTouchMode() {
2416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        synchronized(mService.mWindowMap) {
2426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return mService.mInTouchMode;
2436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean performHapticFeedback(IWindow window, int effectId,
2476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            boolean always) {
2486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        synchronized(mService.mWindowMap) {
2496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            long ident = Binder.clearCallingIdentity();
2506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            try {
2516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                return mService.mPolicy.performHapticFeedbackLw(
2526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        mService.windowForClientLocked(this, window, true),
2536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        effectId, always);
2546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } finally {
2556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Binder.restoreCallingIdentity(ident);
2566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
2576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /* Drag/drop */
2616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public IBinder prepareDrag(IWindow window, int flags,
2626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            int width, int height, Surface outSurface) {
2636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mService.prepareDragSurface(window, mSurfaceSession, flags,
2646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                width, height, outSurface);
2656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean performDrag(IWindow window, IBinder dragToken,
2686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            float touchX, float touchY, float thumbCenterX, float thumbCenterY,
2696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            ClipData data) {
2706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.DEBUG_DRAG) {
2716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            Slog.d(WindowManagerService.TAG, "perform drag: win=" + window + " data=" + data);
2726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        synchronized (mService.mWindowMap) {
2756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (mService.mDragState == null) {
2766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Slog.w(WindowManagerService.TAG, "No drag prepared");
2776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                throw new IllegalStateException("performDrag() without prepareDrag()");
2786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
2796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (dragToken != mService.mDragState.mToken) {
2816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Slog.w(WindowManagerService.TAG, "Performing mismatched drag");
2826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                throw new IllegalStateException("performDrag() does not match prepareDrag()");
2836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
2846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            WindowState callingWin = mService.windowForClientLocked(null, window, false);
2866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (callingWin == null) {
2876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Slog.w(WindowManagerService.TAG, "Bad requesting window " + window);
2886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                return false;  // !!! TODO: throw here?
2896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
2906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // !!! TODO: if input is not still focused on the initiating window, fail
2926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // the drag initiation (e.g. an alarm window popped up just as the application
2936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // called performDrag()
2946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mH.removeMessages(H.DRAG_START_TIMEOUT, window.asBinder());
2966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // !!! TODO: extract the current touch (x, y) in screen coordinates.  That
2986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // will let us eliminate the (touchX,touchY) parameters from the API.
2996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // !!! FIXME: put all this heavy stuff onto the mH looper, as well as
3016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // the actual drag event dispatch stuff in the dragstate
3026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
303df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            final DisplayContent displayContent = callingWin.getDisplayContent();
304df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            if (displayContent == null) {
305df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner               return false;
306df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            }
307df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            Display display = displayContent.getDisplay();
30814a9f2b9d23976b7aae5330b56c633a03181c710Jeff Brown            mService.mDragState.register(display);
3096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mInputMonitor.updateInputWindowsLw(true /*force*/);
3106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (!mService.mInputManager.transferTouchFocus(callingWin.mInputChannel,
3116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    mService.mDragState.mServerChannel)) {
3126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Slog.e(WindowManagerService.TAG, "Unable to transfer touch focus");
3136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mDragState.unregister();
3146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mDragState = null;
3156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mInputMonitor.updateInputWindowsLw(true /*force*/);
3166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                return false;
3176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
3186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mDragState.mData = data;
3206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mDragState.mCurrentX = touchX;
3216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mDragState.mCurrentY = touchY;
3226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mDragState.broadcastDragStartedLw(touchX, touchY);
3236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // remember the thumb offsets for later
3256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mDragState.mThumbOffsetX = thumbCenterX;
3266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mDragState.mThumbOffsetY = thumbCenterY;
3276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // Make the surface visible at the proper location
32929479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian            final SurfaceControl surfaceControl = mService.mDragState.mSurfaceControl;
33036991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn            if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS) Slog.i(
33136991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn                    WindowManagerService.TAG, ">>> OPEN TRANSACTION performDrag");
3323866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            SurfaceControl.openTransaction();
3336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            try {
33429479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian                surfaceControl.setPosition(touchX - thumbCenterX,
335d040edbae968d826aa2c82d382345811a45c646bDianne Hackborn                        touchY - thumbCenterY);
33629479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian                surfaceControl.setAlpha(.7071f);
33729479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian                surfaceControl.setLayer(mService.mDragState.getDragLayerLw());
33829479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian                surfaceControl.setLayerStack(display.getLayerStack());
33929479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian                surfaceControl.show();
3406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } finally {
3413866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian                SurfaceControl.closeTransaction();
34236991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn                if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS) Slog.i(
34336991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn                        WindowManagerService.TAG, "<<< CLOSE TRANSACTION performDrag");
3446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
3456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return true;    // success!
3486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void reportDropResult(IWindow window, boolean consumed) {
3516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        IBinder token = window.asBinder();
3526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.DEBUG_DRAG) {
3536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            Slog.d(WindowManagerService.TAG, "Drop result=" + consumed + " reported by " + token);
3546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        synchronized (mService.mWindowMap) {
3576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            long ident = Binder.clearCallingIdentity();
3586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            try {
35905e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate                if (mService.mDragState == null) {
36005e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate                    // Most likely the drop recipient ANRed and we ended the drag
36105e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate                    // out from under it.  Log the issue and move on.
36205e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate                    Slog.w(WindowManagerService.TAG, "Drop result given but no drag in progress");
36305e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate                    return;
36405e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate                }
36505e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate
36605e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate                if (mService.mDragState.mToken != token) {
36705e9c65a53002e39306a0581310b4b0fceed7433Christopher Tate                    // We're in a drag, but the wrong window has responded.
3686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    Slog.w(WindowManagerService.TAG, "Invalid drop-result claim by " + window);
3696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    throw new IllegalStateException("reportDropResult() by non-recipient");
3706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
3716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // The right window has responded, even if it's no longer around,
3736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // so be sure to halt the timeout even if the later WindowState
3746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // lookup fails.
3756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mH.removeMessages(H.DRAG_END_TIMEOUT, window.asBinder());
3766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                WindowState callingWin = mService.windowForClientLocked(null, window, false);
3776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                if (callingWin == null) {
3786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    Slog.w(WindowManagerService.TAG, "Bad result-reporting window " + window);
3796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    return;  // !!! TODO: throw here?
3806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
3816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mDragState.mDragResult = consumed;
3836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mDragState.endDragLw();
3846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } finally {
3856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Binder.restoreCallingIdentity(ident);
3866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
3876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void dragRecipientEntered(IWindow window) {
3916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.DEBUG_DRAG) {
3926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            Slog.d(WindowManagerService.TAG, "Drag into new candidate view @ " + window.asBinder());
3936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void dragRecipientExited(IWindow window) {
3976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.DEBUG_DRAG) {
3986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            Slog.d(WindowManagerService.TAG, "Drag from old candidate view @ " + window.asBinder());
3996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void setWallpaperPosition(IBinder window, float x, float y, float xStep, float yStep) {
4036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        synchronized(mService.mWindowMap) {
4046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            long ident = Binder.clearCallingIdentity();
4056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            try {
4066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.setWindowWallpaperPositionLocked(
4076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        mService.windowForClientLocked(this, window, true),
4086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        x, y, xStep, yStep);
4096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } finally {
4106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Binder.restoreCallingIdentity(ident);
4116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void wallpaperOffsetsComplete(IBinder window) {
4166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService.wallpaperOffsetsComplete(window);
4176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
419067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn    public void setWallpaperDisplayOffset(IBinder window, int x, int y) {
420067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        synchronized(mService.mWindowMap) {
421067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            long ident = Binder.clearCallingIdentity();
422067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            try {
423067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                mService.setWindowWallpaperDisplayOffsetLocked(
424067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                        mService.windowForClientLocked(this, window, true), x, y);
425067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            } finally {
426067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                Binder.restoreCallingIdentity(ident);
427067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            }
428067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        }
429067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn    }
430067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
4316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public Bundle sendWallpaperCommand(IBinder window, String action, int x, int y,
4326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            int z, Bundle extras, boolean sync) {
4336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        synchronized(mService.mWindowMap) {
4346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            long ident = Binder.clearCallingIdentity();
4356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            try {
4366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                return mService.sendWindowWallpaperCommandLocked(
4376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        mService.windowForClientLocked(this, window, true),
4386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        action, x, y, z, extras, sync);
4396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } finally {
4406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Binder.restoreCallingIdentity(ident);
4416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void wallpaperCommandComplete(IBinder window, Bundle result) {
4466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService.wallpaperCommandComplete(window, result);
4476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
449a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn    public void setUniverseTransform(IBinder window, float alpha, float offx, float offy,
450a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            float dsdx, float dtdx, float dsdy, float dtdy) {
451a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        synchronized(mService.mWindowMap) {
452a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            long ident = Binder.clearCallingIdentity();
453a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            try {
454a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                mService.setUniverseTransformLocked(
455a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                        mService.windowForClientLocked(this, window, true),
456a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                        alpha, offx, offy, dsdx, dtdx, dsdy, dtdy);
457a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            } finally {
458a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                Binder.restoreCallingIdentity(ident);
459a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            }
460a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        }
461a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn    }
462a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn
463f7174e87b6007000777b0124de9cef70d8618788Svetoslav    public void onRectangleOnScreenRequested(IBinder token, Rect rectangle) {
4641cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov        synchronized(mService.mWindowMap) {
4651cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov            final long identity = Binder.clearCallingIdentity();
4661cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov            try {
467f7174e87b6007000777b0124de9cef70d8618788Svetoslav                mService.onRectangleOnScreenRequested(token, rectangle);
4681cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov            } finally {
4691cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov                Binder.restoreCallingIdentity(identity);
4701cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov            }
4711cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov        }
4721cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov    }
4731cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov
474e3f23a36d86fedf6c8c6503378cd6d2190c5ab23Dianne Hackborn    public IWindowId getWindowId(IBinder window) {
475e3f23a36d86fedf6c8c6503378cd6d2190c5ab23Dianne Hackborn        return mService.getWindowId(window);
476e3f23a36d86fedf6c8c6503378cd6d2190c5ab23Dianne Hackborn    }
477e3f23a36d86fedf6c8c6503378cd6d2190c5ab23Dianne Hackborn
4786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void windowAddedLocked() {
4796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mSurfaceSession == null) {
4806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (WindowManagerService.localLOGV) Slog.v(
4816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                WindowManagerService.TAG, "First window added to " + this + ", creating SurfaceSession");
4826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mSurfaceSession = new SurfaceSession();
4836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
4846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    WindowManagerService.TAG, "  NEW SURFACE SESSION " + mSurfaceSession);
4856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mSessions.add(this);
486eb94fa7975b1e8742f3b00cec6bd4f9d6b329e3aDianne Hackborn            if (mLastReportedAnimatorScale != mService.getCurrentAnimatorScale()) {
487eb94fa7975b1e8742f3b00cec6bd4f9d6b329e3aDianne Hackborn                mService.dispatchNewAnimatorScaleLocked(this);
488eb94fa7975b1e8742f3b00cec6bd4f9d6b329e3aDianne Hackborn            }
4896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mNumWindow++;
4916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void windowRemovedLocked() {
4946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mNumWindow--;
4956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        killSessionLocked();
4966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void killSessionLocked() {
4996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mNumWindow <= 0 && mClientDead) {
5006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mSessions.remove(this);
5016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (mSurfaceSession != null) {
5026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                if (WindowManagerService.localLOGV) Slog.v(
5036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    WindowManagerService.TAG, "Last window removed from " + this
5046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    + ", destroying " + mSurfaceSession);
5056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
5066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        WindowManagerService.TAG, "  KILL SURFACE SESSION " + mSurfaceSession);
5076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                try {
5086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    mSurfaceSession.kill();
5096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                } catch (Exception e) {
5106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    Slog.w(WindowManagerService.TAG, "Exception thrown when killing surface session "
5116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        + mSurfaceSession + " in session " + this
5126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        + ": " + e.toString());
5136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
5146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mSurfaceSession = null;
5156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
5166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
5176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void dump(PrintWriter pw, String prefix) {
5206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        pw.print(prefix); pw.print("mNumWindow="); pw.print(mNumWindow);
5216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                pw.print(" mClientDead="); pw.print(mClientDead);
5226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                pw.print(" mSurfaceSession="); pw.println(mSurfaceSession);
5236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    @Override
5266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public String toString() {
5276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mStringName;
5286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn}