WindowManagerImpl.java revision a53de0629f3b94472c0f160f5bbe1090b020feab
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.view;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
198ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guyimport android.app.ActivityManager;
208ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guyimport android.content.ComponentCallbacks2;
215be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackbornimport android.content.res.CompatibilityInfo;
225fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackbornimport android.content.res.Configuration;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PixelFormat;
24717a25dc2a411edb548859cd6870363346c71b01Dianne Hackbornimport android.opengl.ManagedEGLContext;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
26a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackbornimport android.os.SystemProperties;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AndroidRuntimeException;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputMethodManager;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guyimport java.io.FileDescriptor;
3265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guyimport java.io.FileOutputStream;
3365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guyimport java.io.PrintWriter;
34bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guyimport java.util.HashMap;
35bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfinal class WindowLeaked extends AndroidRuntimeException {
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public WindowLeaked(String msg) {
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(msg);
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Low-level communication with the global system window manager.  It implements
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the ViewManager interface, allowing you to add any View subclass as a
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * top-level window on the screen. Additional window manager specific layout
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parameters are defined for control over how windows are displayed.
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It also implemens the WindowManager interface, allowing you to control the
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * displays attached to the device.
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Applications will not normally use WindowManager directly, instead relying
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on the higher-level facilities in {@link android.app.Activity} and
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Dialog}.
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Even for low-level window manager access, it is almost never correct to use
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this class.  For example, {@link android.app.Activity#getWindowManager}
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provides a ViewManager for adding windows that are associated with that
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity -- the window manager will not normally allow you to add arbitrary
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * windows that are not associated with an activity.
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class WindowManagerImpl implements WindowManager {
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The user is navigating with keys (not the touch screen), so
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * navigational focus should be shown.
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
676d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn    public static final int RELAYOUT_RES_IN_TOUCH_MODE = 0x1;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is the first time the window is being drawn,
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so the client must call drawingFinished() when done
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
726d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn    public static final int RELAYOUT_RES_FIRST_TIME = 0x2;
736d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn    /**
746d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn     * The window manager has changed the surface from the last call.
756d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn     */
766d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn    public static final int RELAYOUT_RES_SURFACE_CHANGED = 0x4;
7712d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn    /**
7812d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn     * The window manager is currently animating.  It will call
7912d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn     * IWindow.doneAnimating() when done.
8012d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn     */
8112d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn    public static final int RELAYOUT_RES_ANIMATING = 0x8;
826d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn
836d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn    /**
846d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn     * Flag for relayout: the client will be later giving
856d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn     * internal insets; as a result, the window will not impact other window
866d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn     * layouts until the insets are given.
876d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn     */
886d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn    public static final int RELAYOUT_INSETS_PENDING = 0x1;
896d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn
906d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn    /**
916d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn     * Flag for relayout: the client may be currently using the current surface,
926d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn     * so if it is to be destroyed as a part of the relayout the destroy must
936d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn     * be deferred until later.  The client will call performDeferredDestroy()
946d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn     * when it is okay.
956d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn     */
966d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn    public static final int RELAYOUT_DEFER_SURFACE_DESTROY = 0x2;
976d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ADD_FLAG_APP_VISIBLE = 0x2;
996d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn    public static final int ADD_FLAG_IN_TOUCH_MODE = RELAYOUT_RES_IN_TOUCH_MODE;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ADD_OKAY = 0;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ADD_BAD_APP_TOKEN = -1;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ADD_BAD_SUBWINDOW_TOKEN = -2;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ADD_NOT_APP_TOKEN = -3;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ADD_APP_EXITING = -4;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ADD_DUPLICATE_ADD = -5;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ADD_STARTING_NOT_NEEDED = -6;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ADD_MULTIPLE_SINGLETON = -7;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ADD_PERMISSION_DENIED = -8;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1115be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    private View[] mViews;
1126dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn    private ViewRootImpl[] mRoots;
1135be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    private WindowManager.LayoutParams[] mParams;
114d9624138723c55a0ac2af58a2e78e98cd51eba27Teng-Hui Zhu    private boolean mNeedsEglTerminate;
1155be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn
116a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn    private Runnable mSystemPropertyUpdater = null;
117a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn
1185be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    private final static Object sLock = new Object();
1195be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    private final static WindowManagerImpl sWindowManager = new WindowManagerImpl();
1205be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    private final static HashMap<CompatibilityInfo, WindowManager> sCompatWindowManagers
1215be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            = new HashMap<CompatibilityInfo, WindowManager>();
1225be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn
1235be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    static class CompatModeWrapper implements WindowManager {
1245fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        private final WindowManagerImpl mWindowManager;
1255be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        private final Display mDefaultDisplay;
1265fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        private final CompatibilityInfoHolder mCompatibilityInfo;
1275be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn
1285fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        CompatModeWrapper(WindowManager wm, CompatibilityInfoHolder ci) {
1295fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            mWindowManager = wm instanceof CompatModeWrapper
1305fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                    ? ((CompatModeWrapper)wm).mWindowManager : (WindowManagerImpl)wm;
1315be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn
1325be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            // Use the original display if there is no compatibility mode
1335be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            // to apply, or the underlying window manager is already a
1345be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            // compatibility mode wrapper.  (We assume that if it is a
1355be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            // wrapper, it is applying the same compatibility mode.)
1365fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            if (ci == null) {
1375be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn                mDefaultDisplay = mWindowManager.getDefaultDisplay();
1385be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            } else {
1395be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn                //mDefaultDisplay = mWindowManager.getDefaultDisplay();
1405be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn                mDefaultDisplay = Display.createCompatibleDisplay(
1415be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn                        mWindowManager.getDefaultDisplay().getDisplayId(), ci);
1425be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            }
1435fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
1445fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            mCompatibilityInfo = ci;
1455be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        }
1465be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn
1475be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        @Override
1485be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        public void addView(View view, android.view.ViewGroup.LayoutParams params) {
1495fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            mWindowManager.addView(view, params, mCompatibilityInfo);
1505be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        }
1515be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn
1525be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        @Override
1535be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        public void updateViewLayout(View view, android.view.ViewGroup.LayoutParams params) {
1545be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            mWindowManager.updateViewLayout(view, params);
1555be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn
1565be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        }
1575be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn
1585be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        @Override
1595be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        public void removeView(View view) {
1605be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            mWindowManager.removeView(view);
1615be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        }
1625be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn
1635be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        @Override
1645be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        public Display getDefaultDisplay() {
1655be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            return mDefaultDisplay;
1665be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        }
1675be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn
1685be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        @Override
1695be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        public void removeViewImmediate(View view) {
1705be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            mWindowManager.removeViewImmediate(view);
1715be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        }
1725be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn
1735be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        @Override
1745be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        public boolean isHardwareAccelerated() {
1755be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            return mWindowManager.isHardwareAccelerated();
1765be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        }
1775be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn
1785be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    }
1795be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn
1805be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    public static WindowManagerImpl getDefault() {
1815be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        return sWindowManager;
1825be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    }
1835be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn
1845be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    public static WindowManager getDefault(CompatibilityInfo compatInfo) {
1855fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        CompatibilityInfoHolder cih = new CompatibilityInfoHolder();
1865fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        cih.set(compatInfo);
1875fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        if (cih.getIfNeeded() == null) {
1885be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            return sWindowManager;
1895be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        }
1905be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn
1915be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        synchronized (sLock) {
1925be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            // NOTE: It would be cleaner to move the implementation of
1935be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            // WindowManagerImpl into a static inner class, and have this
1945be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            // public impl just call into that.  Then we can make multiple
1955be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            // instances of WindowManagerImpl for compat mode rather than
1965be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            // having to make wrappers.
1975be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            WindowManager wm = sCompatWindowManagers.get(compatInfo);
1985be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            if (wm == null) {
1995fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                wm = new CompatModeWrapper(sWindowManager, cih);
2005be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn                sCompatWindowManagers.put(compatInfo, wm);
2015be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            }
2025be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            return wm;
2035be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        }
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2055fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
2065fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    public static WindowManager getDefault(CompatibilityInfoHolder compatInfo) {
2075fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        return new CompatModeWrapper(sWindowManager, compatInfo);
2085fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    }
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2107eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn    public boolean isHardwareAccelerated() {
2117eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn        return false;
2127eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn    }
2137eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn
2145fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    public void addView(View view) {
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        addView(view, new WindowManager.LayoutParams(
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowManager.LayoutParams.TYPE_APPLICATION, 0, PixelFormat.OPAQUE));
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2195fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    public void addView(View view, ViewGroup.LayoutParams params) {
2205fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        addView(view, params, null, false);
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2235fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    public void addView(View view, ViewGroup.LayoutParams params, CompatibilityInfoHolder cih) {
2245fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        addView(view, params, cih, false);
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2275fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    private void addView(View view, ViewGroup.LayoutParams params,
2285fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            CompatibilityInfoHolder cih, boolean nest) {
22943a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false) Log.v("WindowManager", "addView view=" + view);
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!(params instanceof WindowManager.LayoutParams)) {
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException(
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Params must be WindowManager.LayoutParams");
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final WindowManager.LayoutParams wparams
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                = (WindowManager.LayoutParams)params;
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2396dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        ViewRootImpl root;
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        View panelParentView = null;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
243a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn            // Start watching for system property changes.
244a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn            if (mSystemPropertyUpdater == null) {
245a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn                mSystemPropertyUpdater = new Runnable() {
246a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn                    @Override public void run() {
247a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn                        synchronized (this) {
248a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn                            synchronized (this) {
249a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn                                for (ViewRootImpl root : mRoots) {
250a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn                                    root.loadSystemProperties();
251a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn                                }
252a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn                            }
253a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn                        }
254a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn                    }
255a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn                };
256a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn                SystemProperties.addChangeCallback(mSystemPropertyUpdater);
257a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn            }
258a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Here's an odd/questionable case: if someone tries to add a
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // view multiple times, then we simply bump up a nesting count
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // and they need to remove the view the corresponding number of
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // times to have it actually removed from the window manager.
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // This is useful specifically for the notification manager,
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // which can continually add/remove the same view as a
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // notification gets updated.
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int index = findViewLocked(view, false);
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (index >= 0) {
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!nest) {
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new IllegalStateException("View " + view
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " has already been added to the window manager.");
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                root = mRoots[index];
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                root.mAddNesting++;
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Update layout parameters.
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                view.setLayoutParams(wparams);
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                root.setLayoutParams(wparams, true);
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If this is a panel window, then find the window it is being
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // attached to for future reference.
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wparams.type >= WindowManager.LayoutParams.FIRST_SUB_WINDOW &&
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wparams.type <= WindowManager.LayoutParams.LAST_SUB_WINDOW) {
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int count = mViews != null ? mViews.length : 0;
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<count; i++) {
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mRoots[i].mWindow.asBinder() == wparams.token) {
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        panelParentView = mViews[i];
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2926dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            root = new ViewRootImpl(view.getContext());
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            root.mAddNesting = 1;
2945fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            if (cih == null) {
2955fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                root.mCompatibilityInfo = new CompatibilityInfoHolder();
2965fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            } else {
2975fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                root.mCompatibilityInfo = cih;
2985fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            }
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            view.setLayoutParams(wparams);
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mViews == null) {
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                index = 1;
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mViews = new View[1];
3056dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn                mRoots = new ViewRootImpl[1];
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParams = new WindowManager.LayoutParams[1];
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                index = mViews.length + 1;
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Object[] old = mViews;
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mViews = new View[index];
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.arraycopy(old, 0, mViews, 0, index-1);
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                old = mRoots;
3136dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn                mRoots = new ViewRootImpl[index];
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.arraycopy(old, 0, mRoots, 0, index-1);
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                old = mParams;
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParams = new WindowManager.LayoutParams[index];
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.arraycopy(old, 0, mParams, 0, index-1);
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index--;
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mViews[index] = view;
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRoots[index] = root;
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParams[index] = wparams;
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // do this last because it fires off messages to start doing things
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        root.setView(view, wparams, panelParentView);
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void updateViewLayout(View view, ViewGroup.LayoutParams params) {
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!(params instanceof WindowManager.LayoutParams)) {
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("Params must be WindowManager.LayoutParams");
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final WindowManager.LayoutParams wparams
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                = (WindowManager.LayoutParams)params;
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        view.setLayoutParams(wparams);
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int index = findViewLocked(view, true);
3416dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            ViewRootImpl root = mRoots[index];
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParams[index] = wparams;
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            root.setLayoutParams(wparams, false);
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeView(View view) {
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int index = findViewLocked(view, true);
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View curView = removeViewLocked(index);
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (curView == view) {
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalStateException("Calling with view " + view
356c6cc0f8c19d9eccf408a443fa2bf668af261dcd0Joe Onorato                    + " but the ViewAncestor is attached to " + curView);
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeViewImmediate(View view) {
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int index = findViewLocked(view, true);
3636dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            ViewRootImpl root = mRoots[index];
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View curView = root.getView();
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            root.mAddNesting = 0;
3674478de3c02c1fb2f4f888e696ee1b13721e936d9Jeff Sharkey
3684478de3c02c1fb2f4f888e696ee1b13721e936d9Jeff Sharkey            if (view != null) {
3694478de3c02c1fb2f4f888e696ee1b13721e936d9Jeff Sharkey                InputMethodManager imm = InputMethodManager.getInstance(view.getContext());
3704478de3c02c1fb2f4f888e696ee1b13721e936d9Jeff Sharkey                if (imm != null) {
3714478de3c02c1fb2f4f888e696ee1b13721e936d9Jeff Sharkey                    imm.windowDismissed(mViews[index].getWindowToken());
3724478de3c02c1fb2f4f888e696ee1b13721e936d9Jeff Sharkey                }
3734478de3c02c1fb2f4f888e696ee1b13721e936d9Jeff Sharkey            }
3744478de3c02c1fb2f4f888e696ee1b13721e936d9Jeff Sharkey
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            root.die(true);
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            finishRemoveViewLocked(curView, index);
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (curView == view) {
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalStateException("Calling with view " + view
382c6cc0f8c19d9eccf408a443fa2bf668af261dcd0Joe Onorato                    + " but the ViewAncestor is attached to " + curView);
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    View removeViewLocked(int index) {
3876dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        ViewRootImpl root = mRoots[index];
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        View view = root.getView();
389a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Don't really remove until we have matched all calls to add().
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        root.mAddNesting--;
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (root.mAddNesting > 0) {
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return view;
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39648a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        if (view != null) {
39748a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            InputMethodManager imm = InputMethodManager.getInstance(view.getContext());
39848a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            if (imm != null) {
39948a7651823030ed3c0f4c084b423430044425feaDianne Hackborn                imm.windowDismissed(mViews[index].getWindowToken());
40048a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            }
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        root.die(false);
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        finishRemoveViewLocked(view, index);
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return view;
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void finishRemoveViewLocked(View view, int index) {
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int count = mViews.length;
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // remove it from the list
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        View[] tmpViews = new View[count-1];
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        removeItem(tmpViews, mViews, index);
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViews = tmpViews;
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4156dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        ViewRootImpl[] tmpRoots = new ViewRootImpl[count-1];
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        removeItem(tmpRoots, mRoots, index);
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRoots = tmpRoots;
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowManager.LayoutParams[] tmpParams
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                = new WindowManager.LayoutParams[count-1];
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        removeItem(tmpParams, mParams, index);
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mParams = tmpParams;
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42448a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        if (view != null) {
42548a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            view.assignParent(null);
42648a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            // func doesn't allow null...  does it matter if we clear them?
42748a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            //view.setLayoutParams(null);
42848a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        }
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void closeAll(IBinder token, String who, String what) {
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mViews == null)
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int count = mViews.length;
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i("foo", "Closing all windows of " + token);
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<count; i++) {
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //Log.i("foo", "@ " + i + " token " + mParams[i].token
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //        + " view " + mRoots[i].getView());
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (token == null || mParams[i].token == token) {
4426dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn                    ViewRootImpl root = mRoots[i];
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    root.mAddNesting = 1;
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    //Log.i("foo", "Force closing " + root);
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (who != null) {
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        WindowLeaked leak = new WindowLeaked(
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                what + " " + who + " has leaked window "
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + root.getView() + " that was originally added here");
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        leak.setStackTrace(root.getLocation().getStackTrace());
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.e("WindowManager", leak.getMessage(), leak);
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
45365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    removeViewLocked(i);
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    i--;
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    count--;
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
461bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy
462bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    /**
463bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy     * @param level See {@link android.content.ComponentCallbacks}
46419f86e831ee0629b24385b0bb51d27ff91961dd2Romain Guy     *
46519f86e831ee0629b24385b0bb51d27ff91961dd2Romain Guy     * @hide
466bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy     */
46719f86e831ee0629b24385b0bb51d27ff91961dd2Romain Guy    public void startTrimMemory(int level) {
468bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy        if (HardwareRenderer.isAvailable()) {
469162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            // On low-end gfx devices we trim when memory is moderate;
470162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            // on high-end devices we do this when low.
471162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            if (level >= ComponentCallbacks2.TRIM_MEMORY_COMPLETE
472162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    || (level >= ComponentCallbacks2.TRIM_MEMORY_MODERATE
473162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                            && !ActivityManager.isHighEndGfx(getDefaultDisplay()))) {
474162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                // Destroy all hardware surfaces and resources associated to
475162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                // known windows
476162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                synchronized (this) {
477162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    if (mViews == null) return;
478162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    int count = mViews.length;
479162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    for (int i = 0; i < count; i++) {
480162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                        mRoots[i].terminateHardwareResources();
4818ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy                    }
48227ff913d56de8400083a13fc572e2812b32c890cDianne Hackborn                }
483162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                // Force a full memory flush
484162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                mNeedsEglTerminate = true;
48519f86e831ee0629b24385b0bb51d27ff91961dd2Romain Guy                HardwareRenderer.startTrimMemory(ComponentCallbacks2.TRIM_MEMORY_COMPLETE);
486162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                return;
4878ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy            }
48819f86e831ee0629b24385b0bb51d27ff91961dd2Romain Guy
48919f86e831ee0629b24385b0bb51d27ff91961dd2Romain Guy            HardwareRenderer.startTrimMemory(level);
490bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy        }
491bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    }
492bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy
49365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    /**
49465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy     * @hide
49565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy     */
49619f86e831ee0629b24385b0bb51d27ff91961dd2Romain Guy    public void endTrimMemory() {
49719f86e831ee0629b24385b0bb51d27ff91961dd2Romain Guy        HardwareRenderer.endTrimMemory();
49819f86e831ee0629b24385b0bb51d27ff91961dd2Romain Guy
499d9624138723c55a0ac2af58a2e78e98cd51eba27Teng-Hui Zhu        if (mNeedsEglTerminate) {
500d9624138723c55a0ac2af58a2e78e98cd51eba27Teng-Hui Zhu            ManagedEGLContext.doTerminate();
501d9624138723c55a0ac2af58a2e78e98cd51eba27Teng-Hui Zhu            mNeedsEglTerminate = false;
502d9624138723c55a0ac2af58a2e78e98cd51eba27Teng-Hui Zhu        }
503d9624138723c55a0ac2af58a2e78e98cd51eba27Teng-Hui Zhu    }
504d9624138723c55a0ac2af58a2e78e98cd51eba27Teng-Hui Zhu
505d9624138723c55a0ac2af58a2e78e98cd51eba27Teng-Hui Zhu    /**
506d9624138723c55a0ac2af58a2e78e98cd51eba27Teng-Hui Zhu     * @hide
507d9624138723c55a0ac2af58a2e78e98cd51eba27Teng-Hui Zhu     */
50865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    public void trimLocalMemory() {
50965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        synchronized (this) {
51065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            if (mViews == null) return;
51165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            int count = mViews.length;
51265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            for (int i = 0; i < count; i++) {
51365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                mRoots[i].destroyHardwareLayers();
51465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            }
51565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        }
51665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    }
51765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
51865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    /**
51965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy     * @hide
52065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy     */
52165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    public void dumpGfxInfo(FileDescriptor fd) {
52265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        FileOutputStream fout = new FileOutputStream(fd);
52365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        PrintWriter pw = new PrintWriter(fout);
52465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        try {
52565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            synchronized (this) {
52665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                if (mViews != null) {
52765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                    final int count = mViews.length;
528a676ad7e34c9afbaafaeca8c3fe96e95c518828eRomain Guy
529a676ad7e34c9afbaafaeca8c3fe96e95c518828eRomain Guy                    pw.println("Profile data in ms:");
530a676ad7e34c9afbaafaeca8c3fe96e95c518828eRomain Guy
531a676ad7e34c9afbaafaeca8c3fe96e95c518828eRomain Guy                    for (int i = 0; i < count; i++) {
532a676ad7e34c9afbaafaeca8c3fe96e95c518828eRomain Guy                        ViewRootImpl root = mRoots[i];
533a676ad7e34c9afbaafaeca8c3fe96e95c518828eRomain Guy                        HardwareRenderer renderer = root.getView().mAttachInfo.mHardwareRenderer;
534a676ad7e34c9afbaafaeca8c3fe96e95c518828eRomain Guy                        if (renderer != null) {
535a676ad7e34c9afbaafaeca8c3fe96e95c518828eRomain Guy                            renderer.dumpGfxInfo(pw);
536a676ad7e34c9afbaafaeca8c3fe96e95c518828eRomain Guy                        }
537a676ad7e34c9afbaafaeca8c3fe96e95c518828eRomain Guy                    }
538a676ad7e34c9afbaafaeca8c3fe96e95c518828eRomain Guy
539a676ad7e34c9afbaafaeca8c3fe96e95c518828eRomain Guy                    pw.println("\nView hierarchy:");
54065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
54165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                    int viewsCount = 0;
54265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                    int displayListsSize = 0;
54365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                    int[] info = new int[2];
54465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
54565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                    for (int i = 0; i < count; i++) {
54665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                        ViewRootImpl root = mRoots[i];
547211370fd943cf26905001b38b8b1791851b26adcRomain Guy                        root.dumpGfxInfo(info);
54865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
54965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                        String name = root.getClass().getName() + '@' +
55065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                                Integer.toHexString(hashCode());
551a3fabff98590d26f0c362cb09dc378fece66215cMichael Jurka                        pw.printf("  %s: %d views, %.2f kB (display lists)",
55265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                                name, info[0], info[1] / 1024.0f);
553a3fabff98590d26f0c362cb09dc378fece66215cMichael Jurka                        HardwareRenderer renderer = root.getView().mAttachInfo.mHardwareRenderer;
554a3fabff98590d26f0c362cb09dc378fece66215cMichael Jurka                        if (renderer != null) {
555a3fabff98590d26f0c362cb09dc378fece66215cMichael Jurka                            pw.printf(", %d frames rendered", renderer.getFrameCount());
556a3fabff98590d26f0c362cb09dc378fece66215cMichael Jurka                        }
557a3fabff98590d26f0c362cb09dc378fece66215cMichael Jurka                        pw.printf("\n");
55865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
55965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                        viewsCount += info[0];
56065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                        displayListsSize += info[1];
56165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                    }
56265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
56365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                    pw.printf("\nTotal ViewRootImpl: %d\n", count);
56465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                    pw.printf("Total Views:        %d\n", viewsCount);
56565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                    pw.printf("Total DisplayList:  %.2f kB\n\n", displayListsSize / 1024.0f);
56665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                }
56765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            }
56865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        } finally {
56965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            pw.flush();
57065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        }
57165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    }
57265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
573ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn    public void setStoppedState(IBinder token, boolean stopped) {
574ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn        synchronized (this) {
575ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            if (mViews == null)
576ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                return;
577ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            int count = mViews.length;
578ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            for (int i=0; i<count; i++) {
579ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                if (token == null || mParams[i].token == token) {
5806dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn                    ViewRootImpl root = mRoots[i];
581ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    root.setStopped(stopped);
582ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                }
583ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            }
584ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn        }
585ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn    }
586ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
5875fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    public void reportNewConfiguration(Configuration config) {
5885fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        synchronized (this) {
5895fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            int count = mViews.length;
5905fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            config = new Configuration(config);
5915fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            for (int i=0; i<count; i++) {
5926dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn                ViewRootImpl root = mRoots[i];
5935fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                root.requestUpdateConfiguration(config);
5945fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            }
5955fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        }
5965fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    }
5975fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public WindowManager.LayoutParams getRootViewLayoutParameter(View view) {
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ViewParent vp = view.getParent();
6006dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        while (vp != null && !(vp instanceof ViewRootImpl)) {
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            vp = vp.getParent();
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (vp == null) return null;
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6066dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        ViewRootImpl vr = (ViewRootImpl)vp;
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int N = mRoots.length;
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < N; ++i) {
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mRoots[i] == vr) {
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mParams[i];
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void closeAll() {
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        closeAll(null, null, null);
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Display getDefaultDisplay() {
6235be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        return new Display(Display.DEFAULT_DISPLAY, null);
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
626bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    private static void removeItem(Object[] dst, Object[] src, int index) {
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dst.length > 0) {
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (index > 0) {
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.arraycopy(src, 0, dst, 0, index);
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (index < dst.length) {
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.arraycopy(src, index+1, dst, index, src.length-index-1);
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
637bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    private int findViewLocked(View view, boolean required) {
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int count = mViews != null ? mViews.length : 0;
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<count; i++) {
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mViews[i] == view) {
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return i;
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (required) {
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new IllegalArgumentException(
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "View not attached to window manager");
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return -1;
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
653