diff --git a/app/src/main/java/org/kiwix/kiwixmobile/KiwixApplication.java b/app/src/main/java/org/kiwix/kiwixmobile/KiwixApplication.java index 0665dfd3b..e545650e3 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/KiwixApplication.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/KiwixApplication.java @@ -32,6 +32,7 @@ import dagger.android.HasActivityInjector; import java.io.File; import java.io.IOException; import javax.inject.Inject; +import org.kiwix.kiwixmobile.data.local.KiwixDatabase; import org.kiwix.kiwixmobile.di.components.ApplicationComponent; import org.kiwix.kiwixmobile.di.components.DaggerApplicationComponent; @@ -46,7 +47,8 @@ public class KiwixApplication extends MultiDexApplication implements HasActivity @Inject DispatchingAndroidInjector activityInjector; - private File logFile; + @Inject + KiwixDatabase kiwixDatabase; public static KiwixApplication getInstance() { return application; @@ -73,41 +75,36 @@ public class KiwixApplication extends MultiDexApplication implements HasActivity public void onCreate() { super.onCreate(); AndroidThreeTen.init(this); + writeLogFile(); + applicationComponent.inject(this); + kiwixDatabase.forceMigration(); + if (BuildConfig.DEBUG) { + StrictMode.setThreadPolicy(buildThreadPolicy(new StrictMode.ThreadPolicy.Builder())); + StrictMode.setVmPolicy(buildVmPolicy(new StrictMode.VmPolicy.Builder())); + } + } + + private void writeLogFile() { if (isExternalStorageWritable()) { File appDirectory = new File(Environment.getExternalStorageDirectory() + "/Kiwix"); - logFile = new File(appDirectory, "logcat.txt"); + File logFile = new File(appDirectory, "logcat.txt"); Log.d("KIWIX", "Writing all logs into [" + logFile.getPath() + "]"); - // create app folder if (!appDirectory.exists()) { appDirectory.mkdir(); } - - // create log folder - if (!appDirectory.exists()) { - appDirectory.mkdir(); - } - if (logFile.exists() && logFile.isFile()) { logFile.delete(); } - // clear the previous logcat and then write the new one to the file try { logFile.createNewFile(); - Process process = Runtime.getRuntime().exec("logcat -c"); - process = Runtime.getRuntime().exec("logcat -f " + logFile.getPath() + " -s kiwix"); + Runtime.getRuntime().exec("logcat -c"); + Runtime.getRuntime().exec("logcat -f " + logFile.getPath() + " -s kiwix"); } catch (IOException e) { Log.e("KIWIX", "Error while writing logcat.txt", e); } } - - Log.d("KIWIX", "Started KiwixApplication"); - applicationComponent.inject(this); - if (BuildConfig.DEBUG) { - StrictMode.setThreadPolicy(buildThreadPolicy(new StrictMode.ThreadPolicy.Builder())); - StrictMode.setVmPolicy(buildVmPolicy(new StrictMode.VmPolicy.Builder())); - } } private StrictMode.ThreadPolicy buildThreadPolicy(StrictMode.ThreadPolicy.Builder builder) { diff --git a/app/src/main/java/org/kiwix/kiwixmobile/bookmark/BookmarkItem.kt b/app/src/main/java/org/kiwix/kiwixmobile/bookmark/BookmarkItem.kt index 8101a5be1..06717c638 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/bookmark/BookmarkItem.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/bookmark/BookmarkItem.kt @@ -7,10 +7,10 @@ data class BookmarkItem( val databaseId: Long = 0L, val zimId: String, val zimName: String, - val zimFilePath: String, + val zimFilePath: String?, val bookmarkUrl: String, val bookmarkTitle: String, - val favicon: String + val favicon: String? ) { constructor(entity: BookmarkEntity) : this( entity.id, diff --git a/app/src/main/java/org/kiwix/kiwixmobile/data/local/KiwixDatabase.java b/app/src/main/java/org/kiwix/kiwixmobile/data/local/KiwixDatabase.java index 7e0cea345..fce504e19 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/data/local/KiwixDatabase.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/data/local/KiwixDatabase.java @@ -29,7 +29,6 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.util.List; import javax.inject.Inject; import javax.inject.Singleton; import org.kiwix.kiwixmobile.data.ZimContentProvider; @@ -46,7 +45,6 @@ import org.kiwix.kiwixmobile.database.newdb.dao.NewBookDao; import org.kiwix.kiwixmobile.database.newdb.dao.NewBookmarksDao; import org.kiwix.kiwixmobile.database.newdb.dao.NewLanguagesDao; import org.kiwix.kiwixmobile.database.newdb.dao.NewRecentSearchDao; -import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity; import org.kiwix.kiwixmobile.utils.UpdateUtils; import static org.kiwix.kiwixmobile.utils.Constants.TAG_KIWIX; @@ -54,8 +52,8 @@ import static org.kiwix.kiwixmobile.utils.Constants.TAG_KIWIX; @Singleton public class KiwixDatabase extends SquidDatabase { + private static final int TWO_POINT_FIVE_POINT_THREE = 16; private static final int FINAL = 17;//3.0.0 - private static final int VERSION = FINAL; private final Context context; private final NewBookDao bookDao; private final NewLanguagesDao languagesDao; @@ -81,11 +79,17 @@ public class KiwixDatabase extends SquidDatabase { @Override protected Table[] getTables() { - return new Table[] {}; + return new Table[] { + RecentSearch.TABLE, + Bookmark.TABLE, + BookDatabaseEntity.TABLE, + NetworkLanguageDatabaseEntity.TABLE + }; } @Override protected boolean onUpgrade(SQLiteDatabaseWrapper db, int oldVersion, int newVersion) { + Log.e("UPGRADE", "oldversion: " + oldVersion + " newVersion: " + newVersion); switch (oldVersion) { case 1: case 2: @@ -127,9 +131,6 @@ public class KiwixDatabase extends SquidDatabase { tryCreateTable(BookDatabaseEntity.TABLE); case 14: case 15: - tryAddColumn(Bookmark.ZIM_FILE_PATH); - tryAddColumn(Bookmark.FAVICON); - migrateBookmarksVersion16(); try { bookDao.migrationInsert(new BookDao(this).getBooks()); } catch (Exception e) { @@ -143,11 +144,11 @@ public class KiwixDatabase extends SquidDatabase { tryDropTable(BookDatabaseEntity.TABLE); tryDropTable(NetworkLanguageDatabaseEntity.TABLE); tryDropTable(LibraryDatabaseEntity.TABLE); - case 16: + case TWO_POINT_FIVE_POINT_THREE: try { final BookmarksDao oldBookmarksDao = new BookmarksDao(this); oldBookmarksDao.processBookmark(UpdateUtils::reformatProviderUrl); - this.bookmarksDao.migrationInsert(oldBookmarksDao.getBookmarks(false)); + this.bookmarksDao.migrationInsert(oldBookmarksDao.getBookmarks(false), bookDao); } catch (Exception e) { e.printStackTrace(); } @@ -162,27 +163,9 @@ public class KiwixDatabase extends SquidDatabase { return true; } - private void migrateBookmarksVersion16() { - BookmarksDao bookmarksDao = new BookmarksDao(this); - BookDao bookDao = new BookDao(this); - List bookmarks = bookmarksDao.getBookmarks(false); - List books = bookDao.getBooks(); - for (Bookmark bookmark : bookmarks) { - if (bookmark.getZimId() != null) { - for (LibraryNetworkEntity.Book book : books) { - if (bookmark.getZimId().equals(book.getId())) { - bookmark.setZimFilePath(book.getUrl()).setFavicon(book.getFavicon()); - bookmarksDao.saveBookmark(bookmark); - break; - } - } - } - } - } - @Override protected int getVersion() { - return VERSION; + return FINAL; } public void migrateBookmarksVersion6() { @@ -216,6 +199,14 @@ public class KiwixDatabase extends SquidDatabase { } } } + + /* Now that the database is no longer used + * we need to make a migration happen with an explicit call + */ + public void forceMigration() { + beginTransaction(); + endTransaction(); + } } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/data/local/dao/BookmarksDao.java b/app/src/main/java/org/kiwix/kiwixmobile/data/local/dao/BookmarksDao.java index 318e85e40..1a794b163 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/data/local/dao/BookmarksDao.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/data/local/dao/BookmarksDao.java @@ -40,19 +40,6 @@ public class BookmarksDao { this.kiwixDatabase = kiwixDatabase; } - public void saveBookmark(Bookmark bookmark) { - kiwixDatabase.deleteWhere(Bookmark.class, Bookmark.BOOKMARK_URL.eq(bookmark.getBookmarkUrl()) - .and(Bookmark.ZIM_ID.eq(bookmark.getZimId()))); - - kiwixDatabase.persist(new Bookmark() - .setZimId(bookmark.getZimId()) - .setZimName(bookmark.getZimName()) - .setZimFilePath(bookmark.getZimFilePath()) - .setFavicon(bookmark.getFavicon()) - .setBookmarkUrl(bookmark.getBookmarkUrl()) - .setBookmarkTitle(bookmark.getBookmarkTitle())); - } - public List getBookmarks(boolean fromCurrentBook) { ArrayList bookmarks = new ArrayList<>(); Query query = Query.select(); @@ -63,14 +50,10 @@ public class BookmarksDao { .query(Bookmark.class, query.orderBy(Bookmark.BOOKMARK_TITLE.asc()))) { while (squidCursor.moveToNext()) { Bookmark bookmark = new Bookmark(); - bookmark.setZimId(squidCursor.get(Bookmark.ZIM_ID)); bookmark.setZimName(squidCursor.get(Bookmark.ZIM_NAME)); - bookmark.setZimFilePath(squidCursor.get(Bookmark.ZIM_FILE_PATH)); - bookmark.setFavicon(squidCursor.get(Bookmark.FAVICON)); bookmark.setBookmarkTitle(squidCursor.get(Bookmark.BOOKMARK_TITLE)); bookmark.setBookmarkUrl(squidCursor.get(Bookmark.BOOKMARK_URL)); - bookmarks.add(bookmark); } } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/data/local/entity/BookmarksSpec.java b/app/src/main/java/org/kiwix/kiwixmobile/data/local/entity/BookmarksSpec.java index 65b1d5676..535515f43 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/data/local/entity/BookmarksSpec.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/data/local/entity/BookmarksSpec.java @@ -28,8 +28,6 @@ public class BookmarksSpec { @ColumnSpec(constraints = "NOT NULL") public String ZimId; public String ZimName; - public String zimFilePath; public String bookmarkUrl; public String bookmarkTitle; - public String favicon; } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/database/newdb/dao/NewBookDao.kt b/app/src/main/java/org/kiwix/kiwixmobile/database/newdb/dao/NewBookDao.kt index d2f1a5b40..b9324d7c6 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/database/newdb/dao/NewBookDao.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/database/newdb/dao/NewBookDao.kt @@ -20,6 +20,7 @@ package org.kiwix.kiwixmobile.database.newdb.dao import io.objectbox.Box import io.objectbox.kotlin.inValues import io.objectbox.kotlin.query +import org.kiwix.kiwixmobile.data.local.entity.Bookmark import org.kiwix.kiwixmobile.database.newdb.entities.BookOnDiskEntity import org.kiwix.kiwixmobile.database.newdb.entities.BookOnDiskEntity_ import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity.Book @@ -62,4 +63,11 @@ class NewBookDao @Inject constructor(private val box: Box) { private fun delete(books: List) { box.remove(books) } + + fun getFavIconAndZimFile(it: Bookmark): Pair { + val bookOnDiskEntity = box.query { + equal(BookOnDiskEntity_.bookId, it.zimId) + }.find().getOrNull(0) + return bookOnDiskEntity?.let { Pair(it.favIcon, it.file.path) } ?: Pair(null, null) + } } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/database/newdb/dao/NewBookmarksDao.kt b/app/src/main/java/org/kiwix/kiwixmobile/database/newdb/dao/NewBookmarksDao.kt index db16d3dd4..d9756e086 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/database/newdb/dao/NewBookmarksDao.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/database/newdb/dao/NewBookmarksDao.kt @@ -60,7 +60,10 @@ class NewBookmarksDao @Inject constructor(val box: Box) { }.remove() } - fun migrationInsert(bookmarks: MutableList) { - box.put(bookmarks.map(::BookmarkEntity)) + fun migrationInsert( + bookmarks: MutableList, + bookDao: NewBookDao + ) { + box.put(bookmarks.zip(bookmarks.map { bookDao.getFavIconAndZimFile(it) }).map(::BookmarkEntity)) } } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/database/newdb/entities/BookmarkEntity.kt b/app/src/main/java/org/kiwix/kiwixmobile/database/newdb/entities/BookmarkEntity.kt index 6e9b3e9ee..aa7cd93e3 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/database/newdb/entities/BookmarkEntity.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/database/newdb/entities/BookmarkEntity.kt @@ -27,10 +27,10 @@ data class BookmarkEntity( @Id var id: Long = 0, val zimId: String, var zimName: String, - var zimFilePath: String, + var zimFilePath: String?, var bookmarkUrl: String, var bookmarkTitle: String, - var favicon: String + var favicon: String? ) { constructor(item: BookmarkItem) : this( item.databaseId, @@ -42,13 +42,19 @@ data class BookmarkEntity( item.favicon ) - constructor(bookmark: Bookmark) : this( + private constructor(bookmark: Bookmark, zimFilePath: String?, favicon: String?) : this( 0, bookmark.zimId, bookmark.zimName, - bookmark.zimFilePath, + zimFilePath, bookmark.bookmarkUrl, bookmark.bookmarkTitle, - bookmark.favicon + favicon + ) + + constructor(bookmarkWithFavIconAndFile: Pair>) : this( + bookmarkWithFavIconAndFile.first, + bookmarkWithFavIconAndFile.second.first, + bookmarkWithFavIconAndFile.second.second ) } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/extensions/ImageViewExtensions.kt b/app/src/main/java/org/kiwix/kiwixmobile/extensions/ImageViewExtensions.kt index 539c1cd73..904797b70 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/extensions/ImageViewExtensions.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/extensions/ImageViewExtensions.kt @@ -15,6 +15,6 @@ fun ImageView.setBitmap(base64String: Base64String) { // methods that accept inline classes as parameters are not allowed to be called from java // hence this facade -fun ImageView.setBitmapFromString(string: String) { +fun ImageView.setBitmapFromString(string: String?) { setBitmap(Base64String(string)) }