From 4880a30fe08ab165538381a3e8572a9015638539 Mon Sep 17 00:00:00 2001 From: Vishnu Nair Date: Fri, 8 May 2020 11:05:58 -0700 Subject: [PATCH] Remove divider view when exiting splitscreen Remove and re add divider view as needed so we do not allocate memory while split screen is not active. Also release surface reference from server when we are done with the SurfaceControl so we don't have to rely on GC to remove the last reference. Fixes: 150190730 Test: test split screen manually, check for offscreen or onscreen divider layers in winscope Change-Id: I1a6a1c1d4346aafeae85aaf61ec4df23722e75ab --- .../java/android/view/SurfaceControlViewHost.java | 8 -------- .../shared/system/SurfaceViewRequestReceiver.java | 2 +- .../android/systemui/stackdivider/Divider.java | 15 ++++++++------- .../com/android/systemui/wm/SystemWindows.java | 2 +- .../android/server/wm/WindowManagerService.java | 1 + 5 files changed, 11 insertions(+), 17 deletions(-) diff --git a/core/java/android/view/SurfaceControlViewHost.java b/core/java/android/view/SurfaceControlViewHost.java index 7086dc09c8a30..385078165e844 100644 --- a/core/java/android/view/SurfaceControlViewHost.java +++ b/core/java/android/view/SurfaceControlViewHost.java @@ -275,12 +275,4 @@ public class SurfaceControlViewHost { // ViewRoot will release mSurfaceControl for us. mViewRoot.die(false /* immediate */); } - - /** - * Tell this viewroot to clean itself up. - * @hide - */ - public void die() { - mViewRoot.die(false /* immediate */); - } } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestReceiver.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestReceiver.java index 8bd7c790682d9..30156a0cd6f1f 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestReceiver.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestReceiver.java @@ -58,7 +58,7 @@ public class SurfaceViewRequestReceiver { */ public void onReceive(Context context, Bundle bundle, View view, Size viewSize) { if (mSurfaceControlViewHost != null) { - mSurfaceControlViewHost.die(); + mSurfaceControlViewHost.release(); } SurfaceControl surfaceControl = SurfaceViewRequestUtils.getSurfaceControl(bundle); diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java index e67b3d715c84f..0ac0ef193b92f 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java @@ -592,13 +592,11 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, removeDivider(); addDivider(configuration); - if (mView != null) { - if (mMinimized) { - mView.setMinimizedDockStack(true, mHomeStackResizable); - updateTouchable(); - } - mView.setHidden(isDividerHidden); + if (mMinimized) { + mView.setMinimizedDockStack(true, mHomeStackResizable); + updateTouchable(); } + mView.setHidden(isDividerHidden); } void onTaskVanished() { @@ -610,7 +608,7 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, mContext.getDisplayId()).getResources().getConfiguration())); } - void updateVisibility(final boolean visible) { + private void updateVisibility(final boolean visible) { if (DEBUG) Slog.d(TAG, "Updating visibility " + mVisible + "->" + visible); if (mVisible != visible) { mVisible = visible; @@ -639,6 +637,7 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, void onSplitDismissed() { mMinimized = false; updateVisibility(false /* visible */); + removeDivider(); } /** Switch to minimized state if appropriate */ @@ -788,6 +787,8 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, } void startEnterSplit() { + update(mDisplayController.getDisplayContext( + mContext.getDisplayId()).getResources().getConfiguration()); // Set resizable directly here because applyEnterSplit already resizes home stack. mHomeStackResizable = WindowManagerProxy.applyEnterSplit(mSplits, mSplitLayout); } diff --git a/packages/SystemUI/src/com/android/systemui/wm/SystemWindows.java b/packages/SystemUI/src/com/android/systemui/wm/SystemWindows.java index 93f45c51f0ebc..21f67aef56044 100644 --- a/packages/SystemUI/src/com/android/systemui/wm/SystemWindows.java +++ b/packages/SystemUI/src/com/android/systemui/wm/SystemWindows.java @@ -125,7 +125,7 @@ public class SystemWindows { */ public void removeView(View view) { SurfaceControlViewHost root = mViewRoots.remove(view); - root.die(); + root.release(); } /** diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 73126c8b6b6a8..7d9a98583bafd 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -8082,6 +8082,7 @@ public class WindowManagerService extends IWindowManager.Stub t.setInputWindowInfo(surface, h); t.apply(); t.close(); + surface.release(); } /**