Fix 'allow once' for feed update on mobile networks (#6528)
This commit is contained in:
parent
23d4cf5632
commit
6999a944bb
@ -11,8 +11,8 @@ import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.activity.MainActivity;
|
||||
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.util.DownloadErrorLabel;
|
||||
import de.danoeh.antennapod.core.util.download.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.model.download.DownloadError;
|
||||
import de.danoeh.antennapod.model.download.DownloadResult;
|
||||
import de.danoeh.antennapod.model.feed.Feed;
|
||||
@ -109,7 +109,7 @@ public class DownloadLogAdapter extends BaseAdapter {
|
||||
Log.e(TAG, "Could not find feed for feed id: " + status.getFeedfileId());
|
||||
return;
|
||||
}
|
||||
DBTasks.forceRefreshFeed(context, feed, true);
|
||||
FeedUpdateManager.runOnce(context, feed);
|
||||
});
|
||||
} else if (status.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) {
|
||||
holder.secondaryActionButton.setOnClickListener(v -> {
|
||||
|
@ -6,8 +6,8 @@ import android.view.LayoutInflater;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.core.storage.DBTasks;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.core.util.download.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.databinding.EditTextDialogBinding;
|
||||
import de.danoeh.antennapod.model.feed.Feed;
|
||||
|
||||
@ -48,7 +48,7 @@ public abstract class EditUrlSettingsDialog {
|
||||
try {
|
||||
DBWriter.updateFeedDownloadURL(original, updated).get();
|
||||
feed.setDownload_url(updated);
|
||||
DBTasks.forceRefreshFeed(activityRef.get(), feed, false);
|
||||
FeedUpdateManager.runOnce(activityRef.get(), feed);
|
||||
} catch (ExecutionException | InterruptedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
@ -27,6 +27,7 @@ import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.activity.MainActivity;
|
||||
import de.danoeh.antennapod.activity.OnlineFeedViewActivity;
|
||||
import de.danoeh.antennapod.activity.OpmlImportActivity;
|
||||
import de.danoeh.antennapod.core.util.download.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.model.feed.Feed;
|
||||
import de.danoeh.antennapod.core.storage.DBTasks;
|
||||
import de.danoeh.antennapod.model.feed.SortOrder;
|
||||
@ -210,7 +211,7 @@ public class AddFeedFragment extends Fragment {
|
||||
dirFeed.setItems(Collections.emptyList());
|
||||
dirFeed.setSortOrder(SortOrder.EPISODE_TITLE_A_Z);
|
||||
Feed fromDatabase = DBTasks.updateFeed(getContext(), dirFeed, false);
|
||||
DBTasks.forceRefreshFeed(getContext(), fromDatabase, true);
|
||||
FeedUpdateManager.runOnce(requireContext(), fromDatabase);
|
||||
return fromDatabase;
|
||||
}
|
||||
|
||||
|
@ -32,7 +32,6 @@ import de.danoeh.antennapod.adapter.EpisodeItemListAdapter;
|
||||
import de.danoeh.antennapod.core.feed.FeedEvent;
|
||||
import de.danoeh.antennapod.core.menuhandler.MenuItemUtils;
|
||||
import de.danoeh.antennapod.core.storage.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBTasks;
|
||||
import de.danoeh.antennapod.core.util.FeedItemPermutors;
|
||||
import de.danoeh.antennapod.core.util.FeedItemUtil;
|
||||
import de.danoeh.antennapod.core.util.download.FeedUpdateManager;
|
||||
@ -185,7 +184,7 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
|
||||
|
||||
viewBinding.swipeRefresh.setDistanceToTriggerSync(getResources().getInteger(R.integer.swipe_refresh_distance));
|
||||
viewBinding.swipeRefresh.setOnRefreshListener(() -> {
|
||||
DBTasks.forceRefreshFeed(requireContext(), feed, true);
|
||||
FeedUpdateManager.runOnceOrAsk(requireContext(), feed);
|
||||
new Handler(Looper.getMainLooper()).postDelayed(() -> viewBinding.swipeRefresh.setRefreshing(false),
|
||||
getResources().getInteger(R.integer.swipe_to_refresh_duration_in_ms));
|
||||
});
|
||||
|
@ -6,7 +6,6 @@ import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import androidx.annotation.NonNull;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.core.storage.DBTasks;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.core.util.IntentUtils;
|
||||
import de.danoeh.antennapod.core.util.ShareUtils;
|
||||
@ -64,7 +63,7 @@ public class FeedMenuHandler {
|
||||
public static boolean onOptionsItemClicked(final Context context, final MenuItem item, final Feed selectedFeed) {
|
||||
final int itemId = item.getItemId();
|
||||
if (itemId == R.id.refresh_item) {
|
||||
DBTasks.forceRefreshFeed(context, selectedFeed, true);
|
||||
FeedUpdateManager.runOnceOrAsk(context, selectedFeed);
|
||||
} else if (itemId == R.id.refresh_complete_item) {
|
||||
new Thread(() -> {
|
||||
selectedFeed.setNextPageLink(selectedFeed.getDownload_url());
|
||||
|
@ -53,9 +53,11 @@ public class FeedUpdateWorker extends Worker {
|
||||
ClientConfigurator.initialize(getApplicationContext());
|
||||
newEpisodesNotification.loadCountersBeforeRefresh();
|
||||
|
||||
if (!NetworkUtils.networkAvailable() || !NetworkUtils.isFeedRefreshAllowed()) {
|
||||
Log.d(TAG, "Blocking automatic update: no wifi available / no mobile updates allowed");
|
||||
return Result.retry();
|
||||
if (!getInputData().getBoolean(FeedUpdateManager.EXTRA_EVEN_ON_MOBILE, false)) {
|
||||
if (!NetworkUtils.networkAvailable() || !NetworkUtils.isFeedRefreshAllowed()) {
|
||||
Log.d(TAG, "Blocking automatic update: no wifi available / no mobile updates allowed");
|
||||
return Result.retry();
|
||||
}
|
||||
}
|
||||
|
||||
List<Feed> toUpdate;
|
||||
|
@ -8,7 +8,6 @@ import androidx.annotation.VisibleForTesting;
|
||||
import de.danoeh.antennapod.core.R;
|
||||
import de.danoeh.antennapod.core.sync.queue.SynchronizationQueueSink;
|
||||
import de.danoeh.antennapod.core.util.comparator.FeedItemPubdateComparator;
|
||||
import de.danoeh.antennapod.core.util.download.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.event.FeedItemEvent;
|
||||
import de.danoeh.antennapod.event.FeedListUpdateEvent;
|
||||
import de.danoeh.antennapod.event.MessageEvent;
|
||||
@ -92,14 +91,6 @@ public final class DBTasks {
|
||||
}
|
||||
}
|
||||
|
||||
public static void forceRefreshFeed(Context context, Feed feed, boolean initiatedByUser) {
|
||||
forceRefreshFeed(context, feed, false, initiatedByUser);
|
||||
}
|
||||
|
||||
private static void forceRefreshFeed(Context context, Feed feed, boolean loadAllPages, boolean initiatedByUser) {
|
||||
FeedUpdateManager.runOnce(context, feed);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifies the database about a missing FeedMedia file. This method will correct the FeedMedia object's
|
||||
* values in the DB and send a FeedItemEvent.
|
||||
|
@ -3,6 +3,7 @@ package de.danoeh.antennapod.core.util.download;
|
||||
import android.content.Context;
|
||||
import android.util.Log;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.work.Constraints;
|
||||
import androidx.work.Data;
|
||||
import androidx.work.ExistingPeriodicWorkPolicy;
|
||||
@ -16,8 +17,10 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import de.danoeh.antennapod.core.R;
|
||||
import de.danoeh.antennapod.core.service.FeedUpdateWorker;
|
||||
import de.danoeh.antennapod.core.util.NetworkUtils;
|
||||
import de.danoeh.antennapod.event.MessageEvent;
|
||||
import de.danoeh.antennapod.model.feed.Feed;
|
||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@ -27,6 +30,7 @@ public class FeedUpdateManager {
|
||||
private static final String WORK_ID_FEED_UPDATE_MANUAL = "feedUpdateManual";
|
||||
public static final String EXTRA_FEED_ID = "feed_id";
|
||||
public static final String EXTRA_NEXT_PAGE = "next_page";
|
||||
public static final String EXTRA_EVEN_ON_MOBILE = "even_on_mobile";
|
||||
private static final String TAG = "AutoUpdateManager";
|
||||
|
||||
private FeedUpdateManager() {
|
||||
@ -62,37 +66,44 @@ public class FeedUpdateManager {
|
||||
OneTimeWorkRequest.Builder workRequest = new OneTimeWorkRequest.Builder(FeedUpdateWorker.class)
|
||||
.setInitialDelay(0L, TimeUnit.MILLISECONDS)
|
||||
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
|
||||
.addTag(WORK_TAG_FEED_UPDATE);
|
||||
.addTag(WORK_TAG_FEED_UPDATE)
|
||||
.setConstraints(new Constraints.Builder()
|
||||
.setRequiredNetworkType(NetworkType.CONNECTED).build());
|
||||
Data.Builder builder = new Data.Builder();
|
||||
builder.putBoolean(EXTRA_EVEN_ON_MOBILE, true);
|
||||
if (feed != null) {
|
||||
Data.Builder builder = new Data.Builder();
|
||||
builder.putLong(EXTRA_FEED_ID, feed.getId());
|
||||
builder.putBoolean(EXTRA_NEXT_PAGE, nextPage);
|
||||
workRequest.setInputData(builder.build());
|
||||
}
|
||||
workRequest.setInputData(builder.build());
|
||||
WorkManager.getInstance(context).enqueueUniqueWork(WORK_ID_FEED_UPDATE_MANUAL,
|
||||
ExistingWorkPolicy.REPLACE, workRequest.build());
|
||||
}
|
||||
|
||||
public static void runOnceOrAsk(@NonNull Context context) {
|
||||
runOnceOrAsk(context, null);
|
||||
}
|
||||
|
||||
public static void runOnceOrAsk(@NonNull Context context, @Nullable Feed feed) {
|
||||
Log.d(TAG, "Run auto update immediately in background.");
|
||||
if (!NetworkUtils.networkAvailable()) {
|
||||
Log.d(TAG, "Ignoring: No network connection.");
|
||||
EventBus.getDefault().post(new MessageEvent(context.getString(R.string.download_error_no_connection)));
|
||||
} else if (NetworkUtils.isFeedRefreshAllowed()) {
|
||||
runOnce(context);
|
||||
runOnce(context, feed);
|
||||
} else {
|
||||
confirmMobileAllFeedsRefresh(context);
|
||||
confirmMobileRefresh(context, feed);
|
||||
}
|
||||
}
|
||||
|
||||
private static void confirmMobileAllFeedsRefresh(final Context context) {
|
||||
private static void confirmMobileRefresh(final Context context, @Nullable Feed feed) {
|
||||
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(context)
|
||||
.setTitle(R.string.feed_refresh_title)
|
||||
.setMessage(R.string.confirm_mobile_feed_refresh_dialog_message)
|
||||
.setPositiveButton(R.string.confirm_mobile_streaming_button_once,
|
||||
(dialog, which) -> runOnce(context))
|
||||
(dialog, which) -> runOnce(context, feed))
|
||||
.setNeutralButton(R.string.confirm_mobile_streaming_button_always, (dialog, which) -> {
|
||||
UserPreferences.setAllowMobileFeedRefresh(true);
|
||||
runOnce(context);
|
||||
runOnce(context, feed);
|
||||
})
|
||||
.setNegativeButton(R.string.no, null);
|
||||
builder.show();
|
||||
|
@ -275,6 +275,7 @@
|
||||
<string name="download_error_unsupported_type_html">The podcast host\'s server sent a website, not a podcast.</string>
|
||||
<string name="download_error_not_found">The podcast host\'s server does not know where to find the file. It may have been deleted.</string>
|
||||
<string name="download_error_connection_error">Connection error</string>
|
||||
<string name="download_error_no_connection">No network connection</string>
|
||||
<string name="download_error_unknown_host">Cannot find the server. Check if the address is typed correctly and if you have a working network connection.</string>
|
||||
<string name="download_error_unauthorized">Authentication error. Make sure that username and password are correct.</string>
|
||||
<string name="download_error_file_type_type">File type error</string>
|
||||
|
Loading…
x
Reference in New Issue
Block a user