diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index 59ff22150..a3167332d 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -1403,6 +1403,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List protected void onPause() { super.onPause(); if (isRedirect()) onPaused(); + if (mHistory != null) mHistory.merge(); } @Override diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Flag.java b/app/src/main/java/com/fongmi/android/tv/bean/Flag.java index 9f46b1a1b..08ee16ca5 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Flag.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Flag.java @@ -111,7 +111,7 @@ public class Flag implements Parcelable { public Episode find(String remarks, boolean strict) { int number = Util.getDigit(remarks); - if (getEpisodes().size() == 0) return null; + if (getEpisodes().isEmpty()) return null; if (getEpisodes().size() == 1) return getEpisodes().get(0); for (Episode item : getEpisodes()) if (item.rule1(remarks)) return item; for (Episode item : getEpisodes()) if (item.rule2(number)) return item; diff --git a/app/src/main/java/com/fongmi/android/tv/bean/History.java b/app/src/main/java/com/fongmi/android/tv/bean/History.java index 00f97aae1..5cb04ccdc 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/History.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/History.java @@ -260,14 +260,19 @@ public class History implements Diffable { } public static List findByName(String name) { - return AppDatabase.get().getHistoryDao().findByName(VodConfig.getCid(), name); + try { + return AppDatabase.get().getHistoryDao().findByName(VodConfig.getCid(), name); + } catch (Exception e) { + return Collections.emptyList(); + } } public static void delete(int cid) { AppDatabase.get().getHistoryDao().delete(cid); } - private boolean shouldMerge(History item) { + private boolean shouldMerge(History item, boolean force) { + if (!force && getKey().equals(item.getKey())) return false; if (getDuration() <= 0 || item.getDuration() <= 0) return true; return Math.abs(getDuration() - item.getDuration()) <= TimeUnit.MINUTES.toMillis(10); } @@ -279,13 +284,21 @@ public class History implements Diffable { return this; } - private History merge(List items) { - for (History item : items) if (item.shouldMerge(this)) item.copyTo(this).delete(); + public void merge() { + merge(false); + } + + private History merge(boolean force) { + return merge(findByName(getVodName()), force); + } + + private History merge(List items, boolean force) { + for (History item : items) if (item.shouldMerge(this, force)) item.copyTo(this).delete(); return this; } public History save(int cid) { - return cid(cid).merge(findByName(getVodName())).save(); + return cid(cid).merge(true).save(); } public History save() { @@ -300,21 +313,17 @@ public class History implements Diffable { } public void findEpisode(List flags) { - if (!flags.isEmpty()) { - setVodFlag(flags.get(0).getFlag()); - if (!flags.get(0).getEpisodes().isEmpty()) { - setVodRemarks(flags.get(0).getEpisodes().get(0).getName()); - } - } + if (flags.isEmpty()) return; + setVodFlag(flags.get(0).getFlag()); + if (!flags.get(0).getEpisodes().isEmpty()) setVodRemarks(flags.get(0).getEpisodes().get(0).getName()); for (History item : findByName(getVodName())) { - if (getPosition() > 0) break; for (Flag flag : flags) { Episode episode = flag.find(item.getVodRemarks(), true); if (episode == null) continue; + item.copyTo(this); setVodFlag(flag.getFlag()); setPosition(item.getPosition()); setVodRemarks(episode.getName()); - item.copyTo(this); break; } } @@ -327,12 +336,15 @@ public class History implements Diffable { target.cid(VodConfig.getCid()).save(); continue; } + long latestLocalTime = 0; for (History item : items) { - if (target.getCreateTime() > item.getCreateTime()) { - target.cid(VodConfig.getCid()).merge(items).save(); - break; + if (item.getCreateTime() > latestLocalTime) { + latestLocalTime = item.getCreateTime(); } } + if (target.getCreateTime() > latestLocalTime) { + target.cid(VodConfig.getCid()).merge(items, true).save(); + } } } diff --git a/app/src/main/java/com/fongmi/android/tv/db/dao/HistoryDao.java b/app/src/main/java/com/fongmi/android/tv/db/dao/HistoryDao.java index 75408453b..61b201250 100644 --- a/app/src/main/java/com/fongmi/android/tv/db/dao/HistoryDao.java +++ b/app/src/main/java/com/fongmi/android/tv/db/dao/HistoryDao.java @@ -13,13 +13,13 @@ public abstract class HistoryDao extends BaseDao { @Query("SELECT * FROM History") public abstract List findAll(); - @Query("SELECT * FROM History WHERE cid = :cid AND createTime >= :createTime ORDER BY createTime DESC") + @Query("SELECT * FROM History WHERE cid = :cid AND createTime >= :createTime ORDER BY createTime DESC LIMIT 60") public abstract List find(int cid, long createTime); @Query("SELECT * FROM History WHERE cid = :cid AND `key` = :key") public abstract History find(int cid, String key); - @Query("SELECT * FROM History WHERE cid = :cid AND vodName = :vodName") + @Query("SELECT * FROM History WHERE cid = :cid AND vodName = :vodName AND position > 0 ORDER BY createTime DESC") public abstract List findByName(int cid, String vodName); @Query("DELETE FROM History WHERE cid = :cid AND `key` = :key") diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index ceaabd224..159454bd2 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -1646,6 +1646,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo protected void onPause() { super.onPause(); if (isRedirect()) onPaused(); + if (mHistory != null) mHistory.merge(); } @Override