Remove duplicated marked as played implementation
There were two implementations, one for single items and one for multiple items. Now we always use the code for multiple items. I also made API a lot more simpler and the PodDBAdapter now decides if a the playback position should be reset. Which it will now do if the we set it to PLAYED but not for NEW or UNPLAYED. Also it will not reset an episode that is currently playing.
This commit is contained in:
parent
eb71511fce
commit
1f03e1124c
|
@ -30,7 +30,7 @@ public class MarkAsPlayedActionButton extends ItemActionButton {
|
|||
@Override
|
||||
public void onClick(Context context) {
|
||||
if (!item.isPlayed()) {
|
||||
DBWriter.markItemPlayed(item, FeedItem.PLAYED, true);
|
||||
DBWriter.markItemPlayed(FeedItem.PLAYED, item);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@ import androidx.annotation.PluralsRes;
|
|||
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import de.danoeh.antennapod.R;
|
||||
|
@ -67,26 +68,24 @@ public class EpisodeMultiSelectActionHandler {
|
|||
}
|
||||
|
||||
private void removeFromInboxChecked(List<FeedItem> items) {
|
||||
LongList markUnplayed = new LongList();
|
||||
List<FeedItem> markUnplayed = new ArrayList<>();
|
||||
for (FeedItem episode : items) {
|
||||
if (episode.isNew()) {
|
||||
markUnplayed.add(episode.getId());
|
||||
markUnplayed.add(episode);
|
||||
}
|
||||
}
|
||||
DBWriter.markItemPlayed(FeedItem.UNPLAYED, markUnplayed.toArray());
|
||||
DBWriter.markItemPlayed(FeedItem.UNPLAYED, markUnplayed);
|
||||
showMessage(R.plurals.removed_from_inbox_batch_label, markUnplayed.size());
|
||||
}
|
||||
|
||||
private void markedCheckedPlayed(List<FeedItem> items) {
|
||||
long[] checkedIds = getSelectedIds(items);
|
||||
DBWriter.markItemPlayed(FeedItem.PLAYED, checkedIds);
|
||||
showMessage(R.plurals.marked_read_batch_label, checkedIds.length);
|
||||
DBWriter.markItemPlayed(FeedItem.PLAYED, items);
|
||||
showMessage(R.plurals.marked_read_batch_label, items.size());
|
||||
}
|
||||
|
||||
private void markedCheckedUnplayed(List<FeedItem> items) {
|
||||
long[] checkedIds = getSelectedIds(items);
|
||||
DBWriter.markItemPlayed(FeedItem.UNPLAYED, checkedIds);
|
||||
showMessage(R.plurals.marked_unread_batch_label, checkedIds.length);
|
||||
DBWriter.markItemPlayed(FeedItem.UNPLAYED, items);
|
||||
showMessage(R.plurals.marked_unread_batch_label, items.size());
|
||||
}
|
||||
|
||||
private void downloadChecked(List<FeedItem> items) {
|
||||
|
|
|
@ -157,7 +157,7 @@ public class FeedItemMenuHandler {
|
|||
removeNewFlagWithUndo(fragment, selectedItem);
|
||||
} else if (menuItemId == R.id.mark_read_item) {
|
||||
selectedItem.setPlayed(true);
|
||||
DBWriter.markItemPlayed(selectedItem, FeedItem.PLAYED, true);
|
||||
DBWriter.markItemPlayed(FeedItem.PLAYED, selectedItem);
|
||||
if (!selectedItem.getFeed().isLocalFeed() && SynchronizationSettings.isProviderConnected()) {
|
||||
FeedMedia media = selectedItem.getMedia();
|
||||
// not all items have media, Gpodder only cares about those that do
|
||||
|
@ -173,7 +173,7 @@ public class FeedItemMenuHandler {
|
|||
}
|
||||
} else if (menuItemId == R.id.mark_unread_item) {
|
||||
selectedItem.setPlayed(false);
|
||||
DBWriter.markItemPlayed(selectedItem, FeedItem.UNPLAYED, false);
|
||||
DBWriter.markItemPlayed(FeedItem.UNPLAYED, selectedItem);
|
||||
if (!selectedItem.getFeed().isLocalFeed() && selectedItem.getMedia() != null) {
|
||||
EpisodeAction actionNew = new EpisodeAction.Builder(selectedItem, EpisodeAction.NEW)
|
||||
.currentTimestamp()
|
||||
|
@ -194,7 +194,7 @@ public class FeedItemMenuHandler {
|
|||
PlaybackPreferences.writeNoMediaPlaying();
|
||||
IntentUtils.sendLocalBroadcast(context, PlaybackServiceInterface.ACTION_SHUTDOWN_PLAYBACK_SERVICE);
|
||||
}
|
||||
DBWriter.markItemPlayed(selectedItem, FeedItem.UNPLAYED, true);
|
||||
DBWriter.markItemPlayed(FeedItem.UNPLAYED, selectedItem);
|
||||
} else if (menuItemId == R.id.visit_website_item) {
|
||||
IntentUtils.openInBrowser(context, selectedItem.getLinkWithFallback());
|
||||
} else if (menuItemId == R.id.share_item) {
|
||||
|
@ -224,7 +224,7 @@ public class FeedItemMenuHandler {
|
|||
Log.d(TAG, "markReadWithUndo(" + item.getId() + ")");
|
||||
// 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(playState, item.getId());
|
||||
DBWriter.markItemPlayed(playState, item);
|
||||
|
||||
final Handler h = new Handler(fragment.requireContext().getMainLooper());
|
||||
final Runnable r = () -> {
|
||||
|
@ -265,7 +265,7 @@ public class FeedItemMenuHandler {
|
|||
((MainActivity) fragment.getActivity()).showSnackbarAbovePlayer(
|
||||
playStateStringRes, duration)
|
||||
.setAction(fragment.getString(R.string.undo), v -> {
|
||||
DBWriter.markItemPlayed(item.getPlayState(), item.getId());
|
||||
DBWriter.markItemPlayed(item.getPlayState(), item);
|
||||
// don't forget to cancel the thing that's going to remove the media
|
||||
h.removeCallbacks(r);
|
||||
});
|
||||
|
|
|
@ -1151,7 +1151,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
|
|||
|| autoSkipped
|
||||
|| (skipped && !UserPreferences.shouldSkipKeepEpisode())) {
|
||||
// only mark the item as played if we're not keeping it anyways
|
||||
DBWriter.markItemPlayed(item, FeedItem.PLAYED, ended || (skipped && almostEnded));
|
||||
DBWriter.markItemPlayed(FeedItem.PLAYED, item);
|
||||
// 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
|
||||
|
|
|
@ -23,7 +23,7 @@ public abstract class PlayableUtils {
|
|||
FeedMedia media = (FeedMedia) playable;
|
||||
FeedItem item = media.getItem();
|
||||
if (item != null && item.isNew()) {
|
||||
DBWriter.markItemPlayed(FeedItem.UNPLAYED, item.getId());
|
||||
DBWriter.markItemPlayed(FeedItem.UNPLAYED, item);
|
||||
}
|
||||
if (media.getStartPosition() >= 0 && playable.getPosition() > media.getStartPosition()) {
|
||||
media.setPlayedDuration(media.getPlayedDurationWhenStarted()
|
||||
|
|
|
@ -346,7 +346,7 @@ public class DBWriter {
|
|||
EventBus.getDefault().post(QueueEvent.added(item, index));
|
||||
EventBus.getDefault().post(FeedItemEvent.updated(item));
|
||||
if (item.isNew()) {
|
||||
DBWriter.markItemPlayed(FeedItem.UNPLAYED, item.getId());
|
||||
DBWriter.markItemPlayed(FeedItem.UNPLAYED, item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -411,7 +411,7 @@ public class DBWriter {
|
|||
final List<FeedItem> queue = DBReader.getQueue();
|
||||
|
||||
boolean queueModified = false;
|
||||
LongList markAsUnplayedIds = new LongList();
|
||||
List<FeedItem> markAsUnplayedItems = new ArrayList<>();
|
||||
List<QueueEvent> events = new ArrayList<>();
|
||||
List<FeedItem> updatedItems = new ArrayList<>();
|
||||
ItemEnqueuePositionCalculator positionCalculator =
|
||||
|
@ -429,7 +429,7 @@ public class DBWriter {
|
|||
updatedItems.add(item);
|
||||
queueModified = true;
|
||||
if (item.isNew()) {
|
||||
markAsUnplayedIds.add(item.getId());
|
||||
markAsUnplayedItems.add(item);
|
||||
}
|
||||
insertPosition++;
|
||||
}
|
||||
|
@ -442,8 +442,8 @@ public class DBWriter {
|
|||
EventBus.getDefault().post(event);
|
||||
}
|
||||
EventBus.getDefault().post(FeedItemEvent.updated(updatedItems));
|
||||
if (markAsUnplayed && markAsUnplayedIds.size() > 0) {
|
||||
DBWriter.markItemPlayed(FeedItem.UNPLAYED, markAsUnplayedIds.toArray());
|
||||
if (markAsUnplayed && !markAsUnplayedItems.isEmpty()) {
|
||||
DBWriter.markItemPlayed(FeedItem.UNPLAYED, markAsUnplayedItems);
|
||||
}
|
||||
}
|
||||
adapter.close();
|
||||
|
@ -685,49 +685,28 @@ public class DBWriter {
|
|||
});
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* Sets the 'read'-attribute of all specified FeedItems
|
||||
*
|
||||
* @param played New value of the 'read'-attribute, one of FeedItem.PLAYED, FeedItem.NEW,
|
||||
* FeedItem.UNPLAYED
|
||||
* @param itemIds IDs of the FeedItems.
|
||||
* @param played New value of the 'read'-attribute, one of FeedItem.PLAYED, FeedItem.NEW, FeedItem.UNPLAYED
|
||||
* @param items to be marked.
|
||||
*/
|
||||
public static Future<?> markItemPlayed(final int played, final long... itemIds) {
|
||||
return runOnDbThread(() -> {
|
||||
final PodDBAdapter adapter = PodDBAdapter.getInstance();
|
||||
adapter.open();
|
||||
adapter.setFeedItemRead(played, itemIds);
|
||||
adapter.close();
|
||||
EventBus.getDefault().post(new UnreadItemsUpdateEvent());
|
||||
});
|
||||
public static Future<?> markItemPlayed(final int played, final List<FeedItem> items) {
|
||||
return markItemPlayed(played, items.toArray(new FeedItem[0]));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the 'read'-attribute of a FeedItem to the specified value.
|
||||
* Sets the 'read'-attribute of all specified FeedItems
|
||||
*
|
||||
* @param item The FeedItem object
|
||||
* @param played New value of the 'read'-attribute one of FeedItem.PLAYED,
|
||||
* FeedItem.NEW, FeedItem.UNPLAYED
|
||||
* @param resetMediaPosition true if this method should also reset the position of the FeedItem's FeedMedia object.
|
||||
* @param played New value of the 'read'-attribute, one of FeedItem.PLAYED, FeedItem.NEW, FeedItem.UNPLAYED
|
||||
* @param items to be marked.
|
||||
*/
|
||||
@NonNull
|
||||
public static Future<?> markItemPlayed(FeedItem item, int played, boolean resetMediaPosition) {
|
||||
long mediaId = (item.hasMedia()) ? item.getMedia().getId() : 0;
|
||||
return markItemPlayed(item.getId(), played, mediaId, resetMediaPosition);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private static Future<?> markItemPlayed(final long itemId,
|
||||
final int played,
|
||||
final long mediaId,
|
||||
final boolean resetMediaPosition) {
|
||||
public static Future<?> markItemPlayed(final int played, final FeedItem... items) {
|
||||
return runOnDbThread(() -> {
|
||||
final PodDBAdapter adapter = PodDBAdapter.getInstance();
|
||||
adapter.open();
|
||||
adapter.setFeedItemRead(played, itemId, mediaId,
|
||||
resetMediaPosition);
|
||||
adapter.setFeedItemRead(played, items);
|
||||
adapter.close();
|
||||
|
||||
EventBus.getDefault().post(new UnreadItemsUpdateEvent());
|
||||
});
|
||||
}
|
||||
|
|
|
@ -684,43 +684,26 @@ public class PodDBAdapter {
|
|||
return item.getId();
|
||||
}
|
||||
|
||||
public void setFeedItemRead(int played, long itemId, long mediaId,
|
||||
boolean resetMediaPosition) {
|
||||
try {
|
||||
db.beginTransactionNonExclusive();
|
||||
ContentValues values = new ContentValues();
|
||||
|
||||
values.put(KEY_READ, played);
|
||||
db.update(TABLE_NAME_FEED_ITEMS, values, KEY_ID + "=?", new String[]{String.valueOf(itemId)});
|
||||
|
||||
if (resetMediaPosition) {
|
||||
values.clear();
|
||||
values.put(KEY_POSITION, 0);
|
||||
db.update(TABLE_NAME_FEED_MEDIA, values, KEY_ID + "=?", new String[]{String.valueOf(mediaId)});
|
||||
}
|
||||
|
||||
db.setTransactionSuccessful();
|
||||
} catch (SQLException e) {
|
||||
Log.e(TAG, Log.getStackTraceString(e));
|
||||
} finally {
|
||||
db.endTransaction();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the 'read' attribute of the item.
|
||||
*
|
||||
* @param read must be one of FeedItem.PLAYED, FeedItem.NEW, FeedItem.UNPLAYED
|
||||
* @param itemIds items to change the value of
|
||||
* @param items to change the value of
|
||||
*/
|
||||
public void setFeedItemRead(int read, long... itemIds) {
|
||||
public void setFeedItemRead(int read, FeedItem... items) {
|
||||
try {
|
||||
db.beginTransactionNonExclusive();
|
||||
ContentValues values = new ContentValues();
|
||||
for (long id : itemIds) {
|
||||
for (FeedItem item : items) {
|
||||
values.clear();
|
||||
values.put(KEY_READ, read);
|
||||
db.update(TABLE_NAME_FEED_ITEMS, values, KEY_ID + "=?", new String[]{String.valueOf(id)});
|
||||
db.update(TABLE_NAME_FEED_ITEMS, values, KEY_ID + "=?", new String[]{String.valueOf(item.getId())});
|
||||
|
||||
if (read == FeedItem.PLAYED && !item.isInProgress() && !item.isPlayed()) {
|
||||
values.clear();
|
||||
values.put(KEY_POSITION, 0);
|
||||
db.update(TABLE_NAME_FEED_MEDIA, values, KEY_ID + "=?", new String[]{String.valueOf(item.getMedia().getId())});
|
||||
}
|
||||
}
|
||||
db.setTransactionSuccessful();
|
||||
} catch (SQLException e) {
|
||||
|
|
Loading…
Reference in New Issue