198365d7663cbd82979a5700faf0050220b01084dJeff Brown/*
298365d7663cbd82979a5700faf0050220b01084dJeff Brown * Copyright (C) 2012 The Android Open Source Project
398365d7663cbd82979a5700faf0050220b01084dJeff Brown *
498365d7663cbd82979a5700faf0050220b01084dJeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
598365d7663cbd82979a5700faf0050220b01084dJeff Brown * you may not use this file except in compliance with the License.
698365d7663cbd82979a5700faf0050220b01084dJeff Brown * You may obtain a copy of the License at
798365d7663cbd82979a5700faf0050220b01084dJeff Brown *
898365d7663cbd82979a5700faf0050220b01084dJeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
998365d7663cbd82979a5700faf0050220b01084dJeff Brown *
1098365d7663cbd82979a5700faf0050220b01084dJeff Brown * Unless required by applicable law or agreed to in writing, software
1198365d7663cbd82979a5700faf0050220b01084dJeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
1298365d7663cbd82979a5700faf0050220b01084dJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1398365d7663cbd82979a5700faf0050220b01084dJeff Brown * See the License for the specific language governing permissions and
1498365d7663cbd82979a5700faf0050220b01084dJeff Brown * limitations under the License.
1598365d7663cbd82979a5700faf0050220b01084dJeff Brown */
1698365d7663cbd82979a5700faf0050220b01084dJeff Brown
1798365d7663cbd82979a5700faf0050220b01084dJeff Brownpackage android.view;
1898365d7663cbd82979a5700faf0050220b01084dJeff Brown
1998365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.animation.ValueAnimator;
2098365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.app.ActivityManager;
2198365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.content.ComponentCallbacks2;
2298365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.content.res.Configuration;
2398365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.opengl.ManagedEGLContext;
2498365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.os.IBinder;
2598365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.os.RemoteException;
2698365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.os.ServiceManager;
2798365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.os.SystemProperties;
2898365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.util.AndroidRuntimeException;
298f303ad97007a9b38d6d927353c1fba812879ae5Craig Mautnerimport android.util.ArraySet;
3098365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.util.Log;
3198365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.view.inputmethod.InputMethodManager;
328c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackbornimport com.android.internal.util.FastPrintWriter;
3398365d7663cbd82979a5700faf0050220b01084dJeff Brown
3498365d7663cbd82979a5700faf0050220b01084dJeff Brownimport java.io.FileDescriptor;
3598365d7663cbd82979a5700faf0050220b01084dJeff Brownimport java.io.FileOutputStream;
3698365d7663cbd82979a5700faf0050220b01084dJeff Brownimport java.io.PrintWriter;
37652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautnerimport java.util.ArrayList;
3898365d7663cbd82979a5700faf0050220b01084dJeff Brown
3998365d7663cbd82979a5700faf0050220b01084dJeff Brown/**
4098365d7663cbd82979a5700faf0050220b01084dJeff Brown * Provides low-level communication with the system window manager for
4198365d7663cbd82979a5700faf0050220b01084dJeff Brown * operations that are not associated with any particular context.
4298365d7663cbd82979a5700faf0050220b01084dJeff Brown *
4398365d7663cbd82979a5700faf0050220b01084dJeff Brown * This class is only used internally to implement global functions where
4498365d7663cbd82979a5700faf0050220b01084dJeff Brown * the caller already knows the display and relevant compatibility information
4598365d7663cbd82979a5700faf0050220b01084dJeff Brown * for the operation.  For most purposes, you should use {@link WindowManager} instead
4698365d7663cbd82979a5700faf0050220b01084dJeff Brown * since it is bound to a context.
4798365d7663cbd82979a5700faf0050220b01084dJeff Brown *
4898365d7663cbd82979a5700faf0050220b01084dJeff Brown * @see WindowManagerImpl
4998365d7663cbd82979a5700faf0050220b01084dJeff Brown * @hide
5098365d7663cbd82979a5700faf0050220b01084dJeff Brown */
5198365d7663cbd82979a5700faf0050220b01084dJeff Brownpublic final class WindowManagerGlobal {
5298365d7663cbd82979a5700faf0050220b01084dJeff Brown    private static final String TAG = "WindowManager";
5398365d7663cbd82979a5700faf0050220b01084dJeff Brown
5498365d7663cbd82979a5700faf0050220b01084dJeff Brown    /**
5598365d7663cbd82979a5700faf0050220b01084dJeff Brown     * The user is navigating with keys (not the touch screen), so
5698365d7663cbd82979a5700faf0050220b01084dJeff Brown     * navigational focus should be shown.
5798365d7663cbd82979a5700faf0050220b01084dJeff Brown     */
5898365d7663cbd82979a5700faf0050220b01084dJeff Brown    public static final int RELAYOUT_RES_IN_TOUCH_MODE = 0x1;
5998365d7663cbd82979a5700faf0050220b01084dJeff Brown
6098365d7663cbd82979a5700faf0050220b01084dJeff Brown    /**
6198365d7663cbd82979a5700faf0050220b01084dJeff Brown     * This is the first time the window is being drawn,
6298365d7663cbd82979a5700faf0050220b01084dJeff Brown     * so the client must call drawingFinished() when done
6398365d7663cbd82979a5700faf0050220b01084dJeff Brown     */
6498365d7663cbd82979a5700faf0050220b01084dJeff Brown    public static final int RELAYOUT_RES_FIRST_TIME = 0x2;
6598365d7663cbd82979a5700faf0050220b01084dJeff Brown
6698365d7663cbd82979a5700faf0050220b01084dJeff Brown    /**
6798365d7663cbd82979a5700faf0050220b01084dJeff Brown     * The window manager has changed the surface from the last call.
6898365d7663cbd82979a5700faf0050220b01084dJeff Brown     */
6998365d7663cbd82979a5700faf0050220b01084dJeff Brown    public static final int RELAYOUT_RES_SURFACE_CHANGED = 0x4;
7098365d7663cbd82979a5700faf0050220b01084dJeff Brown
7198365d7663cbd82979a5700faf0050220b01084dJeff Brown    /**
7298365d7663cbd82979a5700faf0050220b01084dJeff Brown     * The window manager is currently animating.  It will call
7398365d7663cbd82979a5700faf0050220b01084dJeff Brown     * IWindow.doneAnimating() when done.
7498365d7663cbd82979a5700faf0050220b01084dJeff Brown     */
7598365d7663cbd82979a5700faf0050220b01084dJeff Brown    public static final int RELAYOUT_RES_ANIMATING = 0x8;
7698365d7663cbd82979a5700faf0050220b01084dJeff Brown
7798365d7663cbd82979a5700faf0050220b01084dJeff Brown    /**
7898365d7663cbd82979a5700faf0050220b01084dJeff Brown     * Flag for relayout: the client will be later giving
7998365d7663cbd82979a5700faf0050220b01084dJeff Brown     * internal insets; as a result, the window will not impact other window
8098365d7663cbd82979a5700faf0050220b01084dJeff Brown     * layouts until the insets are given.
8198365d7663cbd82979a5700faf0050220b01084dJeff Brown     */
8298365d7663cbd82979a5700faf0050220b01084dJeff Brown    public static final int RELAYOUT_INSETS_PENDING = 0x1;
8398365d7663cbd82979a5700faf0050220b01084dJeff Brown
8498365d7663cbd82979a5700faf0050220b01084dJeff Brown    /**
8598365d7663cbd82979a5700faf0050220b01084dJeff Brown     * Flag for relayout: the client may be currently using the current surface,
8698365d7663cbd82979a5700faf0050220b01084dJeff Brown     * so if it is to be destroyed as a part of the relayout the destroy must
8798365d7663cbd82979a5700faf0050220b01084dJeff Brown     * be deferred until later.  The client will call performDeferredDestroy()
8898365d7663cbd82979a5700faf0050220b01084dJeff Brown     * when it is okay.
8998365d7663cbd82979a5700faf0050220b01084dJeff Brown     */
9098365d7663cbd82979a5700faf0050220b01084dJeff Brown    public static final int RELAYOUT_DEFER_SURFACE_DESTROY = 0x2;
9198365d7663cbd82979a5700faf0050220b01084dJeff Brown
9298365d7663cbd82979a5700faf0050220b01084dJeff Brown    public static final int ADD_FLAG_APP_VISIBLE = 0x2;
9398365d7663cbd82979a5700faf0050220b01084dJeff Brown    public static final int ADD_FLAG_IN_TOUCH_MODE = RELAYOUT_RES_IN_TOUCH_MODE;
9498365d7663cbd82979a5700faf0050220b01084dJeff Brown
9598365d7663cbd82979a5700faf0050220b01084dJeff Brown    public static final int ADD_OKAY = 0;
9698365d7663cbd82979a5700faf0050220b01084dJeff Brown    public static final int ADD_BAD_APP_TOKEN = -1;
9798365d7663cbd82979a5700faf0050220b01084dJeff Brown    public static final int ADD_BAD_SUBWINDOW_TOKEN = -2;
9898365d7663cbd82979a5700faf0050220b01084dJeff Brown    public static final int ADD_NOT_APP_TOKEN = -3;
9998365d7663cbd82979a5700faf0050220b01084dJeff Brown    public static final int ADD_APP_EXITING = -4;
10098365d7663cbd82979a5700faf0050220b01084dJeff Brown    public static final int ADD_DUPLICATE_ADD = -5;
10198365d7663cbd82979a5700faf0050220b01084dJeff Brown    public static final int ADD_STARTING_NOT_NEEDED = -6;
10298365d7663cbd82979a5700faf0050220b01084dJeff Brown    public static final int ADD_MULTIPLE_SINGLETON = -7;
10398365d7663cbd82979a5700faf0050220b01084dJeff Brown    public static final int ADD_PERMISSION_DENIED = -8;
1042d5618c22101cfc4d6478cfe1d846798389540c1Craig Mautner    public static final int ADD_INVALID_DISPLAY = -9;
10598365d7663cbd82979a5700faf0050220b01084dJeff Brown
10698365d7663cbd82979a5700faf0050220b01084dJeff Brown    private static WindowManagerGlobal sDefaultWindowManager;
10798365d7663cbd82979a5700faf0050220b01084dJeff Brown    private static IWindowManager sWindowManagerService;
10898365d7663cbd82979a5700faf0050220b01084dJeff Brown    private static IWindowSession sWindowSession;
10998365d7663cbd82979a5700faf0050220b01084dJeff Brown
11098365d7663cbd82979a5700faf0050220b01084dJeff Brown    private final Object mLock = new Object();
11198365d7663cbd82979a5700faf0050220b01084dJeff Brown
112652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner    private final ArrayList<View> mViews = new ArrayList<View>();
113652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner    private final ArrayList<ViewRootImpl> mRoots = new ArrayList<ViewRootImpl>();
114652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner    private final ArrayList<WindowManager.LayoutParams> mParams =
115652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner            new ArrayList<WindowManager.LayoutParams>();
1168f303ad97007a9b38d6d927353c1fba812879ae5Craig Mautner    private final ArraySet<View> mDyingViews = new ArraySet<View>();
11798365d7663cbd82979a5700faf0050220b01084dJeff Brown    private boolean mNeedsEglTerminate;
11898365d7663cbd82979a5700faf0050220b01084dJeff Brown
11998365d7663cbd82979a5700faf0050220b01084dJeff Brown    private Runnable mSystemPropertyUpdater;
12098365d7663cbd82979a5700faf0050220b01084dJeff Brown
12198365d7663cbd82979a5700faf0050220b01084dJeff Brown    private WindowManagerGlobal() {
12298365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
12398365d7663cbd82979a5700faf0050220b01084dJeff Brown
12498365d7663cbd82979a5700faf0050220b01084dJeff Brown    public static WindowManagerGlobal getInstance() {
12598365d7663cbd82979a5700faf0050220b01084dJeff Brown        synchronized (WindowManagerGlobal.class) {
12698365d7663cbd82979a5700faf0050220b01084dJeff Brown            if (sDefaultWindowManager == null) {
12798365d7663cbd82979a5700faf0050220b01084dJeff Brown                sDefaultWindowManager = new WindowManagerGlobal();
12898365d7663cbd82979a5700faf0050220b01084dJeff Brown            }
12998365d7663cbd82979a5700faf0050220b01084dJeff Brown            return sDefaultWindowManager;
13098365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
13198365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
13298365d7663cbd82979a5700faf0050220b01084dJeff Brown
13398365d7663cbd82979a5700faf0050220b01084dJeff Brown    public static IWindowManager getWindowManagerService() {
13498365d7663cbd82979a5700faf0050220b01084dJeff Brown        synchronized (WindowManagerGlobal.class) {
13598365d7663cbd82979a5700faf0050220b01084dJeff Brown            if (sWindowManagerService == null) {
13698365d7663cbd82979a5700faf0050220b01084dJeff Brown                sWindowManagerService = IWindowManager.Stub.asInterface(
13798365d7663cbd82979a5700faf0050220b01084dJeff Brown                        ServiceManager.getService("window"));
13898365d7663cbd82979a5700faf0050220b01084dJeff Brown            }
13998365d7663cbd82979a5700faf0050220b01084dJeff Brown            return sWindowManagerService;
14098365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
14198365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
14298365d7663cbd82979a5700faf0050220b01084dJeff Brown
143f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown    public static IWindowSession getWindowSession() {
14498365d7663cbd82979a5700faf0050220b01084dJeff Brown        synchronized (WindowManagerGlobal.class) {
14598365d7663cbd82979a5700faf0050220b01084dJeff Brown            if (sWindowSession == null) {
14698365d7663cbd82979a5700faf0050220b01084dJeff Brown                try {
147f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown                    InputMethodManager imm = InputMethodManager.getInstance();
14898365d7663cbd82979a5700faf0050220b01084dJeff Brown                    IWindowManager windowManager = getWindowManagerService();
14998365d7663cbd82979a5700faf0050220b01084dJeff Brown                    sWindowSession = windowManager.openSession(
15098365d7663cbd82979a5700faf0050220b01084dJeff Brown                            imm.getClient(), imm.getInputContext());
15198365d7663cbd82979a5700faf0050220b01084dJeff Brown                    float animatorScale = windowManager.getAnimationScale(2);
15298365d7663cbd82979a5700faf0050220b01084dJeff Brown                    ValueAnimator.setDurationScale(animatorScale);
15398365d7663cbd82979a5700faf0050220b01084dJeff Brown                } catch (RemoteException e) {
15498365d7663cbd82979a5700faf0050220b01084dJeff Brown                    Log.e(TAG, "Failed to open window session", e);
15598365d7663cbd82979a5700faf0050220b01084dJeff Brown                }
15698365d7663cbd82979a5700faf0050220b01084dJeff Brown            }
15798365d7663cbd82979a5700faf0050220b01084dJeff Brown            return sWindowSession;
15898365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
15998365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
16098365d7663cbd82979a5700faf0050220b01084dJeff Brown
16198365d7663cbd82979a5700faf0050220b01084dJeff Brown    public static IWindowSession peekWindowSession() {
16298365d7663cbd82979a5700faf0050220b01084dJeff Brown        synchronized (WindowManagerGlobal.class) {
16398365d7663cbd82979a5700faf0050220b01084dJeff Brown            return sWindowSession;
16498365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
16598365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
16698365d7663cbd82979a5700faf0050220b01084dJeff Brown
167945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy    public String[] getViewRootNames() {
168945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy        synchronized (mLock) {
169652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner            final int numRoots = mRoots.size();
170652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner            String[] mViewRoots = new String[numRoots];
171652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner            for (int i = 0; i < numRoots; ++i) {
172652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                mViewRoots[i] = getWindowName(mRoots.get(i));
173945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy            }
174945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy            return mViewRoots;
175945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy        }
176945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy    }
177945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy
178945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy    public View getRootView(String name) {
179945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy        synchronized (mLock) {
180652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner            for (int i = mRoots.size() - 1; i >= 0; --i) {
181652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                final ViewRootImpl root = mRoots.get(i);
182945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy                if (name.equals(getWindowName(root))) return root.getView();
183945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy            }
184945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy        }
185945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy
186945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy        return null;
187945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy    }
188945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy
18998365d7663cbd82979a5700faf0050220b01084dJeff Brown    public void addView(View view, ViewGroup.LayoutParams params,
19098365d7663cbd82979a5700faf0050220b01084dJeff Brown            Display display, Window parentWindow) {
19198365d7663cbd82979a5700faf0050220b01084dJeff Brown        if (view == null) {
19298365d7663cbd82979a5700faf0050220b01084dJeff Brown            throw new IllegalArgumentException("view must not be null");
19398365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
19498365d7663cbd82979a5700faf0050220b01084dJeff Brown        if (display == null) {
19598365d7663cbd82979a5700faf0050220b01084dJeff Brown            throw new IllegalArgumentException("display must not be null");
19698365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
19798365d7663cbd82979a5700faf0050220b01084dJeff Brown        if (!(params instanceof WindowManager.LayoutParams)) {
19898365d7663cbd82979a5700faf0050220b01084dJeff Brown            throw new IllegalArgumentException("Params must be WindowManager.LayoutParams");
19998365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
20098365d7663cbd82979a5700faf0050220b01084dJeff Brown
20198365d7663cbd82979a5700faf0050220b01084dJeff Brown        final WindowManager.LayoutParams wparams = (WindowManager.LayoutParams)params;
20298365d7663cbd82979a5700faf0050220b01084dJeff Brown        if (parentWindow != null) {
20398365d7663cbd82979a5700faf0050220b01084dJeff Brown            parentWindow.adjustLayoutParamsForSubWindow(wparams);
20498365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
20598365d7663cbd82979a5700faf0050220b01084dJeff Brown
20698365d7663cbd82979a5700faf0050220b01084dJeff Brown        ViewRootImpl root;
20798365d7663cbd82979a5700faf0050220b01084dJeff Brown        View panelParentView = null;
20898365d7663cbd82979a5700faf0050220b01084dJeff Brown
20998365d7663cbd82979a5700faf0050220b01084dJeff Brown        synchronized (mLock) {
21098365d7663cbd82979a5700faf0050220b01084dJeff Brown            // Start watching for system property changes.
21198365d7663cbd82979a5700faf0050220b01084dJeff Brown            if (mSystemPropertyUpdater == null) {
21298365d7663cbd82979a5700faf0050220b01084dJeff Brown                mSystemPropertyUpdater = new Runnable() {
21398365d7663cbd82979a5700faf0050220b01084dJeff Brown                    @Override public void run() {
21498365d7663cbd82979a5700faf0050220b01084dJeff Brown                        synchronized (mLock) {
215652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                            for (int i = mRoots.size() - 1; i >= 0; --i) {
216652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                                mRoots.get(i).loadSystemProperties();
21798365d7663cbd82979a5700faf0050220b01084dJeff Brown                            }
21898365d7663cbd82979a5700faf0050220b01084dJeff Brown                        }
21998365d7663cbd82979a5700faf0050220b01084dJeff Brown                    }
22098365d7663cbd82979a5700faf0050220b01084dJeff Brown                };
22198365d7663cbd82979a5700faf0050220b01084dJeff Brown                SystemProperties.addChangeCallback(mSystemPropertyUpdater);
22298365d7663cbd82979a5700faf0050220b01084dJeff Brown            }
22398365d7663cbd82979a5700faf0050220b01084dJeff Brown
22498365d7663cbd82979a5700faf0050220b01084dJeff Brown            int index = findViewLocked(view, false);
22598365d7663cbd82979a5700faf0050220b01084dJeff Brown            if (index >= 0) {
2268f303ad97007a9b38d6d927353c1fba812879ae5Craig Mautner                if (mDyingViews.contains(view)) {
2278f303ad97007a9b38d6d927353c1fba812879ae5Craig Mautner                    // Don't wait for MSG_DIE to make it's way through root's queue.
2288f303ad97007a9b38d6d927353c1fba812879ae5Craig Mautner                    mRoots.get(index).doDie();
2298f303ad97007a9b38d6d927353c1fba812879ae5Craig Mautner                } else {
2308f303ad97007a9b38d6d927353c1fba812879ae5Craig Mautner                    throw new IllegalStateException("View " + view
2318f303ad97007a9b38d6d927353c1fba812879ae5Craig Mautner                            + " has already been added to the window manager.");
2328f303ad97007a9b38d6d927353c1fba812879ae5Craig Mautner                }
2338f303ad97007a9b38d6d927353c1fba812879ae5Craig Mautner                // The previous removeView() had not completed executing. Now it has.
23498365d7663cbd82979a5700faf0050220b01084dJeff Brown            }
23598365d7663cbd82979a5700faf0050220b01084dJeff Brown
23698365d7663cbd82979a5700faf0050220b01084dJeff Brown            // If this is a panel window, then find the window it is being
23798365d7663cbd82979a5700faf0050220b01084dJeff Brown            // attached to for future reference.
23898365d7663cbd82979a5700faf0050220b01084dJeff Brown            if (wparams.type >= WindowManager.LayoutParams.FIRST_SUB_WINDOW &&
23998365d7663cbd82979a5700faf0050220b01084dJeff Brown                    wparams.type <= WindowManager.LayoutParams.LAST_SUB_WINDOW) {
240652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                final int count = mViews.size();
241652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                for (int i = 0; i < count; i++) {
242652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                    if (mRoots.get(i).mWindow.asBinder() == wparams.token) {
243652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                        panelParentView = mViews.get(i);
24498365d7663cbd82979a5700faf0050220b01084dJeff Brown                    }
24598365d7663cbd82979a5700faf0050220b01084dJeff Brown                }
24698365d7663cbd82979a5700faf0050220b01084dJeff Brown            }
24798365d7663cbd82979a5700faf0050220b01084dJeff Brown
24898365d7663cbd82979a5700faf0050220b01084dJeff Brown            root = new ViewRootImpl(view.getContext(), display);
24998365d7663cbd82979a5700faf0050220b01084dJeff Brown
25098365d7663cbd82979a5700faf0050220b01084dJeff Brown            view.setLayoutParams(wparams);
25198365d7663cbd82979a5700faf0050220b01084dJeff Brown
252652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner            mViews.add(view);
253652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner            mRoots.add(root);
254652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner            mParams.add(wparams);
25598365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
25698365d7663cbd82979a5700faf0050220b01084dJeff Brown
25798365d7663cbd82979a5700faf0050220b01084dJeff Brown        // do this last because it fires off messages to start doing things
2586018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner        try {
2596018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner            root.setView(view, wparams, panelParentView);
2606018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner        } catch (RuntimeException e) {
2616018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner            // BadTokenException or InvalidDisplayException, clean up.
2626018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner            synchronized (mLock) {
2636018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner                final int index = findViewLocked(view, false);
2646018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner                if (index >= 0) {
2656018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner                    removeViewLocked(index, true);
2666018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner                }
2676018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner            }
2686018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner            throw e;
2696018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner        }
27098365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
27198365d7663cbd82979a5700faf0050220b01084dJeff Brown
27298365d7663cbd82979a5700faf0050220b01084dJeff Brown    public void updateViewLayout(View view, ViewGroup.LayoutParams params) {
27398365d7663cbd82979a5700faf0050220b01084dJeff Brown        if (view == null) {
27498365d7663cbd82979a5700faf0050220b01084dJeff Brown            throw new IllegalArgumentException("view must not be null");
27598365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
27698365d7663cbd82979a5700faf0050220b01084dJeff Brown        if (!(params instanceof WindowManager.LayoutParams)) {
27798365d7663cbd82979a5700faf0050220b01084dJeff Brown            throw new IllegalArgumentException("Params must be WindowManager.LayoutParams");
27898365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
27998365d7663cbd82979a5700faf0050220b01084dJeff Brown
28098365d7663cbd82979a5700faf0050220b01084dJeff Brown        final WindowManager.LayoutParams wparams = (WindowManager.LayoutParams)params;
28198365d7663cbd82979a5700faf0050220b01084dJeff Brown
28298365d7663cbd82979a5700faf0050220b01084dJeff Brown        view.setLayoutParams(wparams);
28398365d7663cbd82979a5700faf0050220b01084dJeff Brown
28498365d7663cbd82979a5700faf0050220b01084dJeff Brown        synchronized (mLock) {
28598365d7663cbd82979a5700faf0050220b01084dJeff Brown            int index = findViewLocked(view, true);
286652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner            ViewRootImpl root = mRoots.get(index);
287652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner            mParams.remove(index);
288652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner            mParams.add(index, wparams);
28998365d7663cbd82979a5700faf0050220b01084dJeff Brown            root.setLayoutParams(wparams, false);
29098365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
29198365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
29298365d7663cbd82979a5700faf0050220b01084dJeff Brown
29398365d7663cbd82979a5700faf0050220b01084dJeff Brown    public void removeView(View view, boolean immediate) {
29498365d7663cbd82979a5700faf0050220b01084dJeff Brown        if (view == null) {
29598365d7663cbd82979a5700faf0050220b01084dJeff Brown            throw new IllegalArgumentException("view must not be null");
29698365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
29798365d7663cbd82979a5700faf0050220b01084dJeff Brown
29898365d7663cbd82979a5700faf0050220b01084dJeff Brown        synchronized (mLock) {
29998365d7663cbd82979a5700faf0050220b01084dJeff Brown            int index = findViewLocked(view, true);
300652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner            View curView = mRoots.get(index).getView();
30105eb730ca42eec3a40f916062af7442218135303Craig Mautner            removeViewLocked(index, immediate);
30298365d7663cbd82979a5700faf0050220b01084dJeff Brown            if (curView == view) {
30398365d7663cbd82979a5700faf0050220b01084dJeff Brown                return;
30498365d7663cbd82979a5700faf0050220b01084dJeff Brown            }
30598365d7663cbd82979a5700faf0050220b01084dJeff Brown
30698365d7663cbd82979a5700faf0050220b01084dJeff Brown            throw new IllegalStateException("Calling with view " + view
30798365d7663cbd82979a5700faf0050220b01084dJeff Brown                    + " but the ViewAncestor is attached to " + curView);
30898365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
30998365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
31098365d7663cbd82979a5700faf0050220b01084dJeff Brown
31198365d7663cbd82979a5700faf0050220b01084dJeff Brown    public void closeAll(IBinder token, String who, String what) {
31298365d7663cbd82979a5700faf0050220b01084dJeff Brown        synchronized (mLock) {
313652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner            int count = mViews.size();
31498365d7663cbd82979a5700faf0050220b01084dJeff Brown            //Log.i("foo", "Closing all windows of " + token);
31505eb730ca42eec3a40f916062af7442218135303Craig Mautner            for (int i = 0; i < count; i++) {
31698365d7663cbd82979a5700faf0050220b01084dJeff Brown                //Log.i("foo", "@ " + i + " token " + mParams[i].token
31798365d7663cbd82979a5700faf0050220b01084dJeff Brown                //        + " view " + mRoots[i].getView());
318652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                if (token == null || mParams.get(i).token == token) {
319652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                    ViewRootImpl root = mRoots.get(i);
32098365d7663cbd82979a5700faf0050220b01084dJeff Brown
32198365d7663cbd82979a5700faf0050220b01084dJeff Brown                    //Log.i("foo", "Force closing " + root);
32298365d7663cbd82979a5700faf0050220b01084dJeff Brown                    if (who != null) {
32398365d7663cbd82979a5700faf0050220b01084dJeff Brown                        WindowLeaked leak = new WindowLeaked(
32498365d7663cbd82979a5700faf0050220b01084dJeff Brown                                what + " " + who + " has leaked window "
32598365d7663cbd82979a5700faf0050220b01084dJeff Brown                                + root.getView() + " that was originally added here");
32698365d7663cbd82979a5700faf0050220b01084dJeff Brown                        leak.setStackTrace(root.getLocation().getStackTrace());
32705eb730ca42eec3a40f916062af7442218135303Craig Mautner                        Log.e(TAG, "", leak);
32898365d7663cbd82979a5700faf0050220b01084dJeff Brown                    }
32998365d7663cbd82979a5700faf0050220b01084dJeff Brown
33098365d7663cbd82979a5700faf0050220b01084dJeff Brown                    removeViewLocked(i, false);
33198365d7663cbd82979a5700faf0050220b01084dJeff Brown                }
33298365d7663cbd82979a5700faf0050220b01084dJeff Brown            }
33398365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
33498365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
33598365d7663cbd82979a5700faf0050220b01084dJeff Brown
33605eb730ca42eec3a40f916062af7442218135303Craig Mautner    private void removeViewLocked(int index, boolean immediate) {
337652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner        ViewRootImpl root = mRoots.get(index);
33898365d7663cbd82979a5700faf0050220b01084dJeff Brown        View view = root.getView();
33998365d7663cbd82979a5700faf0050220b01084dJeff Brown
34098365d7663cbd82979a5700faf0050220b01084dJeff Brown        if (view != null) {
341f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown            InputMethodManager imm = InputMethodManager.getInstance();
34298365d7663cbd82979a5700faf0050220b01084dJeff Brown            if (imm != null) {
343652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                imm.windowDismissed(mViews.get(index).getWindowToken());
34498365d7663cbd82979a5700faf0050220b01084dJeff Brown            }
34598365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
3468f303ad97007a9b38d6d927353c1fba812879ae5Craig Mautner        boolean deferred = root.die(immediate);
34792098c7c30bc76310a066b220e625fa9aa4b925dCraig Mautner        if (view != null) {
34892098c7c30bc76310a066b220e625fa9aa4b925dCraig Mautner            view.assignParent(null);
3498f303ad97007a9b38d6d927353c1fba812879ae5Craig Mautner            if (deferred) {
3508f303ad97007a9b38d6d927353c1fba812879ae5Craig Mautner                mDyingViews.add(view);
3518f303ad97007a9b38d6d927353c1fba812879ae5Craig Mautner            }
35292098c7c30bc76310a066b220e625fa9aa4b925dCraig Mautner        }
35305eb730ca42eec3a40f916062af7442218135303Craig Mautner    }
35498365d7663cbd82979a5700faf0050220b01084dJeff Brown
35505eb730ca42eec3a40f916062af7442218135303Craig Mautner    void doRemoveView(ViewRootImpl root) {
35605eb730ca42eec3a40f916062af7442218135303Craig Mautner        synchronized (mLock) {
357652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner            final int index = mRoots.indexOf(root);
358652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner            if (index >= 0) {
359652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                mRoots.remove(index);
360652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                mParams.remove(index);
3618f303ad97007a9b38d6d927353c1fba812879ae5Craig Mautner                final View view = mViews.remove(index);
3628f303ad97007a9b38d6d927353c1fba812879ae5Craig Mautner                mDyingViews.remove(view);
36398365d7663cbd82979a5700faf0050220b01084dJeff Brown            }
36498365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
36598365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
36698365d7663cbd82979a5700faf0050220b01084dJeff Brown
36798365d7663cbd82979a5700faf0050220b01084dJeff Brown    private int findViewLocked(View view, boolean required) {
368652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner        final int index = mViews.indexOf(view);
369652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner        if (required && index < 0) {
37005eb730ca42eec3a40f916062af7442218135303Craig Mautner            throw new IllegalArgumentException("View=" + view + " not attached to window manager");
3716018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner        }
372652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner        return index;
37398365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
37498365d7663cbd82979a5700faf0050220b01084dJeff Brown
37598365d7663cbd82979a5700faf0050220b01084dJeff Brown    public void startTrimMemory(int level) {
37698365d7663cbd82979a5700faf0050220b01084dJeff Brown        if (HardwareRenderer.isAvailable()) {
37798365d7663cbd82979a5700faf0050220b01084dJeff Brown            // On low-end gfx devices we trim when memory is moderate;
37898365d7663cbd82979a5700faf0050220b01084dJeff Brown            // on high-end devices we do this when low.
37998365d7663cbd82979a5700faf0050220b01084dJeff Brown            if (level >= ComponentCallbacks2.TRIM_MEMORY_COMPLETE
38098365d7663cbd82979a5700faf0050220b01084dJeff Brown                    || (level >= ComponentCallbacks2.TRIM_MEMORY_MODERATE
38198365d7663cbd82979a5700faf0050220b01084dJeff Brown                            && !ActivityManager.isHighEndGfx())) {
38298365d7663cbd82979a5700faf0050220b01084dJeff Brown                // Destroy all hardware surfaces and resources associated to
38398365d7663cbd82979a5700faf0050220b01084dJeff Brown                // known windows
38498365d7663cbd82979a5700faf0050220b01084dJeff Brown                synchronized (mLock) {
385652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                    for (int i = mRoots.size() - 1; i >= 0; --i) {
38646bfc4811094e5b1e3196246e457d4c6b58332ecRomain Guy                        mRoots.get(i).destroyHardwareResources();
38798365d7663cbd82979a5700faf0050220b01084dJeff Brown                    }
38898365d7663cbd82979a5700faf0050220b01084dJeff Brown                }
38998365d7663cbd82979a5700faf0050220b01084dJeff Brown                // Force a full memory flush
39098365d7663cbd82979a5700faf0050220b01084dJeff Brown                mNeedsEglTerminate = true;
39198365d7663cbd82979a5700faf0050220b01084dJeff Brown                HardwareRenderer.startTrimMemory(ComponentCallbacks2.TRIM_MEMORY_COMPLETE);
39298365d7663cbd82979a5700faf0050220b01084dJeff Brown                return;
39398365d7663cbd82979a5700faf0050220b01084dJeff Brown            }
39498365d7663cbd82979a5700faf0050220b01084dJeff Brown
39598365d7663cbd82979a5700faf0050220b01084dJeff Brown            HardwareRenderer.startTrimMemory(level);
39698365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
39798365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
39898365d7663cbd82979a5700faf0050220b01084dJeff Brown
39998365d7663cbd82979a5700faf0050220b01084dJeff Brown    public void endTrimMemory() {
40098365d7663cbd82979a5700faf0050220b01084dJeff Brown        HardwareRenderer.endTrimMemory();
40198365d7663cbd82979a5700faf0050220b01084dJeff Brown
40298365d7663cbd82979a5700faf0050220b01084dJeff Brown        if (mNeedsEglTerminate) {
40398365d7663cbd82979a5700faf0050220b01084dJeff Brown            ManagedEGLContext.doTerminate();
40498365d7663cbd82979a5700faf0050220b01084dJeff Brown            mNeedsEglTerminate = false;
40598365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
40698365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
40798365d7663cbd82979a5700faf0050220b01084dJeff Brown
40898365d7663cbd82979a5700faf0050220b01084dJeff Brown    public void trimLocalMemory() {
40998365d7663cbd82979a5700faf0050220b01084dJeff Brown        synchronized (mLock) {
410652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner            for (int i = mRoots.size() - 1; i >= 0; --i) {
411652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                mRoots.get(i).destroyHardwareLayers();
41298365d7663cbd82979a5700faf0050220b01084dJeff Brown            }
41398365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
41498365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
41598365d7663cbd82979a5700faf0050220b01084dJeff Brown
41698365d7663cbd82979a5700faf0050220b01084dJeff Brown    public void dumpGfxInfo(FileDescriptor fd) {
41798365d7663cbd82979a5700faf0050220b01084dJeff Brown        FileOutputStream fout = new FileOutputStream(fd);
4188c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn        PrintWriter pw = new FastPrintWriter(fout);
41998365d7663cbd82979a5700faf0050220b01084dJeff Brown        try {
42098365d7663cbd82979a5700faf0050220b01084dJeff Brown            synchronized (mLock) {
421652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                final int count = mViews.size();
42298365d7663cbd82979a5700faf0050220b01084dJeff Brown
423652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                pw.println("Profile data in ms:");
42498365d7663cbd82979a5700faf0050220b01084dJeff Brown
425652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                for (int i = 0; i < count; i++) {
426652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                    ViewRootImpl root = mRoots.get(i);
427652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                    String name = getWindowName(root);
428652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                    pw.printf("\n\t%s", name);
42998365d7663cbd82979a5700faf0050220b01084dJeff Brown
430652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                    HardwareRenderer renderer =
431652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                            root.getView().mAttachInfo.mHardwareRenderer;
432652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                    if (renderer != null) {
433652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                        renderer.dumpGfxInfo(pw);
43498365d7663cbd82979a5700faf0050220b01084dJeff Brown                    }
435652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                }
43698365d7663cbd82979a5700faf0050220b01084dJeff Brown
437652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                pw.println("\nView hierarchy:\n");
43898365d7663cbd82979a5700faf0050220b01084dJeff Brown
439652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                int viewsCount = 0;
440652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                int displayListsSize = 0;
441652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                int[] info = new int[2];
44298365d7663cbd82979a5700faf0050220b01084dJeff Brown
443652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                for (int i = 0; i < count; i++) {
444652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                    ViewRootImpl root = mRoots.get(i);
445652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                    root.dumpGfxInfo(info);
44698365d7663cbd82979a5700faf0050220b01084dJeff Brown
447652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                    String name = getWindowName(root);
448652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                    pw.printf("  %s\n  %d views, %.2f kB of display lists",
449652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                            name, info[0], info[1] / 1024.0f);
450652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                    HardwareRenderer renderer =
451652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                            root.getView().mAttachInfo.mHardwareRenderer;
452652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                    if (renderer != null) {
453652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                        pw.printf(", %d frames rendered", renderer.getFrameCount());
45498365d7663cbd82979a5700faf0050220b01084dJeff Brown                    }
455652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                    pw.printf("\n\n");
45698365d7663cbd82979a5700faf0050220b01084dJeff Brown
457652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                    viewsCount += info[0];
458652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                    displayListsSize += info[1];
45998365d7663cbd82979a5700faf0050220b01084dJeff Brown                }
460652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner
461652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                pw.printf("\nTotal ViewRootImpl: %d\n", count);
462652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                pw.printf("Total Views:        %d\n", viewsCount);
463652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                pw.printf("Total DisplayList:  %.2f kB\n\n", displayListsSize / 1024.0f);
46498365d7663cbd82979a5700faf0050220b01084dJeff Brown            }
46598365d7663cbd82979a5700faf0050220b01084dJeff Brown        } finally {
46698365d7663cbd82979a5700faf0050220b01084dJeff Brown            pw.flush();
46798365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
46898365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
46998365d7663cbd82979a5700faf0050220b01084dJeff Brown
47098365d7663cbd82979a5700faf0050220b01084dJeff Brown    private static String getWindowName(ViewRootImpl root) {
47198365d7663cbd82979a5700faf0050220b01084dJeff Brown        return root.mWindowAttributes.getTitle() + "/" +
47298365d7663cbd82979a5700faf0050220b01084dJeff Brown                root.getClass().getName() + '@' + Integer.toHexString(root.hashCode());
47398365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
47498365d7663cbd82979a5700faf0050220b01084dJeff Brown
47598365d7663cbd82979a5700faf0050220b01084dJeff Brown    public void setStoppedState(IBinder token, boolean stopped) {
47698365d7663cbd82979a5700faf0050220b01084dJeff Brown        synchronized (mLock) {
477652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner            int count = mViews.size();
478652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner            for (int i = 0; i < count; i++) {
479652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                if (token == null || mParams.get(i).token == token) {
480652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                    ViewRootImpl root = mRoots.get(i);
481652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                    root.setStopped(stopped);
48298365d7663cbd82979a5700faf0050220b01084dJeff Brown                }
48398365d7663cbd82979a5700faf0050220b01084dJeff Brown            }
48498365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
48598365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
48698365d7663cbd82979a5700faf0050220b01084dJeff Brown
48798365d7663cbd82979a5700faf0050220b01084dJeff Brown    public void reportNewConfiguration(Configuration config) {
48898365d7663cbd82979a5700faf0050220b01084dJeff Brown        synchronized (mLock) {
489652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner            int count = mViews.size();
490652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner            config = new Configuration(config);
491652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner            for (int i=0; i < count; i++) {
492652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                ViewRootImpl root = mRoots.get(i);
493652fdfaf6f8131886dbc925d670e00e9d85e56daCraig Mautner                root.requestUpdateConfiguration(config);
49498365d7663cbd82979a5700faf0050220b01084dJeff Brown            }
49598365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
49698365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
497bc57cd1b248bf23e443581f9fe44167c94699ce8Craig Mautner
498bc57cd1b248bf23e443581f9fe44167c94699ce8Craig Mautner    /** @hide */
499bc57cd1b248bf23e443581f9fe44167c94699ce8Craig Mautner    public void changeCanvasOpacity(IBinder token, boolean opaque) {
500bc57cd1b248bf23e443581f9fe44167c94699ce8Craig Mautner        if (token == null) {
501bc57cd1b248bf23e443581f9fe44167c94699ce8Craig Mautner            return;
502bc57cd1b248bf23e443581f9fe44167c94699ce8Craig Mautner        }
503bc57cd1b248bf23e443581f9fe44167c94699ce8Craig Mautner        synchronized (mLock) {
504bc57cd1b248bf23e443581f9fe44167c94699ce8Craig Mautner            for (int i = mParams.size() - 1; i >= 0; --i) {
505bc57cd1b248bf23e443581f9fe44167c94699ce8Craig Mautner                if (mParams.get(i).token == token) {
506bc57cd1b248bf23e443581f9fe44167c94699ce8Craig Mautner                    mRoots.get(i).changeCanvasOpacity(opaque);
507bc57cd1b248bf23e443581f9fe44167c94699ce8Craig Mautner                    return;
508bc57cd1b248bf23e443581f9fe44167c94699ce8Craig Mautner                }
509bc57cd1b248bf23e443581f9fe44167c94699ce8Craig Mautner            }
510bc57cd1b248bf23e443581f9fe44167c94699ce8Craig Mautner        }
511bc57cd1b248bf23e443581f9fe44167c94699ce8Craig Mautner    }
51298365d7663cbd82979a5700faf0050220b01084dJeff Brown}
51398365d7663cbd82979a5700faf0050220b01084dJeff Brown
51498365d7663cbd82979a5700faf0050220b01084dJeff Brownfinal class WindowLeaked extends AndroidRuntimeException {
51598365d7663cbd82979a5700faf0050220b01084dJeff Brown    public WindowLeaked(String msg) {
51698365d7663cbd82979a5700faf0050220b01084dJeff Brown        super(msg);
51798365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
51898365d7663cbd82979a5700faf0050220b01084dJeff Brown}
519