Loading core/java/android/view/WindowManagerGlobal.java +83 −144 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import android.view.inputmethod.InputMethodManager; import java.io.FileDescriptor; import java.io.FileOutputStream; import java.io.PrintWriter; import java.util.ArrayList; /** * Provides low-level communication with the system window manager for Loading Loading @@ -106,9 +107,10 @@ public final class WindowManagerGlobal { private final Object mLock = new Object(); private View[] mViews; private ViewRootImpl[] mRoots; private WindowManager.LayoutParams[] mParams; private final ArrayList<View> mViews = new ArrayList<View>(); private final ArrayList<ViewRootImpl> mRoots = new ArrayList<ViewRootImpl>(); private final ArrayList<WindowManager.LayoutParams> mParams = new ArrayList<WindowManager.LayoutParams>(); private boolean mNeedsEglTerminate; private Runnable mSystemPropertyUpdater; Loading Loading @@ -161,11 +163,10 @@ public final class WindowManagerGlobal { public String[] getViewRootNames() { synchronized (mLock) { if (mRoots == null) return new String[0]; String[] mViewRoots = new String[mRoots.length]; int i = 0; for (ViewRootImpl root : mRoots) { mViewRoots[i++] = getWindowName(root); final int numRoots = mRoots.size(); String[] mViewRoots = new String[numRoots]; for (int i = 0; i < numRoots; ++i) { mViewRoots[i] = getWindowName(mRoots.get(i)); } return mViewRoots; } Loading @@ -173,8 +174,8 @@ public final class WindowManagerGlobal { public View getRootView(String name) { synchronized (mLock) { if (mRoots == null) return null; for (ViewRootImpl root : mRoots) { for (int i = mRoots.size() - 1; i >= 0; --i) { final ViewRootImpl root = mRoots.get(i); if (name.equals(getWindowName(root))) return root.getView(); } } Loading Loading @@ -208,8 +209,8 @@ public final class WindowManagerGlobal { mSystemPropertyUpdater = new Runnable() { @Override public void run() { synchronized (mLock) { for (ViewRootImpl viewRoot : mRoots) { viewRoot.loadSystemProperties(); for (int i = mRoots.size() - 1; i >= 0; --i) { mRoots.get(i).loadSystemProperties(); } } } Loading @@ -227,10 +228,10 @@ public final class WindowManagerGlobal { // attached to for future reference. if (wparams.type >= WindowManager.LayoutParams.FIRST_SUB_WINDOW && wparams.type <= WindowManager.LayoutParams.LAST_SUB_WINDOW) { final int count = mViews != null ? mViews.length : 0; final int count = mViews.size(); for (int i = 0; i < count; i++) { if (mRoots[i].mWindow.asBinder() == wparams.token) { panelParentView = mViews[i]; if (mRoots.get(i).mWindow.asBinder() == wparams.token) { panelParentView = mViews.get(i); } } } Loading @@ -239,28 +240,9 @@ public final class WindowManagerGlobal { view.setLayoutParams(wparams); if (mViews == null) { index = 1; mViews = new View[1]; mRoots = new ViewRootImpl[1]; mParams = new WindowManager.LayoutParams[1]; } else { index = mViews.length + 1; Object[] old = mViews; mViews = new View[index]; System.arraycopy(old, 0, mViews, 0, index-1); old = mRoots; mRoots = new ViewRootImpl[index]; System.arraycopy(old, 0, mRoots, 0, index-1); old = mParams; mParams = new WindowManager.LayoutParams[index]; System.arraycopy(old, 0, mParams, 0, index-1); } index--; mViews[index] = view; mRoots[index] = root; mParams[index] = wparams; mViews.add(view); mRoots.add(root); mParams.add(wparams); } // do this last because it fires off messages to start doing things Loading Loading @@ -292,8 +274,9 @@ public final class WindowManagerGlobal { synchronized (mLock) { int index = findViewLocked(view, true); ViewRootImpl root = mRoots[index]; mParams[index] = wparams; ViewRootImpl root = mRoots.get(index); mParams.remove(index); mParams.add(index, wparams); root.setLayoutParams(wparams, false); } } Loading @@ -305,7 +288,7 @@ public final class WindowManagerGlobal { synchronized (mLock) { int index = findViewLocked(view, true); View curView = mRoots[index].getView(); View curView = mRoots.get(index).getView(); removeViewLocked(index, immediate); if (curView == view) { return; Loading @@ -318,16 +301,13 @@ public final class WindowManagerGlobal { public void closeAll(IBinder token, String who, String what) { synchronized (mLock) { if (mViews == null) return; int count = mViews.length; int count = mViews.size(); //Log.i("foo", "Closing all windows of " + token); for (int i = 0; i < count; i++) { //Log.i("foo", "@ " + i + " token " + mParams[i].token // + " view " + mRoots[i].getView()); if (token == null || mParams[i].token == token) { ViewRootImpl root = mRoots[i]; if (token == null || mParams.get(i).token == token) { ViewRootImpl root = mRoots.get(i); //Log.i("foo", "Force closing " + root); if (who != null) { Loading @@ -345,13 +325,13 @@ public final class WindowManagerGlobal { } private void removeViewLocked(int index, boolean immediate) { ViewRootImpl root = mRoots[index]; ViewRootImpl root = mRoots.get(index); View view = root.getView(); if (view != null) { InputMethodManager imm = InputMethodManager.getInstance(); if (imm != null) { imm.windowDismissed(mViews[index].getWindowToken()); imm.windowDismissed(mViews.get(index).getWindowToken()); } } root.die(immediate); Loading @@ -364,52 +344,21 @@ public final class WindowManagerGlobal { view.assignParent(null); } final int newCount = mViews.length - 1; for (int index = newCount; index >= 0; --index) { if (mRoots[index] == root) { // remove it from the list View[] tmpViews = new View[newCount]; removeItem(tmpViews, mViews, index); mViews = tmpViews; ViewRootImpl[] tmpRoots = new ViewRootImpl[newCount]; removeItem(tmpRoots, mRoots, index); mRoots = tmpRoots; WindowManager.LayoutParams[] tmpParams = new WindowManager.LayoutParams[newCount]; removeItem(tmpParams, mParams, index); mParams = tmpParams; return; } } } } private static void removeItem(Object[] dst, Object[] src, int index) { if (dst.length > 0) { if (index > 0) { System.arraycopy(src, 0, dst, 0, index); } if (index < dst.length) { System.arraycopy(src, index+1, dst, index, src.length-index-1); final int index = mRoots.indexOf(root); if (index >= 0) { mRoots.remove(index); mViews.remove(index); mParams.remove(index); } } } private int findViewLocked(View view, boolean required) { if (mViews != null) { final int count = mViews.length; for (int i = 0; i < count; i++) { if (mViews[i] == view) { return i; } } } if (required) { final int index = mViews.indexOf(view); if (required && index < 0) { throw new IllegalArgumentException("View=" + view + " not attached to window manager"); } return -1; return index; } public void startTrimMemory(int level) { Loading @@ -422,10 +371,8 @@ public final class WindowManagerGlobal { // Destroy all hardware surfaces and resources associated to // known windows synchronized (mLock) { if (mViews == null) return; int count = mViews.length; for (int i = 0; i < count; i++) { mRoots[i].terminateHardwareResources(); for (int i = mRoots.size() - 1; i >= 0; --i) { mRoots.get(i).terminateHardwareResources(); } } // Force a full memory flush Loading @@ -449,10 +396,8 @@ public final class WindowManagerGlobal { public void trimLocalMemory() { synchronized (mLock) { if (mViews == null) return; int count = mViews.length; for (int i = 0; i < count; i++) { mRoots[i].destroyHardwareLayers(); for (int i = mRoots.size() - 1; i >= 0; --i) { mRoots.get(i).destroyHardwareLayers(); } } } Loading @@ -462,13 +407,12 @@ public final class WindowManagerGlobal { PrintWriter pw = new PrintWriter(fout); try { synchronized (mLock) { if (mViews != null) { final int count = mViews.length; final int count = mViews.size(); pw.println("Profile data in ms:"); for (int i = 0; i < count; i++) { ViewRootImpl root = mRoots[i]; ViewRootImpl root = mRoots.get(i); String name = getWindowName(root); pw.printf("\n\t%s", name); Loading @@ -486,7 +430,7 @@ public final class WindowManagerGlobal { int[] info = new int[2]; for (int i = 0; i < count; i++) { ViewRootImpl root = mRoots[i]; ViewRootImpl root = mRoots.get(i); root.dumpGfxInfo(info); String name = getWindowName(root); Loading @@ -507,7 +451,6 @@ public final class WindowManagerGlobal { pw.printf("Total Views: %d\n", viewsCount); pw.printf("Total DisplayList: %.2f kB\n\n", displayListsSize / 1024.0f); } } } finally { pw.flush(); } Loading @@ -520,31 +463,27 @@ public final class WindowManagerGlobal { public void setStoppedState(IBinder token, boolean stopped) { synchronized (mLock) { if (mViews != null) { int count = mViews.length; int count = mViews.size(); for (int i = 0; i < count; i++) { if (token == null || mParams[i].token == token) { ViewRootImpl root = mRoots[i]; if (token == null || mParams.get(i).token == token) { ViewRootImpl root = mRoots.get(i); root.setStopped(stopped); } } } } } public void reportNewConfiguration(Configuration config) { synchronized (mLock) { if (mViews != null) { int count = mViews.length; int count = mViews.size(); config = new Configuration(config); for (int i=0; i < count; i++) { ViewRootImpl root = mRoots[i]; ViewRootImpl root = mRoots.get(i); root.requestUpdateConfiguration(config); } } } } } final class WindowLeaked extends AndroidRuntimeException { public WindowLeaked(String msg) { Loading Loading
core/java/android/view/WindowManagerGlobal.java +83 −144 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import android.view.inputmethod.InputMethodManager; import java.io.FileDescriptor; import java.io.FileOutputStream; import java.io.PrintWriter; import java.util.ArrayList; /** * Provides low-level communication with the system window manager for Loading Loading @@ -106,9 +107,10 @@ public final class WindowManagerGlobal { private final Object mLock = new Object(); private View[] mViews; private ViewRootImpl[] mRoots; private WindowManager.LayoutParams[] mParams; private final ArrayList<View> mViews = new ArrayList<View>(); private final ArrayList<ViewRootImpl> mRoots = new ArrayList<ViewRootImpl>(); private final ArrayList<WindowManager.LayoutParams> mParams = new ArrayList<WindowManager.LayoutParams>(); private boolean mNeedsEglTerminate; private Runnable mSystemPropertyUpdater; Loading Loading @@ -161,11 +163,10 @@ public final class WindowManagerGlobal { public String[] getViewRootNames() { synchronized (mLock) { if (mRoots == null) return new String[0]; String[] mViewRoots = new String[mRoots.length]; int i = 0; for (ViewRootImpl root : mRoots) { mViewRoots[i++] = getWindowName(root); final int numRoots = mRoots.size(); String[] mViewRoots = new String[numRoots]; for (int i = 0; i < numRoots; ++i) { mViewRoots[i] = getWindowName(mRoots.get(i)); } return mViewRoots; } Loading @@ -173,8 +174,8 @@ public final class WindowManagerGlobal { public View getRootView(String name) { synchronized (mLock) { if (mRoots == null) return null; for (ViewRootImpl root : mRoots) { for (int i = mRoots.size() - 1; i >= 0; --i) { final ViewRootImpl root = mRoots.get(i); if (name.equals(getWindowName(root))) return root.getView(); } } Loading Loading @@ -208,8 +209,8 @@ public final class WindowManagerGlobal { mSystemPropertyUpdater = new Runnable() { @Override public void run() { synchronized (mLock) { for (ViewRootImpl viewRoot : mRoots) { viewRoot.loadSystemProperties(); for (int i = mRoots.size() - 1; i >= 0; --i) { mRoots.get(i).loadSystemProperties(); } } } Loading @@ -227,10 +228,10 @@ public final class WindowManagerGlobal { // attached to for future reference. if (wparams.type >= WindowManager.LayoutParams.FIRST_SUB_WINDOW && wparams.type <= WindowManager.LayoutParams.LAST_SUB_WINDOW) { final int count = mViews != null ? mViews.length : 0; final int count = mViews.size(); for (int i = 0; i < count; i++) { if (mRoots[i].mWindow.asBinder() == wparams.token) { panelParentView = mViews[i]; if (mRoots.get(i).mWindow.asBinder() == wparams.token) { panelParentView = mViews.get(i); } } } Loading @@ -239,28 +240,9 @@ public final class WindowManagerGlobal { view.setLayoutParams(wparams); if (mViews == null) { index = 1; mViews = new View[1]; mRoots = new ViewRootImpl[1]; mParams = new WindowManager.LayoutParams[1]; } else { index = mViews.length + 1; Object[] old = mViews; mViews = new View[index]; System.arraycopy(old, 0, mViews, 0, index-1); old = mRoots; mRoots = new ViewRootImpl[index]; System.arraycopy(old, 0, mRoots, 0, index-1); old = mParams; mParams = new WindowManager.LayoutParams[index]; System.arraycopy(old, 0, mParams, 0, index-1); } index--; mViews[index] = view; mRoots[index] = root; mParams[index] = wparams; mViews.add(view); mRoots.add(root); mParams.add(wparams); } // do this last because it fires off messages to start doing things Loading Loading @@ -292,8 +274,9 @@ public final class WindowManagerGlobal { synchronized (mLock) { int index = findViewLocked(view, true); ViewRootImpl root = mRoots[index]; mParams[index] = wparams; ViewRootImpl root = mRoots.get(index); mParams.remove(index); mParams.add(index, wparams); root.setLayoutParams(wparams, false); } } Loading @@ -305,7 +288,7 @@ public final class WindowManagerGlobal { synchronized (mLock) { int index = findViewLocked(view, true); View curView = mRoots[index].getView(); View curView = mRoots.get(index).getView(); removeViewLocked(index, immediate); if (curView == view) { return; Loading @@ -318,16 +301,13 @@ public final class WindowManagerGlobal { public void closeAll(IBinder token, String who, String what) { synchronized (mLock) { if (mViews == null) return; int count = mViews.length; int count = mViews.size(); //Log.i("foo", "Closing all windows of " + token); for (int i = 0; i < count; i++) { //Log.i("foo", "@ " + i + " token " + mParams[i].token // + " view " + mRoots[i].getView()); if (token == null || mParams[i].token == token) { ViewRootImpl root = mRoots[i]; if (token == null || mParams.get(i).token == token) { ViewRootImpl root = mRoots.get(i); //Log.i("foo", "Force closing " + root); if (who != null) { Loading @@ -345,13 +325,13 @@ public final class WindowManagerGlobal { } private void removeViewLocked(int index, boolean immediate) { ViewRootImpl root = mRoots[index]; ViewRootImpl root = mRoots.get(index); View view = root.getView(); if (view != null) { InputMethodManager imm = InputMethodManager.getInstance(); if (imm != null) { imm.windowDismissed(mViews[index].getWindowToken()); imm.windowDismissed(mViews.get(index).getWindowToken()); } } root.die(immediate); Loading @@ -364,52 +344,21 @@ public final class WindowManagerGlobal { view.assignParent(null); } final int newCount = mViews.length - 1; for (int index = newCount; index >= 0; --index) { if (mRoots[index] == root) { // remove it from the list View[] tmpViews = new View[newCount]; removeItem(tmpViews, mViews, index); mViews = tmpViews; ViewRootImpl[] tmpRoots = new ViewRootImpl[newCount]; removeItem(tmpRoots, mRoots, index); mRoots = tmpRoots; WindowManager.LayoutParams[] tmpParams = new WindowManager.LayoutParams[newCount]; removeItem(tmpParams, mParams, index); mParams = tmpParams; return; } } } } private static void removeItem(Object[] dst, Object[] src, int index) { if (dst.length > 0) { if (index > 0) { System.arraycopy(src, 0, dst, 0, index); } if (index < dst.length) { System.arraycopy(src, index+1, dst, index, src.length-index-1); final int index = mRoots.indexOf(root); if (index >= 0) { mRoots.remove(index); mViews.remove(index); mParams.remove(index); } } } private int findViewLocked(View view, boolean required) { if (mViews != null) { final int count = mViews.length; for (int i = 0; i < count; i++) { if (mViews[i] == view) { return i; } } } if (required) { final int index = mViews.indexOf(view); if (required && index < 0) { throw new IllegalArgumentException("View=" + view + " not attached to window manager"); } return -1; return index; } public void startTrimMemory(int level) { Loading @@ -422,10 +371,8 @@ public final class WindowManagerGlobal { // Destroy all hardware surfaces and resources associated to // known windows synchronized (mLock) { if (mViews == null) return; int count = mViews.length; for (int i = 0; i < count; i++) { mRoots[i].terminateHardwareResources(); for (int i = mRoots.size() - 1; i >= 0; --i) { mRoots.get(i).terminateHardwareResources(); } } // Force a full memory flush Loading @@ -449,10 +396,8 @@ public final class WindowManagerGlobal { public void trimLocalMemory() { synchronized (mLock) { if (mViews == null) return; int count = mViews.length; for (int i = 0; i < count; i++) { mRoots[i].destroyHardwareLayers(); for (int i = mRoots.size() - 1; i >= 0; --i) { mRoots.get(i).destroyHardwareLayers(); } } } Loading @@ -462,13 +407,12 @@ public final class WindowManagerGlobal { PrintWriter pw = new PrintWriter(fout); try { synchronized (mLock) { if (mViews != null) { final int count = mViews.length; final int count = mViews.size(); pw.println("Profile data in ms:"); for (int i = 0; i < count; i++) { ViewRootImpl root = mRoots[i]; ViewRootImpl root = mRoots.get(i); String name = getWindowName(root); pw.printf("\n\t%s", name); Loading @@ -486,7 +430,7 @@ public final class WindowManagerGlobal { int[] info = new int[2]; for (int i = 0; i < count; i++) { ViewRootImpl root = mRoots[i]; ViewRootImpl root = mRoots.get(i); root.dumpGfxInfo(info); String name = getWindowName(root); Loading @@ -507,7 +451,6 @@ public final class WindowManagerGlobal { pw.printf("Total Views: %d\n", viewsCount); pw.printf("Total DisplayList: %.2f kB\n\n", displayListsSize / 1024.0f); } } } finally { pw.flush(); } Loading @@ -520,31 +463,27 @@ public final class WindowManagerGlobal { public void setStoppedState(IBinder token, boolean stopped) { synchronized (mLock) { if (mViews != null) { int count = mViews.length; int count = mViews.size(); for (int i = 0; i < count; i++) { if (token == null || mParams[i].token == token) { ViewRootImpl root = mRoots[i]; if (token == null || mParams.get(i).token == token) { ViewRootImpl root = mRoots.get(i); root.setStopped(stopped); } } } } } public void reportNewConfiguration(Configuration config) { synchronized (mLock) { if (mViews != null) { int count = mViews.length; int count = mViews.size(); config = new Configuration(config); for (int i=0; i < count; i++) { ViewRootImpl root = mRoots[i]; ViewRootImpl root = mRoots.get(i); root.requestUpdateConfiguration(config); } } } } } final class WindowLeaked extends AndroidRuntimeException { public WindowLeaked(String msg) { Loading