Optimize history save

release^2
jhengazuki 2 months ago
parent 18b3ffb57f
commit 37bafe8507
  1. 1
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  2. 2
      app/src/main/java/com/fongmi/android/tv/bean/Flag.java
  3. 40
      app/src/main/java/com/fongmi/android/tv/bean/History.java
  4. 4
      app/src/main/java/com/fongmi/android/tv/db/dao/HistoryDao.java
  5. 1
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java

@ -1403,6 +1403,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List
protected void onPause() { protected void onPause() {
super.onPause(); super.onPause();
if (isRedirect()) onPaused(); if (isRedirect()) onPaused();
if (mHistory != null) mHistory.merge();
} }
@Override @Override

@ -111,7 +111,7 @@ public class Flag implements Parcelable {
public Episode find(String remarks, boolean strict) { public Episode find(String remarks, boolean strict) {
int number = Util.getDigit(remarks); int number = Util.getDigit(remarks);
if (getEpisodes().size() == 0) return null; if (getEpisodes().isEmpty()) return null;
if (getEpisodes().size() == 1) return getEpisodes().get(0); if (getEpisodes().size() == 1) return getEpisodes().get(0);
for (Episode item : getEpisodes()) if (item.rule1(remarks)) return item; for (Episode item : getEpisodes()) if (item.rule1(remarks)) return item;
for (Episode item : getEpisodes()) if (item.rule2(number)) return item; for (Episode item : getEpisodes()) if (item.rule2(number)) return item;

@ -260,14 +260,19 @@ public class History implements Diffable<History> {
} }
public static List<History> findByName(String name) { public static List<History> findByName(String name) {
try {
return AppDatabase.get().getHistoryDao().findByName(VodConfig.getCid(), name); return AppDatabase.get().getHistoryDao().findByName(VodConfig.getCid(), name);
} catch (Exception e) {
return Collections.emptyList();
}
} }
public static void delete(int cid) { public static void delete(int cid) {
AppDatabase.get().getHistoryDao().delete(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; if (getDuration() <= 0 || item.getDuration() <= 0) return true;
return Math.abs(getDuration() - item.getDuration()) <= TimeUnit.MINUTES.toMillis(10); return Math.abs(getDuration() - item.getDuration()) <= TimeUnit.MINUTES.toMillis(10);
} }
@ -279,13 +284,21 @@ public class History implements Diffable<History> {
return this; return this;
} }
private History merge(List<History> items) { public void merge() {
for (History item : items) if (item.shouldMerge(this)) item.copyTo(this).delete(); merge(false);
}
private History merge(boolean force) {
return merge(findByName(getVodName()), force);
}
private History merge(List<History> items, boolean force) {
for (History item : items) if (item.shouldMerge(this, force)) item.copyTo(this).delete();
return this; return this;
} }
public History save(int cid) { public History save(int cid) {
return cid(cid).merge(findByName(getVodName())).save(); return cid(cid).merge(true).save();
} }
public History save() { public History save() {
@ -300,21 +313,17 @@ public class History implements Diffable<History> {
} }
public void findEpisode(List<Flag> flags) { public void findEpisode(List<Flag> flags) {
if (!flags.isEmpty()) { if (flags.isEmpty()) return;
setVodFlag(flags.get(0).getFlag()); setVodFlag(flags.get(0).getFlag());
if (!flags.get(0).getEpisodes().isEmpty()) { if (!flags.get(0).getEpisodes().isEmpty()) setVodRemarks(flags.get(0).getEpisodes().get(0).getName());
setVodRemarks(flags.get(0).getEpisodes().get(0).getName());
}
}
for (History item : findByName(getVodName())) { for (History item : findByName(getVodName())) {
if (getPosition() > 0) break;
for (Flag flag : flags) { for (Flag flag : flags) {
Episode episode = flag.find(item.getVodRemarks(), true); Episode episode = flag.find(item.getVodRemarks(), true);
if (episode == null) continue; if (episode == null) continue;
item.copyTo(this);
setVodFlag(flag.getFlag()); setVodFlag(flag.getFlag());
setPosition(item.getPosition()); setPosition(item.getPosition());
setVodRemarks(episode.getName()); setVodRemarks(episode.getName());
item.copyTo(this);
break; break;
} }
} }
@ -327,11 +336,14 @@ public class History implements Diffable<History> {
target.cid(VodConfig.getCid()).save(); target.cid(VodConfig.getCid()).save();
continue; continue;
} }
long latestLocalTime = 0;
for (History item : items) { for (History item : items) {
if (target.getCreateTime() > item.getCreateTime()) { if (item.getCreateTime() > latestLocalTime) {
target.cid(VodConfig.getCid()).merge(items).save(); latestLocalTime = item.getCreateTime();
break; }
} }
if (target.getCreateTime() > latestLocalTime) {
target.cid(VodConfig.getCid()).merge(items, true).save();
} }
} }
} }

@ -13,13 +13,13 @@ public abstract class HistoryDao extends BaseDao<History> {
@Query("SELECT * FROM History") @Query("SELECT * FROM History")
public abstract List<History> findAll(); public abstract List<History> 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<History> find(int cid, long createTime); public abstract List<History> find(int cid, long createTime);
@Query("SELECT * FROM History WHERE cid = :cid AND `key` = :key") @Query("SELECT * FROM History WHERE cid = :cid AND `key` = :key")
public abstract History find(int cid, String 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<History> findByName(int cid, String vodName); public abstract List<History> findByName(int cid, String vodName);
@Query("DELETE FROM History WHERE cid = :cid AND `key` = :key") @Query("DELETE FROM History WHERE cid = :cid AND `key` = :key")

@ -1646,6 +1646,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
protected void onPause() { protected void onPause() {
super.onPause(); super.onPause();
if (isRedirect()) onPaused(); if (isRedirect()) onPaused();
if (mHistory != null) mHistory.merge();
} }
@Override @Override

Loading…
Cancel
Save