From 085d1e0d384fe4babd846163936a4cacfc7196f2 Mon Sep 17 00:00:00 2001 From: Stypox Date: Fri, 1 Jul 2022 15:44:27 +0200 Subject: [PATCH] Actually fix wrong view count --- .../history/model/StreamHistoryEntity.java | 14 +++++------ .../local/history/HistoryRecordManager.java | 13 +++++------ .../org/schabi/newpipe/player/Player.java | 23 +++++++++++++------ 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.java b/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.java index 8d703301b..a9d69afe8 100644 --- a/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.java +++ b/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.java @@ -4,7 +4,6 @@ import androidx.annotation.NonNull; import androidx.room.ColumnInfo; import androidx.room.Entity; import androidx.room.ForeignKey; -import androidx.room.Ignore; import androidx.room.Index; import org.schabi.newpipe.database.stream.model.StreamEntity; @@ -42,18 +41,19 @@ public class StreamHistoryEntity { @ColumnInfo(name = STREAM_REPEAT_COUNT) private long repeatCount; - public StreamHistoryEntity(final long streamUid, @NonNull final OffsetDateTime accessDate, + /** + * @param streamUid the stream id this history item will refer to + * @param accessDate the last time the stream was accessed + * @param repeatCount the total number of views this stream received + */ + public StreamHistoryEntity(final long streamUid, + @NonNull final OffsetDateTime accessDate, final long repeatCount) { this.streamUid = streamUid; this.accessDate = accessDate; this.repeatCount = repeatCount; } - @Ignore - public StreamHistoryEntity(final long streamUid, @NonNull final OffsetDateTime accessDate) { - this(streamUid, accessDate, 0); // start with 0 views (adding views will be done elsewhere) - } - public long getStreamUid() { return streamUid; } diff --git a/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java b/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java index 45445cf58..19f7afce5 100644 --- a/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java @@ -128,13 +128,11 @@ public class HistoryRecordManager { // Add a history entry final StreamHistoryEntity latestEntry = streamHistoryTable.getLatestEntry(streamId); - if (latestEntry != null) { - streamHistoryTable.delete(latestEntry); - latestEntry.setAccessDate(currentTime); - latestEntry.setRepeatCount(latestEntry.getRepeatCount() + 1); - return streamHistoryTable.insert(latestEntry); + if (latestEntry == null) { + // never actually viewed: add history entry but with 0 views + return streamHistoryTable.insert(new StreamHistoryEntity(streamId, currentTime, 0)); } else { - return streamHistoryTable.insert(new StreamHistoryEntity(streamId, currentTime)); + return 0L; } })).subscribeOn(Schedulers.io()); } @@ -155,7 +153,8 @@ public class HistoryRecordManager { latestEntry.setRepeatCount(latestEntry.getRepeatCount() + 1); return streamHistoryTable.insert(latestEntry); } else { - return streamHistoryTable.insert(new StreamHistoryEntity(streamId, currentTime)); + // just viewed for the first time: set 1 view + return streamHistoryTable.insert(new StreamHistoryEntity(streamId, currentTime, 1)); } })).subscribeOn(Schedulers.io()); } diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index b2c8836e5..b3194afe6 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -2485,22 +2485,31 @@ public final class Player implements Listener.super.onEvents(player, events); MediaItemTag.from(player.getCurrentMediaItem()).ifPresent(tag -> { if (tag == currentMetadata) { - return; + return; // we still have the same metadata, no need to do anything } + final StreamInfo previousInfo = Optional.ofNullable(currentMetadata) + .flatMap(MediaItemTag::getMaybeStreamInfo).orElse(null); currentMetadata = tag; - if (!tag.getErrors().isEmpty()) { + + if (!currentMetadata.getErrors().isEmpty()) { + // new errors might have been added even if previousInfo == tag.getMaybeStreamInfo() final ErrorInfo errorInfo = new ErrorInfo( - tag.getErrors().get(0), + currentMetadata.getErrors(), UserAction.PLAY_STREAM, - "Loading failed for [" + tag.getTitle() + "]: " + tag.getStreamUrl(), - tag.getServiceId()); + "Loading failed for [" + currentMetadata.getTitle() + + "]: " + currentMetadata.getStreamUrl(), + currentMetadata.getServiceId()); ErrorUtil.createNotification(context, errorInfo); } - tag.getMaybeStreamInfo().ifPresent(info -> { + + currentMetadata.getMaybeStreamInfo().ifPresent(info -> { if (DEBUG) { Log.d(TAG, "ExoPlayer - onEvents() update stream info: " + info.getName()); } - updateMetadataWith(info); + if (previousInfo == null || !previousInfo.getUrl().equals(info.getUrl())) { + // only update with the new stream info if it has actually changed + updateMetadataWith(info); + } }); }); }