Merge pull request #2666 from orionlee/mark_as_seen_in_context_menu_2580
Expose "Mark as seen" as a context menu item in Episodes screen
This commit is contained in:
commit
340fbfb231
|
@ -295,6 +295,8 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
FeedItemMenuHandler.onPrepareMenu(contextMenuInterface, item, true, null);
|
FeedItemMenuHandler.onPrepareMenu(contextMenuInterface, item, true, null);
|
||||||
|
|
||||||
|
contextMenuInterface.setItemVisibility(R.id.mark_as_seen_item, item.isNew());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,8 @@ import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.support.design.widget.Snackbar;
|
||||||
import android.support.v4.app.Fragment;
|
import android.support.v4.app.Fragment;
|
||||||
import android.support.v4.view.MenuItemCompat;
|
import android.support.v4.view.MenuItemCompat;
|
||||||
import android.support.v7.widget.LinearLayoutManager;
|
import android.support.v7.widget.LinearLayoutManager;
|
||||||
|
@ -36,12 +38,12 @@ import de.danoeh.antennapod.core.feed.EventDistributor;
|
||||||
import de.danoeh.antennapod.core.feed.Feed;
|
import de.danoeh.antennapod.core.feed.Feed;
|
||||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||||
import de.danoeh.antennapod.core.feed.FeedMedia;
|
import de.danoeh.antennapod.core.feed.FeedMedia;
|
||||||
|
import de.danoeh.antennapod.core.preferences.UserPreferences;
|
||||||
import de.danoeh.antennapod.core.service.download.DownloadService;
|
import de.danoeh.antennapod.core.service.download.DownloadService;
|
||||||
import de.danoeh.antennapod.core.service.download.Downloader;
|
import de.danoeh.antennapod.core.service.download.Downloader;
|
||||||
import de.danoeh.antennapod.core.storage.DBReader;
|
import de.danoeh.antennapod.core.storage.DBReader;
|
||||||
import de.danoeh.antennapod.core.storage.DBTasks;
|
import de.danoeh.antennapod.core.storage.DBTasks;
|
||||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||||
import de.danoeh.antennapod.core.storage.DownloadRequestException;
|
|
||||||
import de.danoeh.antennapod.core.storage.DownloadRequester;
|
import de.danoeh.antennapod.core.storage.DownloadRequester;
|
||||||
import de.danoeh.antennapod.core.util.FeedItemUtil;
|
import de.danoeh.antennapod.core.util.FeedItemUtil;
|
||||||
import de.danoeh.antennapod.core.util.LongList;
|
import de.danoeh.antennapod.core.util.LongList;
|
||||||
|
@ -284,6 +286,16 @@ public class AllEpisodesFragment extends Fragment {
|
||||||
return super.onContextItemSelected(item);
|
return super.onContextItemSelected(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Mark as seen contains UI logic specific to All/New/FavoriteSegments,
|
||||||
|
// e.g., Undo with Snackbar,
|
||||||
|
// and is handled by this class rather than the generic FeedItemMenuHandler
|
||||||
|
// Undo is useful for Mark as seen, given there is no UI to undo it otherwise,
|
||||||
|
// i.e., there is context menu item for Mark as new
|
||||||
|
if (R.id.mark_as_seen_item == item.getItemId()) {
|
||||||
|
markItemAsSeenWithUndo(selectedItem);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return FeedItemMenuHandler.onMenuItemClicked(getActivity(), item.getItemId(), selectedItem);
|
return FeedItemMenuHandler.onMenuItemClicked(getActivity(), item.getItemId(), selectedItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -481,4 +493,36 @@ public class AllEpisodesFragment extends Fragment {
|
||||||
return DBReader.getRecentlyPublishedEpisodes(RECENT_EPISODES_LIMIT);
|
return DBReader.getRecentlyPublishedEpisodes(RECENT_EPISODES_LIMIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void markItemAsSeenWithUndo(FeedItem item) {
|
||||||
|
if (item == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.d(TAG, "markItemAsSeenWithUndo(" + item.getId() + ")");
|
||||||
|
if (subscription != null) {
|
||||||
|
subscription.unsubscribe();
|
||||||
|
}
|
||||||
|
// we're marking it as unplayed since the user didn't actually play it
|
||||||
|
// but they don't want it considered 'NEW' anymore
|
||||||
|
DBWriter.markItemPlayed(FeedItem.UNPLAYED, item.getId());
|
||||||
|
|
||||||
|
final Handler h = new Handler(getActivity().getMainLooper());
|
||||||
|
final Runnable r = () -> {
|
||||||
|
FeedMedia media = item.getMedia();
|
||||||
|
if (media != null && media.hasAlmostEnded() && UserPreferences.isAutoDelete()) {
|
||||||
|
DBWriter.deleteFeedMediaOfItem(getActivity(), media.getId());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Snackbar snackbar = Snackbar.make(getView(), getString(R.string.marked_as_seen_label),
|
||||||
|
Snackbar.LENGTH_LONG);
|
||||||
|
snackbar.setAction(getString(R.string.undo), v -> {
|
||||||
|
DBWriter.markItemPlayed(FeedItem.NEW, item.getId());
|
||||||
|
// don't forget to cancel the thing that's going to remove the media
|
||||||
|
h.removeCallbacks(r);
|
||||||
|
});
|
||||||
|
snackbar.show();
|
||||||
|
h.postDelayed(r, (int)Math.ceil(snackbar.getDuration() * 1.05f));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
package de.danoeh.antennapod.fragment;
|
package de.danoeh.antennapod.fragment;
|
||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
|
||||||
import android.support.design.widget.Snackbar;
|
|
||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
import android.support.v7.widget.helper.ItemTouchHelper;
|
import android.support.v7.widget.helper.ItemTouchHelper;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
@ -16,10 +14,7 @@ import de.danoeh.antennapod.R;
|
||||||
import de.danoeh.antennapod.adapter.AllEpisodesRecycleAdapter;
|
import de.danoeh.antennapod.adapter.AllEpisodesRecycleAdapter;
|
||||||
import de.danoeh.antennapod.core.event.FeedItemEvent;
|
import de.danoeh.antennapod.core.event.FeedItemEvent;
|
||||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||||
import de.danoeh.antennapod.core.feed.FeedMedia;
|
|
||||||
import de.danoeh.antennapod.core.preferences.UserPreferences;
|
|
||||||
import de.danoeh.antennapod.core.storage.DBReader;
|
import de.danoeh.antennapod.core.storage.DBReader;
|
||||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
|
||||||
import de.danoeh.antennapod.core.util.FeedItemUtil;
|
import de.danoeh.antennapod.core.util.FeedItemUtil;
|
||||||
|
|
||||||
|
|
||||||
|
@ -74,33 +69,7 @@ public class NewEpisodesFragment extends AllEpisodesFragment {
|
||||||
@Override
|
@Override
|
||||||
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
|
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
|
||||||
AllEpisodesRecycleAdapter.Holder holder = (AllEpisodesRecycleAdapter.Holder)viewHolder;
|
AllEpisodesRecycleAdapter.Holder holder = (AllEpisodesRecycleAdapter.Holder)viewHolder;
|
||||||
|
markItemAsSeenWithUndo(holder.getFeedItem());
|
||||||
Log.d(TAG, "remove(" + holder.getItemId() + ")");
|
|
||||||
if (subscription != null) {
|
|
||||||
subscription.unsubscribe();
|
|
||||||
}
|
|
||||||
FeedItem item = holder.getFeedItem();
|
|
||||||
// we're marking it as unplayed since the user didn't actually play it
|
|
||||||
// but they don't want it considered 'NEW' anymore
|
|
||||||
DBWriter.markItemPlayed(FeedItem.UNPLAYED, item.getId());
|
|
||||||
|
|
||||||
final Handler h = new Handler(getActivity().getMainLooper());
|
|
||||||
final Runnable r = () -> {
|
|
||||||
FeedMedia media = item.getMedia();
|
|
||||||
if (media != null && media.hasAlmostEnded() && UserPreferences.isAutoDelete()) {
|
|
||||||
DBWriter.deleteFeedMediaOfItem(getActivity(), media.getId());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Snackbar snackbar = Snackbar.make(root, getString(R.string.marked_as_seen_label),
|
|
||||||
Snackbar.LENGTH_LONG);
|
|
||||||
snackbar.setAction(getString(R.string.undo), v -> {
|
|
||||||
DBWriter.markItemPlayed(FeedItem.NEW, item.getId());
|
|
||||||
// don't forget to cancel the thing that's going to remove the media
|
|
||||||
h.removeCallbacks(r);
|
|
||||||
});
|
|
||||||
snackbar.show();
|
|
||||||
h.postDelayed(r, (int)Math.ceil(snackbar.getDuration() * 1.05f));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -7,6 +7,12 @@
|
||||||
android:menuCategory="container"
|
android:menuCategory="container"
|
||||||
android:title="@string/skip_episode_label" />
|
android:title="@string/skip_episode_label" />
|
||||||
|
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/mark_as_seen_item"
|
||||||
|
android:menuCategory="container"
|
||||||
|
android:title="@string/mark_as_seen_label" />
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/mark_read_item"
|
android:id="@+id/mark_read_item"
|
||||||
android:menuCategory="container"
|
android:menuCategory="container"
|
||||||
|
|
|
@ -166,6 +166,7 @@
|
||||||
<string name="delete_label">Delete</string>
|
<string name="delete_label">Delete</string>
|
||||||
<string name="delete_failed">Unable to delete file. Rebooting the device could help.</string>
|
<string name="delete_failed">Unable to delete file. Rebooting the device could help.</string>
|
||||||
<string name="remove_episode_lable">Remove Episode</string>
|
<string name="remove_episode_lable">Remove Episode</string>
|
||||||
|
<string name="mark_as_seen_label">Mark as seen</string>
|
||||||
<string name="marked_as_seen_label">Marked as seen</string>
|
<string name="marked_as_seen_label">Marked as seen</string>
|
||||||
<string name="mark_read_label">Mark as played</string>
|
<string name="mark_read_label">Mark as played</string>
|
||||||
<string name="marked_as_read_label">Marked as played</string>
|
<string name="marked_as_read_label">Marked as played</string>
|
||||||
|
|
Loading…
Reference in New Issue