Skip to content

Commit b175774

Browse files
devlearnerStypox
authored andcommitted
Try to amicably handle DialogFragment in FragmentManager when recreated from orientation change
- Handle finish() call instead of passing around callbacks to setOnDismissListener() - Don't start over again if returning to DialogFragment before orientation change
1 parent 73e3288 commit b175774

1 file changed

Lines changed: 34 additions & 7 deletions

File tree

app/src/main/java/org/schabi/newpipe/RouterActivity.java

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import androidx.core.app.NotificationCompat;
3232
import androidx.core.app.ServiceCompat;
3333
import androidx.core.math.MathUtils;
34+
import androidx.fragment.app.Fragment;
3435
import androidx.fragment.app.FragmentManager;
3536
import 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

Comments
 (0)