From d397b9084dfcd650cefa0454855dc1c8f3233573 Mon Sep 17 00:00:00 2001 From: Aran Ink Date: Tue, 21 Apr 2020 17:53:41 -0400 Subject: [PATCH] Add dismissImmediate to ListPopupWindow to prevent window leaks in GlobalActionsDialog. Fixes: 154640131 Test: Manual -- Use 'adb shell dumpsys window windows || grep "PopupWindow"' to confirm number of PopupWindows displayed (should be zero at home screen.) Open GlobalActions. Tap the power overflow menu and check number of PopupWindows while the overflow dropdown is visible (should be 1). Put the phone to sleep by pressing the power button. Wake phone and make sure number of PopupWindows is 0. Repeat with Controls structure switcher dropdown and add controls dropdown. Change-Id: I4ae2d86e981465e8e6c0adf924a6fc2eabfc88ee --- core/java/android/widget/ListPopupWindow.java | 9 +++++++++ .../controls/ui/ControlsUiControllerImpl.kt | 2 +- .../systemui/globalactions/GlobalActionsDialog.java | 13 ++++++++----- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/core/java/android/widget/ListPopupWindow.java b/core/java/android/widget/ListPopupWindow.java index 6425cf11ccb33..4311ffbe0e95b 100755 --- a/core/java/android/widget/ListPopupWindow.java +++ b/core/java/android/widget/ListPopupWindow.java @@ -745,6 +745,15 @@ public class ListPopupWindow implements ShowableListMenu { mHandler.removeCallbacks(mResizePopupRunnable); } + /** + * Remove existing exit transition from PopupWindow and force immediate dismissal. + * @hide + */ + public void dismissImmediate() { + mPopup.setExitTransition(null); + dismiss(); + } + /** * Set a listener to receive a callback when the popup is dismissed. * diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt index 42db0051b8e67..f3693c1c72ab3 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt @@ -536,7 +536,7 @@ class ControlsUiControllerImpl @Inject constructor ( override fun hide() { Log.d(ControlsUiController.TAG, "hide()") hidden = true - popup?.dismiss() + popup?.dismissImmediate() activeDialog?.dismiss() ControlActionCoordinator.closeDialog() diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java index 6aa4f8684928c..9bd32ff7b344c 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java @@ -484,8 +484,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, */ @VisibleForTesting protected int getMaxShownPowerItems() { - // TODO: Overflow disabled on keyguard while we solve for touch blocking issues. - if (shouldUseControlsLayout() && !mKeyguardShowing) { + if (shouldUseControlsLayout()) { return mResources.getInteger(com.android.systemui.R.integer.power_menu_max_columns); } else { return Integer.MAX_VALUE; @@ -2246,7 +2245,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, mShowing = false; resetOrientation(); dismissPanel(); - dismissOverflow(); + dismissOverflow(true); if (mControlsUiController != null) mControlsUiController.hide(); mNotificationShadeWindowController.setForceHasTopUi(mHadTopUi); mDepthController.updateGlobalDialogVisibility(0, null /* view */); @@ -2259,9 +2258,13 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } } - private void dismissOverflow() { + private void dismissOverflow(boolean immediate) { if (mOverflowPopup != null) { - mOverflowPopup.dismiss(); + if (immediate) { + mOverflowPopup.dismissImmediate(); + } else { + mOverflowPopup.dismiss(); + } } }