diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java index dbc2d7888..bba5d519c 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java @@ -492,20 +492,17 @@ public class MainActivity extends CastEnabledActivity implements NavigationToolb public void loadFragment(Fragment fragment) { FragmentManager fragmentManager = getSupportFragmentManager(); - // clear back stack - for (int i = 0; i < fragmentManager.getBackStackEntryCount(); i++) { - fragmentManager.popBackStack(); - } + // Clear all synchronously to avoid conflicting with predictive back gesture cancellation + fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); FragmentTransaction t = fragmentManager.beginTransaction(); t.replace(R.id.main_content_view, fragment, MAIN_FRAGMENT_TAG); - fragmentManager.popBackStack(); // TODO: we have to allow state loss here // since this function can get called from an AsyncTask which // could be finishing after our app has already committed state // and is about to get shutdown. What we *should* do is // not commit anything in an AsyncTask, but that's a bigger // change than we want now. - t.commitAllowingStateLoss(); + t.commitNowAllowingStateLoss(); if (drawerLayout != null) { // Tablet layout does not have a drawer drawerLayout.closeDrawer(navDrawer); diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/home/HomeFragment.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/home/HomeFragment.java index 77af87ce2..e85d42ff3 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/home/HomeFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/home/HomeFragment.java @@ -93,6 +93,9 @@ public class HomeFragment extends Fragment implements Toolbar.OnMenuItemClickLis } private void addSection(Fragment section) { + if (section == null) { // Can happen when stored settings reference a section that no longer exists + return; + } FragmentContainerView containerView = new FragmentContainerView(getContext()); containerView.setId(View.generateViewId()); viewBinding.homeContainer.addView(containerView); diff --git a/playback/service/src/main/java/de/danoeh/antennapod/playback/service/internal/MediaLibrarySessionCallback.java b/playback/service/src/main/java/de/danoeh/antennapod/playback/service/internal/MediaLibrarySessionCallback.java index 769127aed..42baf3f04 100644 --- a/playback/service/src/main/java/de/danoeh/antennapod/playback/service/internal/MediaLibrarySessionCallback.java +++ b/playback/service/src/main/java/de/danoeh/antennapod/playback/service/internal/MediaLibrarySessionCallback.java @@ -277,7 +277,8 @@ public class MediaLibrarySessionCallback implements MediaLibraryService.MediaLib future.set(new MediaSession.MediaItemsWithStartPosition(result.first, index, startPosition)); }, error -> { Log.e(TAG, "Failed to load media", error); - future.set(new MediaSession.MediaItemsWithStartPosition(mediaItems, index, startPositionMs)); + future.set(new MediaSession.MediaItemsWithStartPosition( + Collections.emptyList(), index, startPositionMs)); }); return future; } @@ -484,6 +485,10 @@ public class MediaLibrarySessionCallback implements MediaLibraryService.MediaLib try { long mediaId = Long.parseLong(item.mediaId); FeedMedia media = DBReader.getFeedMedia(mediaId); + if (media == null) { + Log.e(TAG, "Media not found for ID: " + mediaId); + continue; + } builder.add(MediaItemAdapter.fromPlayable(context, media, false)); } catch (NumberFormatException e) { Log.e(TAG, "Invalid media ID: " + item.mediaId, e);