From 3d1c1a79bad2e3e6c6f4cd107587ace28051e004 Mon Sep 17 00:00:00 2001 From: Hans-Peter Lehmann Date: Thu, 9 Jul 2026 08:48:05 +0200 Subject: [PATCH] Fix some crashes reported through google play (#8579) ### Description Possible fixes for some crashes reported through google play ### Checklist - [x] I have read the contribution guidelines: https://github.com/AntennaPod/AntennaPod/blob/develop/CONTRIBUTING.md#submit-a-pull-request - [x] I have performed a self-review of my code, going through my changes line by line and carefully considering why this line change is necessary - [x] I have run the automated code checks using `./gradlew checkstyle lint` - [x] My code follows the style guidelines of the AntennaPod project: https://antennapod.org/contribute/develop/app/code-style - [x] I have mentioned the corresponding issue and the relevant keyword (e.g., "Closes: #xy") in the description (see https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue) - [x] If it is a core feature, I have added automated tests --- .../java/de/danoeh/antennapod/activity/MainActivity.java | 9 +++------ .../danoeh/antennapod/ui/screen/home/HomeFragment.java | 3 +++ .../service/internal/MediaLibrarySessionCallback.java | 7 ++++++- 3 files changed, 12 insertions(+), 7 deletions(-) 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);