diff --git a/app/src/main/java/com/hippo/ehviewer/EhDB.java b/app/src/main/java/com/hippo/ehviewer/EhDB.java index b5048fe71..119905174 100644 --- a/app/src/main/java/com/hippo/ehviewer/EhDB.java +++ b/app/src/main/java/com/hippo/ehviewer/EhDB.java @@ -29,6 +29,7 @@ import androidx.room.Room; import com.hippo.ehviewer.client.data.GalleryInfo; import com.hippo.ehviewer.client.data.ListUrlBuilder; +import com.hippo.ehviewer.dao.BasicDao; import com.hippo.ehviewer.dao.DownloadDirname; import com.hippo.ehviewer.dao.DownloadDirnameDao; import com.hippo.ehviewer.dao.DownloadInfo; @@ -43,9 +44,18 @@ import com.hippo.ehviewer.dao.LocalFavoriteInfo; import com.hippo.ehviewer.dao.LocalFavoritesDao; import com.hippo.ehviewer.dao.QuickSearch; import com.hippo.ehviewer.dao.QuickSearchDao; +import com.hippo.ehviewer.download.DownloadManager; import com.hippo.util.ExceptionUtils; +import com.hippo.yorozuya.IOUtils; +import com.hippo.yorozuya.ObjectUtils; import com.hippo.yorozuya.collect.SparseJLArray; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.util.ArrayList; import java.util.List; @@ -53,6 +63,8 @@ public class EhDB { private static final String TAG = EhDB.class.getSimpleName(); + private static final int CUR_DB_VER = 4; + private static final int MAX_HISTORY_COUNT = 200; private static EhDatabase db; @@ -589,15 +601,159 @@ public class EhDB { db.filterDao().update(filter); } - public static synchronized boolean exportDB(Context context, Uri uri) { + private static boolean copyDao(BasicDao from, BasicDao to) { + List list = from.fakeList(); + for (T item : list) + to.fakeInsert(item); return false; } + public static synchronized boolean exportDB(Context context, Uri uri) { + final String ehExportName = "eh.export.db"; + + // Delete old export db + context.deleteDatabase(ehExportName); + EhDatabase newDb = Room.databaseBuilder(context, EhDatabase.class, ehExportName).allowMainThreadQueries().build(); + + try { + // Copy data to a export db + if (copyDao(db.downloadsDao(), newDb.downloadsDao())) + return false; + if (copyDao(db.downloadLabelDao(), newDb.downloadLabelDao())) + return false; + if (copyDao(db.downloadDirnameDao(), newDb.downloadDirnameDao())) + return false; + if (copyDao(db.historyDao(), newDb.historyDao())) + return false; + if (copyDao(db.quickSearchDao(), newDb.quickSearchDao())) + return false; + if (copyDao(db.localFavoritesDao(), newDb.localFavoritesDao())) + return false; + if (copyDao(db.filterDao(), newDb.filterDao())) + return false; + + // Copy export db to data dir + File dbFile = context.getDatabasePath(ehExportName); + if (dbFile == null || !dbFile.isFile()) { + return false; + } + InputStream is = null; + OutputStream os = null; + try { + is = new FileInputStream(dbFile); + os = context.getContentResolver().openOutputStream(uri); + IOUtils.copy(is, os); + return true; + } catch (IOException e) { + e.printStackTrace(); + } finally { + IOUtils.closeQuietly(is); + IOUtils.closeQuietly(os); + } + // Delete failed file + return false; + } finally { + context.deleteDatabase(ehExportName); + } + } + /** * @return error string, null for no error */ public static synchronized String importDB(Context context, Uri uri) { - return ""; + try { + InputStream inputStream = context.getContentResolver().openInputStream(uri); + File file = File.createTempFile("importDatabase", ""); + FileOutputStream outputStream = new FileOutputStream(file); + byte[] buff = new byte[1024]; + int read; + if (inputStream != null) { + while ((read = inputStream.read(buff, 0, buff.length)) > 0) { + outputStream.write(buff, 0, read); + } + } else { + return context.getString(R.string.cant_read_the_file); + } + inputStream.close(); + outputStream.close(); + + SQLiteDatabase oldDB = SQLiteDatabase.openDatabase( + file.getPath(), null, SQLiteDatabase.NO_LOCALIZED_COLLATORS); + int newVersion = CUR_DB_VER; + int oldVersion = oldDB.getVersion(); + if (oldVersion < newVersion) { + upgradeDB(oldDB, oldVersion); + oldDB.setVersion(newVersion); + } else if (oldVersion > newVersion) { + return context.getString(R.string.cant_read_the_file); + } + + String tmpDBName = "tmp.db"; + context.deleteDatabase(tmpDBName); + EhDatabase oldRoomDatabase = Room.databaseBuilder(context, EhDatabase.class, tmpDBName) + .createFromFile(file).allowMainThreadQueries().build(); + + + // Downloads + DownloadManager manager = EhApplication.getDownloadManager(context); + List downloadInfoList = oldRoomDatabase.downloadsDao().list(); + manager.addDownload(downloadInfoList, false); + + // Download label + List downloadLabelList = oldRoomDatabase.downloadLabelDao().list(); + manager.addDownloadLabel(downloadLabelList); + + // Download dirname + List downloadDirnameList = oldRoomDatabase.downloadDirnameDao().fakeList(); + for (DownloadDirname dirname : downloadDirnameList) { + putDownloadDirname(dirname.getGid(), dirname.getDirname()); + } + + // History + List historyInfoList = oldRoomDatabase.historyDao().list(); + putHistoryInfo(historyInfoList); + + // QuickSearch + List quickSearchList = oldRoomDatabase.quickSearchDao().list(); + List currentQuickSearchList = db.quickSearchDao().list(); + List importList = new ArrayList<>(); + for (QuickSearch quickSearch : quickSearchList) { + String name = quickSearch.name; + for (QuickSearch q : currentQuickSearchList) { + if (ObjectUtils.equal(q.name, name)) { + // The same name + name = null; + break; + } + } + if (null == name) { + continue; + } + importList.add(quickSearch); + } + importQuickSearch(importList); + + // LocalFavorites + List localFavoriteInfoList = oldRoomDatabase.localFavoritesDao().list(); + for (LocalFavoriteInfo info : localFavoriteInfoList) { + putLocalFavorites(info); + } + + // Filter + List filterList = oldRoomDatabase.filterDao().list(); + List currentFilterList = db.filterDao().list(); + for (Filter filter : filterList) { + if (!currentFilterList.contains(filter)) { + addFilter(filter); + } + } + + return null; + } catch (Throwable e) { + ExceptionUtils.throwIfFatal(e); + // Ignore + return context.getString(R.string.cant_read_the_file); + } } private static class OldDBHelper extends SQLiteOpenHelper { diff --git a/app/src/main/java/com/hippo/ehviewer/client/data/GalleryInfo.java b/app/src/main/java/com/hippo/ehviewer/client/data/GalleryInfo.java index 6dd53d7f9..0afe1506f 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/data/GalleryInfo.java +++ b/app/src/main/java/com/hippo/ehviewer/client/data/GalleryInfo.java @@ -195,6 +195,7 @@ public class GalleryInfo implements Parcelable { } private void generateSLangFromTags() { + assert simpleTags != null; for (String tag : simpleTags) { for (int i = 0; i < S_LANGS.length; i++) { if (S_LANG_TAGS[i].equals(tag)) { diff --git a/app/src/main/java/com/hippo/ehviewer/dao/BasicDao.java b/app/src/main/java/com/hippo/ehviewer/dao/BasicDao.java new file mode 100644 index 000000000..fc7940dbc --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/dao/BasicDao.java @@ -0,0 +1,8 @@ +package com.hippo.ehviewer.dao; + +import java.util.List; + +public interface BasicDao { + List fakeList(); + void fakeInsert(T t); +} diff --git a/app/src/main/java/com/hippo/ehviewer/dao/BookmarkInfo.java b/app/src/main/java/com/hippo/ehviewer/dao/BookmarkInfo.java index 328b836d9..73f529513 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/BookmarkInfo.java +++ b/app/src/main/java/com/hippo/ehviewer/dao/BookmarkInfo.java @@ -9,8 +9,7 @@ import com.hippo.ehviewer.client.data.GalleryInfo; @Entity(tableName = "BOOKMARKS") public class BookmarkInfo extends GalleryInfo { - - public static final Creator CREATOR = new Creator() { + public static final Creator CREATOR = new Creator<>() { @Override public BookmarkInfo createFromParcel(Parcel source) { return new BookmarkInfo(source); @@ -158,5 +157,4 @@ public class BookmarkInfo extends GalleryInfo { dest.writeInt(this.page); dest.writeLong(this.time); } - } diff --git a/app/src/main/java/com/hippo/ehviewer/dao/BookmarksBao.java b/app/src/main/java/com/hippo/ehviewer/dao/BookmarksDao.java similarity index 87% rename from app/src/main/java/com/hippo/ehviewer/dao/BookmarksBao.java rename to app/src/main/java/com/hippo/ehviewer/dao/BookmarksDao.java index ede23fbc8..5ab452b69 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/BookmarksBao.java +++ b/app/src/main/java/com/hippo/ehviewer/dao/BookmarksDao.java @@ -5,12 +5,10 @@ import androidx.room.Delete; import androidx.room.Insert; @Dao -public interface BookmarksBao { - +public interface BookmarksDao { @Insert void insert(BookmarkInfo bookmark); @Delete void delete(BookmarkInfo bookmark); - } diff --git a/app/src/main/java/com/hippo/ehviewer/dao/DownloadDirname.java b/app/src/main/java/com/hippo/ehviewer/dao/DownloadDirname.java index 2b5df9fb3..049c4d7cd 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/DownloadDirname.java +++ b/app/src/main/java/com/hippo/ehviewer/dao/DownloadDirname.java @@ -6,7 +6,6 @@ import androidx.room.PrimaryKey; @Entity(tableName = "DOWNLOAD_DIRNAME") public class DownloadDirname { - @PrimaryKey @ColumnInfo(name = "GID") private long gid; @@ -28,5 +27,4 @@ public class DownloadDirname { public void setDirname(String dirname) { this.dirname = dirname; } - } diff --git a/app/src/main/java/com/hippo/ehviewer/dao/DownloadDirnameDao.java b/app/src/main/java/com/hippo/ehviewer/dao/DownloadDirnameDao.java index 319205be4..f206bf725 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/DownloadDirnameDao.java +++ b/app/src/main/java/com/hippo/ehviewer/dao/DownloadDirnameDao.java @@ -5,9 +5,10 @@ import androidx.room.Insert; import androidx.room.Query; import androidx.room.Update; -@Dao -public interface DownloadDirnameDao { +import java.util.List; +@Dao +public interface DownloadDirnameDao extends BasicDao { @Query("SELECT * FROM DOWNLOAD_DIRNAME WHERE GID = :gid") DownloadDirname load(long gid); @@ -15,11 +16,17 @@ public interface DownloadDirnameDao { void update(DownloadDirname downloadDirname); @Insert - void insert(DownloadDirname downloadDirname); + long insert(DownloadDirname downloadDirname); @Query("DELETE FROM DOWNLOAD_DIRNAME WHERE GID = :gid") void deleteByKey(long gid); @Query("DELETE FROM DOWNLOAD_DIRNAME") void deleteAll(); + + @Query("SELECT * FROM DOWNLOAD_DIRNAME") + List fakeList(); + + @Insert + void fakeInsert(DownloadDirname t); } diff --git a/app/src/main/java/com/hippo/ehviewer/dao/DownloadInfo.java b/app/src/main/java/com/hippo/ehviewer/dao/DownloadInfo.java index 15c52de37..58d8ebf6b 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/DownloadInfo.java +++ b/app/src/main/java/com/hippo/ehviewer/dao/DownloadInfo.java @@ -10,8 +10,7 @@ import com.hippo.ehviewer.client.data.GalleryInfo; @Entity(tableName = "DOWNLOADS") public class DownloadInfo extends GalleryInfo { - - public static final Creator CREATOR = new Creator() { + public static final Creator CREATOR = new Creator<>() { @Override public DownloadInfo createFromParcel(Parcel source) { return new DownloadInfo(source); @@ -250,5 +249,4 @@ public class DownloadInfo extends GalleryInfo { public void setTotal(int total) { this.total = total; } - } diff --git a/app/src/main/java/com/hippo/ehviewer/dao/DownloadLabel.java b/app/src/main/java/com/hippo/ehviewer/dao/DownloadLabel.java index 022bdffd9..f1b51a7d3 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/DownloadLabel.java +++ b/app/src/main/java/com/hippo/ehviewer/dao/DownloadLabel.java @@ -6,7 +6,6 @@ import androidx.room.PrimaryKey; @Entity(tableName = "DOWNLOAD_LABELS") public class DownloadLabel { - @PrimaryKey @ColumnInfo(name = "_id") private Long id; @@ -38,5 +37,4 @@ public class DownloadLabel { public void setTime(long time) { this.time = time; } - } diff --git a/app/src/main/java/com/hippo/ehviewer/dao/DownloadLabelDao.java b/app/src/main/java/com/hippo/ehviewer/dao/DownloadLabelDao.java index b9f555faa..946fe44c6 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/DownloadLabelDao.java +++ b/app/src/main/java/com/hippo/ehviewer/dao/DownloadLabelDao.java @@ -9,8 +9,7 @@ import androidx.room.Update; import java.util.List; @Dao -public interface DownloadLabelDao { - +public interface DownloadLabelDao extends BasicDao { @Query("SELECT * FROM DOWNLOAD_LABELS ORDER BY TIME ASC") List list(); @@ -28,4 +27,10 @@ public interface DownloadLabelDao { @Delete void delete(DownloadLabel downloadLabel); + + @Query("SELECT * FROM DOWNLOAD_LABELS ORDER BY TIME ASC") + List fakeList(); + + @Insert + void fakeInsert(DownloadLabel t); } diff --git a/app/src/main/java/com/hippo/ehviewer/dao/DownloadsDao.java b/app/src/main/java/com/hippo/ehviewer/dao/DownloadsDao.java index b61ae894f..dc738cd78 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/DownloadsDao.java +++ b/app/src/main/java/com/hippo/ehviewer/dao/DownloadsDao.java @@ -9,10 +9,7 @@ import androidx.room.Update; import java.util.List; @Dao -public interface DownloadsDao { - - String TABLENAME = "DOWNLOADS"; - +public interface DownloadsDao extends BasicDao { @Query("SELECT * FROM DOWNLOADS ORDER BY TIME DESC") List list(); @@ -23,9 +20,14 @@ public interface DownloadsDao { void update(DownloadInfo downloadInfo); @Insert - void insert(DownloadInfo downloadInfo); + long insert(DownloadInfo downloadInfo); @Delete void delete(DownloadInfo downloadInfo); + @Query("SELECT * FROM DOWNLOADS ORDER BY TIME DESC") + List fakeList(); + + @Insert + void fakeInsert(DownloadInfo t); } diff --git a/app/src/main/java/com/hippo/ehviewer/dao/EhDatabase.java b/app/src/main/java/com/hippo/ehviewer/dao/EhDatabase.java index 308a1b348..780c20fb7 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/EhDatabase.java +++ b/app/src/main/java/com/hippo/ehviewer/dao/EhDatabase.java @@ -5,7 +5,7 @@ import androidx.room.RoomDatabase; @Database(entities = {BookmarkInfo.class, DownloadInfo.class, DownloadLabel.class, DownloadDirname.class, Filter.class, HistoryInfo.class, LocalFavoriteInfo.class, QuickSearch.class}, version = 4, exportSchema = false) public abstract class EhDatabase extends RoomDatabase { - public abstract BookmarksBao bookmarksBao(); + public abstract BookmarksDao bookmarksBao(); public abstract DownloadDirnameDao downloadDirnameDao(); diff --git a/app/src/main/java/com/hippo/ehviewer/dao/Filter.java b/app/src/main/java/com/hippo/ehviewer/dao/Filter.java index 48e572333..ede60ee24 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/Filter.java +++ b/app/src/main/java/com/hippo/ehviewer/dao/Filter.java @@ -9,7 +9,6 @@ import com.hippo.yorozuya.ObjectUtils; @Entity(tableName = "FILTER") public class Filter { - @ColumnInfo(name = "MODE") public int mode; @ColumnInfo(name = "TEXT") @@ -65,5 +64,4 @@ public class Filter { Filter filter = (Filter) o; return filter.mode == mode && ObjectUtils.equal(filter.text, text); } - } diff --git a/app/src/main/java/com/hippo/ehviewer/dao/FilterDao.java b/app/src/main/java/com/hippo/ehviewer/dao/FilterDao.java index 688e87880..ad39a0f4e 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/FilterDao.java +++ b/app/src/main/java/com/hippo/ehviewer/dao/FilterDao.java @@ -9,10 +9,7 @@ import androidx.room.Update; import java.util.List; @Dao -public interface FilterDao { - - String TABLENAME = "FILTER"; - +public interface FilterDao extends BasicDao { @Query("SELECT * FROM FILTER") List list(); @@ -25,4 +22,9 @@ public interface FilterDao { @Delete void delete(Filter filter); + @Query("SELECT * FROM FILTER") + List fakeList(); + + @Insert + void fakeInsert(Filter t); } diff --git a/app/src/main/java/com/hippo/ehviewer/dao/HistoryDao.java b/app/src/main/java/com/hippo/ehviewer/dao/HistoryDao.java index 802cb934c..d7e1101bb 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/HistoryDao.java +++ b/app/src/main/java/com/hippo/ehviewer/dao/HistoryDao.java @@ -9,8 +9,7 @@ import androidx.room.Update; import java.util.List; @Dao -public interface HistoryDao { - +public interface HistoryDao extends BasicDao { @Query("SELECT * FROM HISTORY WHERE GID = :gid") HistoryInfo load(long gid); @@ -24,7 +23,7 @@ public interface HistoryDao { void update(HistoryInfo historyInfo); @Insert - void insert(HistoryInfo historyInfo); + long insert(HistoryInfo historyInfo); @Delete void delete(HistoryInfo historyInfos); @@ -35,4 +34,9 @@ public interface HistoryDao { @Query("DELETE FROM HISTORY") void deleteAll(); + @Query("SELECT * FROM HISTORY ORDER BY TIME DESC") + List fakeList(); + + @Insert + void fakeInsert(HistoryInfo t); } diff --git a/app/src/main/java/com/hippo/ehviewer/dao/HistoryInfo.java b/app/src/main/java/com/hippo/ehviewer/dao/HistoryInfo.java index 205d0a14d..01fec78fe 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/HistoryInfo.java +++ b/app/src/main/java/com/hippo/ehviewer/dao/HistoryInfo.java @@ -9,8 +9,7 @@ import com.hippo.ehviewer.client.data.GalleryInfo; @Entity(tableName = "HISTORY") public class HistoryInfo extends GalleryInfo { - - public static final Creator CREATOR = new Creator() { + public static final Creator CREATOR = new Creator<>() { @Override public HistoryInfo createFromParcel(Parcel source) { return new HistoryInfo(source); @@ -158,5 +157,4 @@ public class HistoryInfo extends GalleryInfo { dest.writeInt(this.mode); dest.writeLong(this.time); } - } diff --git a/app/src/main/java/com/hippo/ehviewer/dao/LocalFavoriteInfo.java b/app/src/main/java/com/hippo/ehviewer/dao/LocalFavoriteInfo.java index cc4507183..e7a5fa601 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/LocalFavoriteInfo.java +++ b/app/src/main/java/com/hippo/ehviewer/dao/LocalFavoriteInfo.java @@ -10,7 +10,7 @@ import com.hippo.ehviewer.client.data.GalleryInfo; @Entity(tableName = "LOCAL_FAVORITES") public class LocalFavoriteInfo extends GalleryInfo { - public static final Creator CREATOR = new Creator() { + public static final Creator CREATOR = new Creator<>() { @Override public LocalFavoriteInfo createFromParcel(Parcel source) { return new LocalFavoriteInfo(source); @@ -144,5 +144,4 @@ public class LocalFavoriteInfo extends GalleryInfo { super.writeToParcel(dest, flags); dest.writeLong(this.time); } - } diff --git a/app/src/main/java/com/hippo/ehviewer/dao/LocalFavoritesDao.java b/app/src/main/java/com/hippo/ehviewer/dao/LocalFavoritesDao.java index 089261e8a..3a42d67d6 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/LocalFavoritesDao.java +++ b/app/src/main/java/com/hippo/ehviewer/dao/LocalFavoritesDao.java @@ -8,10 +8,7 @@ import androidx.room.Query; import java.util.List; @Dao -public interface LocalFavoritesDao { - - String TABLENAME = "LOCAL_FAVORITES"; - +public interface LocalFavoritesDao extends BasicDao { @Query("SELECT * FROM LOCAL_FAVORITES ORDER BY TIME DESC") List list(); @@ -22,7 +19,7 @@ public interface LocalFavoritesDao { LocalFavoriteInfo load(long gid); @Insert - void insert(LocalFavoriteInfo localFavoriteInfo); + long insert(LocalFavoriteInfo localFavoriteInfo); @Delete void delete(LocalFavoriteInfo localFavoriteInfo); @@ -30,4 +27,9 @@ public interface LocalFavoritesDao { @Query("DELETE FROM LOCAL_FAVORITES WHERE GID = :gid") void deleteByKey(long gid); + @Query("SELECT * FROM LOCAL_FAVORITES ORDER BY TIME DESC") + List fakeList(); + + @Insert + void fakeInsert(LocalFavoriteInfo t); } diff --git a/app/src/main/java/com/hippo/ehviewer/dao/QuickSearch.java b/app/src/main/java/com/hippo/ehviewer/dao/QuickSearch.java index 022dae17b..d2b42e848 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/QuickSearch.java +++ b/app/src/main/java/com/hippo/ehviewer/dao/QuickSearch.java @@ -1,12 +1,12 @@ package com.hippo.ehviewer.dao; +import androidx.annotation.NonNull; import androidx.room.ColumnInfo; import androidx.room.Entity; import androidx.room.PrimaryKey; @Entity(tableName = "QUICK_SEARCH") public class QuickSearch { - @PrimaryKey @ColumnInfo(name = "_id") public Long id; @@ -109,9 +109,9 @@ public class QuickSearch { this.time = time; } + @NonNull @Override public String toString() { return name; } - } diff --git a/app/src/main/java/com/hippo/ehviewer/dao/QuickSearchDao.java b/app/src/main/java/com/hippo/ehviewer/dao/QuickSearchDao.java index 62fc219f8..ca6db8dd9 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/QuickSearchDao.java +++ b/app/src/main/java/com/hippo/ehviewer/dao/QuickSearchDao.java @@ -9,10 +9,7 @@ import androidx.room.Update; import java.util.List; @Dao -public interface QuickSearchDao { - - String TABLENAME = "QUICK_SEARCH"; - +public interface QuickSearchDao extends BasicDao { @Query("SELECT * FROM QUICK_SEARCH ORDER BY TIME ASC") List list(); @@ -31,4 +28,9 @@ public interface QuickSearchDao { @Delete void delete(QuickSearch quickSearch); + @Query("SELECT * FROM QUICK_SEARCH ORDER BY TIME ASC") + List fakeList(); + + @Insert + void fakeInsert(QuickSearch t); }