From 6d7bfef8a5fe8180f13904739996bb2b8de8a0d4 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Fri, 5 May 2023 23:09:03 +0200 Subject: Download Service Rewrite (#6420) --- .../activity/DownloadAuthenticationActivity.java | 71 -------------- .../danoeh/antennapod/activity/MainActivity.java | 47 ++++++++- .../activity/OnlineFeedViewActivity.java | 18 ++-- .../antennapod/adapter/DownloadLogAdapter.java | 95 +++--------------- .../adapter/actionbutton/DownloadActionButton.java | 25 ++--- .../adapter/actionbutton/ItemActionButton.java | 4 +- .../adapter/actionbutton/MobileDownloadHelper.java | 49 ---------- .../dialog/DownloadLogDetailsDialog.java | 4 +- .../fragment/CompletedDownloadsFragment.java | 41 ++++---- .../antennapod/fragment/DownloadLogFragment.java | 21 +--- .../antennapod/fragment/EpisodesListFragment.java | 18 ++-- .../antennapod/fragment/FeedItemlistFragment.java | 29 +++--- .../danoeh/antennapod/fragment/ItemFragment.java | 42 +++----- .../danoeh/antennapod/fragment/QueueFragment.java | 21 ++-- .../danoeh/antennapod/fragment/SearchFragment.java | 20 ++-- .../antennapod/fragment/SubscriptionFragment.java | 7 -- .../actions/EpisodeMultiSelectActionHandler.java | 9 +- .../preferences/DownloadsPreferencesFragment.java | 14 --- .../preferences/NumberPickerPreference.java | 108 --------------------- .../ui/home/sections/EpisodesSurpriseSection.java | 23 ++--- .../antennapod/ui/home/sections/InboxSection.java | 20 ++-- .../antennapod/ui/home/sections/QueueSection.java | 20 ++-- .../view/viewholder/EpisodeItemViewHolder.java | 14 ++- .../view/viewholder/HorizontalItemViewHolder.java | 13 ++- 24 files changed, 204 insertions(+), 529 deletions(-) delete mode 100644 app/src/main/java/de/danoeh/antennapod/activity/DownloadAuthenticationActivity.java delete mode 100644 app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/MobileDownloadHelper.java delete mode 100644 app/src/main/java/de/danoeh/antennapod/preferences/NumberPickerPreference.java (limited to 'app/src/main/java') diff --git a/app/src/main/java/de/danoeh/antennapod/activity/DownloadAuthenticationActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/DownloadAuthenticationActivity.java deleted file mode 100644 index 176c3c990..000000000 --- a/app/src/main/java/de/danoeh/antennapod/activity/DownloadAuthenticationActivity.java +++ /dev/null @@ -1,71 +0,0 @@ -package de.danoeh.antennapod.activity; - -import android.os.Bundle; -import android.text.TextUtils; -import androidx.appcompat.app.AppCompatActivity; -import de.danoeh.antennapod.R; -import de.danoeh.antennapod.core.preferences.ThemeSwitcher; -import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface; -import de.danoeh.antennapod.model.feed.FeedMedia; -import de.danoeh.antennapod.model.feed.FeedPreferences; -import de.danoeh.antennapod.net.download.serviceinterface.DownloadRequest; -import de.danoeh.antennapod.core.storage.DBReader; -import de.danoeh.antennapod.core.storage.DBWriter; -import de.danoeh.antennapod.dialog.AuthenticationDialog; -import de.danoeh.antennapod.ui.appstartintent.DownloadAuthenticationActivityStarter; -import io.reactivex.Completable; -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.schedulers.Schedulers; - - -/** - * Shows a username and a password text field. - * The activity MUST be started with the ARG_DOWNlOAD_REQUEST argument set to a non-null value. - */ -public class DownloadAuthenticationActivity extends AppCompatActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - setTheme(ThemeSwitcher.getTranslucentTheme(this)); - super.onCreate(savedInstanceState); - - DownloadRequest request = getIntent().getParcelableExtra( - DownloadAuthenticationActivityStarter.EXTRA_DOWNLOAD_REQUEST); - - new AuthenticationDialog(this, R.string.authentication_label, true, "", "") { - @Override - protected void onConfirmed(String username, String password) { - Completable.fromAction( - () -> { - request.setUsername(username); - request.setPassword(password); - - if (request.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) { - long mediaId = request.getFeedfileId(); - FeedMedia media = DBReader.getFeedMedia(mediaId); - if (media != null) { - FeedPreferences preferences = media.getItem().getFeed().getPreferences(); - if (TextUtils.isEmpty(preferences.getPassword()) - || TextUtils.isEmpty(preferences.getUsername())) { - preferences.setUsername(username); - preferences.setPassword(password); - DBWriter.setFeedPreferences(preferences); - } - } - } - }) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(() -> { - DownloadServiceInterface.get() - .download(DownloadAuthenticationActivity.this, false, request); - finish(); - }); - } - - @Override - protected void onCancelled() { - finish(); - } - }.show(); - } -} 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 bd467076a..a55bfade3 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java @@ -39,12 +39,14 @@ import de.danoeh.antennapod.core.preferences.ThemeSwitcher; import de.danoeh.antennapod.core.receiver.MediaButtonReceiver; import de.danoeh.antennapod.core.util.download.FeedUpdateManager; import de.danoeh.antennapod.dialog.RatingDialog; +import de.danoeh.antennapod.event.EpisodeDownloadEvent; import de.danoeh.antennapod.event.FeedUpdateRunningEvent; import de.danoeh.antennapod.event.MessageEvent; import de.danoeh.antennapod.fragment.AddFeedFragment; import de.danoeh.antennapod.fragment.AllEpisodesFragment; import de.danoeh.antennapod.fragment.AudioPlayerFragment; import de.danoeh.antennapod.fragment.CompletedDownloadsFragment; +import de.danoeh.antennapod.fragment.DownloadLogFragment; import de.danoeh.antennapod.fragment.FeedItemlistFragment; import de.danoeh.antennapod.fragment.InboxFragment; import de.danoeh.antennapod.fragment.NavDrawerFragment; @@ -53,6 +55,8 @@ import de.danoeh.antennapod.fragment.QueueFragment; import de.danoeh.antennapod.fragment.SearchFragment; import de.danoeh.antennapod.fragment.SubscriptionFragment; import de.danoeh.antennapod.fragment.TransitionEffect; +import de.danoeh.antennapod.model.download.DownloadStatus; +import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface; import de.danoeh.antennapod.playback.cast.CastEnabledActivity; import de.danoeh.antennapod.preferences.PreferenceUpgrader; import de.danoeh.antennapod.storage.preferences.UserPreferences; @@ -66,6 +70,9 @@ import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; +import java.util.HashMap; +import java.util.Map; + /** * The activity that is shown when the user launches the app. */ @@ -173,6 +180,39 @@ public class MainActivity extends CastEnabledActivity { } EventBus.getDefault().postSticky(new FeedUpdateRunningEvent(isRefreshingFeeds)); }); + WorkManager.getInstance(this) + .getWorkInfosByTagLiveData(DownloadServiceInterface.WORK_TAG) + .observe(this, workInfos -> { + Map updatedEpisodes = new HashMap<>(); + for (WorkInfo workInfo : workInfos) { + String downloadUrl = null; + for (String tag : workInfo.getTags()) { + if (tag.startsWith(DownloadServiceInterface.WORK_TAG_EPISODE_URL)) { + downloadUrl = tag.substring(DownloadServiceInterface.WORK_TAG_EPISODE_URL.length()); + } + } + if (downloadUrl == null) { + continue; + } + int status; + if (workInfo.getState() == WorkInfo.State.RUNNING) { + status = DownloadStatus.STATE_RUNNING; + } else if (workInfo.getState() == WorkInfo.State.ENQUEUED + || workInfo.getState() == WorkInfo.State.BLOCKED) { + status = DownloadStatus.STATE_QUEUED; + } else { + status = DownloadStatus.STATE_COMPLETED; + } + int progress = workInfo.getProgress().getInt(DownloadServiceInterface.WORK_DATA_PROGRESS, -1); + if (progress == -1 && status != DownloadStatus.STATE_COMPLETED) { + status = DownloadStatus.STATE_QUEUED; + progress = 0; + } + updatedEpisodes.put(downloadUrl, new DownloadStatus(status, progress)); + } + DownloadServiceInterface.get().setCurrentDownloads(updatedEpisodes); + EventBus.getDefault().postSticky(new EpisodeDownloadEvent(updatedEpisodes)); + }); } @Override @@ -531,9 +571,9 @@ public class MainActivity extends CastEnabledActivity { public void onEventMainThread(MessageEvent event) { Log.d(TAG, "onEvent(" + event + ")"); - Snackbar snackbar = showSnackbarAbovePlayer(event.message, Snackbar.LENGTH_SHORT); + Snackbar snackbar = showSnackbarAbovePlayer(event.message, Snackbar.LENGTH_LONG); if (event.action != null) { - snackbar.setAction(getString(R.string.undo), v -> event.action.run()); + snackbar.setAction(event.actionText, v -> event.action.accept(this)); } } @@ -570,6 +610,9 @@ public class MainActivity extends CastEnabledActivity { if (intent.getBooleanExtra(MainActivityStarter.EXTRA_OPEN_DRAWER, false) && drawerLayout != null) { drawerLayout.open(); } + if (intent.getBooleanExtra(MainActivityStarter.EXTRA_OPEN_DOWNLOAD_LOGS, false)) { + new DownloadLogFragment().show(getSupportFragmentManager(), null); + } if (intent.getBooleanExtra(EXTRA_REFRESH_ON_START, false)) { FeedUpdateManager.runOnceOrAsk(this); } diff --git a/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java index f5f3d28f6..3812339bd 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java @@ -31,20 +31,20 @@ import com.google.android.material.snackbar.Snackbar; import de.danoeh.antennapod.R; import de.danoeh.antennapod.adapter.FeedItemlistDescriptionAdapter; -import de.danoeh.antennapod.core.event.DownloadEvent; import de.danoeh.antennapod.core.preferences.ThemeSwitcher; -import de.danoeh.antennapod.core.service.download.DownloadService; import de.danoeh.antennapod.core.service.download.DownloadRequestCreator; import de.danoeh.antennapod.core.feed.FeedUrlNotFoundException; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.service.playback.PlaybackServiceInterface; import de.danoeh.antennapod.core.util.DownloadErrorLabel; +import de.danoeh.antennapod.event.EpisodeDownloadEvent; import de.danoeh.antennapod.event.FeedListUpdateEvent; import de.danoeh.antennapod.event.PlayerStatusEvent; import de.danoeh.antennapod.core.preferences.PlaybackPreferences; +import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface; import de.danoeh.antennapod.storage.preferences.UserPreferences; import de.danoeh.antennapod.net.download.serviceinterface.DownloadRequest; -import de.danoeh.antennapod.model.download.DownloadStatus; +import de.danoeh.antennapod.model.download.DownloadResult; import de.danoeh.antennapod.core.service.download.Downloader; import de.danoeh.antennapod.core.service.download.HttpDownloader; import de.danoeh.antennapod.core.storage.DBReader; @@ -307,10 +307,7 @@ public class OnlineFeedViewActivity extends AppCompatActivity { error -> Log.e(TAG, Log.getStackTraceString(error))); } - private void checkDownloadResult(@NonNull DownloadStatus status, String destination) { - if (status.isCancelled()) { - return; - } + private void checkDownloadResult(@NonNull DownloadResult status, String destination) { if (status.isSuccessful()) { parseFeed(destination); } else if (status.getReason() == DownloadError.ERROR_UNAUTHORIZED) { @@ -341,9 +338,8 @@ public class OnlineFeedViewActivity extends AppCompatActivity { ); } - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEventMainThread(DownloadEvent event) { - Log.d(TAG, "onEventMainThread() called with: " + "event = [" + event + "]"); + @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) + public void onEventMainThread(EpisodeDownloadEvent event) { handleUpdatedFeedStatus(); } @@ -535,7 +531,7 @@ public class OnlineFeedViewActivity extends AppCompatActivity { } private void handleUpdatedFeedStatus() { - if (DownloadService.isDownloadingFile(selectedDownloadUrl)) { + if (DownloadServiceInterface.get().isDownloadingEpisode(selectedDownloadUrl)) { viewBinding.subscribeButton.setEnabled(false); viewBinding.subscribeButton.setText(R.string.subscribing_label); } else if (feedInFeedlist()) { diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java index 8df3e3968..0fb6a7e7a 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java @@ -2,7 +2,6 @@ package de.danoeh.antennapod.adapter; import android.app.Activity; import android.text.format.DateUtils; -import android.text.format.Formatter; import android.util.Log; import android.view.View; import android.view.ViewGroup; @@ -10,18 +9,13 @@ import android.widget.BaseAdapter; import android.widget.Toast; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; -import de.danoeh.antennapod.net.download.serviceinterface.DownloadRequest; -import de.danoeh.antennapod.core.service.download.DownloadRequestCreator; -import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface; -import de.danoeh.antennapod.core.service.download.Downloader; +import de.danoeh.antennapod.adapter.actionbutton.DownloadActionButton; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBTasks; -import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.util.DownloadErrorLabel; import de.danoeh.antennapod.model.download.DownloadError; -import de.danoeh.antennapod.model.download.DownloadStatus; +import de.danoeh.antennapod.model.download.DownloadResult; import de.danoeh.antennapod.model.feed.Feed; -import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.ui.common.ThemeUtils; import de.danoeh.antennapod.view.viewholder.DownloadLogItemViewHolder; @@ -36,24 +30,18 @@ public class DownloadLogAdapter extends BaseAdapter { private static final String TAG = "DownloadLogAdapter"; private final Activity context; - private List downloadLog = new ArrayList<>(); - private List runningDownloads = new ArrayList<>(); + private List downloadLog = new ArrayList<>(); public DownloadLogAdapter(Activity context) { super(); this.context = context; } - public void setDownloadLog(List downloadLog) { + public void setDownloadLog(List downloadLog) { this.downloadLog = downloadLog; notifyDataSetChanged(); } - public void setRunningDownloads(List runningDownloads) { - this.runningDownloads = runningDownloads; - notifyDataSetChanged(); - } - @Override public View getView(int position, View convertView, ViewGroup parent) { DownloadLogItemViewHolder holder; @@ -63,17 +51,11 @@ public class DownloadLogAdapter extends BaseAdapter { } else { holder = (DownloadLogItemViewHolder) convertView.getTag(); } - - Object item = getItem(position); - if (item instanceof DownloadStatus) { - bind(holder, (DownloadStatus) item, position); - } else if (item instanceof Downloader) { - bind(holder, (Downloader) item, position); - } + bind(holder, getItem(position), position); return holder.itemView; } - private void bind(DownloadLogItemViewHolder holder, DownloadStatus status, int position) { + private void bind(DownloadLogItemViewHolder holder, DownloadResult status, int position) { String statusText = ""; if (status.getFeedfileType() == Feed.FEEDFILETYPE_FEED) { statusText += context.getString(R.string.download_type_feed); @@ -111,8 +93,7 @@ public class DownloadLogAdapter extends BaseAdapter { holder.reason.setVisibility(View.VISIBLE); holder.tapForDetails.setVisibility(View.VISIBLE); - if (newerWasSuccessful(position - runningDownloads.size(), - status.getFeedfileType(), status.getFeedfileId())) { + if (newerWasSuccessful(position, status.getFeedfileType(), status.getFeedfileId())) { holder.secondaryActionButton.setVisibility(View.INVISIBLE); holder.secondaryActionButton.setOnClickListener(null); holder.secondaryActionButton.setTag(null); @@ -138,8 +119,7 @@ public class DownloadLogAdapter extends BaseAdapter { Log.e(TAG, "Could not find feed media for feed id: " + status.getFeedfileId()); return; } - DownloadServiceInterface.get() - .download(context, true, DownloadRequestCreator.create(media).build()); + new DownloadActionButton(media.getItem()).onClick(context); ((MainActivity) context).showSnackbarAbovePlayer( R.string.status_downloading_label, Toast.LENGTH_SHORT); }); @@ -148,56 +128,9 @@ public class DownloadLogAdapter extends BaseAdapter { } } - private void bind(DownloadLogItemViewHolder holder, Downloader downloader, int position) { - DownloadRequest request = downloader.getDownloadRequest(); - holder.title.setText(request.getTitle()); - holder.secondaryActionIcon.setImageResource(R.drawable.ic_cancel); - holder.secondaryActionButton.setContentDescription(context.getString(R.string.cancel_download_label)); - holder.secondaryActionButton.setVisibility(View.VISIBLE); - holder.secondaryActionButton.setTag(downloader); - holder.secondaryActionButton.setOnClickListener(v -> { - DownloadServiceInterface.get().cancel(context, request.getSource()); - if (request.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) { - FeedMedia media = DBReader.getFeedMedia(request.getFeedfileId()); - FeedItem feedItem = media.getItem(); - feedItem.disableAutoDownload(); - DBWriter.setFeedItem(feedItem); - } - }); - holder.reason.setVisibility(View.GONE); - holder.tapForDetails.setVisibility(View.GONE); - holder.icon.setTextColor(ThemeUtils.getColorFromAttr(context, R.attr.colorPrimary)); - holder.icon.setText("{fa-arrow-circle-down}"); - holder.icon.setContentDescription(context.getString(R.string.status_downloading_label)); - - boolean percentageWasSet = false; - String status = ""; - if (request.getFeedfileType() == Feed.FEEDFILETYPE_FEED) { - status += context.getString(R.string.download_type_feed); - } else if (request.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) { - status += context.getString(R.string.download_type_media); - } - status += " · "; - if (request.getSoFar() <= 0) { - status += context.getString(R.string.download_pending); - } else { - status += Formatter.formatShortFileSize(context, request.getSoFar()); - if (request.getSize() != DownloadStatus.SIZE_UNKNOWN) { - status += " / " + Formatter.formatShortFileSize(context, request.getSize()); - holder.secondaryActionProgress.setPercentage( - 0.01f * Math.max(1, request.getProgressPercent()), request); - percentageWasSet = true; - } - } - if (!percentageWasSet) { - holder.secondaryActionProgress.setPercentage(0, request); - } - holder.status.setText(status); - } - private boolean newerWasSuccessful(int downloadStatusIndex, int feedTypeId, long id) { for (int i = 0; i < downloadStatusIndex; i++) { - DownloadStatus status = downloadLog.get(i); + DownloadResult status = downloadLog.get(i); if (status.getFeedfileType() == feedTypeId && status.getFeedfileId() == id && status.isSuccessful()) { return true; } @@ -207,15 +140,13 @@ public class DownloadLogAdapter extends BaseAdapter { @Override public int getCount() { - return downloadLog.size() + runningDownloads.size(); + return downloadLog.size(); } @Override - public Object getItem(int position) { - if (position < runningDownloads.size()) { - return runningDownloads.get(position); - } else if (position - runningDownloads.size() < downloadLog.size()) { - return downloadLog.get(position - runningDownloads.size()); + public DownloadResult getItem(int position) { + if (position < downloadLog.size()) { + return downloadLog.get(position); } return null; } diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/DownloadActionButton.java b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/DownloadActionButton.java index 3b54efc03..86a8047a9 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/DownloadActionButton.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/DownloadActionButton.java @@ -2,20 +2,17 @@ package de.danoeh.antennapod.adapter.actionbutton; import android.content.Context; import android.view.View; -import android.widget.Toast; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.StringRes; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; import de.danoeh.antennapod.R; -import de.danoeh.antennapod.core.service.download.DownloadRequestCreator; -import de.danoeh.antennapod.core.service.download.DownloadService; import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface; import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.core.preferences.UsageStatistics; -import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.util.NetworkUtils; public class DownloadActionButton extends ItemActionButton { @@ -50,19 +47,23 @@ public class DownloadActionButton extends ItemActionButton { UsageStatistics.logAction(UsageStatistics.ACTION_DOWNLOAD); - if (NetworkUtils.isEpisodeDownloadAllowed() || MobileDownloadHelper.userAllowedMobileDownloads()) { - DownloadServiceInterface.get() - .download(context, false, DownloadRequestCreator.create(item.getMedia()).build()); - } else if (MobileDownloadHelper.userChoseAddToQueue() && !item.isTagged(FeedItem.TAG_QUEUE)) { - DBWriter.addQueueItem(context, item); - Toast.makeText(context, R.string.added_to_queue_label, Toast.LENGTH_SHORT).show(); + if (NetworkUtils.isEpisodeDownloadAllowed()) { + DownloadServiceInterface.get().downloadNow(context, item, false); } else { - MobileDownloadHelper.confirmMobileDownload(context, item); + MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(context) + .setTitle(R.string.confirm_mobile_download_dialog_title) + .setMessage(R.string.confirm_mobile_download_dialog_message) + .setPositiveButton(R.string.confirm_mobile_download_dialog_download_later, + (d, w) -> DownloadServiceInterface.get().downloadNow(context, item, false)) + .setNeutralButton(R.string.confirm_mobile_download_dialog_allow_this_time, + (d, w) -> DownloadServiceInterface.get().downloadNow(context, item, true)) + .setNegativeButton(R.string.cancel_label, null); + builder.show(); } } private boolean shouldNotDownload(@NonNull FeedMedia media) { - boolean isDownloading = DownloadService.isDownloadingFile(media.getDownload_url()); + boolean isDownloading = DownloadServiceInterface.get().isDownloadingEpisode(media.getDownload_url()); return isDownloading || media.isDownloaded(); } } diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/ItemActionButton.java b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/ItemActionButton.java index e7a95c404..613dd32f0 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/ItemActionButton.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/ItemActionButton.java @@ -7,10 +7,10 @@ import androidx.annotation.NonNull; import androidx.annotation.StringRes; import android.view.View; -import de.danoeh.antennapod.core.service.download.DownloadService; import de.danoeh.antennapod.core.util.PlaybackStatus; import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedMedia; +import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface; import de.danoeh.antennapod.storage.preferences.UserPreferences; public abstract class ItemActionButton { @@ -39,7 +39,7 @@ public abstract class ItemActionButton { return new MarkAsPlayedActionButton(item); } - final boolean isDownloadingMedia = DownloadService.isDownloadingFile(media.getDownload_url()); + final boolean isDownloadingMedia = DownloadServiceInterface.get().isDownloadingEpisode(media.getDownload_url()); if (PlaybackStatus.isCurrentlyPlaying(media)) { return new PauseActionButton(item); } else if (item.getFeed().isLocalFeed()) { diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/MobileDownloadHelper.java b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/MobileDownloadHelper.java deleted file mode 100644 index 015f46318..000000000 --- a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/MobileDownloadHelper.java +++ /dev/null @@ -1,49 +0,0 @@ -package de.danoeh.antennapod.adapter.actionbutton; - -import android.content.Context; - -import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import de.danoeh.antennapod.R; -import de.danoeh.antennapod.core.service.download.DownloadRequestCreator; -import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface; -import de.danoeh.antennapod.model.feed.FeedItem; -import de.danoeh.antennapod.core.storage.DBReader; -import de.danoeh.antennapod.core.storage.DBWriter; - -class MobileDownloadHelper { - private static long addToQueueTimestamp; - private static long allowMobileDownloadTimestamp; - private static final int TEN_MINUTES_IN_MILLIS = 10 * 60 * 1000; - - static boolean userChoseAddToQueue() { - return System.currentTimeMillis() - addToQueueTimestamp < TEN_MINUTES_IN_MILLIS; - } - - static boolean userAllowedMobileDownloads() { - return System.currentTimeMillis() - allowMobileDownloadTimestamp < TEN_MINUTES_IN_MILLIS; - } - - static void confirmMobileDownload(final Context context, final FeedItem item) { - MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(context) - .setTitle(R.string.confirm_mobile_download_dialog_title) - .setMessage(R.string.confirm_mobile_download_dialog_message) - .setPositiveButton(context.getText(R.string.confirm_mobile_download_dialog_enable_temporarily), - (dialog, which) -> downloadFeedItems(context, item)); - if (!DBReader.getQueueIDList().contains(item.getId())) { - builder.setMessage(R.string.confirm_mobile_download_dialog_message_not_in_queue) - .setNeutralButton(R.string.confirm_mobile_download_dialog_only_add_to_queue, - (dialog, which) -> addToQueue(context, item)); - } - builder.show(); - } - - private static void addToQueue(Context context, FeedItem item) { - addToQueueTimestamp = System.currentTimeMillis(); - DBWriter.addQueueItem(context, item); - } - - private static void downloadFeedItems(Context context, FeedItem item) { - allowMobileDownloadTimestamp = System.currentTimeMillis(); - DownloadServiceInterface.get().download(context, true, DownloadRequestCreator.create(item.getMedia()).build()); - } -} \ No newline at end of file diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/DownloadLogDetailsDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/DownloadLogDetailsDialog.java index 5e28639dd..00936a38a 100644 --- a/app/src/main/java/de/danoeh/antennapod/dialog/DownloadLogDetailsDialog.java +++ b/app/src/main/java/de/danoeh/antennapod/dialog/DownloadLogDetailsDialog.java @@ -9,7 +9,7 @@ import androidx.appcompat.app.AlertDialog; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.util.DownloadErrorLabel; -import de.danoeh.antennapod.model.download.DownloadStatus; +import de.danoeh.antennapod.model.download.DownloadResult; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.event.MessageEvent; import de.danoeh.antennapod.model.feed.Feed; @@ -18,7 +18,7 @@ import org.greenrobot.eventbus.EventBus; public class DownloadLogDetailsDialog extends MaterialAlertDialogBuilder { - public DownloadLogDetailsDialog(@NonNull Context context, DownloadStatus status) { + public DownloadLogDetailsDialog(@NonNull Context context, DownloadResult status) { super(context); String url = "unknown"; diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java index 737975389..ba328adba 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java @@ -20,12 +20,12 @@ import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.adapter.EpisodeItemListAdapter; import de.danoeh.antennapod.adapter.actionbutton.DeleteActionButton; -import de.danoeh.antennapod.core.event.DownloadEvent; import de.danoeh.antennapod.core.event.DownloadLogEvent; import de.danoeh.antennapod.core.menuhandler.MenuItemUtils; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.util.FeedItemUtil; import de.danoeh.antennapod.core.util.download.FeedUpdateManager; +import de.danoeh.antennapod.event.EpisodeDownloadEvent; import de.danoeh.antennapod.event.FeedItemEvent; import de.danoeh.antennapod.event.PlayerStatusEvent; import de.danoeh.antennapod.event.UnreadItemsUpdateEvent; @@ -36,6 +36,7 @@ import de.danoeh.antennapod.menuhandler.FeedItemMenuHandler; import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedItemFilter; import de.danoeh.antennapod.model.feed.SortOrder; +import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface; import de.danoeh.antennapod.storage.preferences.UserPreferences; import de.danoeh.antennapod.view.EmptyViewHandler; import de.danoeh.antennapod.view.EpisodeItemListRecyclerView; @@ -50,9 +51,10 @@ import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** * Displays all completed downloads and provides a button to delete them. @@ -63,7 +65,7 @@ public class CompletedDownloadsFragment extends Fragment public static final String ARG_SHOW_LOGS = "show_logs"; private static final String KEY_UP_ARROW = "up_arrow"; - private long[] runningDownloads = new long[0]; + private Set runningDownloads = new HashSet<>(); private List items = new ArrayList<>(); private CompletedDownloadsListAdapter adapter; private EpisodeItemListRecyclerView recyclerView; @@ -217,19 +219,22 @@ public class CompletedDownloadsFragment extends Fragment } @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) - public void onEventMainThread(DownloadEvent event) { - Log.d(TAG, "onEventMainThread() called with: " + "event = [" + event + "]"); - if (!Arrays.equals(event.update.mediaIds, runningDownloads)) { - runningDownloads = event.update.mediaIds; + public void onEventMainThread(EpisodeDownloadEvent event) { + Set newRunningDownloads = new HashSet<>(); + for (String url : event.getUrls()) { + if (DownloadServiceInterface.get().isDownloadingEpisode(url)) { + newRunningDownloads.add(url); + } + } + if (!newRunningDownloads.equals(runningDownloads)) { + runningDownloads = newRunningDownloads; loadItems(); return; // Refreshed anyway } - if (event.update.mediaIds.length > 0) { - for (long mediaId : event.update.mediaIds) { - int pos = FeedItemUtil.indexOfItemWithMediaId(items, mediaId); - if (pos >= 0) { - adapter.notifyItemChangedCompat(pos); - } + for (String downloadUrl : event.getUrls()) { + int pos = FeedItemUtil.indexOfItemWithDownloadUrl(items, downloadUrl); + if (pos >= 0) { + adapter.notifyItemChangedCompat(pos); } } } @@ -318,17 +323,17 @@ public class CompletedDownloadsFragment extends Fragment List downloadedItems = DBReader.getEpisodes(0, Integer.MAX_VALUE, new FeedItemFilter(FeedItemFilter.DOWNLOADED), sortOrder); - List mediaIds = new ArrayList<>(); + List mediaUrls = new ArrayList<>(); if (runningDownloads == null) { return downloadedItems; } - for (long id : runningDownloads) { - if (FeedItemUtil.indexOfItemWithMediaId(downloadedItems, id) != -1) { + for (String url : runningDownloads) { + if (FeedItemUtil.indexOfItemWithDownloadUrl(downloadedItems, url) != -1) { continue; // Already in list } - mediaIds.add(id); + mediaUrls.add(url); } - List currentDownloads = DBReader.getFeedItemsWithMedia(mediaIds.toArray(new Long[0])); + List currentDownloads = DBReader.getFeedItemsWithUrl(mediaUrls); currentDownloads.addAll(downloadedItems); return currentDownloads; }) diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java index c27d8c058..03913ff12 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java @@ -14,15 +14,12 @@ import com.google.android.material.appbar.MaterialToolbar; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import de.danoeh.antennapod.R; import de.danoeh.antennapod.adapter.DownloadLogAdapter; -import de.danoeh.antennapod.core.event.DownloadEvent; import de.danoeh.antennapod.core.event.DownloadLogEvent; -import de.danoeh.antennapod.core.event.DownloaderUpdate; -import de.danoeh.antennapod.core.service.download.Downloader; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.databinding.DownloadLogFragmentBinding; import de.danoeh.antennapod.dialog.DownloadLogDetailsDialog; -import de.danoeh.antennapod.model.download.DownloadStatus; +import de.danoeh.antennapod.model.download.DownloadResult; import de.danoeh.antennapod.view.EmptyViewHandler; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -30,7 +27,6 @@ import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; import java.util.ArrayList; import java.util.List; @@ -42,8 +38,7 @@ public class DownloadLogFragment extends BottomSheetDialogFragment implements AdapterView.OnItemClickListener, MaterialToolbar.OnMenuItemClickListener { private static final String TAG = "DownloadLogFragment"; - private List downloadLog = new ArrayList<>(); - private List runningDownloads = new ArrayList<>(); + private List downloadLog = new ArrayList<>(); private DownloadLogAdapter adapter; private Disposable disposable; private DownloadLogFragmentBinding viewBinding; @@ -93,8 +88,8 @@ public class DownloadLogFragment extends BottomSheetDialogFragment @Override public void onItemClick(AdapterView parent, View view, int position, long id) { Object item = adapter.getItem(position); - if (item instanceof DownloadStatus) { - new DownloadLogDetailsDialog(getContext(), (DownloadStatus) item).show(); + if (item instanceof DownloadResult) { + new DownloadLogDetailsDialog(getContext(), (DownloadResult) item).show(); } } @@ -119,14 +114,6 @@ public class DownloadLogFragment extends BottomSheetDialogFragment return false; } - @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) - public void onEvent(DownloadEvent event) { - Log.d(TAG, "onEvent() called with: " + "event = [" + event + "]"); - DownloaderUpdate update = event.update; - runningDownloads = update.downloaders; - adapter.setRunningDownloads(runningDownloads); - } - private void loadDownloadLog() { if (disposable != null) { disposable.dispose(); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java index ef784e9ee..00d671d36 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java @@ -27,11 +27,10 @@ import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.adapter.EpisodeItemListAdapter; import de.danoeh.antennapod.core.dialog.ConfirmationDialog; -import de.danoeh.antennapod.core.event.DownloadEvent; -import de.danoeh.antennapod.core.event.DownloaderUpdate; import de.danoeh.antennapod.core.menuhandler.MenuItemUtils; import de.danoeh.antennapod.core.util.FeedItemUtil; import de.danoeh.antennapod.core.util.download.FeedUpdateManager; +import de.danoeh.antennapod.event.EpisodeDownloadEvent; import de.danoeh.antennapod.event.FeedItemEvent; import de.danoeh.antennapod.event.FeedListUpdateEvent; import de.danoeh.antennapod.event.FeedUpdateRunningEvent; @@ -387,16 +386,11 @@ public abstract class EpisodesListFragment extends Fragment } @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) - public void onEventMainThread(DownloadEvent event) { - Log.d(TAG, "onEventMainThread() called with: " + "event = [" + event + "]"); - DownloaderUpdate update = event.update; - updateToolbar(); - if (update.mediaIds.length > 0) { - for (long mediaId : update.mediaIds) { - int pos = FeedItemUtil.indexOfItemWithMediaId(episodes, mediaId); - if (pos >= 0) { - listAdapter.notifyItemChangedCompat(pos); - } + public void onEventMainThread(EpisodeDownloadEvent event) { + for (String downloadUrl : event.getUrls()) { + int pos = FeedItemUtil.indexOfItemWithDownloadUrl(episodes, downloadUrl); + if (pos >= 0) { + listAdapter.notifyItemChangedCompat(pos); } } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java index 61883afe7..f59d5dbd4 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java @@ -29,8 +29,6 @@ import com.leinardi.android.speeddial.SpeedDialView; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.adapter.EpisodeItemListAdapter; -import de.danoeh.antennapod.core.event.DownloadEvent; -import de.danoeh.antennapod.core.event.DownloaderUpdate; import de.danoeh.antennapod.core.feed.FeedEvent; import de.danoeh.antennapod.core.menuhandler.MenuItemUtils; import de.danoeh.antennapod.core.storage.DBReader; @@ -45,6 +43,7 @@ import de.danoeh.antennapod.dialog.DownloadLogDetailsDialog; import de.danoeh.antennapod.dialog.FeedItemFilterDialog; import de.danoeh.antennapod.dialog.RemoveFeedDialog; import de.danoeh.antennapod.dialog.RenameItemDialog; +import de.danoeh.antennapod.event.EpisodeDownloadEvent; import de.danoeh.antennapod.event.FavoritesEvent; import de.danoeh.antennapod.event.FeedItemEvent; import de.danoeh.antennapod.event.FeedListUpdateEvent; @@ -57,7 +56,7 @@ import de.danoeh.antennapod.fragment.actions.EpisodeMultiSelectActionHandler; import de.danoeh.antennapod.fragment.swipeactions.SwipeActions; import de.danoeh.antennapod.menuhandler.FeedItemMenuHandler; import de.danoeh.antennapod.menuhandler.FeedMenuHandler; -import de.danoeh.antennapod.model.download.DownloadStatus; +import de.danoeh.antennapod.model.download.DownloadResult; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedItemFilter; @@ -330,16 +329,14 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem } @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) - public void onEventMainThread(DownloadEvent event) { - Log.d(TAG, "onEventMainThread() called with: " + "event = [" + event + "]"); - DownloaderUpdate update = event.update; - updateToolbar(); - if (update.mediaIds.length > 0 && feed != null) { - for (long mediaId : update.mediaIds) { - int pos = FeedItemUtil.indexOfItemWithMediaId(feed.getItems(), mediaId); - if (pos >= 0) { - adapter.notifyItemChangedCompat(pos); - } + public void onEventMainThread(EpisodeDownloadEvent event) { + if (feed == null) { + return; + } + for (String downloadUrl : event.getUrls()) { + int pos = FeedItemUtil.indexOfItemWithDownloadUrl(feed.getItems(), downloadUrl); + if (pos >= 0) { + adapter.notifyItemChangedCompat(pos); } } } @@ -479,7 +476,7 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem private void showErrorDetails() { Maybe.fromCallable( () -> { - List feedDownloadLog = DBReader.getFeedDownloadLog(feedID); + List feedDownloadLog = DBReader.getFeedDownloadLog(feedID); if (feedDownloadLog.size() == 0 || feedDownloadLog.get(0).isSuccessful()) { return null; } @@ -490,9 +487,7 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem .subscribe( downloadStatus -> new DownloadLogDetailsDialog(getContext(), downloadStatus).show(), error -> error.printStackTrace(), - () -> { - ((MainActivity) getActivity()).loadChildFragment(new DownloadLogFragment()); - }); + () -> new DownloadLogFragment().show(getChildFragmentManager(), null)); } private void showFeedInfo() { 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 df48c9a98..94877811e 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java @@ -37,10 +37,7 @@ import de.danoeh.antennapod.adapter.actionbutton.PlayActionButton; import de.danoeh.antennapod.adapter.actionbutton.PlayLocalActionButton; import de.danoeh.antennapod.adapter.actionbutton.StreamActionButton; import de.danoeh.antennapod.adapter.actionbutton.VisitWebsiteActionButton; -import de.danoeh.antennapod.core.event.DownloadEvent; -import de.danoeh.antennapod.core.event.DownloaderUpdate; -import de.danoeh.antennapod.net.download.serviceinterface.DownloadRequest; -import de.danoeh.antennapod.core.service.download.DownloadService; +import de.danoeh.antennapod.event.EpisodeDownloadEvent; import de.danoeh.antennapod.core.util.PlaybackStatus; import de.danoeh.antennapod.event.FeedItemEvent; import de.danoeh.antennapod.event.PlayerStatusEvent; @@ -49,8 +46,8 @@ import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.core.feed.util.ImageResourceUtils; import de.danoeh.antennapod.core.preferences.UsageStatistics; +import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface; import de.danoeh.antennapod.storage.preferences.UserPreferences; -import de.danoeh.antennapod.core.service.download.Downloader; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.util.Converter; import de.danoeh.antennapod.core.util.DateFormatter; @@ -63,12 +60,10 @@ import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; -import org.apache.commons.lang3.ArrayUtils; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; -import java.util.List; import java.util.Locale; import java.util.Objects; @@ -98,7 +93,6 @@ public class ItemFragment extends Fragment { private long itemId; private FeedItem item; private String webviewData; - private List downloaderList; private ViewGroup root; private ShownotesWebView webvDescription; @@ -309,14 +303,13 @@ public class ItemFragment extends Fragment { private void updateButtons() { progbarDownload.setVisibility(View.GONE); - if (item.hasMedia() && downloaderList != null) { - for (Downloader downloader : downloaderList) { - DownloadRequest request = downloader.getDownloadRequest(); - if (request.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA - && request.getFeedfileId() == item.getMedia().getId()) { - progbarDownload.setVisibility(View.VISIBLE); - progbarDownload.setPercentage(0.01f * Math.max(1, request.getProgressPercent()), request); - } + if (item.hasMedia()) { + if (DownloadServiceInterface.get().isDownloadingEpisode(item.getMedia().getDownload_url())) { + progbarDownload.setVisibility(View.VISIBLE); + progbarDownload.setPercentage(0.01f * Math.max(1, + DownloadServiceInterface.get().getProgress(item.getMedia().getDownload_url())), item); + progbarDownload.setIndeterminate( + DownloadServiceInterface.get().isEpisodeQueued(item.getMedia().getDownload_url())); } } @@ -341,7 +334,7 @@ public class ItemFragment extends Fragment { } else { actionButton1 = new StreamActionButton(item); } - if (DownloadService.isDownloadingFile(media.getDownload_url())) { + if (DownloadServiceInterface.get().isDownloadingEpisode(media.getDownload_url())) { actionButton2 = new CancelDownloadActionButton(item); } else if (!media.isDownloaded()) { actionButton2 = new DownloadActionButton(item); @@ -386,18 +379,15 @@ public class ItemFragment extends Fragment { } @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) - public void onEventMainThread(DownloadEvent event) { - Log.d(TAG, "onEventMainThread() called with: " + "event = [" + event + "]"); - DownloaderUpdate update = event.update; - downloaderList = update.downloaders; + public void onEventMainThread(EpisodeDownloadEvent event) { if (item == null || item.getMedia() == null) { return; } - long mediaId = item.getMedia().getId(); - if (ArrayUtils.contains(update.mediaIds, mediaId)) { - if (itemsLoaded && getActivity() != null) { - updateButtons(); - } + if (!event.getUrls().contains(item.getMedia().getDownload_url())) { + return; + } + if (itemsLoaded && getActivity() != null) { + updateButtons(); } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java index 6681df4c1..a1aa7226d 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -32,8 +32,6 @@ import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.adapter.EpisodeItemListAdapter; import de.danoeh.antennapod.adapter.QueueRecyclerAdapter; import de.danoeh.antennapod.core.dialog.ConfirmationDialog; -import de.danoeh.antennapod.core.event.DownloadEvent; -import de.danoeh.antennapod.core.event.DownloaderUpdate; import de.danoeh.antennapod.core.feed.util.PlaybackSpeedUtils; import de.danoeh.antennapod.core.menuhandler.MenuItemUtils; import de.danoeh.antennapod.core.storage.DBReader; @@ -41,6 +39,7 @@ import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.util.Converter; import de.danoeh.antennapod.core.util.FeedItemUtil; import de.danoeh.antennapod.core.util.download.FeedUpdateManager; +import de.danoeh.antennapod.event.EpisodeDownloadEvent; import de.danoeh.antennapod.event.FeedItemEvent; import de.danoeh.antennapod.event.FeedUpdateRunningEvent; import de.danoeh.antennapod.event.PlayerStatusEvent; @@ -186,16 +185,14 @@ public class QueueFragment extends Fragment implements MaterialToolbar.OnMenuIte } @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) - public void onEventMainThread(DownloadEvent event) { - Log.d(TAG, "onEventMainThread() called with DownloadEvent"); - DownloaderUpdate update = event.update; - refreshToolbarState(); - if (recyclerAdapter != null && update.mediaIds.length > 0) { - for (long mediaId : update.mediaIds) { - int pos = FeedItemUtil.indexOfItemWithMediaId(queue, mediaId); - if (pos >= 0) { - recyclerAdapter.notifyItemChangedCompat(pos); - } + public void onEventMainThread(EpisodeDownloadEvent event) { + if (queue == null) { + return; + } + for (String downloadUrl : event.getUrls()) { + int pos = FeedItemUtil.indexOfItemWithDownloadUrl(queue, downloadUrl); + if (pos >= 0) { + recyclerAdapter.notifyItemChangedCompat(pos); } } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java index d2aa35549..b85e34e7d 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java @@ -28,9 +28,8 @@ import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.adapter.EpisodeItemListAdapter; import de.danoeh.antennapod.adapter.HorizontalFeedListAdapter; -import de.danoeh.antennapod.core.event.DownloadEvent; -import de.danoeh.antennapod.core.event.DownloaderUpdate; import de.danoeh.antennapod.core.menuhandler.MenuItemUtils; +import de.danoeh.antennapod.event.EpisodeDownloadEvent; import de.danoeh.antennapod.event.FeedItemEvent; import de.danoeh.antennapod.event.playback.PlaybackPositionEvent; import de.danoeh.antennapod.event.PlayerStatusEvent; @@ -295,15 +294,14 @@ public class SearchFragment extends Fragment { } @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) - public void onEventMainThread(DownloadEvent event) { - Log.d(TAG, "onEventMainThread() called with: " + "event = [" + event + "]"); - DownloaderUpdate update = event.update; - if (adapter != null && update.mediaIds.length > 0) { - for (long mediaId : update.mediaIds) { - int pos = FeedItemUtil.indexOfItemWithMediaId(results, mediaId); - if (pos >= 0) { - adapter.notifyItemChangedCompat(pos); - } + public void onEventMainThread(EpisodeDownloadEvent event) { + if (results == null) { + return; + } + for (String downloadUrl : event.getUrls()) { + int pos = FeedItemUtil.indexOfItemWithDownloadUrl(results, downloadUrl); + if (pos >= 0) { + adapter.notifyItemChangedCompat(pos); } } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java index 490c79d47..a6daec2e7 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java @@ -36,7 +36,6 @@ import java.util.Locale; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.adapter.SubscriptionsRecyclerAdapter; -import de.danoeh.antennapod.core.event.DownloadEvent; import de.danoeh.antennapod.core.menuhandler.MenuItemUtils; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.NavDrawerData; @@ -362,12 +361,6 @@ public class SubscriptionFragment extends Fragment loadSubscriptions(); } - @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) - public void onEventMainThread(DownloadEvent event) { - Log.d(TAG, "onEventMainThread() called with: " + "event = [" + event + "]"); - refreshToolbarState(); - } - @Override public void onEndSelectMode() { speedDialView.close(); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/actions/EpisodeMultiSelectActionHandler.java b/app/src/main/java/de/danoeh/antennapod/fragment/actions/EpisodeMultiSelectActionHandler.java index e076d35b6..a14bfcd16 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/actions/EpisodeMultiSelectActionHandler.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/actions/EpisodeMultiSelectActionHandler.java @@ -6,13 +6,10 @@ import androidx.annotation.PluralsRes; import com.google.android.material.snackbar.Snackbar; -import java.util.ArrayList; import java.util.List; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; -import de.danoeh.antennapod.net.download.serviceinterface.DownloadRequest; -import de.danoeh.antennapod.core.service.download.DownloadRequestCreator; import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.util.LongList; @@ -93,14 +90,12 @@ public class EpisodeMultiSelectActionHandler { private void downloadChecked(List items) { // download the check episodes in the same order as they are currently displayed - List requests = new ArrayList<>(); for (FeedItem episode : items) { if (episode.hasMedia() && !episode.getFeed().isLocalFeed()) { - requests.add(DownloadRequestCreator.create(episode.getMedia()).build()); + DownloadServiceInterface.get().download(activity, episode); } } - DownloadServiceInterface.get().download(activity, true, requests.toArray(new DownloadRequest[0])); - showMessage(R.plurals.downloading_batch_label, requests.size()); + showMessage(R.plurals.downloading_batch_label, items.size()); } private void deleteChecked(List items) { diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/DownloadsPreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/DownloadsPreferencesFragment.java index c486089fc..7b0c3efdf 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/DownloadsPreferencesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/DownloadsPreferencesFragment.java @@ -1,7 +1,6 @@ package de.danoeh.antennapod.fragment.preferences; import android.content.SharedPreferences; -import android.content.res.Resources; import android.os.Bundle; import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceManager; @@ -43,7 +42,6 @@ public class DownloadsPreferencesFragment extends PreferenceFragmentCompat @Override public void onResume() { super.onResume(); - setParallelDownloadsText(UserPreferences.getParallelDownloads()); setDataFolderText(); } @@ -52,12 +50,6 @@ public class DownloadsPreferencesFragment extends PreferenceFragmentCompat ((PreferenceActivity) getActivity()).openScreen(R.xml.preferences_autodownload); return true; }); - findPreference(UserPreferences.PREF_PARALLEL_DOWNLOADS).setOnPreferenceChangeListener((preference, o) -> { - if (o instanceof Integer) { - setParallelDownloadsText((Integer) o); - } - return true; - }); // validate and set correct value: number of downloads between 1 and 50 (inclusive) findPreference(PREF_PROXY).setOnPreferenceClickListener(preference -> { ProxyDialog dialog = new ProxyDialog(getActivity()); @@ -73,12 +65,6 @@ public class DownloadsPreferencesFragment extends PreferenceFragmentCompat }); } - private void setParallelDownloadsText(int downloads) { - final Resources res = getActivity().getResources(); - String s = res.getString(R.string.parallel_downloads, downloads); - findPreference(UserPreferences.PREF_PARALLEL_DOWNLOADS).setSummary(s); - } - private void setDataFolderText() { File f = UserPreferences.getDataFolder(null); if (f != null) { diff --git a/app/src/main/java/de/danoeh/antennapod/preferences/NumberPickerPreference.java b/app/src/main/java/de/danoeh/antennapod/preferences/NumberPickerPreference.java deleted file mode 100644 index a15c6d6b2..000000000 --- a/app/src/main/java/de/danoeh/antennapod/preferences/NumberPickerPreference.java +++ /dev/null @@ -1,108 +0,0 @@ -package de.danoeh.antennapod.preferences; - -import android.content.Context; -import androidx.appcompat.app.AlertDialog; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import androidx.preference.Preference; -import android.text.InputFilter; -import android.util.AttributeSet; -import android.view.View; -import android.view.WindowManager; -import android.widget.EditText; - -import de.danoeh.antennapod.R; - -public class NumberPickerPreference extends Preference { - private Context context; - private int defaultValue = 0; - private int minValue = 0; - private int maxValue = Integer.MAX_VALUE; - - public NumberPickerPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - init(context, attrs); - } - - public NumberPickerPreference(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - init(context, attrs); - } - - public NumberPickerPreference(Context context, AttributeSet attrs) { - super(context, attrs); - init(context, attrs); - } - - public NumberPickerPreference(Context context) { - super(context); - this.context = context; - } - - private void init(Context context, AttributeSet attrs) { - this.context = context; - - for (int i = 0; i < attrs.getAttributeCount(); i++) { - String name = attrs.getAttributeName(i); - String value = attrs.getAttributeValue(i); - switch (name) { - case "defaultValue": - defaultValue = Integer.parseInt(value); - break; - case "minValue": - minValue = Integer.parseInt(value); - break; - case "maxValue": - maxValue = Integer.parseInt(value); - break; - } - } - } - - @Override - protected void onClick() { - super.onClick(); - - View view = View.inflate(context, R.layout.numberpicker, null); - EditText number = view.findViewById(R.id.number); - number.setText(getSharedPreferences().getString(getKey(), ""+defaultValue)); - number.setFilters(new InputFilter[]{(source, start, end, dest, dstart, dend) -> { - try { - String newVal = dest.toString().substring(0, dstart) + dest.toString().substring(dend); - newVal = newVal.substring(0, dstart) + source.toString() + newVal.substring(dstart); - int input = Integer.parseInt(newVal); - if (input >= minValue && input <= maxValue) { - return null; - } - } catch (NumberFormatException nfe) { - nfe.printStackTrace(); - } - return ""; - }}); - - AlertDialog dialog = new MaterialAlertDialogBuilder(context) - .setTitle(getTitle()) - .setView(view) - .setNegativeButton(android.R.string.cancel, null) - .setPositiveButton(android.R.string.ok, (dialogInterface, i) -> { - try { - String numberString = number.getText().toString(); - int value = Integer.parseInt(numberString); - - if (value < minValue || value > maxValue) { - return; - } - - getSharedPreferences().edit().putString(getKey(), "" + value).apply(); - - if (getOnPreferenceChangeListener() != null) { - getOnPreferenceChangeListener().onPreferenceChange(this, value); - } - } catch (NumberFormatException e) { - // Do not set value - } - }) - .create(); - dialog.show(); - dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); - } -} diff --git a/app/src/main/java/de/danoeh/antennapod/ui/home/sections/EpisodesSurpriseSection.java b/app/src/main/java/de/danoeh/antennapod/ui/home/sections/EpisodesSurpriseSection.java index 7e2c855e9..298bd05c5 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/home/sections/EpisodesSurpriseSection.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/home/sections/EpisodesSurpriseSection.java @@ -13,11 +13,10 @@ import androidx.recyclerview.widget.RecyclerView; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.adapter.HorizontalItemListAdapter; -import de.danoeh.antennapod.core.event.DownloadEvent; -import de.danoeh.antennapod.core.event.DownloaderUpdate; import de.danoeh.antennapod.core.menuhandler.MenuItemUtils; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.util.FeedItemUtil; +import de.danoeh.antennapod.event.EpisodeDownloadEvent; import de.danoeh.antennapod.event.FeedItemEvent; import de.danoeh.antennapod.event.PlayerStatusEvent; import de.danoeh.antennapod.event.playback.PlaybackPositionEvent; @@ -32,6 +31,7 @@ import io.reactivex.schedulers.Schedulers; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; +import java.util.ArrayList; import java.util.List; import java.util.Random; @@ -41,7 +41,7 @@ public class EpisodesSurpriseSection extends HomeSection { private static int seed = 0; private HorizontalItemListAdapter listAdapter; private Disposable disposable; - private List episodes; + private List episodes = new ArrayList<>(); @Nullable @Override @@ -103,9 +103,6 @@ public class EpisodesSurpriseSection extends HomeSection { @Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(FeedItemEvent event) { Log.d(TAG, "onEventMainThread() called with: " + "event = [" + event + "]"); - if (episodes == null) { - return; - } for (int i = 0, size = event.items.size(); i < size; i++) { FeedItem item = event.items.get(i); int pos = FeedItemUtil.indexOfItemWithId(episodes, item.getId()); @@ -118,15 +115,11 @@ public class EpisodesSurpriseSection extends HomeSection { } @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) - public void onEventMainThread(DownloadEvent event) { - Log.d(TAG, "onEventMainThread() called with DownloadEvent"); - DownloaderUpdate update = event.update; - if (listAdapter != null && update.mediaIds.length > 0) { - for (long mediaId : update.mediaIds) { - int pos = FeedItemUtil.indexOfItemWithMediaId(episodes, mediaId); - if (pos >= 0) { - listAdapter.notifyItemChangedCompat(pos); - } + public void onEventMainThread(EpisodeDownloadEvent event) { + for (String downloadUrl : event.getUrls()) { + int pos = FeedItemUtil.indexOfItemWithDownloadUrl(episodes, downloadUrl); + if (pos >= 0) { + listAdapter.notifyItemChangedCompat(pos); } } } diff --git a/app/src/main/java/de/danoeh/antennapod/ui/home/sections/InboxSection.java b/app/src/main/java/de/danoeh/antennapod/ui/home/sections/InboxSection.java index 8d343a16a..fe9d15dc1 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/home/sections/InboxSection.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/home/sections/InboxSection.java @@ -14,11 +14,10 @@ import androidx.recyclerview.widget.RecyclerView; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.adapter.EpisodeItemListAdapter; -import de.danoeh.antennapod.core.event.DownloadEvent; -import de.danoeh.antennapod.core.event.DownloaderUpdate; import de.danoeh.antennapod.core.menuhandler.MenuItemUtils; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.util.FeedItemUtil; +import de.danoeh.antennapod.event.EpisodeDownloadEvent; import de.danoeh.antennapod.event.FeedItemEvent; import de.danoeh.antennapod.event.FeedListUpdateEvent; import de.danoeh.antennapod.event.UnreadItemsUpdateEvent; @@ -35,6 +34,7 @@ import io.reactivex.schedulers.Schedulers; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; +import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -42,7 +42,7 @@ public class InboxSection extends HomeSection { public static final String TAG = "InboxSection"; private static final int NUM_EPISODES = 2; private EpisodeItemListAdapter adapter; - private List items; + private List items = new ArrayList<>(); private Disposable disposable; @Nullable @@ -97,15 +97,11 @@ public class InboxSection extends HomeSection { } @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) - public void onEventMainThread(DownloadEvent event) { - Log.d(TAG, "onEventMainThread() called with DownloadEvent"); - DownloaderUpdate update = event.update; - if (adapter != null && update.mediaIds.length > 0) { - for (long mediaId : update.mediaIds) { - int pos = FeedItemUtil.indexOfItemWithMediaId(items, mediaId); - if (pos >= 0) { - adapter.notifyItemChangedCompat(pos); - } + public void onEventMainThread(EpisodeDownloadEvent event) { + for (String downloadUrl : event.getUrls()) { + int pos = FeedItemUtil.indexOfItemWithDownloadUrl(items, downloadUrl); + if (pos >= 0) { + adapter.notifyItemChangedCompat(pos); } } } diff --git a/app/src/main/java/de/danoeh/antennapod/ui/home/sections/QueueSection.java b/app/src/main/java/de/danoeh/antennapod/ui/home/sections/QueueSection.java index 070d56ed6..33335f2bb 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/home/sections/QueueSection.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/home/sections/QueueSection.java @@ -13,11 +13,10 @@ import androidx.recyclerview.widget.RecyclerView; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.adapter.HorizontalItemListAdapter; -import de.danoeh.antennapod.core.event.DownloadEvent; -import de.danoeh.antennapod.core.event.DownloaderUpdate; import de.danoeh.antennapod.core.menuhandler.MenuItemUtils; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.util.FeedItemUtil; +import de.danoeh.antennapod.event.EpisodeDownloadEvent; import de.danoeh.antennapod.event.FeedItemEvent; import de.danoeh.antennapod.event.PlayerStatusEvent; import de.danoeh.antennapod.event.QueueEvent; @@ -33,6 +32,7 @@ import io.reactivex.schedulers.Schedulers; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; +import java.util.ArrayList; import java.util.List; public class QueueSection extends HomeSection { @@ -40,7 +40,7 @@ public class QueueSection extends HomeSection { private static final int NUM_EPISODES = 8; private HorizontalItemListAdapter listAdapter; private Disposable disposable; - private List queue; + private List queue = new ArrayList<>(); @Nullable @Override @@ -102,15 +102,11 @@ public class QueueSection extends HomeSection { } @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) - public void onEventMainThread(DownloadEvent event) { - Log.d(TAG, "onEventMainThread() called with DownloadEvent"); - DownloaderUpdate update = event.update; - if (listAdapter != null && update.mediaIds.length > 0) { - for (long mediaId : update.mediaIds) { - int pos = FeedItemUtil.indexOfItemWithMediaId(queue, mediaId); - if (pos >= 0) { - listAdapter.notifyItemChangedCompat(pos); - } + public void onEventMainThread(EpisodeDownloadEvent event) { + for (String downloadUrl : event.getUrls()) { + int pos = FeedItemUtil.indexOfItemWithDownloadUrl(queue, downloadUrl); + if (pos >= 0) { + listAdapter.notifyItemChangedCompat(pos); } } } diff --git a/app/src/main/java/de/danoeh/antennapod/view/viewholder/EpisodeItemViewHolder.java b/app/src/main/java/de/danoeh/antennapod/view/viewholder/EpisodeItemViewHolder.java index fd3ec9299..03df844b1 100644 --- a/app/src/main/java/de/danoeh/antennapod/view/viewholder/EpisodeItemViewHolder.java +++ b/app/src/main/java/de/danoeh/antennapod/view/viewholder/EpisodeItemViewHolder.java @@ -21,8 +21,6 @@ import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.adapter.CoverLoader; import de.danoeh.antennapod.adapter.actionbutton.ItemActionButton; -import de.danoeh.antennapod.net.download.serviceinterface.DownloadRequest; -import de.danoeh.antennapod.core.service.download.DownloadService; import de.danoeh.antennapod.core.util.PlaybackStatus; import de.danoeh.antennapod.core.util.download.MediaSizeLoader; import de.danoeh.antennapod.event.playback.PlaybackPositionEvent; @@ -31,6 +29,7 @@ import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.model.playback.MediaType; import de.danoeh.antennapod.core.feed.util.ImageResourceUtils; +import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface; import de.danoeh.antennapod.storage.preferences.UserPreferences; import de.danoeh.antennapod.core.util.Converter; import de.danoeh.antennapod.core.util.NetworkUtils; @@ -117,6 +116,7 @@ public class EpisodeItemViewHolder extends RecyclerView.ViewHolder { bind(item.getMedia()); } else { secondaryActionProgress.setPercentage(0, item); + secondaryActionProgress.setIndeterminate(false); isVideo.setVisibility(View.GONE); progressBar.setVisibility(View.GONE); duration.setVisibility(View.GONE); @@ -145,14 +145,17 @@ public class EpisodeItemViewHolder extends RecyclerView.ViewHolder { itemView.setBackgroundResource(ThemeUtils.getDrawableFromAttr(activity, R.attr.selectableItemBackground)); } - if (DownloadService.isDownloadingFile(media.getDownload_url())) { - final DownloadRequest downloadRequest = DownloadService.findRequest(media.getDownload_url()); - float percent = 0.01f * downloadRequest.getProgressPercent(); + if (DownloadServiceInterface.get().isDownloadingEpisode(media.getDownload_url())) { + float percent = 0.01f * DownloadServiceInterface.get().getProgress(media.getDownload_url()); secondaryActionProgress.setPercentage(Math.max(percent, 0.01f), item); + secondaryActionProgress.setIndeterminate( + DownloadServiceInterface.get().isEpisodeQueued(media.getDownload_url())); } else if (media.isDownloaded()) { secondaryActionProgress.setPercentage(1, item); // Do not animate 100% -> 0% + secondaryActionProgress.setIndeterminate(false); } else { secondaryActionProgress.setPercentage(0, item); // Animate X% -> 0% + secondaryActionProgress.setIndeterminate(false); } duration.setText(Converter.getDurationStringLong(media.getDuration())); @@ -210,6 +213,7 @@ public class EpisodeItemViewHolder extends RecyclerView.ViewHolder { pubDate.setText("████"); duration.setText("████"); secondaryActionProgress.setPercentage(0, null); + secondaryActionProgress.setIndeterminate(false); progressBar.setVisibility(View.GONE); position.setVisibility(View.GONE); dragHandle.setVisibility(View.GONE); diff --git a/app/src/main/java/de/danoeh/antennapod/view/viewholder/HorizontalItemViewHolder.java b/app/src/main/java/de/danoeh/antennapod/view/viewholder/HorizontalItemViewHolder.java index 05240b371..f809de175 100644 --- a/app/src/main/java/de/danoeh/antennapod/view/viewholder/HorizontalItemViewHolder.java +++ b/app/src/main/java/de/danoeh/antennapod/view/viewholder/HorizontalItemViewHolder.java @@ -14,13 +14,12 @@ import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.adapter.CoverLoader; import de.danoeh.antennapod.adapter.actionbutton.ItemActionButton; import de.danoeh.antennapod.core.feed.util.ImageResourceUtils; -import de.danoeh.antennapod.net.download.serviceinterface.DownloadRequest; -import de.danoeh.antennapod.core.service.download.DownloadService; import de.danoeh.antennapod.core.util.DateFormatter; import de.danoeh.antennapod.core.util.PlaybackStatus; import de.danoeh.antennapod.event.playback.PlaybackPositionEvent; import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedMedia; +import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface; import de.danoeh.antennapod.ui.common.CircularProgressBar; import de.danoeh.antennapod.ui.common.SquareImageView; import de.danoeh.antennapod.ui.common.ThemeUtils; @@ -85,14 +84,17 @@ public class HorizontalItemViewHolder extends RecyclerView.ViewHolder { setProgressBar(false, 0); } - if (DownloadService.isDownloadingFile(media.getDownload_url())) { - final DownloadRequest downloadRequest = DownloadService.findRequest(media.getDownload_url()); - float percent = 0.01f * downloadRequest.getProgressPercent(); + if (DownloadServiceInterface.get().isDownloadingEpisode(media.getDownload_url())) { + float percent = 0.01f * DownloadServiceInterface.get().getProgress(media.getDownload_url()); circularProgressBar.setPercentage(Math.max(percent, 0.01f), item); + circularProgressBar.setIndeterminate( + DownloadServiceInterface.get().isEpisodeQueued(media.getDownload_url())); } else if (media.isDownloaded()) { circularProgressBar.setPercentage(1, item); // Do not animate 100% -> 0% + circularProgressBar.setIndeterminate(false); } else { circularProgressBar.setPercentage(0, item); // Animate X% -> 0% + circularProgressBar.setIndeterminate(false); } } } @@ -107,6 +109,7 @@ public class HorizontalItemViewHolder extends RecyclerView.ViewHolder { date.setText("███"); secondaryActionIcon.setImageDrawable(null); circularProgressBar.setPercentage(0, null); + circularProgressBar.setIndeterminate(false); setProgressBar(true, 50); } -- cgit v1.2.3