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