Skip to content

Commit

Permalink
Add episodes without subscribing (#7098)
Browse files Browse the repository at this point in the history
  • Loading branch information
ByteHamster committed May 9, 2024
1 parent 53ce6cd commit 084723a
Show file tree
Hide file tree
Showing 50 changed files with 677 additions and 817 deletions.
Expand Up @@ -7,6 +7,7 @@
import androidx.annotation.StringRes;
import android.view.View;

import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.playback.service.PlaybackStatus;
import de.danoeh.antennapod.model.feed.FeedItem;
import de.danoeh.antennapod.model.feed.FeedMedia;
Expand Down Expand Up @@ -48,6 +49,8 @@ public static ItemActionButton forItem(@NonNull FeedItem item) {
return new PlayActionButton(item);
} else if (isDownloadingMedia) {
return new CancelDownloadActionButton(item);
} else if (item.getFeed().getState() != Feed.STATE_SUBSCRIBED) {
return new StreamActionButton(item);
} else if (UserPreferences.isStreamOverDownload()) {
return new StreamActionButton(item);
} else {
Expand Down
Expand Up @@ -12,6 +12,7 @@

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentActivity;
import androidx.recyclerview.widget.RecyclerView;

import de.danoeh.antennapod.ui.SelectableAdapter;
Expand All @@ -32,13 +33,13 @@
public class EpisodeItemListAdapter extends SelectableAdapter<EpisodeItemViewHolder>
implements View.OnCreateContextMenuListener {

private final WeakReference<MainActivity> mainActivityRef;
private final WeakReference<FragmentActivity> mainActivityRef;
private List<FeedItem> episodes = new ArrayList<>();
private FeedItem longPressedItem;
int longPressedPosition = 0; // used to init actionMode
private int dummyViews = 0;

public EpisodeItemListAdapter(MainActivity mainActivity) {
public EpisodeItemListAdapter(FragmentActivity mainActivity) {
super(mainActivity);
this.mainActivityRef = new WeakReference<>(mainActivity);
setHasStableIds(true);
Expand Down Expand Up @@ -86,9 +87,18 @@ public final void onBindViewHolder(EpisodeItemViewHolder holder, int pos) {
holder.bind(item);

holder.itemView.setOnClickListener(v -> {
MainActivity activity = mainActivityRef.get();
if (activity != null && !inActionMode()) {
activity.loadChildFragment(ItemPagerFragment.newInstance(episodes, item));
if (!inActionMode()) {
if (mainActivityRef.get() instanceof MainActivity) {
((MainActivity) mainActivityRef.get())
.loadChildFragment(ItemPagerFragment.newInstance(episodes, item));
} else {
ItemPagerFragment fragment = ItemPagerFragment.newInstance(episodes, item);
mainActivityRef.get().getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragmentContainer, fragment, "Items")
.addToBackStack("Items")
.commitAllowingStateLoss();
}
} else {
toggleSelection(holder.getBindingAdapterPosition());
}
Expand Down
@@ -1,5 +1,6 @@
package de.danoeh.antennapod.ui.episodeslist;

import android.app.Activity;
import android.os.Build;
import android.text.Layout;
import android.text.format.Formatter;
Expand All @@ -17,7 +18,6 @@
import com.google.android.material.elevation.SurfaceColors;

import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.ui.CoverLoader;
import de.danoeh.antennapod.actionbutton.ItemActionButton;
import de.danoeh.antennapod.playback.service.PlaybackStatus;
Expand Down Expand Up @@ -62,10 +62,10 @@ public class EpisodeItemViewHolder extends RecyclerView.ViewHolder {
private final View leftPadding;
public final CardView coverHolder;

private final MainActivity activity;
private final Activity activity;
private FeedItem item;

public EpisodeItemViewHolder(MainActivity activity, ViewGroup parent) {
public EpisodeItemViewHolder(Activity activity, ViewGroup parent) {
super(LayoutInflater.from(activity).inflate(R.layout.feeditemlist_item, parent, false));
this.activity = activity;
container = itemView.findViewById(R.id.container);
Expand Down
@@ -1,29 +1,28 @@
package de.danoeh.antennapod.ui.episodeslist;

import android.app.Activity;
import android.util.Log;

import androidx.annotation.PluralsRes;

import com.google.android.material.snackbar.Snackbar;

import java.util.List;

import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.event.MessageEvent;
import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface;
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.ui.view.LocalDeleteModal;
import org.greenrobot.eventbus.EventBus;

public class EpisodeMultiSelectActionHandler {
private static final String TAG = "EpisodeSelectHandler";
private final MainActivity activity;
private final Activity activity;
private final int actionId;
private int totalNumItems = 0;
private Snackbar snackbar = null;

public EpisodeMultiSelectActionHandler(MainActivity activity, int actionId) {
public EpisodeMultiSelectActionHandler(Activity activity, int actionId) {
this.activity = activity;
this.actionId = actionId;
}
Expand Down Expand Up @@ -116,12 +115,7 @@ private void showMessage(@PluralsRes int msgId, int numItems) {
totalNumItems += numItems;
activity.runOnUiThread(() -> {
String text = activity.getResources().getQuantityString(msgId, totalNumItems, totalNumItems);
if (snackbar != null) {
snackbar.setText(text);
snackbar.show(); // Resets the timeout
} else {
snackbar = activity.showSnackbarAbovePlayer(text, Snackbar.LENGTH_LONG);
}
EventBus.getDefault().post(new MessageEvent(text));
});
}

Expand Down
Expand Up @@ -16,6 +16,7 @@

import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueueSink;
import de.danoeh.antennapod.storage.preferences.PlaybackPreferences;
import de.danoeh.antennapod.playback.service.PlaybackServiceInterface;
Expand Down Expand Up @@ -84,6 +85,10 @@ public static boolean onPrepareMenu(Menu menu, FeedItem selectedItem) {
setItemVisibility(menu, R.id.add_to_favorites_item, !isFavorite);
setItemVisibility(menu, R.id.remove_from_favorites_item, isFavorite);
setItemVisibility(menu, R.id.remove_item, fileDownloaded || isLocalFile);

if (selectedItem.getFeed().getState() != Feed.STATE_SUBSCRIBED) {
setItemVisibility(menu, R.id.mark_read_item, false);
}
return true;
}

Expand Down Expand Up @@ -158,7 +163,8 @@ public static boolean onMenuItemClicked(@NonNull Fragment fragment, int menuItem
} else if (menuItemId == R.id.mark_read_item) {
selectedItem.setPlayed(true);
DBWriter.markItemPlayed(selectedItem, FeedItem.PLAYED, true);
if (!selectedItem.getFeed().isLocalFeed() && SynchronizationSettings.isProviderConnected()) {
if (!selectedItem.getFeed().isLocalFeed() && selectedItem.getFeed().getState() == Feed.STATE_SUBSCRIBED
&& SynchronizationSettings.isProviderConnected()) {
FeedMedia media = selectedItem.getMedia();
// not all items have media, Gpodder only cares about those that do
if (media != null) {
Expand All @@ -174,7 +180,8 @@ public static boolean onMenuItemClicked(@NonNull Fragment fragment, int menuItem
} else if (menuItemId == R.id.mark_unread_item) {
selectedItem.setPlayed(false);
DBWriter.markItemPlayed(selectedItem, FeedItem.UNPLAYED, false);
if (!selectedItem.getFeed().isLocalFeed() && selectedItem.getMedia() != null) {
if (!selectedItem.getFeed().isLocalFeed() && selectedItem.getMedia() != null
&& selectedItem.getFeed().getState() == Feed.STATE_SUBSCRIBED) {
EpisodeAction actionNew = new EpisodeAction.Builder(selectedItem, EpisodeAction.NEW)
.currentTimestamp()
.build();
Expand Down
Expand Up @@ -66,7 +66,12 @@ protected int loadTotalItemCount() {

@Override
protected FeedItemFilter getFilter() {
return new FeedItemFilter(UserPreferences.getPrefFilterAllEpisodes());
FeedItemFilter filter = new FeedItemFilter(UserPreferences.getPrefFilterAllEpisodes());
if (filter.showIsFavorite) {
return new FeedItemFilter(filter, FeedItemFilter.INCLUDE_NOT_SUBSCRIBED);
} else {
return filter;
}
}

@Override
Expand All @@ -91,6 +96,7 @@ public boolean onMenuItemClick(MenuItem item) {
ArrayList<String> filter = new ArrayList<>(getFilter().getValuesList());
if (filter.contains(FeedItemFilter.IS_FAVORITE)) {
filter.remove(FeedItemFilter.IS_FAVORITE);
filter.remove(FeedItemFilter.INCLUDE_NOT_SUBSCRIBED);
} else {
filter.add(FeedItemFilter.IS_FAVORITE);
}
Expand Down
Expand Up @@ -23,7 +23,8 @@

public class PlaybackHistoryFragment extends EpisodesListFragment {
public static final String TAG = "PlaybackHistoryFragment";
private static final FeedItemFilter FILTER_HISTORY = new FeedItemFilter(FeedItemFilter.IS_IN_HISTORY);
private static final FeedItemFilter FILTER_HISTORY = new FeedItemFilter(
FeedItemFilter.IS_IN_HISTORY, FeedItemFilter.INCLUDE_NOT_SUBSCRIBED);

@NonNull
@Override
Expand Down
Expand Up @@ -285,7 +285,7 @@ private void loadItems() {
disposable = Observable.fromCallable(() -> {
SortOrder sortOrder = UserPreferences.getDownloadsSortedOrder();
List<FeedItem> downloadedItems = DBReader.getEpisodes(0, Integer.MAX_VALUE,
new FeedItemFilter(FeedItemFilter.DOWNLOADED), sortOrder);
new FeedItemFilter(FeedItemFilter.DOWNLOADED, FeedItemFilter.INCLUDE_NOT_SUBSCRIBED), sortOrder);

List<String> mediaUrls = new ArrayList<>();
if (runningDownloads == null) {
Expand Down
Expand Up @@ -38,6 +38,7 @@
import de.danoeh.antennapod.actionbutton.StreamActionButton;
import de.danoeh.antennapod.actionbutton.VisitWebsiteActionButton;
import de.danoeh.antennapod.event.EpisodeDownloadEvent;
import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.playback.service.PlaybackStatus;
import de.danoeh.antennapod.event.FeedItemEvent;
import de.danoeh.antennapod.event.PlayerStatusEvent;
Expand All @@ -49,6 +50,7 @@
import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface;
import de.danoeh.antennapod.storage.preferences.UserPreferences;
import de.danoeh.antennapod.storage.database.DBReader;
import de.danoeh.antennapod.ui.appstartintent.OnlineFeedviewActivityStarter;
import de.danoeh.antennapod.ui.common.Converter;
import de.danoeh.antennapod.ui.common.DateFormatter;
import de.danoeh.antennapod.ui.common.CircularProgressBar;
Expand Down Expand Up @@ -114,6 +116,7 @@ public static ItemFragment newInstance(long feeditem) {
private ItemActionButton actionButton1;
private ItemActionButton actionButton2;
private View noMediaLabel;
private View nonSubscribedWarningLabel;

private Disposable disposable;
private PlaybackController controller;
Expand Down Expand Up @@ -164,6 +167,7 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
butAction1Text = layout.findViewById(R.id.butAction1Text);
butAction2Text = layout.findViewById(R.id.butAction2Text);
noMediaLabel = layout.findViewById(R.id.noMediaLabel);
nonSubscribedWarningLabel = layout.findViewById(R.id.nonSubscribedWarningLabel);

butAction1.setOnClickListener(v -> {
if (actionButton1 instanceof StreamActionButton && !UserPreferences.isStreamOverDownload()
Expand Down Expand Up @@ -287,6 +291,11 @@ private void updateAppearance() {
txtvPublished.setContentDescription(DateFormatter.formatForAccessibility(item.getPubDate()));
}

if (item.getFeed().getState() != Feed.STATE_SUBSCRIBED) {
nonSubscribedWarningLabel.setVisibility(View.VISIBLE);
nonSubscribedWarningLabel.setOnClickListener(v -> openPodcast());
}

float radius = 8 * getResources().getDisplayMetrics().density;
RequestOptions options = new RequestOptions()
.error(ImagePlaceholder.getDrawable(getContext(), radius))
Expand Down Expand Up @@ -366,8 +375,13 @@ private void openPodcast() {
if (item == null) {
return;
}
Fragment fragment = FeedItemlistFragment.newInstance(item.getFeedId());
((MainActivity) getActivity()).loadChildFragment(fragment);
if (item.getFeed().getState() == Feed.STATE_SUBSCRIBED) {
Fragment fragment = FeedItemlistFragment.newInstance(item.getFeedId());
((MainActivity) getActivity()).loadChildFragment(fragment);
} else {
startActivity(new OnlineFeedviewActivityStarter(getContext(), item.getFeed().getDownloadUrl())
.getIntent());
}
}

@Subscribe(threadMode = ThreadMode.MAIN)
Expand Down
@@ -1,5 +1,6 @@
package de.danoeh.antennapod.ui.screen.episode;

import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MenuItem;
Expand All @@ -13,7 +14,8 @@
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;

import de.danoeh.antennapod.ui.screen.feed.FeedItemlistFragment;
import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.ui.appstartintent.OnlineFeedviewActivityStarter;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
Expand Down Expand Up @@ -173,8 +175,12 @@ private void openPodcast() {
if (item == null) {
return;
}
Fragment fragment = FeedItemlistFragment.newInstance(item.getFeedId());
((MainActivity) getActivity()).loadChildFragment(fragment);
if (item.getFeed().getState() == Feed.STATE_SUBSCRIBED) {
Intent intent = MainActivity.getIntentToOpenFeed(getContext(), item.getFeedId());
startActivity(intent);
} else {
startActivity(new OnlineFeedviewActivityStarter(getContext(), item.getFeed().getDownloadUrl()).getIntent());
}
}

private class ItemPagerAdapter extends FragmentStateAdapter {
Expand Down
Expand Up @@ -122,7 +122,6 @@ protected void doTint(Context themedContext) {
viewBinding.header.butFilter.setVisibility(View.INVISIBLE);
// https://github.com/bumptech/glide/issues/529
viewBinding.imgvBackground.setColorFilter(new LightingColorFilter(0xff828282, 0x000000));

viewBinding.urlLabel.setOnClickListener(copyUrlToClipboard);

long feedId = getArguments().getLong(EXTRA_FEED_ID);
Expand Down Expand Up @@ -237,6 +236,25 @@ private void showFeed() {
viewBinding.supportUrl.setText(str.toString());
}

if (feed.getState() == Feed.STATE_SUBSCRIBED) {
long feedId = getArguments().getLong(EXTRA_FEED_ID);
getParentFragmentManager().beginTransaction().replace(R.id.statisticsFragmentContainer,
FeedStatisticsFragment.newInstance(feedId, false), "feed_statistics_fragment")
.commitAllowingStateLoss();

viewBinding.statisticsButton.setOnClickListener(view -> {
StatisticsFragment fragment = new StatisticsFragment();
((MainActivity) getActivity()).loadChildFragment(fragment, TransitionEffect.SLIDE);
});
} else {
viewBinding.statisticsButton.setVisibility(View.GONE);
viewBinding.statisticsFragmentContainer.setVisibility(View.GONE);
viewBinding.statisticsHeadingLabel.setVisibility(View.GONE);
viewBinding.supportHeadingLabel.setVisibility(View.GONE);
viewBinding.supportUrl.setVisibility(View.GONE);
viewBinding.descriptionHeadingLabel.setVisibility(View.GONE);
}

refreshToolbarState();
}

Expand All @@ -249,13 +267,14 @@ public void onDestroy() {
}

private void refreshToolbarState() {
boolean isSubscribed = feed != null && feed.getState() == Feed.STATE_SUBSCRIBED;
viewBinding.toolbar.getMenu().findItem(R.id.reconnect_local_folder).setVisible(
feed != null && feed.isLocalFeed());
viewBinding.toolbar.getMenu().findItem(R.id.share_item).setVisible(feed != null && !feed.isLocalFeed());
viewBinding.toolbar.getMenu().findItem(R.id.visit_website_item).setVisible(feed != null
isSubscribed && feed.isLocalFeed());
viewBinding.toolbar.getMenu().findItem(R.id.share_item).setVisible(isSubscribed && !feed.isLocalFeed());
viewBinding.toolbar.getMenu().findItem(R.id.visit_website_item).setVisible(isSubscribed
&& feed.getLink() != null
&& IntentUtils.isCallable(getContext(), new Intent(Intent.ACTION_VIEW, Uri.parse(feed.getLink()))));
viewBinding.toolbar.getMenu().findItem(R.id.edit_feed_url_item).setVisible(feed != null && !feed.isLocalFeed());
viewBinding.toolbar.getMenu().findItem(R.id.edit_feed_url_item).setVisible(isSubscribed && !feed.isLocalFeed());
}

@Override
Expand Down

0 comments on commit 084723a

Please sign in to comment.