3131import androidx .core .app .NotificationCompat ;
3232import androidx .core .app .ServiceCompat ;
3333import androidx .core .math .MathUtils ;
34+ import androidx .fragment .app .Fragment ;
3435import androidx .fragment .app .FragmentManager ;
3536import androidx .preference .PreferenceManager ;
3637
@@ -151,7 +152,32 @@ protected void onSaveInstanceState(@NonNull final Bundle outState) {
151152 protected void onStart () {
152153 super .onStart ();
153154
154- handleUrl (currentUrl );
155+ // FragmentManager will take care to recreate DialogFragments when screen rotates
156+ // currently that's namely PlaylistDialog or DownloadDialog
157+ // We used to .setOnDismissListener(dialog ->finish()); when creating those Dialogs
158+ // but those callbacks won't survive a config change
159+ // Try an alternate approach to hook into FragmentManager instead, to that effect
160+ // (courtesy of https://stackoverflow.com/a/44028453)
161+ final FragmentManager fm = getSupportFragmentManager ();
162+ fm .registerFragmentLifecycleCallbacks (new FragmentManager .FragmentLifecycleCallbacks () {
163+ @ Override
164+ public void onFragmentViewDestroyed (@ NonNull final FragmentManager fm ,
165+ @ NonNull final Fragment f ) {
166+ super .onFragmentViewDestroyed (fm , f );
167+ if (fm .getFragments ().isEmpty ()) {
168+ // No more Dialog, we're done
169+ finish ();
170+ }
171+ }
172+ }, false );
173+
174+ // Don't overlap the DialogFragment after rotating the screen
175+ // If there's no DialogFragment, we're either starting afresh
176+ // or we didn't make it to PlaylistDialog or DownloadDialog before the orientation change
177+ if (fm .getFragments ().isEmpty ()) {
178+ // Start over from scratch
179+ handleUrl (currentUrl );
180+ }
155181 }
156182
157183 @ Override
@@ -659,12 +685,12 @@ private void openAddToPlaylistDialog() {
659685 getThemeWrapperContext (),
660686 List .of (new StreamEntity (info )),
661687 playlistDialog -> {
662- playlistDialog .setOnDismissListener (dialog -> finish ());
688+ // to be handled by FragmentManager
689+ // playlistDialog.setOnDismissListener(dialog ->finish());
663690
664- playlistDialog .show (
665- this .getSupportFragmentManager (),
666- "addToPlaylistDialog"
667- );
691+ final FragmentManager fm = getSupportFragmentManager ();
692+ playlistDialog .show (fm , "addToPlaylistDialog" );
693+ fm .executePendingTransactions ();
668694 }
669695 ),
670696 throwable -> handleError (this , new ErrorInfo (
@@ -684,7 +710,8 @@ private void openDownloadDialog() {
684710 .observeOn (AndroidSchedulers .mainThread ())
685711 .subscribe (result -> {
686712 final DownloadDialog downloadDialog = new DownloadDialog (this , result );
687- downloadDialog .setOnDismissListener (dialog -> finish ());
713+ // to be handled by FragmentManager since listener would be gone when recreated
714+ // playlistDialog.setOnDismissListener(dialog ->finish());
688715
689716 final FragmentManager fm = getSupportFragmentManager ();
690717 downloadDialog .show (fm , "downloadDialog" );
0 commit comments