Create module for sync service and move DBWriter to database module (#7040)
This commit is contained in:
parent
0c8c9a89a3
commit
6f3a9b1676
@ -86,6 +86,7 @@ dependencies {
|
||||
implementation project(':ui:widget')
|
||||
implementation project(':ui:preferences')
|
||||
implementation project(':ui:statistics')
|
||||
implementation project(':net:sync:service-interface')
|
||||
|
||||
annotationProcessor "androidx.annotation:annotation:$annotationVersion"
|
||||
implementation "androidx.appcompat:appcompat:$appcompatVersion"
|
||||
|
@ -13,7 +13,7 @@ import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.activity.MainActivity;
|
||||
import de.danoeh.antennapod.storage.preferences.PlaybackPreferences;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.LongList;
|
||||
import de.danoeh.antennapod.core.util.playback.PlaybackController;
|
||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||
|
@ -35,10 +35,11 @@ import com.google.android.material.appbar.MaterialToolbar;
|
||||
import com.google.android.material.bottomsheet.BottomSheetBehavior;
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.core.util.download.FeedUpdateManagerImpl;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueueSink;
|
||||
import de.danoeh.antennapod.ui.appstartintent.MediaButtonStarter;
|
||||
import de.danoeh.antennapod.ui.common.ThemeSwitcher;
|
||||
import de.danoeh.antennapod.core.sync.queue.SynchronizationQueueSink;
|
||||
import de.danoeh.antennapod.core.util.download.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.dialog.rating.RatingDialogManager;
|
||||
import de.danoeh.antennapod.event.EpisodeDownloadEvent;
|
||||
import de.danoeh.antennapod.event.FeedUpdateRunningEvent;
|
||||
@ -166,12 +167,12 @@ public class MainActivity extends CastEnabledActivity {
|
||||
sheetBehavior.setHideable(false);
|
||||
sheetBehavior.setBottomSheetCallback(bottomSheetCallback);
|
||||
|
||||
FeedUpdateManager.restartUpdateAlarm(this, false);
|
||||
FeedUpdateManager.getInstance().restartUpdateAlarm(this, false);
|
||||
SynchronizationQueueSink.syncNowIfNotSyncedRecently();
|
||||
AutomaticDatabaseExportWorker.enqueueIfNeeded(this, false);
|
||||
|
||||
WorkManager.getInstance(this)
|
||||
.getWorkInfosByTagLiveData(FeedUpdateManager.WORK_TAG_FEED_UPDATE)
|
||||
.getWorkInfosByTagLiveData(FeedUpdateManagerImpl.WORK_TAG_FEED_UPDATE)
|
||||
.observe(this, workInfos -> {
|
||||
boolean isRefreshingFeeds = false;
|
||||
for (WorkInfo workInfo : workInfos) {
|
||||
@ -301,7 +302,7 @@ public class MainActivity extends CastEnabledActivity {
|
||||
private void checkFirstLaunch() {
|
||||
SharedPreferences prefs = getSharedPreferences(PREF_NAME, MODE_PRIVATE);
|
||||
if (prefs.getBoolean(PREF_IS_FIRST_LAUNCH, true)) {
|
||||
FeedUpdateManager.restartUpdateAlarm(this, true);
|
||||
FeedUpdateManager.getInstance().restartUpdateAlarm(this, true);
|
||||
|
||||
SharedPreferences.Editor edit = prefs.edit();
|
||||
edit.putBoolean(PREF_IS_FIRST_LAUNCH, false);
|
||||
@ -630,7 +631,7 @@ public class MainActivity extends CastEnabledActivity {
|
||||
new DownloadLogFragment().show(getSupportFragmentManager(), null);
|
||||
}
|
||||
if (intent.getBooleanExtra(EXTRA_REFRESH_ON_START, false)) {
|
||||
FeedUpdateManager.runOnceOrAsk(this);
|
||||
FeedUpdateManager.getInstance().runOnceOrAsk(this);
|
||||
}
|
||||
// to avoid handling the intent twice when the configuration changes
|
||||
setIntent(new Intent(MainActivity.this, MainActivity.class));
|
||||
|
@ -32,7 +32,7 @@ import de.danoeh.antennapod.ui.appstartintent.MainActivityStarter;
|
||||
import de.danoeh.antennapod.ui.common.ThemeSwitcher;
|
||||
import de.danoeh.antennapod.core.service.download.DownloadRequestCreator;
|
||||
import de.danoeh.antennapod.net.discovery.FeedUrlNotFoundException;
|
||||
import de.danoeh.antennapod.core.storage.FeedDatabaseWriter;
|
||||
import de.danoeh.antennapod.storage.database.FeedDatabaseWriter;
|
||||
import de.danoeh.antennapod.core.service.playback.PlaybackServiceInterface;
|
||||
import de.danoeh.antennapod.core.util.DownloadErrorLabel;
|
||||
import de.danoeh.antennapod.databinding.EditTextDialogBinding;
|
||||
@ -48,7 +48,7 @@ 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.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.net.discovery.CombinedSearcher;
|
||||
import de.danoeh.antennapod.net.discovery.PodcastSearchResult;
|
||||
import de.danoeh.antennapod.net.discovery.PodcastSearcherRegistry;
|
||||
|
@ -26,10 +26,10 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.core.app.ActivityCompat;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.ui.common.ThemeSwitcher;
|
||||
|
||||
import de.danoeh.antennapod.core.storage.FeedDatabaseWriter;
|
||||
import de.danoeh.antennapod.core.util.download.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.storage.database.FeedDatabaseWriter;
|
||||
import de.danoeh.antennapod.databinding.OpmlSelectionBinding;
|
||||
import de.danoeh.antennapod.model.feed.Feed;
|
||||
import de.danoeh.antennapod.storage.importexport.OpmlElement;
|
||||
@ -104,7 +104,7 @@ public class OpmlImportActivity extends AppCompatActivity {
|
||||
feed.setItems(Collections.emptyList());
|
||||
FeedDatabaseWriter.updateFeed(this, feed, false);
|
||||
}
|
||||
FeedUpdateManager.runOnce(this);
|
||||
FeedUpdateManager.getInstance().runOnce(this);
|
||||
})
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
|
@ -46,7 +46,7 @@ import de.danoeh.antennapod.fragment.ChaptersFragment;
|
||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||
import de.danoeh.antennapod.core.service.playback.PlaybackService;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.ui.common.Converter;
|
||||
import de.danoeh.antennapod.core.util.FeedItemUtil;
|
||||
import de.danoeh.antennapod.core.util.IntentUtils;
|
||||
|
@ -10,9 +10,9 @@ import android.widget.Toast;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.activity.MainActivity;
|
||||
import de.danoeh.antennapod.adapter.actionbutton.DownloadActionButton;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
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;
|
||||
@ -105,7 +105,7 @@ public class DownloadLogAdapter extends BaseAdapter {
|
||||
Log.e(TAG, "Could not find feed for feed id: " + status.getFeedfileId());
|
||||
return;
|
||||
}
|
||||
FeedUpdateManager.runOnce(context, feed);
|
||||
FeedUpdateManager.getInstance().runOnce(context, feed);
|
||||
});
|
||||
} else if (status.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) {
|
||||
holder.secondaryActionButton.setOnClickListener(v -> {
|
||||
|
@ -9,7 +9,7 @@ import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterfa
|
||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||
import de.danoeh.antennapod.model.feed.FeedMedia;
|
||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
|
||||
public class CancelDownloadActionButton extends ItemActionButton {
|
||||
|
||||
|
@ -10,7 +10,7 @@ import java.util.Collections;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||
import de.danoeh.antennapod.model.feed.FeedMedia;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.view.LocalDeleteModal;
|
||||
|
||||
public class DeleteActionButton extends ItemActionButton {
|
||||
|
@ -7,7 +7,7 @@ import android.view.View;
|
||||
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
|
||||
public class MarkAsPlayedActionButton extends ItemActionButton {
|
||||
|
||||
|
@ -5,7 +5,7 @@ import android.util.Log;
|
||||
import androidx.annotation.DrawableRes;
|
||||
import androidx.annotation.StringRes;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.event.FeedItemEvent;
|
||||
import de.danoeh.antennapod.event.MessageEvent;
|
||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||
|
@ -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.DBWriter;
|
||||
import de.danoeh.antennapod.core.util.download.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
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.setDownloadUrl(updated);
|
||||
FeedUpdateManager.runOnce(activityRef.get(), feed);
|
||||
FeedUpdateManager.getInstance().runOnce(activityRef.get(), feed);
|
||||
} catch (ExecutionException | InterruptedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
package de.danoeh.antennapod.dialog;
|
||||
|
||||
import android.os.Bundle;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.model.feed.Feed;
|
||||
|
||||
import java.util.Set;
|
||||
|
@ -13,7 +13,7 @@ import java.util.List;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.core.dialog.ConfirmationDialog;
|
||||
import de.danoeh.antennapod.model.feed.Feed;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import io.reactivex.Completable;
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
|
@ -12,7 +12,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.storage.database.NavDrawerData;
|
||||
import de.danoeh.antennapod.model.feed.Feed;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.databinding.EditTextDialogBinding;
|
||||
import de.danoeh.antennapod.model.feed.FeedPreferences;
|
||||
|
||||
|
@ -23,7 +23,7 @@ import java.util.Set;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.adapter.SimpleChipAdapter;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.NavDrawerData;
|
||||
import de.danoeh.antennapod.databinding.EditTagsDialogBinding;
|
||||
import de.danoeh.antennapod.model.feed.FeedCounter;
|
||||
|
@ -26,9 +26,9 @@ import com.google.android.material.snackbar.Snackbar;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.activity.MainActivity;
|
||||
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.FeedDatabaseWriter;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.storage.database.FeedDatabaseWriter;
|
||||
import de.danoeh.antennapod.model.feed.SortOrder;
|
||||
import de.danoeh.antennapod.databinding.AddfeedBinding;
|
||||
import de.danoeh.antennapod.databinding.EditTextDialogBinding;
|
||||
@ -204,7 +204,7 @@ public class AddFeedFragment extends Fragment {
|
||||
dirFeed.setItems(Collections.emptyList());
|
||||
dirFeed.setSortOrder(SortOrder.EPISODE_TITLE_A_Z);
|
||||
Feed fromDatabase = FeedDatabaseWriter.updateFeed(getContext(), dirFeed, false);
|
||||
FeedUpdateManager.runOnce(requireContext(), fromDatabase);
|
||||
FeedUpdateManager.getInstance().runOnce(requireContext(), fromDatabase);
|
||||
return fromDatabase;
|
||||
}
|
||||
|
||||
|
@ -20,9 +20,9 @@ import de.danoeh.antennapod.adapter.EpisodeItemListAdapter;
|
||||
import de.danoeh.antennapod.adapter.actionbutton.DeleteActionButton;
|
||||
import de.danoeh.antennapod.event.DownloadLogEvent;
|
||||
import de.danoeh.antennapod.core.menuhandler.MenuItemUtils;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.core.util.FeedItemUtil;
|
||||
import de.danoeh.antennapod.core.util.download.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.dialog.ItemSortDialog;
|
||||
import de.danoeh.antennapod.event.EpisodeDownloadEvent;
|
||||
import de.danoeh.antennapod.event.FeedItemEvent;
|
||||
@ -179,7 +179,7 @@ public class CompletedDownloadsFragment extends Fragment
|
||||
@Override
|
||||
public boolean onMenuItemClick(MenuItem item) {
|
||||
if (item.getItemId() == R.id.refresh_item) {
|
||||
FeedUpdateManager.runOnceOrAsk(requireContext());
|
||||
FeedUpdateManager.getInstance().runOnceOrAsk(requireContext());
|
||||
return true;
|
||||
} else if (item.getItemId() == R.id.action_download_logs) {
|
||||
new DownloadLogFragment().show(getChildFragmentManager(), null);
|
||||
|
@ -15,7 +15,7 @@ import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.adapter.DownloadLogAdapter;
|
||||
import de.danoeh.antennapod.event.DownloadLogEvent;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.databinding.DownloadLogFragmentBinding;
|
||||
import de.danoeh.antennapod.dialog.DownloadLogDetailsDialog;
|
||||
import de.danoeh.antennapod.model.download.DownloadResult;
|
||||
|
@ -24,6 +24,7 @@ import com.google.android.material.appbar.MaterialToolbar;
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
import com.leinardi.android.speeddial.SpeedDialView;
|
||||
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
import org.greenrobot.eventbus.ThreadMode;
|
||||
@ -38,7 +39,6 @@ import de.danoeh.antennapod.adapter.EpisodeItemListAdapter;
|
||||
import de.danoeh.antennapod.core.dialog.ConfirmationDialog;
|
||||
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;
|
||||
@ -122,7 +122,7 @@ public abstract class EpisodesListFragment extends Fragment
|
||||
public boolean onMenuItemClick(MenuItem item) {
|
||||
final int itemId = item.getItemId();
|
||||
if (itemId == R.id.refresh_item) {
|
||||
FeedUpdateManager.runOnceOrAsk(requireContext());
|
||||
FeedUpdateManager.getInstance().runOnceOrAsk(requireContext());
|
||||
return true;
|
||||
} else if (itemId == R.id.action_search) {
|
||||
((MainActivity) getActivity()).loadChildFragment(SearchFragment.newInstance());
|
||||
@ -182,7 +182,7 @@ public abstract class EpisodesListFragment extends Fragment
|
||||
|
||||
swipeRefreshLayout = root.findViewById(R.id.swipeRefresh);
|
||||
swipeRefreshLayout.setDistanceToTriggerSync(getResources().getInteger(R.integer.swipe_refresh_distance));
|
||||
swipeRefreshLayout.setOnRefreshListener(() -> FeedUpdateManager.runOnceOrAsk(requireContext()));
|
||||
swipeRefreshLayout.setOnRefreshListener(() -> FeedUpdateManager.getInstance().runOnceOrAsk(requireContext()));
|
||||
|
||||
listAdapter = new EpisodeItemListAdapter((MainActivity) getActivity()) {
|
||||
@Override
|
||||
|
@ -35,7 +35,7 @@ import com.google.android.material.snackbar.Snackbar;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.activity.MainActivity;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.FeedDatabaseWriter;
|
||||
import de.danoeh.antennapod.storage.database.FeedDatabaseWriter;
|
||||
import de.danoeh.antennapod.core.util.IntentUtils;
|
||||
import de.danoeh.antennapod.core.util.ShareUtils;
|
||||
import de.danoeh.antennapod.core.util.syndication.HtmlToPlainText;
|
||||
|
@ -26,6 +26,7 @@ import com.google.android.material.appbar.MaterialToolbar;
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
import com.leinardi.android.speeddial.SpeedDialView;
|
||||
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.Validate;
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
@ -42,12 +43,11 @@ import de.danoeh.antennapod.adapter.EpisodeItemListAdapter;
|
||||
import de.danoeh.antennapod.event.FeedEvent;
|
||||
import de.danoeh.antennapod.core.menuhandler.MenuItemUtils;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.FeedItemPermutors;
|
||||
import de.danoeh.antennapod.core.util.FeedItemUtil;
|
||||
import de.danoeh.antennapod.core.util.IntentUtils;
|
||||
import de.danoeh.antennapod.core.util.ShareUtils;
|
||||
import de.danoeh.antennapod.core.util.download.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.core.util.gui.MoreContentListFooterUtil;
|
||||
import de.danoeh.antennapod.databinding.FeedItemListFragmentBinding;
|
||||
import de.danoeh.antennapod.databinding.MultiSelectSpeedDialBinding;
|
||||
@ -171,7 +171,7 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
|
||||
nextPageLoader = new MoreContentListFooterUtil(viewBinding.moreContent.moreContentListFooter);
|
||||
nextPageLoader.setClickListener(() -> {
|
||||
if (feed != null) {
|
||||
FeedUpdateManager.runOnce(getContext(), feed, true);
|
||||
FeedUpdateManager.getInstance().runOnce(getContext(), feed, true);
|
||||
}
|
||||
});
|
||||
viewBinding.recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
|
||||
@ -190,7 +190,8 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
|
||||
EventBus.getDefault().register(this);
|
||||
|
||||
viewBinding.swipeRefresh.setDistanceToTriggerSync(getResources().getInteger(R.integer.swipe_refresh_distance));
|
||||
viewBinding.swipeRefresh.setOnRefreshListener(() -> FeedUpdateManager.runOnceOrAsk(requireContext(), feed));
|
||||
viewBinding.swipeRefresh.setOnRefreshListener(() ->
|
||||
FeedUpdateManager.getInstance().runOnceOrAsk(requireContext(), feed));
|
||||
|
||||
loadItems();
|
||||
|
||||
@ -273,14 +274,14 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
|
||||
} else if (item.getItemId() == R.id.share_item) {
|
||||
ShareUtils.shareFeedLink(getContext(), feed);
|
||||
} else if (item.getItemId() == R.id.refresh_item) {
|
||||
FeedUpdateManager.runOnceOrAsk(getContext(), feed);
|
||||
FeedUpdateManager.getInstance().runOnceOrAsk(getContext(), feed);
|
||||
} else if (item.getItemId() == R.id.refresh_complete_item) {
|
||||
new Thread(() -> {
|
||||
feed.setNextPageLink(feed.getDownloadUrl());
|
||||
feed.setPageNr(0);
|
||||
try {
|
||||
DBWriter.resetPagedFeedPage(feed).get();
|
||||
FeedUpdateManager.runOnce(getContext(), feed);
|
||||
FeedUpdateManager.getInstance().runOnce(getContext(), feed);
|
||||
} catch (ExecutionException | InterruptedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
@ -26,7 +26,6 @@ import androidx.preference.PreferenceFragmentCompat;
|
||||
import androidx.preference.SwitchPreferenceCompat;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.core.util.download.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.event.settings.SkipIntroEndingChangedEvent;
|
||||
import de.danoeh.antennapod.event.settings.SpeedPresetChangedEvent;
|
||||
import de.danoeh.antennapod.event.settings.VolumeAdaptionChangedEvent;
|
||||
@ -35,9 +34,10 @@ import de.danoeh.antennapod.model.feed.Feed;
|
||||
import de.danoeh.antennapod.model.feed.FeedFilter;
|
||||
import de.danoeh.antennapod.model.feed.FeedPreferences;
|
||||
import de.danoeh.antennapod.model.feed.VolumeAdaptionSetting;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.dialog.EpisodeFilterDialog;
|
||||
import de.danoeh.antennapod.dialog.FeedPreferenceSkipDialog;
|
||||
import de.danoeh.antennapod.dialog.TagSettingsDialog;
|
||||
@ -313,7 +313,7 @@ public class FeedSettingsFragment extends Fragment {
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
FeedUpdateManager.runOnce(getContext(), feed);
|
||||
FeedUpdateManager.getInstance().runOnce(getContext(), feed);
|
||||
}, "RefreshAfterCredentialChange").start();
|
||||
}
|
||||
}.show();
|
||||
|
@ -15,7 +15,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.activity.MainActivity;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.dialog.ItemSortDialog;
|
||||
import de.danoeh.antennapod.event.FeedListUpdateEvent;
|
||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||
|
@ -52,7 +52,7 @@ import de.danoeh.antennapod.adapter.NavListAdapter;
|
||||
import de.danoeh.antennapod.core.dialog.ConfirmationDialog;
|
||||
import de.danoeh.antennapod.core.menuhandler.MenuItemUtils;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.NavDrawerData;
|
||||
import de.danoeh.antennapod.dialog.DrawerPreferencesDialog;
|
||||
import de.danoeh.antennapod.dialog.RemoveFeedDialog;
|
||||
|
@ -10,7 +10,7 @@ import androidx.annotation.NonNull;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.core.dialog.ConfirmationDialog;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.event.playback.PlaybackHistoryEvent;
|
||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||
import de.danoeh.antennapod.model.feed.FeedItemFilter;
|
||||
|
@ -28,6 +28,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
import com.leinardi.android.speeddial.SpeedDialView;
|
||||
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.ui.episodes.PlaybackSpeedUtils;
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
@ -42,10 +43,9 @@ import de.danoeh.antennapod.adapter.QueueRecyclerAdapter;
|
||||
import de.danoeh.antennapod.core.dialog.ConfirmationDialog;
|
||||
import de.danoeh.antennapod.core.menuhandler.MenuItemUtils;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.ui.common.Converter;
|
||||
import de.danoeh.antennapod.core.util.FeedItemUtil;
|
||||
import de.danoeh.antennapod.core.util.download.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.dialog.ItemSortDialog;
|
||||
import de.danoeh.antennapod.event.EpisodeDownloadEvent;
|
||||
import de.danoeh.antennapod.event.FeedItemEvent;
|
||||
@ -279,7 +279,7 @@ public class QueueFragment extends Fragment implements MaterialToolbar.OnMenuIte
|
||||
new QueueSortDialog().show(getChildFragmentManager().beginTransaction(), "SortDialog");
|
||||
return true;
|
||||
} else if (itemId == R.id.refresh_item) {
|
||||
FeedUpdateManager.runOnceOrAsk(requireContext());
|
||||
FeedUpdateManager.getInstance().runOnceOrAsk(requireContext());
|
||||
return true;
|
||||
} else if (itemId == R.id.clear_queue) {
|
||||
// make sure the user really wants to clear the queue
|
||||
@ -428,7 +428,7 @@ public class QueueFragment extends Fragment implements MaterialToolbar.OnMenuIte
|
||||
|
||||
swipeRefreshLayout = root.findViewById(R.id.swipeRefresh);
|
||||
swipeRefreshLayout.setDistanceToTriggerSync(getResources().getInteger(R.integer.swipe_refresh_distance));
|
||||
swipeRefreshLayout.setOnRefreshListener(() -> FeedUpdateManager.runOnceOrAsk(requireContext()));
|
||||
swipeRefreshLayout.setOnRefreshListener(() -> FeedUpdateManager.getInstance().runOnceOrAsk(requireContext()));
|
||||
|
||||
emptyView = new EmptyViewHandler(getContext());
|
||||
emptyView.attachToRecyclerView(recyclerView);
|
||||
|
@ -22,6 +22,7 @@ import com.google.android.material.appbar.MaterialToolbar;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
import com.leinardi.android.speeddial.SpeedDialView;
|
||||
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
import org.greenrobot.eventbus.ThreadMode;
|
||||
@ -36,7 +37,6 @@ import de.danoeh.antennapod.adapter.SubscriptionsRecyclerAdapter;
|
||||
import de.danoeh.antennapod.core.menuhandler.MenuItemUtils;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.storage.database.NavDrawerData;
|
||||
import de.danoeh.antennapod.core.util.download.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.dialog.FeedSortDialog;
|
||||
import de.danoeh.antennapod.dialog.RenameItemDialog;
|
||||
import de.danoeh.antennapod.dialog.SubscriptionsFilterDialog;
|
||||
@ -170,7 +170,7 @@ public class SubscriptionFragment extends Fragment
|
||||
|
||||
swipeRefreshLayout = root.findViewById(R.id.swipeRefresh);
|
||||
swipeRefreshLayout.setDistanceToTriggerSync(getResources().getInteger(R.integer.swipe_refresh_distance));
|
||||
swipeRefreshLayout.setOnRefreshListener(() -> FeedUpdateManager.runOnceOrAsk(requireContext()));
|
||||
swipeRefreshLayout.setOnRefreshListener(() -> FeedUpdateManager.getInstance().runOnceOrAsk(requireContext()));
|
||||
|
||||
speedDialView = root.findViewById(R.id.fabSD);
|
||||
speedDialView.setOverlayLayout(root.findViewById(R.id.fabSDOverlay));
|
||||
@ -204,7 +204,7 @@ public class SubscriptionFragment extends Fragment
|
||||
public boolean onMenuItemClick(MenuItem item) {
|
||||
final int itemId = item.getItemId();
|
||||
if (itemId == R.id.refresh_item) {
|
||||
FeedUpdateManager.runOnceOrAsk(requireContext());
|
||||
FeedUpdateManager.getInstance().runOnceOrAsk(requireContext());
|
||||
return true;
|
||||
} else if (itemId == R.id.subscriptions_filter) {
|
||||
new SubscriptionsFilterDialog().show(getChildFragmentManager(), "filter");
|
||||
|
@ -11,7 +11,7 @@ import java.util.List;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.activity.MainActivity;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.LongList;
|
||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||
import de.danoeh.antennapod.view.LocalDeleteModal;
|
||||
|
@ -14,7 +14,7 @@ import java.util.Locale;
|
||||
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.activity.MainActivity;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.databinding.PlaybackSpeedFeedSettingDialogBinding;
|
||||
import de.danoeh.antennapod.dialog.RemoveFeedDialog;
|
||||
import de.danoeh.antennapod.dialog.TagSettingsDialog;
|
||||
|
@ -10,7 +10,7 @@ import androidx.preference.TwoStatePreference;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.activity.PreferenceActivity;
|
||||
import de.danoeh.antennapod.core.util.download.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.ui.preferences.screen.downloads.ChooseDataFolderDialog;
|
||||
import de.danoeh.antennapod.dialog.ProxyDialog;
|
||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||
@ -90,7 +90,7 @@ public class DownloadsPreferencesFragment extends PreferenceFragmentCompat
|
||||
@Override
|
||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
||||
if (UserPreferences.PREF_UPDATE_INTERVAL.equals(key)) {
|
||||
FeedUpdateManager.restartUpdateAlarm(getContext(), true);
|
||||
FeedUpdateManager.getInstance().restartUpdateAlarm(getContext(), true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5,7 +5,7 @@ import android.content.Context;
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||
import de.danoeh.antennapod.model.feed.FeedItemFilter;
|
||||
|
||||
|
@ -6,7 +6,7 @@ import androidx.fragment.app.Fragment;
|
||||
import java.util.Collections;
|
||||
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||
import de.danoeh.antennapod.model.feed.FeedItemFilter;
|
||||
import de.danoeh.antennapod.view.LocalDeleteModal;
|
||||
|
@ -5,7 +5,7 @@ import android.content.Context;
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||
import de.danoeh.antennapod.model.feed.FeedItemFilter;
|
||||
|
||||
|
@ -10,7 +10,7 @@ import java.util.Date;
|
||||
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.activity.MainActivity;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||
import de.danoeh.antennapod.model.feed.FeedItemFilter;
|
||||
|
||||
|
@ -9,7 +9,7 @@ import com.google.android.material.snackbar.Snackbar;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.activity.MainActivity;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||
import de.danoeh.antennapod.model.feed.FeedItemFilter;
|
||||
|
||||
|
@ -16,12 +16,12 @@ import java.util.Arrays;
|
||||
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.activity.MainActivity;
|
||||
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueueSink;
|
||||
import de.danoeh.antennapod.storage.preferences.PlaybackPreferences;
|
||||
import de.danoeh.antennapod.core.util.FeedUtil;
|
||||
import de.danoeh.antennapod.core.service.playback.PlaybackServiceInterface;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.storage.preferences.SynchronizationSettings;
|
||||
import de.danoeh.antennapod.core.sync.queue.SynchronizationQueueSink;
|
||||
import de.danoeh.antennapod.core.util.FeedItemUtil;
|
||||
import de.danoeh.antennapod.core.util.IntentUtils;
|
||||
import de.danoeh.antennapod.core.util.PlaybackStatus;
|
||||
@ -30,6 +30,7 @@ import de.danoeh.antennapod.dialog.ShareDialog;
|
||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||
import de.danoeh.antennapod.model.feed.FeedMedia;
|
||||
import de.danoeh.antennapod.net.sync.model.EpisodeAction;
|
||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||
import de.danoeh.antennapod.ui.appstartintent.MediaButtonStarter;
|
||||
import de.danoeh.antennapod.view.LocalDeleteModal;
|
||||
|
||||
@ -230,8 +231,14 @@ public class FeedItemMenuHandler {
|
||||
final Handler h = new Handler(fragment.requireContext().getMainLooper());
|
||||
final Runnable r = () -> {
|
||||
FeedMedia media = item.getMedia();
|
||||
if (media == null) {
|
||||
return;
|
||||
}
|
||||
boolean shouldAutoDelete = FeedUtil.shouldAutoDeleteItemsOnThatFeed(item.getFeed());
|
||||
if (media != null && FeedItemUtil.hasAlmostEnded(media) && shouldAutoDelete) {
|
||||
int smartMarkAsPlayedSecs = UserPreferences.getSmartMarkAsPlayedSecs();
|
||||
boolean almostEnded = media.getDuration() > 0
|
||||
&& media.getPosition() >= media.getDuration() - smartMarkAsPlayedSecs * 1000;
|
||||
if (almostEnded && shouldAutoDelete) {
|
||||
DBWriter.deleteFeedMediaOfItem(fragment.requireContext(), media);
|
||||
}
|
||||
};
|
||||
|
@ -8,7 +8,7 @@ import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.core.dialog.ConfirmationDialog;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.dialog.RemoveFeedDialog;
|
||||
import de.danoeh.antennapod.dialog.RenameItemDialog;
|
||||
import de.danoeh.antennapod.dialog.TagSettingsDialog;
|
||||
|
@ -6,7 +6,7 @@ import android.content.Intent;
|
||||
import android.util.Log;
|
||||
|
||||
import de.danoeh.antennapod.core.ClientConfigurator;
|
||||
import de.danoeh.antennapod.core.storage.AutoDownloadManager;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.AutoDownloadManager;
|
||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface;
|
||||
|
||||
@ -32,7 +32,7 @@ public class PowerConnectionReceiver extends BroadcastReceiver {
|
||||
// downloading now. They shouldn't mind.
|
||||
// autodownloadUndownloadedItems will make sure we're on the right wifi networks,
|
||||
// etc... so we don't have to worry about it.
|
||||
AutoDownloadManager.autodownloadUndownloadedItems(context);
|
||||
AutoDownloadManager.getInstance().autodownloadUndownloadedItems(context);
|
||||
} else {
|
||||
// if we're not supposed to be auto-downloading when we're not charging, stop it
|
||||
if (!UserPreferences.isEnableAutodownloadOnBattery()) {
|
||||
|
@ -12,8 +12,8 @@ import java.util.Collections;
|
||||
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.core.ClientConfigurator;
|
||||
import de.danoeh.antennapod.core.storage.FeedDatabaseWriter;
|
||||
import de.danoeh.antennapod.core.util.download.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.storage.database.FeedDatabaseWriter;
|
||||
import de.danoeh.antennapod.model.feed.Feed;
|
||||
|
||||
/**
|
||||
@ -49,6 +49,6 @@ public class SPAReceiver extends BroadcastReceiver{
|
||||
FeedDatabaseWriter.updateFeed(context, feed, false);
|
||||
}
|
||||
Toast.makeText(context, R.string.sp_apps_importing_feeds_msg, Toast.LENGTH_LONG).show();
|
||||
FeedUpdateManager.runOnce(context);
|
||||
FeedUpdateManager.getInstance().runOnce(context);
|
||||
}
|
||||
}
|
||||
|
@ -19,6 +19,7 @@ import androidx.core.content.ContextCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentContainerView;
|
||||
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.ui.echo.EchoConfig;
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
@ -32,7 +33,6 @@ import java.util.List;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.activity.MainActivity;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.core.util.download.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.databinding.HomeFragmentBinding;
|
||||
import de.danoeh.antennapod.event.FeedListUpdateEvent;
|
||||
import de.danoeh.antennapod.event.FeedUpdateRunningEvent;
|
||||
@ -83,7 +83,8 @@ public class HomeFragment extends Fragment implements Toolbar.OnMenuItemClickLis
|
||||
updateWelcomeScreenVisibility();
|
||||
|
||||
viewBinding.swipeRefresh.setDistanceToTriggerSync(getResources().getInteger(R.integer.swipe_refresh_distance));
|
||||
viewBinding.swipeRefresh.setOnRefreshListener(() -> FeedUpdateManager.runOnceOrAsk(requireContext()));
|
||||
viewBinding.swipeRefresh.setOnRefreshListener(() ->
|
||||
FeedUpdateManager.getInstance().runOnceOrAsk(requireContext()));
|
||||
|
||||
return viewBinding.getRoot();
|
||||
}
|
||||
@ -156,7 +157,7 @@ public class HomeFragment extends Fragment implements Toolbar.OnMenuItemClickLis
|
||||
HomeSectionsSettingsDialog.open(getContext(), (dialogInterface, i) -> populateSectionList());
|
||||
return true;
|
||||
} else if (item.getItemId() == R.id.refresh_item) {
|
||||
FeedUpdateManager.runOnceOrAsk(requireContext());
|
||||
FeedUpdateManager.getInstance().runOnceOrAsk(requireContext());
|
||||
return true;
|
||||
} else if (item.getItemId() == R.id.action_search) {
|
||||
((MainActivity) getActivity()).loadChildFragment(SearchFragment.newInstance());
|
||||
|
@ -30,6 +30,8 @@ dependencies {
|
||||
implementation project(':net:ssl')
|
||||
implementation project(':net:sync:gpoddernet')
|
||||
implementation project(':net:sync:model')
|
||||
implementation project(':net:sync:service')
|
||||
implementation project(':net:sync:service-interface')
|
||||
implementation project(':parser:feed')
|
||||
implementation project(':parser:media')
|
||||
implementation project(':playback:base')
|
||||
|
@ -3,6 +3,12 @@ package de.danoeh.antennapod.core;
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import de.danoeh.antennapod.core.storage.AutoDownloadManagerImpl;
|
||||
import de.danoeh.antennapod.core.util.download.FeedUpdateManagerImpl;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.AutoDownloadManager;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.net.sync.service.SyncService;
|
||||
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueueSink;
|
||||
import de.danoeh.antennapod.storage.preferences.SynchronizationSettings;
|
||||
import de.danoeh.antennapod.storage.preferences.SynchronizationCredentials;
|
||||
import de.danoeh.antennapod.storage.preferences.PlaybackPreferences;
|
||||
@ -13,8 +19,6 @@ import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||
import de.danoeh.antennapod.net.common.AntennapodHttpClient;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface;
|
||||
import de.danoeh.antennapod.core.service.download.DownloadServiceInterfaceImpl;
|
||||
import de.danoeh.antennapod.core.sync.SyncService;
|
||||
import de.danoeh.antennapod.core.sync.queue.SynchronizationQueueSink;
|
||||
import de.danoeh.antennapod.net.common.NetworkUtils;
|
||||
import de.danoeh.antennapod.core.util.download.NetworkConnectionChangeHandler;
|
||||
import de.danoeh.antennapod.net.ssl.SslProviderInstaller;
|
||||
@ -46,6 +50,8 @@ public class ClientConfigurator {
|
||||
NetworkUtils.init(context);
|
||||
NetworkConnectionChangeHandler.init(context);
|
||||
DownloadServiceInterface.setImpl(new DownloadServiceInterfaceImpl());
|
||||
FeedUpdateManager.setInstance(new FeedUpdateManagerImpl());
|
||||
AutoDownloadManager.setInstance(new AutoDownloadManagerImpl());
|
||||
SynchronizationQueueSink.setServiceStarterImpl(() -> SyncService.sync(context));
|
||||
AntennapodHttpClient.setCacheDirectory(new File(context.getCacheDir(), "okhttp"));
|
||||
AntennapodHttpClient.setProxyConfig(UserPreferences.getProxyConfig());
|
||||
|
@ -8,8 +8,8 @@ import android.content.Context;
|
||||
import android.os.ParcelFileDescriptor;
|
||||
import android.util.Log;
|
||||
|
||||
import de.danoeh.antennapod.core.storage.FeedDatabaseWriter;
|
||||
import de.danoeh.antennapod.core.util.download.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.storage.database.FeedDatabaseWriter;
|
||||
import de.danoeh.antennapod.storage.importexport.OpmlElement;
|
||||
import de.danoeh.antennapod.storage.importexport.OpmlReader;
|
||||
import de.danoeh.antennapod.storage.importexport.OpmlWriter;
|
||||
@ -148,7 +148,7 @@ public class OpmlBackupAgent extends BackupAgentHelper {
|
||||
feed.setItems(Collections.emptyList());
|
||||
FeedDatabaseWriter.updateFeed(mContext, feed, false);
|
||||
}
|
||||
FeedUpdateManager.runOnce(mContext);
|
||||
FeedUpdateManager.getInstance().runOnce(mContext);
|
||||
} catch (XmlPullParserException e) {
|
||||
Log.e(TAG, "Error while parsing the OPML file", e);
|
||||
} catch (IOException e) {
|
||||
|
@ -31,8 +31,8 @@ import de.danoeh.antennapod.core.util.FastDocumentFile;
|
||||
import de.danoeh.antennapod.model.MediaMetadataRetrieverCompat;
|
||||
import de.danoeh.antennapod.model.download.DownloadResult;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.FeedDatabaseWriter;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.FeedDatabaseWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.parser.feed.util.DateUtils;
|
||||
import de.danoeh.antennapod.model.download.DownloadError;
|
||||
import de.danoeh.antennapod.model.feed.Feed;
|
||||
|
@ -6,7 +6,7 @@ import android.content.Intent;
|
||||
import android.util.Log;
|
||||
|
||||
import de.danoeh.antennapod.core.ClientConfigurator;
|
||||
import de.danoeh.antennapod.core.util.download.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
||||
|
||||
/**
|
||||
* Refreshes all feeds when it receives an intent
|
||||
@ -20,7 +20,7 @@ public class FeedUpdateReceiver extends BroadcastReceiver {
|
||||
Log.d(TAG, "Received intent");
|
||||
ClientConfigurator.initialize(context);
|
||||
|
||||
FeedUpdateManager.runOnce(context);
|
||||
FeedUpdateManager.getInstance().runOnce(context);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -24,12 +24,12 @@ import de.danoeh.antennapod.core.service.download.DownloadRequestCreator;
|
||||
import de.danoeh.antennapod.core.service.download.Downloader;
|
||||
import de.danoeh.antennapod.core.service.download.NewEpisodesNotification;
|
||||
import de.danoeh.antennapod.core.service.download.handler.FeedParserTask;
|
||||
import de.danoeh.antennapod.core.storage.AutoDownloadManager;
|
||||
import de.danoeh.antennapod.core.util.download.FeedUpdateManagerImpl;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.AutoDownloadManager;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.FeedDatabaseWriter;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.FeedDatabaseWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.net.common.NetworkUtils;
|
||||
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;
|
||||
@ -62,7 +62,7 @@ public class FeedUpdateWorker extends Worker {
|
||||
newEpisodesNotification.loadCountersBeforeRefresh();
|
||||
|
||||
List<Feed> toUpdate;
|
||||
long feedId = getInputData().getLong(FeedUpdateManager.EXTRA_FEED_ID, -1);
|
||||
long feedId = getInputData().getLong(FeedUpdateManagerImpl.EXTRA_FEED_ID, -1);
|
||||
boolean allAreLocal = true;
|
||||
boolean force = false;
|
||||
if (feedId == -1) { // Update all
|
||||
@ -91,7 +91,7 @@ public class FeedUpdateWorker extends Worker {
|
||||
force = true;
|
||||
}
|
||||
|
||||
if (!getInputData().getBoolean(FeedUpdateManager.EXTRA_EVEN_ON_MOBILE, false) && !allAreLocal) {
|
||||
if (!getInputData().getBoolean(FeedUpdateManagerImpl.EXTRA_EVEN_ON_MOBILE, false) && !allAreLocal) {
|
||||
if (!NetworkUtils.networkAvailable() || !NetworkUtils.isFeedRefreshAllowed()) {
|
||||
Log.d(TAG, "Blocking automatic update");
|
||||
return Result.retry();
|
||||
@ -100,7 +100,7 @@ public class FeedUpdateWorker extends Worker {
|
||||
refreshFeeds(toUpdate, force);
|
||||
|
||||
notificationManager.cancel(R.id.notification_updating_feeds);
|
||||
AutoDownloadManager.autodownloadUndownloadedItems(getApplicationContext());
|
||||
AutoDownloadManager.getInstance().autodownloadUndownloadedItems(getApplicationContext());
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
@ -164,7 +164,7 @@ public class FeedUpdateWorker extends Worker {
|
||||
}
|
||||
|
||||
void refreshFeed(Feed feed, boolean force) throws Exception {
|
||||
boolean nextPage = getInputData().getBoolean(FeedUpdateManager.EXTRA_NEXT_PAGE, false)
|
||||
boolean nextPage = getInputData().getBoolean(FeedUpdateManagerImpl.EXTRA_NEXT_PAGE, false)
|
||||
&& feed.getNextPageLink() != null;
|
||||
if (nextPage) {
|
||||
feed.setPageNr(feed.getPageNr() + 1);
|
||||
|
@ -9,7 +9,7 @@ import androidx.work.OneTimeWorkRequest;
|
||||
import androidx.work.OutOfQuotaPolicy;
|
||||
import androidx.work.WorkInfo;
|
||||
import androidx.work.WorkManager;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||
import de.danoeh.antennapod.model.feed.FeedMedia;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface;
|
||||
|
@ -23,7 +23,7 @@ import de.danoeh.antennapod.core.ClientConfigurator;
|
||||
import de.danoeh.antennapod.core.R;
|
||||
import de.danoeh.antennapod.core.service.download.handler.MediaDownloadedHandler;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.event.MessageEvent;
|
||||
import de.danoeh.antennapod.model.download.DownloadError;
|
||||
import de.danoeh.antennapod.model.download.DownloadResult;
|
||||
|
@ -7,6 +7,7 @@ import android.util.Log;
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import de.danoeh.antennapod.model.MediaMetadataRetrieverCompat;
|
||||
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueueSink;
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
|
||||
import java.io.File;
|
||||
@ -17,8 +18,7 @@ import de.danoeh.antennapod.event.UnreadItemsUpdateEvent;
|
||||
import de.danoeh.antennapod.model.download.DownloadRequest;
|
||||
import de.danoeh.antennapod.model.download.DownloadResult;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.core.sync.queue.SynchronizationQueueSink;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.core.util.ChapterUtils;
|
||||
import de.danoeh.antennapod.model.download.DownloadError;
|
||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||
|
@ -51,6 +51,7 @@ import androidx.core.content.ContextCompat;
|
||||
import androidx.media.MediaBrowserServiceCompat;
|
||||
|
||||
import de.danoeh.antennapod.event.PlayerStatusEvent;
|
||||
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueueSink;
|
||||
import de.danoeh.antennapod.ui.notifications.NotificationUtils;
|
||||
import de.danoeh.antennapod.ui.widget.WidgetUpdater;
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
@ -71,10 +72,8 @@ import de.danoeh.antennapod.core.receiver.MediaButtonReceiver;
|
||||
import de.danoeh.antennapod.core.service.QuickSettingsTileService;
|
||||
import de.danoeh.antennapod.core.service.playback.PlaybackServiceTaskManager.SleepTimer;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.core.sync.queue.SynchronizationQueueSink;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.core.util.ChapterUtils;
|
||||
import de.danoeh.antennapod.core.util.FeedItemUtil;
|
||||
import de.danoeh.antennapod.core.util.FeedUtil;
|
||||
import de.danoeh.antennapod.core.util.IntentUtils;
|
||||
import de.danoeh.antennapod.net.common.NetworkUtils;
|
||||
@ -1110,8 +1109,10 @@ public class PlaybackService extends MediaBrowserServiceCompat {
|
||||
}
|
||||
FeedMedia media = (FeedMedia) playable;
|
||||
FeedItem item = media.getItem();
|
||||
boolean smartMarkAsPlayed = FeedItemUtil.hasAlmostEnded(media);
|
||||
if (!ended && smartMarkAsPlayed) {
|
||||
int smartMarkAsPlayedSecs = UserPreferences.getSmartMarkAsPlayedSecs();
|
||||
boolean almostEnded = media.getDuration() > 0
|
||||
&& media.getPosition() >= media.getDuration() - smartMarkAsPlayedSecs * 1000;
|
||||
if (!ended && almostEnded) {
|
||||
Log.d(TAG, "smart mark as played");
|
||||
}
|
||||
|
||||
@ -1121,7 +1122,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
|
||||
autoSkipped = true;
|
||||
}
|
||||
|
||||
if (ended || smartMarkAsPlayed) {
|
||||
if (ended || almostEnded) {
|
||||
SynchronizationQueueSink.enqueueEpisodePlayedIfSynchronizationIsActive(
|
||||
getApplicationContext(), media, true);
|
||||
media.onPlaybackCompleted(getApplicationContext());
|
||||
@ -1132,11 +1133,11 @@ public class PlaybackService extends MediaBrowserServiceCompat {
|
||||
}
|
||||
|
||||
if (item != null) {
|
||||
if (ended || smartMarkAsPlayed
|
||||
if (ended || almostEnded
|
||||
|| autoSkipped
|
||||
|| (skipped && !UserPreferences.shouldSkipKeepEpisode())) {
|
||||
// only mark the item as played if we're not keeping it anyways
|
||||
DBWriter.markItemPlayed(item, FeedItem.PLAYED, ended || (skipped && smartMarkAsPlayed));
|
||||
DBWriter.markItemPlayed(item, FeedItem.PLAYED, ended || (skipped && almostEnded));
|
||||
// don't know if it actually matters to not autodownload when smart mark as played is triggered
|
||||
DBWriter.removeQueueItem(PlaybackService.this, ended, item);
|
||||
// Delete episode if enabled
|
||||
|
@ -18,6 +18,7 @@ import de.danoeh.antennapod.model.feed.FeedItemFilter;
|
||||
import de.danoeh.antennapod.model.feed.FeedMedia;
|
||||
import de.danoeh.antennapod.model.feed.SortOrder;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
|
||||
/**
|
||||
* Implementation of the EpisodeCleanupAlgorithm interface used by AntennaPod.
|
||||
|
@ -15,6 +15,7 @@ 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.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
|
||||
/**
|
||||
* A cleanup algorithm that removes any item that isn't in the queue and isn't a favorite
|
||||
|
@ -2,12 +2,13 @@ package de.danoeh.antennapod.core.storage;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.Log;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.AutoDownloadManager;
|
||||
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
public abstract class AutoDownloadManager {
|
||||
public class AutoDownloadManagerImpl extends AutoDownloadManager {
|
||||
private static final String TAG = "AutoDownloadManager";
|
||||
|
||||
/**
|
||||
@ -35,7 +36,7 @@ public abstract class AutoDownloadManager {
|
||||
* @param context Used for accessing the DB.
|
||||
* @return A Future that can be used for waiting for the methods completion.
|
||||
*/
|
||||
public static Future<?> autodownloadUndownloadedItems(final Context context) {
|
||||
public Future<?> autodownloadUndownloadedItems(final Context context) {
|
||||
Log.d(TAG, "autodownloadUndownloadedItems");
|
||||
return autodownloadExec.submit(downloadAlgorithm.autoDownloadUndownloadedItems(context));
|
||||
}
|
||||
@ -48,7 +49,7 @@ public abstract class AutoDownloadManager {
|
||||
*
|
||||
* @param context Used for accessing the DB.
|
||||
*/
|
||||
public static void performAutoCleanup(final Context context) {
|
||||
public void performAutoCleanup(final Context context) {
|
||||
EpisodeCleanupAlgorithmFactory.build().performCleanup(context);
|
||||
}
|
||||
}
|
@ -16,6 +16,7 @@ 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.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||
|
||||
/**
|
||||
|
@ -2,8 +2,6 @@ package de.danoeh.antennapod.core.util;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import de.danoeh.antennapod.model.feed.FeedMedia;
|
||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -68,9 +66,4 @@ public class FeedItemUtil {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static boolean hasAlmostEnded(FeedMedia media) {
|
||||
int smartMarkAsPlayedSecs = UserPreferences.getSmartMarkAsPlayedSecs();
|
||||
return media.getDuration() > 0 && media.getPosition() >= media.getDuration() - smartMarkAsPlayedSecs * 1000;
|
||||
}
|
||||
}
|
||||
|
@ -19,12 +19,13 @@ import de.danoeh.antennapod.core.service.FeedUpdateWorker;
|
||||
import de.danoeh.antennapod.net.common.NetworkUtils;
|
||||
import de.danoeh.antennapod.event.MessageEvent;
|
||||
import de.danoeh.antennapod.model.feed.Feed;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class FeedUpdateManager {
|
||||
public class FeedUpdateManagerImpl extends FeedUpdateManager {
|
||||
public static final String WORK_TAG_FEED_UPDATE = "feedUpdate";
|
||||
private static final String WORK_ID_FEED_UPDATE = "de.danoeh.antennapod.core.service.FeedUpdateWorker";
|
||||
private static final String WORK_ID_FEED_UPDATE_MANUAL = "feedUpdateManual";
|
||||
@ -33,15 +34,11 @@ public class FeedUpdateManager {
|
||||
public static final String EXTRA_EVEN_ON_MOBILE = "even_on_mobile";
|
||||
private static final String TAG = "AutoUpdateManager";
|
||||
|
||||
private FeedUpdateManager() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Start / restart periodic auto feed refresh
|
||||
* @param context Context
|
||||
*/
|
||||
public static void restartUpdateAlarm(Context context, boolean replace) {
|
||||
public void restartUpdateAlarm(Context context, boolean replace) {
|
||||
if (UserPreferences.isAutoUpdateDisabled()) {
|
||||
WorkManager.getInstance(context).cancelUniqueWork(WORK_ID_FEED_UPDATE);
|
||||
} else {
|
||||
@ -56,15 +53,15 @@ public class FeedUpdateManager {
|
||||
}
|
||||
}
|
||||
|
||||
public static void runOnce(Context context) {
|
||||
public void runOnce(Context context) {
|
||||
runOnce(context, null, false);
|
||||
}
|
||||
|
||||
public static void runOnce(Context context, Feed feed) {
|
||||
public void runOnce(Context context, Feed feed) {
|
||||
runOnce(context, feed, false);
|
||||
}
|
||||
|
||||
public static void runOnce(Context context, Feed feed, boolean nextPage) {
|
||||
public void runOnce(Context context, Feed feed, boolean nextPage) {
|
||||
OneTimeWorkRequest.Builder workRequest = new OneTimeWorkRequest.Builder(FeedUpdateWorker.class)
|
||||
.setInitialDelay(0L, TimeUnit.MILLISECONDS)
|
||||
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
|
||||
@ -84,11 +81,11 @@ public class FeedUpdateManager {
|
||||
ExistingWorkPolicy.REPLACE, workRequest.build());
|
||||
}
|
||||
|
||||
public static void runOnceOrAsk(@NonNull Context context) {
|
||||
public void runOnceOrAsk(@NonNull Context context) {
|
||||
runOnceOrAsk(context, null);
|
||||
}
|
||||
|
||||
public static void runOnceOrAsk(@NonNull Context context, @Nullable Feed feed) {
|
||||
public void runOnceOrAsk(@NonNull Context context, @Nullable Feed feed) {
|
||||
Log.d(TAG, "Run auto update immediately in background.");
|
||||
if (feed != null && feed.isLocalFeed()) {
|
||||
runOnce(context, feed);
|
||||
@ -101,7 +98,7 @@ public class FeedUpdateManager {
|
||||
}
|
||||
}
|
||||
|
||||
private static void confirmMobileRefresh(final Context context, @Nullable Feed feed) {
|
||||
private void confirmMobileRefresh(final Context context, @Nullable Feed feed) {
|
||||
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(context)
|
||||
.setTitle(R.string.feed_refresh_title)
|
||||
.setPositiveButton(R.string.confirm_mobile_streaming_button_once,
|
@ -2,7 +2,7 @@ package de.danoeh.antennapod.core.util.download;
|
||||
|
||||
import android.text.TextUtils;
|
||||
import de.danoeh.antennapod.net.common.AntennapodHttpClient;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.net.common.NetworkUtils;
|
||||
import de.danoeh.antennapod.model.feed.FeedMedia;
|
||||
import io.reactivex.Single;
|
||||
|
@ -2,7 +2,7 @@ package de.danoeh.antennapod.core.util.download;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.Log;
|
||||
import de.danoeh.antennapod.core.storage.AutoDownloadManager;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.AutoDownloadManager;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface;
|
||||
import de.danoeh.antennapod.net.common.NetworkUtils;
|
||||
|
||||
@ -17,7 +17,7 @@ public abstract class NetworkConnectionChangeHandler {
|
||||
public static void networkChangedDetected() {
|
||||
if (NetworkUtils.isAutoDownloadAllowed()) {
|
||||
Log.d(TAG, "auto-dl network available, starting auto-download");
|
||||
AutoDownloadManager.autodownloadUndownloadedItems(context);
|
||||
AutoDownloadManager.getInstance().autodownloadUndownloadedItems(context);
|
||||
} else { // if new network is Wi-Fi, finish ongoing downloads,
|
||||
// otherwise cancel all downloads
|
||||
if (NetworkUtils.isNetworkRestricted()) {
|
||||
|
@ -1,6 +1,6 @@
|
||||
package de.danoeh.antennapod.core.util.playback;
|
||||
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||
import de.danoeh.antennapod.model.feed.FeedMedia;
|
||||
import de.danoeh.antennapod.model.playback.Playable;
|
||||
|
@ -14,7 +14,7 @@ import android.view.SurfaceHolder;
|
||||
import androidx.annotation.NonNull;
|
||||
import de.danoeh.antennapod.core.service.playback.PlaybackServiceInterface;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.event.playback.PlaybackPositionEvent;
|
||||
import de.danoeh.antennapod.model.feed.FeedMedia;
|
||||
import de.danoeh.antennapod.event.playback.PlaybackServiceEvent;
|
||||
|
@ -16,8 +16,6 @@
|
||||
<item name="view_type_episode_item" type="id"/>
|
||||
|
||||
<!-- Notifications need unique IDs to update/cancel them -->
|
||||
<item name="notification_gpodnet_sync_error" type="id"/>
|
||||
<item name="notification_gpodnet_sync_autherror" type="id"/>
|
||||
<item name="notification_downloading" type="id"/>
|
||||
<item name="notification_updating_feeds" type="id"/>
|
||||
<item name="notification_download_report" type="id"/>
|
||||
|
@ -35,7 +35,7 @@ import java.util.Objects;
|
||||
|
||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.endsWith;
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
|
@ -15,6 +15,8 @@ import androidx.test.platform.app.InstrumentationRegistry;
|
||||
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.net.download.serviceinterface.AutoDownloadManager;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.storage.preferences.PlaybackPreferences;
|
||||
import de.danoeh.antennapod.storage.preferences.SynchronizationSettings;
|
||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||
@ -80,6 +82,7 @@ public class DbCleanupTests {
|
||||
UserPreferences.init(context);
|
||||
PlaybackPreferences.init(context);
|
||||
SynchronizationSettings.init(context);
|
||||
AutoDownloadManager.setInstance(new AutoDownloadManagerImpl());
|
||||
}
|
||||
|
||||
@After
|
||||
@ -108,7 +111,7 @@ public class DbCleanupTests {
|
||||
List<File> files = new ArrayList<>();
|
||||
populateItems(numItems, feed, items, files, FeedItem.PLAYED, false, false);
|
||||
|
||||
AutoDownloadManager.performAutoCleanup(context);
|
||||
AutoDownloadManager.getInstance().performAutoCleanup(context);
|
||||
for (int i = 0; i < files.size(); i++) {
|
||||
if (i < EPISODE_CACHE_SIZE) {
|
||||
assertTrue(files.get(i).exists());
|
||||
@ -167,7 +170,7 @@ public class DbCleanupTests {
|
||||
List<File> files = new ArrayList<>();
|
||||
populateItems(numItems, feed, items, files, FeedItem.UNPLAYED, false, false);
|
||||
|
||||
AutoDownloadManager.performAutoCleanup(context);
|
||||
AutoDownloadManager.getInstance().performAutoCleanup(context);
|
||||
for (File file : files) {
|
||||
assertTrue(file.exists());
|
||||
}
|
||||
@ -183,7 +186,7 @@ public class DbCleanupTests {
|
||||
List<File> files = new ArrayList<>();
|
||||
populateItems(numItems, feed, items, files, FeedItem.PLAYED, true, false);
|
||||
|
||||
AutoDownloadManager.performAutoCleanup(context);
|
||||
AutoDownloadManager.getInstance().performAutoCleanup(context);
|
||||
for (File file : files) {
|
||||
assertTrue(file.exists());
|
||||
}
|
||||
@ -223,7 +226,7 @@ public class DbCleanupTests {
|
||||
List<File> files = new ArrayList<>();
|
||||
populateItems(numItems, feed, items, files, FeedItem.PLAYED, false, true);
|
||||
|
||||
AutoDownloadManager.performAutoCleanup(context);
|
||||
AutoDownloadManager.getInstance().performAutoCleanup(context);
|
||||
for (File file : files) {
|
||||
assertTrue(file.exists());
|
||||
}
|
||||
|
@ -14,6 +14,8 @@ import androidx.test.platform.app.InstrumentationRegistry;
|
||||
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.net.download.serviceinterface.AutoDownloadManager;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||
import de.danoeh.antennapod.storage.database.PodDBAdapter;
|
||||
import org.junit.After;
|
||||
@ -61,6 +63,7 @@ public class DbNullCleanupAlgorithmTest {
|
||||
prefEdit.commit();
|
||||
|
||||
UserPreferences.init(context);
|
||||
AutoDownloadManager.setInstance(new AutoDownloadManagerImpl());
|
||||
}
|
||||
|
||||
@After
|
||||
@ -114,7 +117,7 @@ public class DbNullCleanupAlgorithmTest {
|
||||
//noinspection ConstantConditions
|
||||
assertTrue(item.getMedia().getId() != 0);
|
||||
}
|
||||
AutoDownloadManager.performAutoCleanup(context);
|
||||
AutoDownloadManager.getInstance().performAutoCleanup(context);
|
||||
for (int i = 0; i < files.size(); i++) {
|
||||
assertTrue(files.get(i).exists());
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ import java.util.List;
|
||||
|
||||
import de.danoeh.antennapod.model.feed.Feed;
|
||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.AutoDownloadManager;
|
||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||
|
||||
import org.junit.Test;
|
||||
@ -24,6 +25,7 @@ public class DbQueueCleanupAlgorithmTest extends DbCleanupTests {
|
||||
|
||||
public DbQueueCleanupAlgorithmTest() {
|
||||
setCleanupAlgorithm(UserPreferences.EPISODE_CLEANUP_QUEUE);
|
||||
AutoDownloadManager.setInstance(new AutoDownloadManagerImpl());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -40,7 +42,7 @@ public class DbQueueCleanupAlgorithmTest extends DbCleanupTests {
|
||||
List<File> files = new ArrayList<>();
|
||||
populateItems(numItems, feed, items, files, FeedItem.UNPLAYED, false, false);
|
||||
|
||||
AutoDownloadManager.performAutoCleanup(context);
|
||||
AutoDownloadManager.getInstance().performAutoCleanup(context);
|
||||
for (int i = 0; i < files.size(); i++) {
|
||||
if (i < EPISODE_CACHE_SIZE) {
|
||||
assertTrue(files.get(i).exists());
|
||||
|
@ -19,6 +19,7 @@ import de.danoeh.antennapod.model.feed.FeedMedia;
|
||||
import de.danoeh.antennapod.model.feed.FeedOrder;
|
||||
import de.danoeh.antennapod.model.feed.SortOrder;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.NavDrawerData;
|
||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||
import de.danoeh.antennapod.storage.database.LongList;
|
||||
|
@ -5,6 +5,8 @@ import android.content.Context;
|
||||
import androidx.test.platform.app.InstrumentationRegistry;
|
||||
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.FeedDatabaseWriter;
|
||||
import de.danoeh.antennapod.storage.database.PodDBAdapter;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
|
@ -12,6 +12,7 @@ import androidx.test.platform.app.InstrumentationRegistry;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterfaceStub;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.PodDBAdapter;
|
||||
import org.awaitility.Awaitility;
|
||||
import org.junit.After;
|
||||
|
@ -1,5 +1,6 @@
|
||||
package de.danoeh.antennapod.core.storage;
|
||||
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.AutoDownloadManager;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
@ -25,6 +26,7 @@ public class ExceptFavoriteCleanupAlgorithmTest extends DbCleanupTests {
|
||||
|
||||
public ExceptFavoriteCleanupAlgorithmTest() {
|
||||
setCleanupAlgorithm(UserPreferences.EPISODE_CLEANUP_EXCEPT_FAVORITE);
|
||||
AutoDownloadManager.setInstance(new AutoDownloadManagerImpl());
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -35,7 +37,7 @@ public class ExceptFavoriteCleanupAlgorithmTest extends DbCleanupTests {
|
||||
List<File> files = new ArrayList<>();
|
||||
populateItems(numberOfItems, feed, items, files, FeedItem.UNPLAYED, false, false);
|
||||
|
||||
AutoDownloadManager.performAutoCleanup(context);
|
||||
AutoDownloadManager.getInstance().performAutoCleanup(context);
|
||||
for (int i = 0; i < files.size(); i++) {
|
||||
if (i < EPISODE_CACHE_SIZE) {
|
||||
assertTrue("Only enough items should be deleted", files.get(i).exists());
|
||||
@ -53,7 +55,7 @@ public class ExceptFavoriteCleanupAlgorithmTest extends DbCleanupTests {
|
||||
List<File> files = new ArrayList<>();
|
||||
populateItems(numberOfItems, feed, items, files, FeedItem.UNPLAYED, true, false);
|
||||
|
||||
AutoDownloadManager.performAutoCleanup(context);
|
||||
AutoDownloadManager.getInstance().performAutoCleanup(context);
|
||||
for (int i = 0; i < files.size(); i++) {
|
||||
if (i < EPISODE_CACHE_SIZE) {
|
||||
assertTrue("Only enough items should be deleted", files.get(i).exists());
|
||||
@ -71,7 +73,7 @@ public class ExceptFavoriteCleanupAlgorithmTest extends DbCleanupTests {
|
||||
List<File> files = new ArrayList<>();
|
||||
populateItems(numberOfItems, feed, items, files, FeedItem.UNPLAYED, false, true);
|
||||
|
||||
AutoDownloadManager.performAutoCleanup(context);
|
||||
AutoDownloadManager.getInstance().performAutoCleanup(context);
|
||||
for (int i = 0; i < files.size(); i++) {
|
||||
assertTrue("Favorite episodes should should not be deleted", files.get(i).exists());
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package de.danoeh.antennapod.core.storage;
|
||||
|
||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||
import de.danoeh.antennapod.model.feed.FeedMedia;
|
||||
import de.danoeh.antennapod.storage.database.FeedItemDuplicateGuesser;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Date;
|
||||
|
@ -3,6 +3,7 @@ package de.danoeh.antennapod.core.storage;
|
||||
import de.danoeh.antennapod.model.playback.RemoteMedia;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterfaceStub;
|
||||
import de.danoeh.antennapod.storage.database.ItemEnqueuePositionCalculator;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.Parameterized;
|
||||
|
@ -0,0 +1,39 @@
|
||||
package de.danoeh.antennapod.net.download.serviceinterface;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
public abstract class AutoDownloadManager {
|
||||
private static AutoDownloadManager instance;
|
||||
|
||||
public static AutoDownloadManager getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
public static void setInstance(AutoDownloadManager instance) {
|
||||
AutoDownloadManager.instance = instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Looks for non-downloaded episodes in the queue or list of unread items and request a download if
|
||||
* 1. Network is available
|
||||
* 2. The device is charging or the user allows auto download on battery
|
||||
* 3. There is free space in the episode cache
|
||||
* This method is executed on an internal single thread executor.
|
||||
*
|
||||
* @param context Used for accessing the DB.
|
||||
* @return A Future that can be used for waiting for the methods completion.
|
||||
*/
|
||||
public abstract Future<?> autodownloadUndownloadedItems(final Context context);
|
||||
|
||||
/**
|
||||
* Removed downloaded episodes outside of the queue if the episode cache is full. Episodes with a smaller
|
||||
* 'playbackCompletionDate'-value will be deleted first.
|
||||
* <p/>
|
||||
* This method should NOT be executed on the GUI thread.
|
||||
*
|
||||
* @param context Used for accessing the DB.
|
||||
*/
|
||||
public abstract void performAutoCleanup(final Context context);
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
package de.danoeh.antennapod.net.download.serviceinterface;
|
||||
|
||||
import android.content.Context;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import de.danoeh.antennapod.model.feed.Feed;
|
||||
|
||||
public abstract class FeedUpdateManager {
|
||||
private static FeedUpdateManager instance;
|
||||
|
||||
public static FeedUpdateManager getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
public static void setInstance(FeedUpdateManager instance) {
|
||||
FeedUpdateManager.instance = instance;
|
||||
}
|
||||
|
||||
public abstract void restartUpdateAlarm(Context context, boolean replace);
|
||||
|
||||
public abstract void runOnce(Context context);
|
||||
|
||||
public abstract void runOnce(Context context, Feed feed);
|
||||
|
||||
public abstract void runOnce(Context context, Feed feed, boolean nextPage);
|
||||
|
||||
public abstract void runOnceOrAsk(@NonNull Context context);
|
||||
|
||||
public abstract void runOnceOrAsk(@NonNull Context context, @Nullable Feed feed);
|
||||
}
|
3
net/sync/service-interface/README.md
Normal file
3
net/sync/service-interface/README.md
Normal file
@ -0,0 +1,3 @@
|
||||
# :net:sync:service-interface
|
||||
|
||||
This module contains the interface for starting the sync service.
|
19
net/sync/service-interface/build.gradle
Normal file
19
net/sync/service-interface/build.gradle
Normal file
@ -0,0 +1,19 @@
|
||||
plugins {
|
||||
id("com.android.library")
|
||||
}
|
||||
apply from: "../../../common.gradle"
|
||||
|
||||
android {
|
||||
namespace "de.danoeh.antennapod.net.sync.serviceinterface"
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation project(':model')
|
||||
implementation project(':net:sync:model')
|
||||
implementation project(':storage:preferences')
|
||||
implementation project(':ui:i18n')
|
||||
|
||||
annotationProcessor "androidx.annotation:annotation:$annotationVersion"
|
||||
implementation "io.reactivex.rxjava2:rxandroid:$rxAndroidVersion"
|
||||
implementation "io.reactivex.rxjava2:rxjava:$rxJavaVersion"
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package de.danoeh.antennapod.core.sync;
|
||||
package de.danoeh.antennapod.net.sync.serviceinterface;
|
||||
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
@ -7,7 +7,7 @@ import io.reactivex.schedulers.Schedulers;
|
||||
|
||||
public class LockingAsyncExecutor {
|
||||
|
||||
static final ReentrantLock lock = new ReentrantLock();
|
||||
private static final ReentrantLock lock = new ReentrantLock();
|
||||
|
||||
/**
|
||||
* Take the lock and execute runnable (to prevent changes to preferences being lost when enqueueing while sync is
|
||||
@ -32,4 +32,12 @@ public class LockingAsyncExecutor {
|
||||
.subscribe();
|
||||
}
|
||||
}
|
||||
|
||||
public static void unlock() {
|
||||
lock.unlock();
|
||||
}
|
||||
|
||||
public static void lock() {
|
||||
lock.lock();
|
||||
}
|
||||
}
|
@ -1,6 +1,4 @@
|
||||
package de.danoeh.antennapod.core.sync;
|
||||
|
||||
import de.danoeh.antennapod.core.R;
|
||||
package de.danoeh.antennapod.net.sync.serviceinterface;
|
||||
|
||||
public enum SynchronizationProviderViewData {
|
||||
GPODDER_NET(
|
@ -1,8 +1,7 @@
|
||||
package de.danoeh.antennapod.core.sync.queue;
|
||||
package de.danoeh.antennapod.net.sync.serviceinterface;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import de.danoeh.antennapod.core.sync.LockingAsyncExecutor;
|
||||
import de.danoeh.antennapod.storage.preferences.SynchronizationSettings;
|
||||
import de.danoeh.antennapod.model.feed.FeedMedia;
|
||||
import de.danoeh.antennapod.net.sync.model.EpisodeAction;
|
@ -1,4 +1,4 @@
|
||||
package de.danoeh.antennapod.core.sync.queue;
|
||||
package de.danoeh.antennapod.net.sync.serviceinterface;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
5
net/sync/service-interface/src/main/res/values/ids.xml
Normal file
5
net/sync/service-interface/src/main/res/values/ids.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<resources>
|
||||
<item name="notification_gpodnet_sync_error" type="id"/>
|
||||
<item name="notification_gpodnet_sync_autherror" type="id"/>
|
||||
<item name="pending_intent_sync_error" type="id"/>
|
||||
</resources>
|
3
net/sync/service/README.md
Normal file
3
net/sync/service/README.md
Normal file
@ -0,0 +1,3 @@
|
||||
# :net:sync:service
|
||||
|
||||
This module contains the sync service.
|
36
net/sync/service/build.gradle
Normal file
36
net/sync/service/build.gradle
Normal file
@ -0,0 +1,36 @@
|
||||
plugins {
|
||||
id("com.android.library")
|
||||
}
|
||||
apply from: "../../../common.gradle"
|
||||
apply from: "../../../playFlavor.gradle"
|
||||
|
||||
android {
|
||||
namespace "de.danoeh.antennapod.net.sync.service"
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation project(':event')
|
||||
implementation project(':model')
|
||||
implementation project(':net:common')
|
||||
implementation project(':net:sync:gpoddernet')
|
||||
implementation project(':net:sync:model')
|
||||
implementation project(':net:sync:service-interface')
|
||||
implementation project(':storage:database')
|
||||
implementation project(':storage:preferences')
|
||||
implementation project(':ui:notifications')
|
||||
implementation project(':ui:i18n')
|
||||
implementation project(':net:download:service-interface')
|
||||
|
||||
annotationProcessor "androidx.annotation:annotation:$annotationVersion"
|
||||
implementation "androidx.core:core:$coreVersion"
|
||||
implementation "androidx.work:work-runtime:$workManagerVersion"
|
||||
|
||||
implementation "org.greenrobot:eventbus:$eventbusVersion"
|
||||
implementation "org.apache.commons:commons-lang3:$commonslangVersion"
|
||||
implementation "com.squareup.okhttp3:okhttp:$okhttpVersion"
|
||||
implementation "io.reactivex.rxjava2:rxandroid:$rxAndroidVersion"
|
||||
implementation "io.reactivex.rxjava2:rxjava:$rxJavaVersion"
|
||||
implementation "com.google.guava:guava:31.0.1-android"
|
||||
|
||||
testImplementation "junit:junit:$junitVersion"
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package de.danoeh.antennapod.core.sync;
|
||||
package de.danoeh.antennapod.net.sync.service;
|
||||
|
||||
import android.util.Log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
package de.danoeh.antennapod.core.sync;
|
||||
package de.danoeh.antennapod.net.sync.service;
|
||||
|
||||
public class GuidValidator {
|
||||
|
@ -1,4 +1,4 @@
|
||||
package de.danoeh.antennapod.core.sync;
|
||||
package de.danoeh.antennapod.net.sync.service;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.Notification;
|
||||
@ -23,11 +23,16 @@ import androidx.work.WorkManager;
|
||||
import androidx.work.Worker;
|
||||
import androidx.work.WorkerParameters;
|
||||
|
||||
import de.danoeh.antennapod.core.util.download.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.event.FeedUpdateRunningEvent;
|
||||
import de.danoeh.antennapod.event.MessageEvent;
|
||||
import de.danoeh.antennapod.model.feed.FeedItemFilter;
|
||||
import de.danoeh.antennapod.model.feed.SortOrder;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.net.sync.serviceinterface.LockingAsyncExecutor;
|
||||
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationProviderViewData;
|
||||
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueueStorage;
|
||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||
import de.danoeh.antennapod.storage.database.FeedDatabaseWriter;
|
||||
import de.danoeh.antennapod.storage.preferences.SynchronizationCredentials;
|
||||
import de.danoeh.antennapod.storage.preferences.SynchronizationSettings;
|
||||
import de.danoeh.antennapod.ui.notifications.NotificationUtils;
|
||||
@ -40,15 +45,10 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import de.danoeh.antennapod.core.R;
|
||||
import de.danoeh.antennapod.event.SyncServiceEvent;
|
||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||
import de.danoeh.antennapod.net.common.AntennapodHttpClient;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.FeedDatabaseWriter;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.core.sync.queue.SynchronizationQueueStorage;
|
||||
import de.danoeh.antennapod.core.util.FeedItemUtil;
|
||||
import de.danoeh.antennapod.storage.database.LongList;
|
||||
import de.danoeh.antennapod.net.common.UrlChecker;
|
||||
import de.danoeh.antennapod.model.feed.Feed;
|
||||
@ -161,7 +161,7 @@ public class SyncService extends Worker {
|
||||
Feed feed = new Feed(downloadUrl, null, "Unknown podcast");
|
||||
feed.setItems(Collections.emptyList());
|
||||
Feed newFeed = FeedDatabaseWriter.updateFeed(getApplicationContext(), feed, false);
|
||||
FeedUpdateManager.runOnce(getApplicationContext(), newFeed);
|
||||
FeedUpdateManager.getInstance().runOnce(getApplicationContext(), newFeed);
|
||||
}
|
||||
}
|
||||
|
||||
@ -183,14 +183,14 @@ public class SyncService extends Worker {
|
||||
Log.d(TAG, "Added: " + StringUtils.join(queuedAddedFeeds, ", "));
|
||||
Log.d(TAG, "Removed: " + StringUtils.join(queuedRemovedFeeds, ", "));
|
||||
|
||||
LockingAsyncExecutor.lock.lock();
|
||||
LockingAsyncExecutor.lock();
|
||||
try {
|
||||
UploadChangesResponse uploadResponse = syncServiceImpl
|
||||
.uploadSubscriptionChanges(queuedAddedFeeds, queuedRemovedFeeds);
|
||||
synchronizationQueueStorage.clearFeedQueues();
|
||||
newTimeStamp = uploadResponse.timestamp;
|
||||
} finally {
|
||||
LockingAsyncExecutor.lock.unlock();
|
||||
LockingAsyncExecutor.unlock();
|
||||
}
|
||||
}
|
||||
SynchronizationSettings.setLastSubscriptionSynchronizationAttemptTimestamp(newTimeStamp);
|
||||
@ -242,8 +242,8 @@ public class SyncService extends Worker {
|
||||
queuedEpisodeActions.add(played);
|
||||
}
|
||||
}
|
||||
if (queuedEpisodeActions.size() > 0) {
|
||||
LockingAsyncExecutor.lock.lock();
|
||||
if (!queuedEpisodeActions.isEmpty()) {
|
||||
LockingAsyncExecutor.lock();
|
||||
try {
|
||||
Log.d(TAG, "Uploading " + queuedEpisodeActions.size() + " actions: "
|
||||
+ StringUtils.join(queuedEpisodeActions, ", "));
|
||||
@ -252,7 +252,7 @@ public class SyncService extends Worker {
|
||||
Log.d(TAG, "Upload episode response: " + postResponse);
|
||||
synchronizationQueueStorage.clearEpisodeActionQueue();
|
||||
} finally {
|
||||
LockingAsyncExecutor.lock.unlock();
|
||||
LockingAsyncExecutor.unlock();
|
||||
}
|
||||
}
|
||||
SynchronizationSettings.setLastEpisodeActionSynchronizationAttemptTimestamp(newTimeStamp);
|
||||
@ -280,11 +280,15 @@ public class SyncService extends Worker {
|
||||
Log.i(TAG, "Feed item has no media: " + action);
|
||||
continue;
|
||||
}
|
||||
feedItem.getMedia().setPosition(action.getPosition() * 1000);
|
||||
if (FeedItemUtil.hasAlmostEnded(feedItem.getMedia())) {
|
||||
FeedMedia media = feedItem.getMedia();
|
||||
media.setPosition(action.getPosition() * 1000);
|
||||
int smartMarkAsPlayedSecs = UserPreferences.getSmartMarkAsPlayedSecs();
|
||||
boolean almostEnded = media.getDuration() > 0
|
||||
&& media.getPosition() >= media.getDuration() - smartMarkAsPlayedSecs * 1000;
|
||||
if (almostEnded) {
|
||||
Log.d(TAG, "Marking as played: " + action);
|
||||
feedItem.setPlayed(true);
|
||||
feedItem.getMedia().setPosition(0);
|
||||
media.setPosition(0);
|
||||
queueToBeRemoved.add(feedItem.getId());
|
||||
} else {
|
||||
Log.d(TAG, "Setting position: " + action);
|
@ -1,4 +1,4 @@
|
||||
package de.danoeh.antennapod.core.sync;
|
||||
package de.danoeh.antennapod.net.sync.service;
|
||||
|
||||
|
||||
import androidx.core.util.Pair;
|
@ -1,4 +1,4 @@
|
||||
package de.danoeh.antennapod.core.sync;
|
||||
package de.danoeh.antennapod.net.sync.service;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
@ -26,6 +26,8 @@ include ':net:download:service-interface'
|
||||
include ':net:ssl'
|
||||
include ':net:sync:gpoddernet'
|
||||
include ':net:sync:model'
|
||||
include ':net:sync:service-interface'
|
||||
include ':net:sync:service'
|
||||
|
||||
include ':parser:feed'
|
||||
include ':parser:media'
|
||||
|
@ -2,6 +2,7 @@ plugins {
|
||||
id("com.android.library")
|
||||
}
|
||||
apply from: "../../common.gradle"
|
||||
apply from: "../../playFlavor.gradle"
|
||||
|
||||
android {
|
||||
namespace "de.danoeh.antennapod.storage.database"
|
||||
@ -12,11 +13,21 @@ android {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation project(':event')
|
||||
implementation project(':model')
|
||||
implementation project(':net:download:service-interface')
|
||||
implementation project(':net:sync:model')
|
||||
implementation project(':net:sync:service-interface')
|
||||
implementation project(':storage:preferences')
|
||||
implementation project(':ui:app-start-intent')
|
||||
|
||||
annotationProcessor "androidx.annotation:annotation:$annotationVersion"
|
||||
implementation "androidx.core:core:$coreVersion"
|
||||
implementation 'androidx.documentfile:documentfile:1.0.1'
|
||||
|
||||
implementation "commons-io:commons-io:$commonsioVersion"
|
||||
implementation "org.greenrobot:eventbus:$eventbusVersion"
|
||||
implementation "com.google.guava:guava:31.0.1-android"
|
||||
|
||||
testImplementation "junit:junit:$junitVersion"
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
package de.danoeh.antennapod.core.storage;
|
||||
package de.danoeh.antennapod.storage.database;
|
||||
|
||||
import android.app.backup.BackupManager;
|
||||
import android.content.Context;
|
||||
@ -6,20 +6,19 @@ import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
import android.util.Log;
|
||||
|
||||
import android.view.KeyEvent;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.app.NotificationManagerCompat;
|
||||
import androidx.documentfile.provider.DocumentFile;
|
||||
|
||||
import com.google.common.util.concurrent.Futures;
|
||||
|
||||
import de.danoeh.antennapod.event.DownloadLogEvent;
|
||||
import de.danoeh.antennapod.core.feed.LocalFeedUpdater;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface;
|
||||
import de.danoeh.antennapod.core.service.playback.PlaybackServiceInterface;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.storage.database.PodDBAdapter;
|
||||
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.AutoDownloadManager;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface;
|
||||
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
||||
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueueSink;
|
||||
import de.danoeh.antennapod.ui.appstartintent.MediaButtonStarter;
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
|
||||
import java.io.File;
|
||||
@ -34,7 +33,6 @@ import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import de.danoeh.antennapod.core.R;
|
||||
import de.danoeh.antennapod.event.FavoritesEvent;
|
||||
import de.danoeh.antennapod.event.FeedItemEvent;
|
||||
import de.danoeh.antennapod.event.FeedListUpdateEvent;
|
||||
@ -46,11 +44,6 @@ import de.danoeh.antennapod.event.FeedEvent;
|
||||
import de.danoeh.antennapod.storage.preferences.PlaybackPreferences;
|
||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||
import de.danoeh.antennapod.model.download.DownloadResult;
|
||||
import de.danoeh.antennapod.core.sync.queue.SynchronizationQueueSink;
|
||||
import de.danoeh.antennapod.storage.database.FeedItemPermutors;
|
||||
import de.danoeh.antennapod.core.util.IntentUtils;
|
||||
import de.danoeh.antennapod.storage.database.LongList;
|
||||
import de.danoeh.antennapod.storage.database.Permutor;
|
||||
import de.danoeh.antennapod.model.feed.Feed;
|
||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||
import de.danoeh.antennapod.model.feed.FeedMedia;
|
||||
@ -145,15 +138,12 @@ public class DBWriter {
|
||||
|
||||
if (media.getId() == PlaybackPreferences.getCurrentlyPlayingFeedMediaId()) {
|
||||
PlaybackPreferences.writeNoMediaPlaying();
|
||||
IntentUtils.sendLocalBroadcast(context, PlaybackServiceInterface.ACTION_SHUTDOWN_PLAYBACK_SERVICE);
|
||||
|
||||
NotificationManagerCompat nm = NotificationManagerCompat.from(context);
|
||||
nm.cancel(R.id.notification_playing);
|
||||
context.sendBroadcast(MediaButtonStarter.createIntent(context, KeyEvent.KEYCODE_MEDIA_STOP));
|
||||
}
|
||||
|
||||
if (localDelete) {
|
||||
// Do full update of this feed to get rid of the item
|
||||
LocalFeedUpdater.updateFeed(media.getItem().getFeed(), context.getApplicationContext(), null);
|
||||
FeedUpdateManager.getInstance().runOnce(context, media.getItem().getFeed());
|
||||
} else {
|
||||
// Gpodder: queue delete action for synchronization
|
||||
FeedItem item = media.getItem();
|
||||
@ -219,7 +209,7 @@ public class DBWriter {
|
||||
if (item.getMedia().getId() == PlaybackPreferences.getCurrentlyPlayingFeedMediaId()) {
|
||||
// Applies to both downloaded and streamed media
|
||||
PlaybackPreferences.writeNoMediaPlaying();
|
||||
IntentUtils.sendLocalBroadcast(context, PlaybackServiceInterface.ACTION_SHUTDOWN_PLAYBACK_SERVICE);
|
||||
context.sendBroadcast(MediaButtonStarter.createIntent(context, KeyEvent.KEYCODE_MEDIA_STOP));
|
||||
}
|
||||
if (!item.getFeed().isLocalFeed()) {
|
||||
if (DownloadServiceInterface.get().isDownloadingEpisode(item.getMedia().getDownloadUrl())) {
|
||||
@ -368,7 +358,7 @@ public class DBWriter {
|
||||
|
||||
adapter.close();
|
||||
if (performAutoDownload) {
|
||||
AutoDownloadManager.autodownloadUndownloadedItems(context);
|
||||
AutoDownloadManager.getInstance().autodownloadUndownloadedItems(context);
|
||||
}
|
||||
|
||||
});
|
||||
@ -462,7 +452,7 @@ public class DBWriter {
|
||||
}
|
||||
adapter.close();
|
||||
if (performAutoDownload) {
|
||||
AutoDownloadManager.autodownloadUndownloadedItems(context);
|
||||
AutoDownloadManager.getInstance().autodownloadUndownloadedItems(context);
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -571,7 +561,7 @@ public class DBWriter {
|
||||
}
|
||||
adapter.close();
|
||||
if (performAutoDownload) {
|
||||
AutoDownloadManager.autodownloadUndownloadedItems(context);
|
||||
AutoDownloadManager.getInstance().autodownloadUndownloadedItems(context);
|
||||
}
|
||||
}
|
||||
|
@ -1,10 +1,8 @@
|
||||
package de.danoeh.antennapod.core.storage;
|
||||
package de.danoeh.antennapod.storage.database;
|
||||
|
||||
import android.content.Context;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import de.danoeh.antennapod.core.sync.queue.SynchronizationQueueSink;
|
||||
import de.danoeh.antennapod.core.util.comparator.FeedItemPubdateComparator;
|
||||
import de.danoeh.antennapod.event.FeedListUpdateEvent;
|
||||
import de.danoeh.antennapod.model.download.DownloadError;
|
||||
import de.danoeh.antennapod.model.download.DownloadResult;
|
||||
@ -12,8 +10,7 @@ import de.danoeh.antennapod.model.feed.Feed;
|
||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||
import de.danoeh.antennapod.model.feed.FeedPreferences;
|
||||
import de.danoeh.antennapod.net.sync.model.EpisodeAction;
|
||||
import de.danoeh.antennapod.storage.database.DBReader;
|
||||
import de.danoeh.antennapod.storage.database.PodDBAdapter;
|
||||
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueueSink;
|
||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
|
@ -1,4 +1,4 @@
|
||||
package de.danoeh.antennapod.core.storage;
|
||||
package de.danoeh.antennapod.storage.database;
|
||||
|
||||
import android.text.TextUtils;
|
||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
@ -1,4 +1,4 @@
|
||||
package de.danoeh.antennapod.core.util.comparator;
|
||||
package de.danoeh.antennapod.storage.database;
|
||||
|
||||
import java.util.Comparator;
|
||||
|
@ -1,4 +1,4 @@
|
||||
package de.danoeh.antennapod.core.storage;
|
||||
package de.danoeh.antennapod.storage.database;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
@ -11,6 +11,7 @@ import java.util.Random;
|
||||
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.database.DBWriter;
|
||||
import de.danoeh.antennapod.storage.preferences.UserPreferences.EnqueueLocation;
|
||||
import de.danoeh.antennapod.model.playback.Playable;
|
||||
|
||||
@ -18,7 +19,7 @@ import de.danoeh.antennapod.model.playback.Playable;
|
||||
* @see DBWriter#addQueueItem(Context, boolean, long...) it uses the class to determine
|
||||
* the positions of the {@link FeedItem} in the queue.
|
||||
*/
|
||||
class ItemEnqueuePositionCalculator {
|
||||
public class ItemEnqueuePositionCalculator {
|
||||
|
||||
@NonNull
|
||||
private final EnqueueLocation enqueueLocation;
|
@ -2,6 +2,7 @@ plugins {
|
||||
id("com.android.library")
|
||||
}
|
||||
apply from: "../../common.gradle"
|
||||
apply from: "../../playFlavor.gradle"
|
||||
|
||||
android {
|
||||
namespace "de.danoeh.antennapod.storage.importexport"
|
||||
@ -24,4 +25,5 @@ dependencies {
|
||||
implementation "io.reactivex.rxjava2:rxandroid:$rxAndroidVersion"
|
||||
implementation "io.reactivex.rxjava2:rxjava:$rxJavaVersion"
|
||||
implementation "org.greenrobot:eventbus:$eventbusVersion"
|
||||
implementation "com.google.guava:guava:31.0.1-android"
|
||||
}
|
||||
|
@ -11,5 +11,4 @@
|
||||
<item name="pending_intent_playback_speed" type="id"/>
|
||||
<item name="pending_intent_player_activity" type="id"/>
|
||||
<item name="pending_intent_video_player" type="id"/>
|
||||
<item name="pending_intent_sync_error" type="id"/>
|
||||
</resources>
|
||||
|
@ -34,6 +34,8 @@ dependencies {
|
||||
implementation project(":ui:common")
|
||||
implementation project(":ui:glide")
|
||||
implementation project(":ui:i18n")
|
||||
implementation project(':net:sync:service-interface')
|
||||
implementation project(':net:sync:service')
|
||||
|
||||
annotationProcessor "androidx.annotation:annotation:$annotationVersion"
|
||||
implementation "androidx.appcompat:appcompat:$appcompatVersion"
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user