From a9ab2f54eadfa541258a94d07e9e5750aa0d7fbc Mon Sep 17 00:00:00 2001 From: evermind Date: Tue, 25 May 2021 07:49:49 +0200 Subject: [PATCH] dismiss choice dialog in onStop() to avoid a leaked window Exception: E/WindowManager: android.view.WindowLeaked: Activity org.schabi.newpipe.RouterActivity has leaked window DecorView@d99fe3b[] that was originally added here at android.view.ViewRootImpl.(ViewRootImpl.java:418) --- .../org/schabi/newpipe/RouterActivity.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/RouterActivity.java b/app/src/main/java/org/schabi/newpipe/RouterActivity.java index 55bb8424f33..f7c77024777 100644 --- a/app/src/main/java/org/schabi/newpipe/RouterActivity.java +++ b/app/src/main/java/org/schabi/newpipe/RouterActivity.java @@ -107,6 +107,7 @@ public class RouterActivity extends AppCompatActivity { protected String currentUrl; private StreamingService currentService; private boolean selectionIsDownload = false; + private AlertDialog alertDialogChoice = null; @Override protected void onCreate(final Bundle savedInstanceState) { @@ -126,6 +127,15 @@ protected void onCreate(final Bundle savedInstanceState) { ? R.style.RouterActivityThemeLight : R.style.RouterActivityThemeDark); } + @Override + protected void onStop() { + super.onStop(); + // we need to dismiss the dialog before leaving the activity or we get leaks + if (alertDialogChoice != null) { + alertDialogChoice.dismiss(); + } + } + @Override protected void onSaveInstanceState(@NonNull final Bundle outState) { super.onSaveInstanceState(outState); @@ -333,7 +343,7 @@ private void showDialog(final List choices) { } }; - final AlertDialog alertDialog = new AlertDialog.Builder(themeWrapperContext) + alertDialogChoice = new AlertDialog.Builder(themeWrapperContext) .setTitle(R.string.preferred_open_action_share_menu_title) .setView(radioGroup) .setCancelable(true) @@ -347,12 +357,12 @@ private void showDialog(final List choices) { .create(); //noinspection CodeBlock2Expr - alertDialog.setOnShowListener(dialog -> { - setDialogButtonsState(alertDialog, radioGroup.getCheckedRadioButtonId() != -1); + alertDialogChoice.setOnShowListener(dialog -> { + setDialogButtonsState(alertDialogChoice, radioGroup.getCheckedRadioButtonId() != -1); }); radioGroup.setOnCheckedChangeListener((group, checkedId) -> - setDialogButtonsState(alertDialog, true)); + setDialogButtonsState(alertDialogChoice, true)); final View.OnClickListener radioButtonsClickListener = v -> { final int indexOfChild = radioGroup.indexOfChild(v); if (indexOfChild == -1) { @@ -402,10 +412,10 @@ private void showDialog(final List choices) { } selectedPreviously = selectedRadioPosition; - alertDialog.show(); + alertDialogChoice.show(); if (DeviceUtils.isTv(this)) { - FocusOverlayView.setupFocusObserver(alertDialog); + FocusOverlayView.setupFocusObserver(alertDialogChoice); } }