198365d7663cbd82979a5700faf0050220b01084dJeff Brown/* 298365d7663cbd82979a5700faf0050220b01084dJeff Brown * Copyright (C) 2012 The Android Open Source Project 398365d7663cbd82979a5700faf0050220b01084dJeff Brown * 498365d7663cbd82979a5700faf0050220b01084dJeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 598365d7663cbd82979a5700faf0050220b01084dJeff Brown * you may not use this file except in compliance with the License. 698365d7663cbd82979a5700faf0050220b01084dJeff Brown * You may obtain a copy of the License at 798365d7663cbd82979a5700faf0050220b01084dJeff Brown * 898365d7663cbd82979a5700faf0050220b01084dJeff Brown * http://www.apache.org/licenses/LICENSE-2.0 998365d7663cbd82979a5700faf0050220b01084dJeff Brown * 1098365d7663cbd82979a5700faf0050220b01084dJeff Brown * Unless required by applicable law or agreed to in writing, software 1198365d7663cbd82979a5700faf0050220b01084dJeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 1298365d7663cbd82979a5700faf0050220b01084dJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1398365d7663cbd82979a5700faf0050220b01084dJeff Brown * See the License for the specific language governing permissions and 1498365d7663cbd82979a5700faf0050220b01084dJeff Brown * limitations under the License. 1598365d7663cbd82979a5700faf0050220b01084dJeff Brown */ 1698365d7663cbd82979a5700faf0050220b01084dJeff Brown 1798365d7663cbd82979a5700faf0050220b01084dJeff Brownpackage android.view; 1898365d7663cbd82979a5700faf0050220b01084dJeff Brown 1998365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.animation.ValueAnimator; 2098365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.app.ActivityManager; 2198365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.content.ComponentCallbacks2; 2298365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.content.res.Configuration; 2398365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.opengl.ManagedEGLContext; 2498365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.os.IBinder; 2598365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.os.Looper; 2698365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.os.RemoteException; 2798365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.os.ServiceManager; 2898365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.os.SystemProperties; 2998365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.util.AndroidRuntimeException; 3098365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.util.Log; 3198365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.view.inputmethod.InputMethodManager; 3298365d7663cbd82979a5700faf0050220b01084dJeff Brown 3398365d7663cbd82979a5700faf0050220b01084dJeff Brownimport java.io.FileDescriptor; 3498365d7663cbd82979a5700faf0050220b01084dJeff Brownimport java.io.FileOutputStream; 3598365d7663cbd82979a5700faf0050220b01084dJeff Brownimport java.io.PrintWriter; 3698365d7663cbd82979a5700faf0050220b01084dJeff Brown 3798365d7663cbd82979a5700faf0050220b01084dJeff Brown/** 3898365d7663cbd82979a5700faf0050220b01084dJeff Brown * Provides low-level communication with the system window manager for 3998365d7663cbd82979a5700faf0050220b01084dJeff Brown * operations that are not associated with any particular context. 4098365d7663cbd82979a5700faf0050220b01084dJeff Brown * 4198365d7663cbd82979a5700faf0050220b01084dJeff Brown * This class is only used internally to implement global functions where 4298365d7663cbd82979a5700faf0050220b01084dJeff Brown * the caller already knows the display and relevant compatibility information 4398365d7663cbd82979a5700faf0050220b01084dJeff Brown * for the operation. For most purposes, you should use {@link WindowManager} instead 4498365d7663cbd82979a5700faf0050220b01084dJeff Brown * since it is bound to a context. 4598365d7663cbd82979a5700faf0050220b01084dJeff Brown * 4698365d7663cbd82979a5700faf0050220b01084dJeff Brown * @see WindowManagerImpl 4798365d7663cbd82979a5700faf0050220b01084dJeff Brown * @hide 4898365d7663cbd82979a5700faf0050220b01084dJeff Brown */ 4998365d7663cbd82979a5700faf0050220b01084dJeff Brownpublic final class WindowManagerGlobal { 5098365d7663cbd82979a5700faf0050220b01084dJeff Brown private static final String TAG = "WindowManager"; 5198365d7663cbd82979a5700faf0050220b01084dJeff Brown 5298365d7663cbd82979a5700faf0050220b01084dJeff Brown /** 5398365d7663cbd82979a5700faf0050220b01084dJeff Brown * The user is navigating with keys (not the touch screen), so 5498365d7663cbd82979a5700faf0050220b01084dJeff Brown * navigational focus should be shown. 5598365d7663cbd82979a5700faf0050220b01084dJeff Brown */ 5698365d7663cbd82979a5700faf0050220b01084dJeff Brown public static final int RELAYOUT_RES_IN_TOUCH_MODE = 0x1; 5798365d7663cbd82979a5700faf0050220b01084dJeff Brown 5898365d7663cbd82979a5700faf0050220b01084dJeff Brown /** 5998365d7663cbd82979a5700faf0050220b01084dJeff Brown * This is the first time the window is being drawn, 6098365d7663cbd82979a5700faf0050220b01084dJeff Brown * so the client must call drawingFinished() when done 6198365d7663cbd82979a5700faf0050220b01084dJeff Brown */ 6298365d7663cbd82979a5700faf0050220b01084dJeff Brown public static final int RELAYOUT_RES_FIRST_TIME = 0x2; 6398365d7663cbd82979a5700faf0050220b01084dJeff Brown 6498365d7663cbd82979a5700faf0050220b01084dJeff Brown /** 6598365d7663cbd82979a5700faf0050220b01084dJeff Brown * The window manager has changed the surface from the last call. 6698365d7663cbd82979a5700faf0050220b01084dJeff Brown */ 6798365d7663cbd82979a5700faf0050220b01084dJeff Brown public static final int RELAYOUT_RES_SURFACE_CHANGED = 0x4; 6898365d7663cbd82979a5700faf0050220b01084dJeff Brown 6998365d7663cbd82979a5700faf0050220b01084dJeff Brown /** 7098365d7663cbd82979a5700faf0050220b01084dJeff Brown * The window manager is currently animating. It will call 7198365d7663cbd82979a5700faf0050220b01084dJeff Brown * IWindow.doneAnimating() when done. 7298365d7663cbd82979a5700faf0050220b01084dJeff Brown */ 7398365d7663cbd82979a5700faf0050220b01084dJeff Brown public static final int RELAYOUT_RES_ANIMATING = 0x8; 7498365d7663cbd82979a5700faf0050220b01084dJeff Brown 7598365d7663cbd82979a5700faf0050220b01084dJeff Brown /** 7698365d7663cbd82979a5700faf0050220b01084dJeff Brown * Flag for relayout: the client will be later giving 7798365d7663cbd82979a5700faf0050220b01084dJeff Brown * internal insets; as a result, the window will not impact other window 7898365d7663cbd82979a5700faf0050220b01084dJeff Brown * layouts until the insets are given. 7998365d7663cbd82979a5700faf0050220b01084dJeff Brown */ 8098365d7663cbd82979a5700faf0050220b01084dJeff Brown public static final int RELAYOUT_INSETS_PENDING = 0x1; 8198365d7663cbd82979a5700faf0050220b01084dJeff Brown 8298365d7663cbd82979a5700faf0050220b01084dJeff Brown /** 8398365d7663cbd82979a5700faf0050220b01084dJeff Brown * Flag for relayout: the client may be currently using the current surface, 8498365d7663cbd82979a5700faf0050220b01084dJeff Brown * so if it is to be destroyed as a part of the relayout the destroy must 8598365d7663cbd82979a5700faf0050220b01084dJeff Brown * be deferred until later. The client will call performDeferredDestroy() 8698365d7663cbd82979a5700faf0050220b01084dJeff Brown * when it is okay. 8798365d7663cbd82979a5700faf0050220b01084dJeff Brown */ 8898365d7663cbd82979a5700faf0050220b01084dJeff Brown public static final int RELAYOUT_DEFER_SURFACE_DESTROY = 0x2; 8998365d7663cbd82979a5700faf0050220b01084dJeff Brown 9098365d7663cbd82979a5700faf0050220b01084dJeff Brown public static final int ADD_FLAG_APP_VISIBLE = 0x2; 9198365d7663cbd82979a5700faf0050220b01084dJeff Brown public static final int ADD_FLAG_IN_TOUCH_MODE = RELAYOUT_RES_IN_TOUCH_MODE; 9298365d7663cbd82979a5700faf0050220b01084dJeff Brown 9398365d7663cbd82979a5700faf0050220b01084dJeff Brown public static final int ADD_OKAY = 0; 9498365d7663cbd82979a5700faf0050220b01084dJeff Brown public static final int ADD_BAD_APP_TOKEN = -1; 9598365d7663cbd82979a5700faf0050220b01084dJeff Brown public static final int ADD_BAD_SUBWINDOW_TOKEN = -2; 9698365d7663cbd82979a5700faf0050220b01084dJeff Brown public static final int ADD_NOT_APP_TOKEN = -3; 9798365d7663cbd82979a5700faf0050220b01084dJeff Brown public static final int ADD_APP_EXITING = -4; 9898365d7663cbd82979a5700faf0050220b01084dJeff Brown public static final int ADD_DUPLICATE_ADD = -5; 9998365d7663cbd82979a5700faf0050220b01084dJeff Brown public static final int ADD_STARTING_NOT_NEEDED = -6; 10098365d7663cbd82979a5700faf0050220b01084dJeff Brown public static final int ADD_MULTIPLE_SINGLETON = -7; 10198365d7663cbd82979a5700faf0050220b01084dJeff Brown public static final int ADD_PERMISSION_DENIED = -8; 1022d5618c22101cfc4d6478cfe1d846798389540c1Craig Mautner public static final int ADD_INVALID_DISPLAY = -9; 10398365d7663cbd82979a5700faf0050220b01084dJeff Brown 10498365d7663cbd82979a5700faf0050220b01084dJeff Brown private static WindowManagerGlobal sDefaultWindowManager; 10598365d7663cbd82979a5700faf0050220b01084dJeff Brown private static IWindowManager sWindowManagerService; 10698365d7663cbd82979a5700faf0050220b01084dJeff Brown private static IWindowSession sWindowSession; 10798365d7663cbd82979a5700faf0050220b01084dJeff Brown 10898365d7663cbd82979a5700faf0050220b01084dJeff Brown private final Object mLock = new Object(); 10998365d7663cbd82979a5700faf0050220b01084dJeff Brown 11098365d7663cbd82979a5700faf0050220b01084dJeff Brown private View[] mViews; 11198365d7663cbd82979a5700faf0050220b01084dJeff Brown private ViewRootImpl[] mRoots; 11298365d7663cbd82979a5700faf0050220b01084dJeff Brown private WindowManager.LayoutParams[] mParams; 11398365d7663cbd82979a5700faf0050220b01084dJeff Brown private boolean mNeedsEglTerminate; 11498365d7663cbd82979a5700faf0050220b01084dJeff Brown 11598365d7663cbd82979a5700faf0050220b01084dJeff Brown private Runnable mSystemPropertyUpdater; 11698365d7663cbd82979a5700faf0050220b01084dJeff Brown 11798365d7663cbd82979a5700faf0050220b01084dJeff Brown private WindowManagerGlobal() { 11898365d7663cbd82979a5700faf0050220b01084dJeff Brown } 11998365d7663cbd82979a5700faf0050220b01084dJeff Brown 12098365d7663cbd82979a5700faf0050220b01084dJeff Brown public static WindowManagerGlobal getInstance() { 12198365d7663cbd82979a5700faf0050220b01084dJeff Brown synchronized (WindowManagerGlobal.class) { 12298365d7663cbd82979a5700faf0050220b01084dJeff Brown if (sDefaultWindowManager == null) { 12398365d7663cbd82979a5700faf0050220b01084dJeff Brown sDefaultWindowManager = new WindowManagerGlobal(); 12498365d7663cbd82979a5700faf0050220b01084dJeff Brown } 12598365d7663cbd82979a5700faf0050220b01084dJeff Brown return sDefaultWindowManager; 12698365d7663cbd82979a5700faf0050220b01084dJeff Brown } 12798365d7663cbd82979a5700faf0050220b01084dJeff Brown } 12898365d7663cbd82979a5700faf0050220b01084dJeff Brown 12998365d7663cbd82979a5700faf0050220b01084dJeff Brown public static IWindowManager getWindowManagerService() { 13098365d7663cbd82979a5700faf0050220b01084dJeff Brown synchronized (WindowManagerGlobal.class) { 13198365d7663cbd82979a5700faf0050220b01084dJeff Brown if (sWindowManagerService == null) { 13298365d7663cbd82979a5700faf0050220b01084dJeff Brown sWindowManagerService = IWindowManager.Stub.asInterface( 13398365d7663cbd82979a5700faf0050220b01084dJeff Brown ServiceManager.getService("window")); 13498365d7663cbd82979a5700faf0050220b01084dJeff Brown } 13598365d7663cbd82979a5700faf0050220b01084dJeff Brown return sWindowManagerService; 13698365d7663cbd82979a5700faf0050220b01084dJeff Brown } 13798365d7663cbd82979a5700faf0050220b01084dJeff Brown } 13898365d7663cbd82979a5700faf0050220b01084dJeff Brown 13998365d7663cbd82979a5700faf0050220b01084dJeff Brown public static IWindowSession getWindowSession(Looper mainLooper) { 14098365d7663cbd82979a5700faf0050220b01084dJeff Brown synchronized (WindowManagerGlobal.class) { 14198365d7663cbd82979a5700faf0050220b01084dJeff Brown if (sWindowSession == null) { 14298365d7663cbd82979a5700faf0050220b01084dJeff Brown try { 14398365d7663cbd82979a5700faf0050220b01084dJeff Brown InputMethodManager imm = InputMethodManager.getInstance(mainLooper); 14498365d7663cbd82979a5700faf0050220b01084dJeff Brown IWindowManager windowManager = getWindowManagerService(); 14598365d7663cbd82979a5700faf0050220b01084dJeff Brown sWindowSession = windowManager.openSession( 14698365d7663cbd82979a5700faf0050220b01084dJeff Brown imm.getClient(), imm.getInputContext()); 14798365d7663cbd82979a5700faf0050220b01084dJeff Brown float animatorScale = windowManager.getAnimationScale(2); 14898365d7663cbd82979a5700faf0050220b01084dJeff Brown ValueAnimator.setDurationScale(animatorScale); 14998365d7663cbd82979a5700faf0050220b01084dJeff Brown } catch (RemoteException e) { 15098365d7663cbd82979a5700faf0050220b01084dJeff Brown Log.e(TAG, "Failed to open window session", e); 15198365d7663cbd82979a5700faf0050220b01084dJeff Brown } 15298365d7663cbd82979a5700faf0050220b01084dJeff Brown } 15398365d7663cbd82979a5700faf0050220b01084dJeff Brown return sWindowSession; 15498365d7663cbd82979a5700faf0050220b01084dJeff Brown } 15598365d7663cbd82979a5700faf0050220b01084dJeff Brown } 15698365d7663cbd82979a5700faf0050220b01084dJeff Brown 15798365d7663cbd82979a5700faf0050220b01084dJeff Brown public static IWindowSession peekWindowSession() { 15898365d7663cbd82979a5700faf0050220b01084dJeff Brown synchronized (WindowManagerGlobal.class) { 15998365d7663cbd82979a5700faf0050220b01084dJeff Brown return sWindowSession; 16098365d7663cbd82979a5700faf0050220b01084dJeff Brown } 16198365d7663cbd82979a5700faf0050220b01084dJeff Brown } 16298365d7663cbd82979a5700faf0050220b01084dJeff Brown 16398365d7663cbd82979a5700faf0050220b01084dJeff Brown public void addView(View view, ViewGroup.LayoutParams params, 16498365d7663cbd82979a5700faf0050220b01084dJeff Brown Display display, Window parentWindow) { 16598365d7663cbd82979a5700faf0050220b01084dJeff Brown if (view == null) { 16698365d7663cbd82979a5700faf0050220b01084dJeff Brown throw new IllegalArgumentException("view must not be null"); 16798365d7663cbd82979a5700faf0050220b01084dJeff Brown } 16898365d7663cbd82979a5700faf0050220b01084dJeff Brown if (display == null) { 16998365d7663cbd82979a5700faf0050220b01084dJeff Brown throw new IllegalArgumentException("display must not be null"); 17098365d7663cbd82979a5700faf0050220b01084dJeff Brown } 17198365d7663cbd82979a5700faf0050220b01084dJeff Brown if (!(params instanceof WindowManager.LayoutParams)) { 17298365d7663cbd82979a5700faf0050220b01084dJeff Brown throw new IllegalArgumentException("Params must be WindowManager.LayoutParams"); 17398365d7663cbd82979a5700faf0050220b01084dJeff Brown } 17498365d7663cbd82979a5700faf0050220b01084dJeff Brown 17598365d7663cbd82979a5700faf0050220b01084dJeff Brown final WindowManager.LayoutParams wparams = (WindowManager.LayoutParams)params; 17698365d7663cbd82979a5700faf0050220b01084dJeff Brown if (parentWindow != null) { 17798365d7663cbd82979a5700faf0050220b01084dJeff Brown parentWindow.adjustLayoutParamsForSubWindow(wparams); 17898365d7663cbd82979a5700faf0050220b01084dJeff Brown } 17998365d7663cbd82979a5700faf0050220b01084dJeff Brown 18098365d7663cbd82979a5700faf0050220b01084dJeff Brown ViewRootImpl root; 18198365d7663cbd82979a5700faf0050220b01084dJeff Brown View panelParentView = null; 18298365d7663cbd82979a5700faf0050220b01084dJeff Brown 18398365d7663cbd82979a5700faf0050220b01084dJeff Brown synchronized (mLock) { 18498365d7663cbd82979a5700faf0050220b01084dJeff Brown // Start watching for system property changes. 18598365d7663cbd82979a5700faf0050220b01084dJeff Brown if (mSystemPropertyUpdater == null) { 18698365d7663cbd82979a5700faf0050220b01084dJeff Brown mSystemPropertyUpdater = new Runnable() { 18798365d7663cbd82979a5700faf0050220b01084dJeff Brown @Override public void run() { 18898365d7663cbd82979a5700faf0050220b01084dJeff Brown synchronized (mLock) { 1896018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner for (ViewRootImpl viewRoot : mRoots) { 1906018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner viewRoot.loadSystemProperties(); 19198365d7663cbd82979a5700faf0050220b01084dJeff Brown } 19298365d7663cbd82979a5700faf0050220b01084dJeff Brown } 19398365d7663cbd82979a5700faf0050220b01084dJeff Brown } 19498365d7663cbd82979a5700faf0050220b01084dJeff Brown }; 19598365d7663cbd82979a5700faf0050220b01084dJeff Brown SystemProperties.addChangeCallback(mSystemPropertyUpdater); 19698365d7663cbd82979a5700faf0050220b01084dJeff Brown } 19798365d7663cbd82979a5700faf0050220b01084dJeff Brown 19898365d7663cbd82979a5700faf0050220b01084dJeff Brown int index = findViewLocked(view, false); 19998365d7663cbd82979a5700faf0050220b01084dJeff Brown if (index >= 0) { 20098365d7663cbd82979a5700faf0050220b01084dJeff Brown throw new IllegalStateException("View " + view 20198365d7663cbd82979a5700faf0050220b01084dJeff Brown + " has already been added to the window manager."); 20298365d7663cbd82979a5700faf0050220b01084dJeff Brown } 20398365d7663cbd82979a5700faf0050220b01084dJeff Brown 20498365d7663cbd82979a5700faf0050220b01084dJeff Brown // If this is a panel window, then find the window it is being 20598365d7663cbd82979a5700faf0050220b01084dJeff Brown // attached to for future reference. 20698365d7663cbd82979a5700faf0050220b01084dJeff Brown if (wparams.type >= WindowManager.LayoutParams.FIRST_SUB_WINDOW && 20798365d7663cbd82979a5700faf0050220b01084dJeff Brown wparams.type <= WindowManager.LayoutParams.LAST_SUB_WINDOW) { 20898365d7663cbd82979a5700faf0050220b01084dJeff Brown final int count = mViews != null ? mViews.length : 0; 20998365d7663cbd82979a5700faf0050220b01084dJeff Brown for (int i=0; i<count; i++) { 21098365d7663cbd82979a5700faf0050220b01084dJeff Brown if (mRoots[i].mWindow.asBinder() == wparams.token) { 21198365d7663cbd82979a5700faf0050220b01084dJeff Brown panelParentView = mViews[i]; 21298365d7663cbd82979a5700faf0050220b01084dJeff Brown } 21398365d7663cbd82979a5700faf0050220b01084dJeff Brown } 21498365d7663cbd82979a5700faf0050220b01084dJeff Brown } 21598365d7663cbd82979a5700faf0050220b01084dJeff Brown 21698365d7663cbd82979a5700faf0050220b01084dJeff Brown root = new ViewRootImpl(view.getContext(), display); 21798365d7663cbd82979a5700faf0050220b01084dJeff Brown 21898365d7663cbd82979a5700faf0050220b01084dJeff Brown view.setLayoutParams(wparams); 21998365d7663cbd82979a5700faf0050220b01084dJeff Brown 22098365d7663cbd82979a5700faf0050220b01084dJeff Brown if (mViews == null) { 22198365d7663cbd82979a5700faf0050220b01084dJeff Brown index = 1; 22298365d7663cbd82979a5700faf0050220b01084dJeff Brown mViews = new View[1]; 22398365d7663cbd82979a5700faf0050220b01084dJeff Brown mRoots = new ViewRootImpl[1]; 22498365d7663cbd82979a5700faf0050220b01084dJeff Brown mParams = new WindowManager.LayoutParams[1]; 22598365d7663cbd82979a5700faf0050220b01084dJeff Brown } else { 22698365d7663cbd82979a5700faf0050220b01084dJeff Brown index = mViews.length + 1; 22798365d7663cbd82979a5700faf0050220b01084dJeff Brown Object[] old = mViews; 22898365d7663cbd82979a5700faf0050220b01084dJeff Brown mViews = new View[index]; 22998365d7663cbd82979a5700faf0050220b01084dJeff Brown System.arraycopy(old, 0, mViews, 0, index-1); 23098365d7663cbd82979a5700faf0050220b01084dJeff Brown old = mRoots; 23198365d7663cbd82979a5700faf0050220b01084dJeff Brown mRoots = new ViewRootImpl[index]; 23298365d7663cbd82979a5700faf0050220b01084dJeff Brown System.arraycopy(old, 0, mRoots, 0, index-1); 23398365d7663cbd82979a5700faf0050220b01084dJeff Brown old = mParams; 23498365d7663cbd82979a5700faf0050220b01084dJeff Brown mParams = new WindowManager.LayoutParams[index]; 23598365d7663cbd82979a5700faf0050220b01084dJeff Brown System.arraycopy(old, 0, mParams, 0, index-1); 23698365d7663cbd82979a5700faf0050220b01084dJeff Brown } 23798365d7663cbd82979a5700faf0050220b01084dJeff Brown index--; 23898365d7663cbd82979a5700faf0050220b01084dJeff Brown 23998365d7663cbd82979a5700faf0050220b01084dJeff Brown mViews[index] = view; 24098365d7663cbd82979a5700faf0050220b01084dJeff Brown mRoots[index] = root; 24198365d7663cbd82979a5700faf0050220b01084dJeff Brown mParams[index] = wparams; 24298365d7663cbd82979a5700faf0050220b01084dJeff Brown } 24398365d7663cbd82979a5700faf0050220b01084dJeff Brown 24498365d7663cbd82979a5700faf0050220b01084dJeff Brown // do this last because it fires off messages to start doing things 2456018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner try { 2466018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner root.setView(view, wparams, panelParentView); 2476018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner } catch (RuntimeException e) { 2486018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner // BadTokenException or InvalidDisplayException, clean up. 2496018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner synchronized (mLock) { 2506018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner final int index = findViewLocked(view, false); 2516018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner if (index >= 0) { 2526018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner removeViewLocked(index, true); 2536018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner } 2546018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner } 2556018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner throw e; 2566018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner } 25798365d7663cbd82979a5700faf0050220b01084dJeff Brown } 25898365d7663cbd82979a5700faf0050220b01084dJeff Brown 25998365d7663cbd82979a5700faf0050220b01084dJeff Brown public void updateViewLayout(View view, ViewGroup.LayoutParams params) { 26098365d7663cbd82979a5700faf0050220b01084dJeff Brown if (view == null) { 26198365d7663cbd82979a5700faf0050220b01084dJeff Brown throw new IllegalArgumentException("view must not be null"); 26298365d7663cbd82979a5700faf0050220b01084dJeff Brown } 26398365d7663cbd82979a5700faf0050220b01084dJeff Brown if (!(params instanceof WindowManager.LayoutParams)) { 26498365d7663cbd82979a5700faf0050220b01084dJeff Brown throw new IllegalArgumentException("Params must be WindowManager.LayoutParams"); 26598365d7663cbd82979a5700faf0050220b01084dJeff Brown } 26698365d7663cbd82979a5700faf0050220b01084dJeff Brown 26798365d7663cbd82979a5700faf0050220b01084dJeff Brown final WindowManager.LayoutParams wparams = (WindowManager.LayoutParams)params; 26898365d7663cbd82979a5700faf0050220b01084dJeff Brown 26998365d7663cbd82979a5700faf0050220b01084dJeff Brown view.setLayoutParams(wparams); 27098365d7663cbd82979a5700faf0050220b01084dJeff Brown 27198365d7663cbd82979a5700faf0050220b01084dJeff Brown synchronized (mLock) { 27298365d7663cbd82979a5700faf0050220b01084dJeff Brown int index = findViewLocked(view, true); 27398365d7663cbd82979a5700faf0050220b01084dJeff Brown ViewRootImpl root = mRoots[index]; 27498365d7663cbd82979a5700faf0050220b01084dJeff Brown mParams[index] = wparams; 27598365d7663cbd82979a5700faf0050220b01084dJeff Brown root.setLayoutParams(wparams, false); 27698365d7663cbd82979a5700faf0050220b01084dJeff Brown } 27798365d7663cbd82979a5700faf0050220b01084dJeff Brown } 27898365d7663cbd82979a5700faf0050220b01084dJeff Brown 27998365d7663cbd82979a5700faf0050220b01084dJeff Brown public void removeView(View view, boolean immediate) { 28098365d7663cbd82979a5700faf0050220b01084dJeff Brown if (view == null) { 28198365d7663cbd82979a5700faf0050220b01084dJeff Brown throw new IllegalArgumentException("view must not be null"); 28298365d7663cbd82979a5700faf0050220b01084dJeff Brown } 28398365d7663cbd82979a5700faf0050220b01084dJeff Brown 28498365d7663cbd82979a5700faf0050220b01084dJeff Brown synchronized (mLock) { 28598365d7663cbd82979a5700faf0050220b01084dJeff Brown int index = findViewLocked(view, true); 28698365d7663cbd82979a5700faf0050220b01084dJeff Brown View curView = removeViewLocked(index, immediate); 28798365d7663cbd82979a5700faf0050220b01084dJeff Brown if (curView == view) { 28898365d7663cbd82979a5700faf0050220b01084dJeff Brown return; 28998365d7663cbd82979a5700faf0050220b01084dJeff Brown } 29098365d7663cbd82979a5700faf0050220b01084dJeff Brown 29198365d7663cbd82979a5700faf0050220b01084dJeff Brown throw new IllegalStateException("Calling with view " + view 29298365d7663cbd82979a5700faf0050220b01084dJeff Brown + " but the ViewAncestor is attached to " + curView); 29398365d7663cbd82979a5700faf0050220b01084dJeff Brown } 29498365d7663cbd82979a5700faf0050220b01084dJeff Brown } 29598365d7663cbd82979a5700faf0050220b01084dJeff Brown 29698365d7663cbd82979a5700faf0050220b01084dJeff Brown public void closeAll(IBinder token, String who, String what) { 29798365d7663cbd82979a5700faf0050220b01084dJeff Brown synchronized (mLock) { 29898365d7663cbd82979a5700faf0050220b01084dJeff Brown if (mViews == null) 29998365d7663cbd82979a5700faf0050220b01084dJeff Brown return; 30098365d7663cbd82979a5700faf0050220b01084dJeff Brown 30198365d7663cbd82979a5700faf0050220b01084dJeff Brown int count = mViews.length; 30298365d7663cbd82979a5700faf0050220b01084dJeff Brown //Log.i("foo", "Closing all windows of " + token); 30398365d7663cbd82979a5700faf0050220b01084dJeff Brown for (int i=0; i<count; i++) { 30498365d7663cbd82979a5700faf0050220b01084dJeff Brown //Log.i("foo", "@ " + i + " token " + mParams[i].token 30598365d7663cbd82979a5700faf0050220b01084dJeff Brown // + " view " + mRoots[i].getView()); 30698365d7663cbd82979a5700faf0050220b01084dJeff Brown if (token == null || mParams[i].token == token) { 30798365d7663cbd82979a5700faf0050220b01084dJeff Brown ViewRootImpl root = mRoots[i]; 30898365d7663cbd82979a5700faf0050220b01084dJeff Brown 30998365d7663cbd82979a5700faf0050220b01084dJeff Brown //Log.i("foo", "Force closing " + root); 31098365d7663cbd82979a5700faf0050220b01084dJeff Brown if (who != null) { 31198365d7663cbd82979a5700faf0050220b01084dJeff Brown WindowLeaked leak = new WindowLeaked( 31298365d7663cbd82979a5700faf0050220b01084dJeff Brown what + " " + who + " has leaked window " 31398365d7663cbd82979a5700faf0050220b01084dJeff Brown + root.getView() + " that was originally added here"); 31498365d7663cbd82979a5700faf0050220b01084dJeff Brown leak.setStackTrace(root.getLocation().getStackTrace()); 31598365d7663cbd82979a5700faf0050220b01084dJeff Brown Log.e(TAG, leak.getMessage(), leak); 31698365d7663cbd82979a5700faf0050220b01084dJeff Brown } 31798365d7663cbd82979a5700faf0050220b01084dJeff Brown 31898365d7663cbd82979a5700faf0050220b01084dJeff Brown removeViewLocked(i, false); 31998365d7663cbd82979a5700faf0050220b01084dJeff Brown i--; 32098365d7663cbd82979a5700faf0050220b01084dJeff Brown count--; 32198365d7663cbd82979a5700faf0050220b01084dJeff Brown } 32298365d7663cbd82979a5700faf0050220b01084dJeff Brown } 32398365d7663cbd82979a5700faf0050220b01084dJeff Brown } 32498365d7663cbd82979a5700faf0050220b01084dJeff Brown } 32598365d7663cbd82979a5700faf0050220b01084dJeff Brown 32698365d7663cbd82979a5700faf0050220b01084dJeff Brown private View removeViewLocked(int index, boolean immediate) { 32798365d7663cbd82979a5700faf0050220b01084dJeff Brown ViewRootImpl root = mRoots[index]; 32898365d7663cbd82979a5700faf0050220b01084dJeff Brown View view = root.getView(); 32998365d7663cbd82979a5700faf0050220b01084dJeff Brown 33098365d7663cbd82979a5700faf0050220b01084dJeff Brown if (view != null) { 33198365d7663cbd82979a5700faf0050220b01084dJeff Brown InputMethodManager imm = InputMethodManager.getInstance(view.getContext()); 33298365d7663cbd82979a5700faf0050220b01084dJeff Brown if (imm != null) { 33398365d7663cbd82979a5700faf0050220b01084dJeff Brown imm.windowDismissed(mViews[index].getWindowToken()); 33498365d7663cbd82979a5700faf0050220b01084dJeff Brown } 33598365d7663cbd82979a5700faf0050220b01084dJeff Brown } 33698365d7663cbd82979a5700faf0050220b01084dJeff Brown root.die(immediate); 33798365d7663cbd82979a5700faf0050220b01084dJeff Brown 33898365d7663cbd82979a5700faf0050220b01084dJeff Brown final int count = mViews.length; 33998365d7663cbd82979a5700faf0050220b01084dJeff Brown 34098365d7663cbd82979a5700faf0050220b01084dJeff Brown // remove it from the list 34198365d7663cbd82979a5700faf0050220b01084dJeff Brown View[] tmpViews = new View[count-1]; 34298365d7663cbd82979a5700faf0050220b01084dJeff Brown removeItem(tmpViews, mViews, index); 34398365d7663cbd82979a5700faf0050220b01084dJeff Brown mViews = tmpViews; 34498365d7663cbd82979a5700faf0050220b01084dJeff Brown 34598365d7663cbd82979a5700faf0050220b01084dJeff Brown ViewRootImpl[] tmpRoots = new ViewRootImpl[count-1]; 34698365d7663cbd82979a5700faf0050220b01084dJeff Brown removeItem(tmpRoots, mRoots, index); 34798365d7663cbd82979a5700faf0050220b01084dJeff Brown mRoots = tmpRoots; 34898365d7663cbd82979a5700faf0050220b01084dJeff Brown 34998365d7663cbd82979a5700faf0050220b01084dJeff Brown WindowManager.LayoutParams[] tmpParams 35098365d7663cbd82979a5700faf0050220b01084dJeff Brown = new WindowManager.LayoutParams[count-1]; 35198365d7663cbd82979a5700faf0050220b01084dJeff Brown removeItem(tmpParams, mParams, index); 35298365d7663cbd82979a5700faf0050220b01084dJeff Brown mParams = tmpParams; 35398365d7663cbd82979a5700faf0050220b01084dJeff Brown 35498365d7663cbd82979a5700faf0050220b01084dJeff Brown if (view != null) { 35598365d7663cbd82979a5700faf0050220b01084dJeff Brown view.assignParent(null); 35698365d7663cbd82979a5700faf0050220b01084dJeff Brown // func doesn't allow null... does it matter if we clear them? 35798365d7663cbd82979a5700faf0050220b01084dJeff Brown //view.setLayoutParams(null); 35898365d7663cbd82979a5700faf0050220b01084dJeff Brown } 35998365d7663cbd82979a5700faf0050220b01084dJeff Brown return view; 36098365d7663cbd82979a5700faf0050220b01084dJeff Brown } 36198365d7663cbd82979a5700faf0050220b01084dJeff Brown 36298365d7663cbd82979a5700faf0050220b01084dJeff Brown private static void removeItem(Object[] dst, Object[] src, int index) { 36398365d7663cbd82979a5700faf0050220b01084dJeff Brown if (dst.length > 0) { 36498365d7663cbd82979a5700faf0050220b01084dJeff Brown if (index > 0) { 36598365d7663cbd82979a5700faf0050220b01084dJeff Brown System.arraycopy(src, 0, dst, 0, index); 36698365d7663cbd82979a5700faf0050220b01084dJeff Brown } 36798365d7663cbd82979a5700faf0050220b01084dJeff Brown if (index < dst.length) { 36898365d7663cbd82979a5700faf0050220b01084dJeff Brown System.arraycopy(src, index+1, dst, index, src.length-index-1); 36998365d7663cbd82979a5700faf0050220b01084dJeff Brown } 37098365d7663cbd82979a5700faf0050220b01084dJeff Brown } 37198365d7663cbd82979a5700faf0050220b01084dJeff Brown } 37298365d7663cbd82979a5700faf0050220b01084dJeff Brown 37398365d7663cbd82979a5700faf0050220b01084dJeff Brown private int findViewLocked(View view, boolean required) { 3746018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner if (mViews != null) { 3756018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner final int count = mViews.length; 3766018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner for (int i = 0; i < count; i++) { 3776018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner if (mViews[i] == view) { 3786018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner return i; 37998365d7663cbd82979a5700faf0050220b01084dJeff Brown } 38098365d7663cbd82979a5700faf0050220b01084dJeff Brown } 38198365d7663cbd82979a5700faf0050220b01084dJeff Brown } 3826018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner if (required) { 3836018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner throw new IllegalArgumentException("View not attached to window manager"); 3846018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner } 3856018aeec27914f138f36b00d8f00136a87562fd3Craig Mautner return -1; 38698365d7663cbd82979a5700faf0050220b01084dJeff Brown } 38798365d7663cbd82979a5700faf0050220b01084dJeff Brown 38898365d7663cbd82979a5700faf0050220b01084dJeff Brown public void startTrimMemory(int level) { 38998365d7663cbd82979a5700faf0050220b01084dJeff Brown if (HardwareRenderer.isAvailable()) { 39098365d7663cbd82979a5700faf0050220b01084dJeff Brown // On low-end gfx devices we trim when memory is moderate; 39198365d7663cbd82979a5700faf0050220b01084dJeff Brown // on high-end devices we do this when low. 39298365d7663cbd82979a5700faf0050220b01084dJeff Brown if (level >= ComponentCallbacks2.TRIM_MEMORY_COMPLETE 39398365d7663cbd82979a5700faf0050220b01084dJeff Brown || (level >= ComponentCallbacks2.TRIM_MEMORY_MODERATE 39498365d7663cbd82979a5700faf0050220b01084dJeff Brown && !ActivityManager.isHighEndGfx())) { 39598365d7663cbd82979a5700faf0050220b01084dJeff Brown // Destroy all hardware surfaces and resources associated to 39698365d7663cbd82979a5700faf0050220b01084dJeff Brown // known windows 39798365d7663cbd82979a5700faf0050220b01084dJeff Brown synchronized (mLock) { 39898365d7663cbd82979a5700faf0050220b01084dJeff Brown if (mViews == null) return; 39998365d7663cbd82979a5700faf0050220b01084dJeff Brown int count = mViews.length; 40098365d7663cbd82979a5700faf0050220b01084dJeff Brown for (int i = 0; i < count; i++) { 40198365d7663cbd82979a5700faf0050220b01084dJeff Brown mRoots[i].terminateHardwareResources(); 40298365d7663cbd82979a5700faf0050220b01084dJeff Brown } 40398365d7663cbd82979a5700faf0050220b01084dJeff Brown } 40498365d7663cbd82979a5700faf0050220b01084dJeff Brown // Force a full memory flush 40598365d7663cbd82979a5700faf0050220b01084dJeff Brown mNeedsEglTerminate = true; 40698365d7663cbd82979a5700faf0050220b01084dJeff Brown HardwareRenderer.startTrimMemory(ComponentCallbacks2.TRIM_MEMORY_COMPLETE); 40798365d7663cbd82979a5700faf0050220b01084dJeff Brown return; 40898365d7663cbd82979a5700faf0050220b01084dJeff Brown } 40998365d7663cbd82979a5700faf0050220b01084dJeff Brown 41098365d7663cbd82979a5700faf0050220b01084dJeff Brown HardwareRenderer.startTrimMemory(level); 41198365d7663cbd82979a5700faf0050220b01084dJeff Brown } 41298365d7663cbd82979a5700faf0050220b01084dJeff Brown } 41398365d7663cbd82979a5700faf0050220b01084dJeff Brown 41498365d7663cbd82979a5700faf0050220b01084dJeff Brown public void endTrimMemory() { 41598365d7663cbd82979a5700faf0050220b01084dJeff Brown HardwareRenderer.endTrimMemory(); 41698365d7663cbd82979a5700faf0050220b01084dJeff Brown 41798365d7663cbd82979a5700faf0050220b01084dJeff Brown if (mNeedsEglTerminate) { 41898365d7663cbd82979a5700faf0050220b01084dJeff Brown ManagedEGLContext.doTerminate(); 41998365d7663cbd82979a5700faf0050220b01084dJeff Brown mNeedsEglTerminate = false; 42098365d7663cbd82979a5700faf0050220b01084dJeff Brown } 42198365d7663cbd82979a5700faf0050220b01084dJeff Brown } 42298365d7663cbd82979a5700faf0050220b01084dJeff Brown 42398365d7663cbd82979a5700faf0050220b01084dJeff Brown public void trimLocalMemory() { 42498365d7663cbd82979a5700faf0050220b01084dJeff Brown synchronized (mLock) { 42598365d7663cbd82979a5700faf0050220b01084dJeff Brown if (mViews == null) return; 42698365d7663cbd82979a5700faf0050220b01084dJeff Brown int count = mViews.length; 42798365d7663cbd82979a5700faf0050220b01084dJeff Brown for (int i = 0; i < count; i++) { 42898365d7663cbd82979a5700faf0050220b01084dJeff Brown mRoots[i].destroyHardwareLayers(); 42998365d7663cbd82979a5700faf0050220b01084dJeff Brown } 43098365d7663cbd82979a5700faf0050220b01084dJeff Brown } 43198365d7663cbd82979a5700faf0050220b01084dJeff Brown } 43298365d7663cbd82979a5700faf0050220b01084dJeff Brown 43398365d7663cbd82979a5700faf0050220b01084dJeff Brown public void dumpGfxInfo(FileDescriptor fd) { 43498365d7663cbd82979a5700faf0050220b01084dJeff Brown FileOutputStream fout = new FileOutputStream(fd); 43598365d7663cbd82979a5700faf0050220b01084dJeff Brown PrintWriter pw = new PrintWriter(fout); 43698365d7663cbd82979a5700faf0050220b01084dJeff Brown try { 43798365d7663cbd82979a5700faf0050220b01084dJeff Brown synchronized (mLock) { 43898365d7663cbd82979a5700faf0050220b01084dJeff Brown if (mViews != null) { 43998365d7663cbd82979a5700faf0050220b01084dJeff Brown final int count = mViews.length; 44098365d7663cbd82979a5700faf0050220b01084dJeff Brown 44198365d7663cbd82979a5700faf0050220b01084dJeff Brown pw.println("Profile data in ms:"); 44298365d7663cbd82979a5700faf0050220b01084dJeff Brown 44398365d7663cbd82979a5700faf0050220b01084dJeff Brown for (int i = 0; i < count; i++) { 44498365d7663cbd82979a5700faf0050220b01084dJeff Brown ViewRootImpl root = mRoots[i]; 44598365d7663cbd82979a5700faf0050220b01084dJeff Brown String name = getWindowName(root); 44698365d7663cbd82979a5700faf0050220b01084dJeff Brown pw.printf("\n\t%s", name); 44798365d7663cbd82979a5700faf0050220b01084dJeff Brown 44898365d7663cbd82979a5700faf0050220b01084dJeff Brown HardwareRenderer renderer = 44998365d7663cbd82979a5700faf0050220b01084dJeff Brown root.getView().mAttachInfo.mHardwareRenderer; 45098365d7663cbd82979a5700faf0050220b01084dJeff Brown if (renderer != null) { 45198365d7663cbd82979a5700faf0050220b01084dJeff Brown renderer.dumpGfxInfo(pw); 45298365d7663cbd82979a5700faf0050220b01084dJeff Brown } 45398365d7663cbd82979a5700faf0050220b01084dJeff Brown } 45498365d7663cbd82979a5700faf0050220b01084dJeff Brown 45598365d7663cbd82979a5700faf0050220b01084dJeff Brown pw.println("\nView hierarchy:\n"); 45698365d7663cbd82979a5700faf0050220b01084dJeff Brown 45798365d7663cbd82979a5700faf0050220b01084dJeff Brown int viewsCount = 0; 45898365d7663cbd82979a5700faf0050220b01084dJeff Brown int displayListsSize = 0; 45998365d7663cbd82979a5700faf0050220b01084dJeff Brown int[] info = new int[2]; 46098365d7663cbd82979a5700faf0050220b01084dJeff Brown 46198365d7663cbd82979a5700faf0050220b01084dJeff Brown for (int i = 0; i < count; i++) { 46298365d7663cbd82979a5700faf0050220b01084dJeff Brown ViewRootImpl root = mRoots[i]; 46398365d7663cbd82979a5700faf0050220b01084dJeff Brown root.dumpGfxInfo(info); 46498365d7663cbd82979a5700faf0050220b01084dJeff Brown 46598365d7663cbd82979a5700faf0050220b01084dJeff Brown String name = getWindowName(root); 46698365d7663cbd82979a5700faf0050220b01084dJeff Brown pw.printf(" %s\n %d views, %.2f kB of display lists", 46798365d7663cbd82979a5700faf0050220b01084dJeff Brown name, info[0], info[1] / 1024.0f); 46898365d7663cbd82979a5700faf0050220b01084dJeff Brown HardwareRenderer renderer = 46998365d7663cbd82979a5700faf0050220b01084dJeff Brown root.getView().mAttachInfo.mHardwareRenderer; 47098365d7663cbd82979a5700faf0050220b01084dJeff Brown if (renderer != null) { 47198365d7663cbd82979a5700faf0050220b01084dJeff Brown pw.printf(", %d frames rendered", renderer.getFrameCount()); 47298365d7663cbd82979a5700faf0050220b01084dJeff Brown } 47398365d7663cbd82979a5700faf0050220b01084dJeff Brown pw.printf("\n\n"); 47498365d7663cbd82979a5700faf0050220b01084dJeff Brown 47598365d7663cbd82979a5700faf0050220b01084dJeff Brown viewsCount += info[0]; 47698365d7663cbd82979a5700faf0050220b01084dJeff Brown displayListsSize += info[1]; 47798365d7663cbd82979a5700faf0050220b01084dJeff Brown } 47898365d7663cbd82979a5700faf0050220b01084dJeff Brown 47998365d7663cbd82979a5700faf0050220b01084dJeff Brown pw.printf("\nTotal ViewRootImpl: %d\n", count); 48098365d7663cbd82979a5700faf0050220b01084dJeff Brown pw.printf("Total Views: %d\n", viewsCount); 48198365d7663cbd82979a5700faf0050220b01084dJeff Brown pw.printf("Total DisplayList: %.2f kB\n\n", displayListsSize / 1024.0f); 48298365d7663cbd82979a5700faf0050220b01084dJeff Brown } 48398365d7663cbd82979a5700faf0050220b01084dJeff Brown } 48498365d7663cbd82979a5700faf0050220b01084dJeff Brown } finally { 48598365d7663cbd82979a5700faf0050220b01084dJeff Brown pw.flush(); 48698365d7663cbd82979a5700faf0050220b01084dJeff Brown } 48798365d7663cbd82979a5700faf0050220b01084dJeff Brown } 48898365d7663cbd82979a5700faf0050220b01084dJeff Brown 48998365d7663cbd82979a5700faf0050220b01084dJeff Brown private static String getWindowName(ViewRootImpl root) { 49098365d7663cbd82979a5700faf0050220b01084dJeff Brown return root.mWindowAttributes.getTitle() + "/" + 49198365d7663cbd82979a5700faf0050220b01084dJeff Brown root.getClass().getName() + '@' + Integer.toHexString(root.hashCode()); 49298365d7663cbd82979a5700faf0050220b01084dJeff Brown } 49398365d7663cbd82979a5700faf0050220b01084dJeff Brown 49498365d7663cbd82979a5700faf0050220b01084dJeff Brown public void setStoppedState(IBinder token, boolean stopped) { 49598365d7663cbd82979a5700faf0050220b01084dJeff Brown synchronized (mLock) { 49698365d7663cbd82979a5700faf0050220b01084dJeff Brown if (mViews != null) { 49798365d7663cbd82979a5700faf0050220b01084dJeff Brown int count = mViews.length; 49898365d7663cbd82979a5700faf0050220b01084dJeff Brown for (int i=0; i < count; i++) { 49998365d7663cbd82979a5700faf0050220b01084dJeff Brown if (token == null || mParams[i].token == token) { 50098365d7663cbd82979a5700faf0050220b01084dJeff Brown ViewRootImpl root = mRoots[i]; 50198365d7663cbd82979a5700faf0050220b01084dJeff Brown root.setStopped(stopped); 50298365d7663cbd82979a5700faf0050220b01084dJeff Brown } 50398365d7663cbd82979a5700faf0050220b01084dJeff Brown } 50498365d7663cbd82979a5700faf0050220b01084dJeff Brown } 50598365d7663cbd82979a5700faf0050220b01084dJeff Brown } 50698365d7663cbd82979a5700faf0050220b01084dJeff Brown } 50798365d7663cbd82979a5700faf0050220b01084dJeff Brown 50898365d7663cbd82979a5700faf0050220b01084dJeff Brown public void reportNewConfiguration(Configuration config) { 50998365d7663cbd82979a5700faf0050220b01084dJeff Brown synchronized (mLock) { 51098365d7663cbd82979a5700faf0050220b01084dJeff Brown if (mViews != null) { 51198365d7663cbd82979a5700faf0050220b01084dJeff Brown int count = mViews.length; 51298365d7663cbd82979a5700faf0050220b01084dJeff Brown config = new Configuration(config); 51398365d7663cbd82979a5700faf0050220b01084dJeff Brown for (int i=0; i < count; i++) { 51498365d7663cbd82979a5700faf0050220b01084dJeff Brown ViewRootImpl root = mRoots[i]; 51598365d7663cbd82979a5700faf0050220b01084dJeff Brown root.requestUpdateConfiguration(config); 51698365d7663cbd82979a5700faf0050220b01084dJeff Brown } 51798365d7663cbd82979a5700faf0050220b01084dJeff Brown } 51898365d7663cbd82979a5700faf0050220b01084dJeff Brown } 51998365d7663cbd82979a5700faf0050220b01084dJeff Brown } 52098365d7663cbd82979a5700faf0050220b01084dJeff Brown} 52198365d7663cbd82979a5700faf0050220b01084dJeff Brown 52298365d7663cbd82979a5700faf0050220b01084dJeff Brownfinal class WindowLeaked extends AndroidRuntimeException { 52398365d7663cbd82979a5700faf0050220b01084dJeff Brown public WindowLeaked(String msg) { 52498365d7663cbd82979a5700faf0050220b01084dJeff Brown super(msg); 52598365d7663cbd82979a5700faf0050220b01084dJeff Brown } 52698365d7663cbd82979a5700faf0050220b01084dJeff Brown} 527