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:
flofriday 2024-05-07 17:03:17 +02:00
parent eb71511fce
commit 1f03e1124c
7 changed files with 41 additions and 80 deletions

View File

@ -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);
}
}

View File

@ -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) {

View File

@ -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);
});

View File

@ -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

View File

@ -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()

View File

@ -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());
});
}

View File

@ -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) {