Loading services/core/java/com/android/server/wm/RootWindowContainer.java +23 −0 Original line number Diff line number Diff line Loading @@ -981,6 +981,29 @@ class RootWindowContainer extends WindowContainer<DisplayContent> mWmService.checkDrawnWindowsLocked(); } final int N = mWmService.mPendingRemove.size(); if (N > 0) { if (mWmService.mPendingRemoveTmp.length < N) { mWmService.mPendingRemoveTmp = new WindowState[N + 10]; } mWmService.mPendingRemove.toArray(mWmService.mPendingRemoveTmp); mWmService.mPendingRemove.clear(); ArrayList<DisplayContent> displayList = new ArrayList(); for (i = 0; i < N; i++) { final WindowState w = mWmService.mPendingRemoveTmp[i]; w.removeImmediately(); final DisplayContent displayContent = w.getDisplayContent(); if (displayContent != null && !displayList.contains(displayContent)) { displayList.add(displayContent); } } for (int j = displayList.size() - 1; j >= 0; --j) { final DisplayContent dc = displayList.get(j); dc.assignWindowLayers(true /*setLayoutNeeded*/); } } forAllDisplays(dc -> { dc.getInputMonitor().updateInputWindowsLw(true /*force*/); dc.updateSystemGestureExclusion(); Loading services/core/java/com/android/server/wm/WindowManagerService.java +33 −0 Original line number Diff line number Diff line Loading @@ -222,6 +222,7 @@ import android.util.DisplayMetrics; import android.util.EventLog; import android.util.MergedConfiguration; import android.util.Slog; import android.util.SparseArray; import android.util.SparseBooleanArray; import android.util.TimeUtils; import android.util.TypedValue; Loading Loading @@ -585,6 +586,20 @@ public class WindowManagerService extends IWindowManager.Stub */ final ArrayList<WindowState> mResizingWindows = new ArrayList<>(); /** * Windows whose animations have ended and now must be removed. */ final ArrayList<WindowState> mPendingRemove = new ArrayList<>(); /** * Used when processing mPendingRemove to avoid working on the original array. */ WindowState[] mPendingRemoveTmp = new WindowState[20]; // TODO: use WindowProcessController once go/wm-unified is done. /** Mapping of process pids to configurations */ final SparseArray<Configuration> mProcessConfigurations = new SparseArray<>(); /** * Mapping of displayId to {@link DisplayImePolicy}. * Note that this can be accessed without holding the lock. Loading Loading @@ -2038,6 +2053,7 @@ public class WindowManagerService extends IWindowManager.Stub dc.mWinRemovedSinceNullFocus.add(win); } mEmbeddedWindowController.onWindowRemoved(win); mPendingRemove.remove(win); mResizingWindows.remove(win); updateNonSystemOverlayWindowsVisibilityIfNeeded(win, false /* surfaceShown */); mWindowsChanged = true; Loading Loading @@ -6366,6 +6382,23 @@ public class WindowManagerService extends IWindowManager.Stub } } } if (mPendingRemove.size() > 0) { pw.println(); pw.println(" Remove pending for:"); for (int i=mPendingRemove.size()-1; i>=0; i--) { WindowState w = mPendingRemove.get(i); if (windows == null || windows.contains(w)) { pw.print(" Remove #"); pw.print(i); pw.print(' '); pw.print(w); if (dumpAll) { pw.println(":"); w.dump(pw, " ", true); } else { pw.println(); } } } } if (mForceRemoves != null && mForceRemoves.size() > 0) { pw.println(); pw.println(" Windows force removing:"); Loading services/core/java/com/android/server/wm/WindowState.java +4 −9 Original line number Diff line number Diff line Loading @@ -4887,18 +4887,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP if (hasSurface) { mWmService.mDestroySurface.add(this); } } mAnimatingExit = false; getDisplayContent().mWallpaperController.hideWallpapers(this); } @Override boolean handleCompleteDeferredRemoval() { if (mRemoveOnExit) { mWmService.mPendingRemove.add(this); mRemoveOnExit = false; removeImmediately(); } return super.handleCompleteDeferredRemoval(); } mAnimatingExit = false; getDisplayContent().mWallpaperController.hideWallpapers(this); } boolean clearAnimatingFlags() { Loading Loading
services/core/java/com/android/server/wm/RootWindowContainer.java +23 −0 Original line number Diff line number Diff line Loading @@ -981,6 +981,29 @@ class RootWindowContainer extends WindowContainer<DisplayContent> mWmService.checkDrawnWindowsLocked(); } final int N = mWmService.mPendingRemove.size(); if (N > 0) { if (mWmService.mPendingRemoveTmp.length < N) { mWmService.mPendingRemoveTmp = new WindowState[N + 10]; } mWmService.mPendingRemove.toArray(mWmService.mPendingRemoveTmp); mWmService.mPendingRemove.clear(); ArrayList<DisplayContent> displayList = new ArrayList(); for (i = 0; i < N; i++) { final WindowState w = mWmService.mPendingRemoveTmp[i]; w.removeImmediately(); final DisplayContent displayContent = w.getDisplayContent(); if (displayContent != null && !displayList.contains(displayContent)) { displayList.add(displayContent); } } for (int j = displayList.size() - 1; j >= 0; --j) { final DisplayContent dc = displayList.get(j); dc.assignWindowLayers(true /*setLayoutNeeded*/); } } forAllDisplays(dc -> { dc.getInputMonitor().updateInputWindowsLw(true /*force*/); dc.updateSystemGestureExclusion(); Loading
services/core/java/com/android/server/wm/WindowManagerService.java +33 −0 Original line number Diff line number Diff line Loading @@ -222,6 +222,7 @@ import android.util.DisplayMetrics; import android.util.EventLog; import android.util.MergedConfiguration; import android.util.Slog; import android.util.SparseArray; import android.util.SparseBooleanArray; import android.util.TimeUtils; import android.util.TypedValue; Loading Loading @@ -585,6 +586,20 @@ public class WindowManagerService extends IWindowManager.Stub */ final ArrayList<WindowState> mResizingWindows = new ArrayList<>(); /** * Windows whose animations have ended and now must be removed. */ final ArrayList<WindowState> mPendingRemove = new ArrayList<>(); /** * Used when processing mPendingRemove to avoid working on the original array. */ WindowState[] mPendingRemoveTmp = new WindowState[20]; // TODO: use WindowProcessController once go/wm-unified is done. /** Mapping of process pids to configurations */ final SparseArray<Configuration> mProcessConfigurations = new SparseArray<>(); /** * Mapping of displayId to {@link DisplayImePolicy}. * Note that this can be accessed without holding the lock. Loading Loading @@ -2038,6 +2053,7 @@ public class WindowManagerService extends IWindowManager.Stub dc.mWinRemovedSinceNullFocus.add(win); } mEmbeddedWindowController.onWindowRemoved(win); mPendingRemove.remove(win); mResizingWindows.remove(win); updateNonSystemOverlayWindowsVisibilityIfNeeded(win, false /* surfaceShown */); mWindowsChanged = true; Loading Loading @@ -6366,6 +6382,23 @@ public class WindowManagerService extends IWindowManager.Stub } } } if (mPendingRemove.size() > 0) { pw.println(); pw.println(" Remove pending for:"); for (int i=mPendingRemove.size()-1; i>=0; i--) { WindowState w = mPendingRemove.get(i); if (windows == null || windows.contains(w)) { pw.print(" Remove #"); pw.print(i); pw.print(' '); pw.print(w); if (dumpAll) { pw.println(":"); w.dump(pw, " ", true); } else { pw.println(); } } } } if (mForceRemoves != null && mForceRemoves.size() > 0) { pw.println(); pw.println(" Windows force removing:"); Loading
services/core/java/com/android/server/wm/WindowState.java +4 −9 Original line number Diff line number Diff line Loading @@ -4887,18 +4887,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP if (hasSurface) { mWmService.mDestroySurface.add(this); } } mAnimatingExit = false; getDisplayContent().mWallpaperController.hideWallpapers(this); } @Override boolean handleCompleteDeferredRemoval() { if (mRemoveOnExit) { mWmService.mPendingRemove.add(this); mRemoveOnExit = false; removeImmediately(); } return super.handleCompleteDeferredRemoval(); } mAnimatingExit = false; getDisplayContent().mWallpaperController.hideWallpapers(this); } boolean clearAnimatingFlags() { Loading