From 1cc1fa1d126f1cbf375b25b715d0937bd73982f9 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Sat, 9 Apr 2022 16:02:00 +0200 Subject: [PATCH 1/5] Don't crash when download log entry is incomplete --- .../download/DownloadServiceNotification.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadServiceNotification.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadServiceNotification.java index b80a20a25..44a30da81 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadServiceNotification.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadServiceNotification.java @@ -117,7 +117,9 @@ public class DownloadServiceNotification { continue; } sb.append("• ").append(statuses.get(i).getTitle()); - sb.append(": ").append(statuses.get(i).getReason().getErrorString(context)); + if (statuses.get(i).getReason() != null) { + sb.append(": ").append(statuses.get(i).getReason().getErrorString(context)); + } if (i != statuses.size() - 1) { sb.append("\n"); } @@ -134,16 +136,18 @@ public class DownloadServiceNotification { public void updateReport(List reportQueue, boolean showAutoDownloadReport) { // check if report should be created boolean createReport = false; - int successfulDownloads = 0; int failedDownloads = 0; // a download report is created if at least one download has failed // (excluding failed image downloads) for (DownloadStatus status : reportQueue) { + if (status == null || status.isCancelled()) { + continue; + } if (status.isSuccessful()) { - successfulDownloads++; - createReport |= showAutoDownloadReport && !status.isInitiatedByUser() && status.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA; - } else if (!status.isCancelled()) { + createReport |= showAutoDownloadReport && !status.isInitiatedByUser() + && status.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA; + } else { failedDownloads++; createReport = true; } From e385d4c02190d5237098022949bb5e68bd224a1e Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Sat, 9 Apr 2022 16:08:52 +0200 Subject: [PATCH 2/5] Fix ArrayIndexOutOfBoundsException reported through Google Play --- .../de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java | 5 +++-- .../antennapod/adapter/SubscriptionsRecyclerAdapter.java | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java index 0ad7fa219..53223896f 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java @@ -84,7 +84,7 @@ public class EpisodeItemListAdapter extends SelectableAdapter { - longPressedItem = getItem(holder.getBindingAdapterPosition()); + longPressedItem = item; longPressedPosition = holder.getBindingAdapterPosition(); return false; }); @@ -92,7 +92,7 @@ public class EpisodeItemListAdapter extends SelectableAdapter= Build.VERSION_CODES.M) { if (e.isFromSource(InputDevice.SOURCE_MOUSE) && e.getButtonState() == MotionEvent.BUTTON_SECONDARY) { - longPressedItem = getItem(holder.getBindingAdapterPosition()); + longPressedItem = item; longPressedPosition = holder.getBindingAdapterPosition(); return false; } @@ -127,6 +127,7 @@ public class EpisodeItemListAdapter extends SelectableAdapter Date: Sat, 9 Apr 2022 16:15:38 +0200 Subject: [PATCH 3/5] Do not crash when pressing download while service is already partially destroyed --- .../antennapod/core/service/download/DownloadService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java index 42340e704..128b7a65d 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java @@ -512,6 +512,9 @@ public class DownloadService extends Service { if (isDownloadingFile(request.getSource())) { Log.d(TAG, "Skipped enqueueing request. Already running."); return; + } else if (downloadHandleExecutor.isShutdown()) { + Log.d(TAG, "Skipped enqueueing request. Service is already shutting down."); + return; } Log.d(TAG, "Add new request: " + request.getSource()); if (request.getSource().startsWith(Feed.PREFIX_LOCAL_FOLDER)) { From 52809976a0660224d74d31a4230802b05a4ae1e9 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Sat, 9 Apr 2022 16:18:50 +0200 Subject: [PATCH 4/5] Do not crash when clicking button while feed is not loaded yet --- .../main/java/de/danoeh/antennapod/fragment/ItemFragment.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java index 715786921..afb0ab8c5 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java @@ -173,6 +173,8 @@ public class ItemFragment extends Fragment { && UsageStatistics.hasSignificantBiasTo(UsageStatistics.ACTION_STREAM)) { showOnDemandConfigBalloon(true); return; + } else if (actionButton1 == null) { + return; // Not loaded yet } actionButton1.onClick(getContext()); }); @@ -181,6 +183,8 @@ public class ItemFragment extends Fragment { && UsageStatistics.hasSignificantBiasTo(UsageStatistics.ACTION_DOWNLOAD)) { showOnDemandConfigBalloon(false); return; + } else if (actionButton2 == null) { + return; // Not loaded yet } actionButton2.onClick(getContext()); }); From 8ea814cfdbfdca86d87a50f7efe070f87286310b Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Sat, 9 Apr 2022 16:28:06 +0200 Subject: [PATCH 5/5] Only crash debug version when trying to enqueue too many downloads at once --- .../core/service/download/DownloadService.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java index 128b7a65d..3efb8b47b 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java @@ -18,6 +18,7 @@ import androidx.annotation.VisibleForTesting; import androidx.core.app.ServiceCompat; import androidx.core.content.ContextCompat; +import de.danoeh.antennapod.core.BuildConfig; import de.danoeh.antennapod.core.R; import de.danoeh.antennapod.core.feed.LocalFeedUpdater; import org.apache.commons.io.FileUtils; @@ -139,9 +140,6 @@ public class DownloadService extends Service { } public static void download(Context context, boolean cleanupMedia, DownloadRequest... requests) { - if (requests.length > 100) { - throw new IllegalArgumentException("Android silently drops intent payloads that are too large"); - } ArrayList requestsToSend = new ArrayList<>(); for (DownloadRequest request : requests) { if (!isDownloadingFile(request.getSource())) { @@ -150,7 +148,15 @@ public class DownloadService extends Service { } if (requestsToSend.isEmpty()) { return; + } else if (requestsToSend.size() > 100) { + if (BuildConfig.DEBUG) { + throw new IllegalArgumentException("Android silently drops intent payloads that are too large"); + } else { + Log.d(TAG, "Too many download requests. Dropping some to avoid Android dropping all."); + requestsToSend = new ArrayList<>(requestsToSend.subList(0, 100)); + } } + Intent launchIntent = new Intent(context, DownloadService.class); launchIntent.putParcelableArrayListExtra(DownloadService.EXTRA_REQUESTS, requestsToSend); if (cleanupMedia) {