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