diff --git a/app/src/main/kotlin/com/hippo/ehviewer/EhApplication.kt b/app/src/main/kotlin/com/hippo/ehviewer/EhApplication.kt index ea77fbaee..4280928b2 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/EhApplication.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/EhApplication.kt @@ -39,6 +39,7 @@ import coil3.request.crossfade import coil3.serviceLoaderEnabled import coil3.util.DebugLogger import com.ehviewer.core.database.SearchDatabase +import com.ehviewer.core.database.roomDb import com.ehviewer.core.files.deleteContent import com.ehviewer.core.ui.util.initSETConnection import com.ehviewer.core.util.isAtLeastO @@ -83,7 +84,6 @@ import logcat.LogPriority import logcat.LogcatLogger import logcat.asLog import okio.Path.Companion.toOkioPath -import splitties.arch.room.roomDb import splitties.init.appCtx private val lifecycle = ProcessLifecycleOwner.get().lifecycle diff --git a/app/src/main/kotlin/com/hippo/ehviewer/EhDB.kt b/app/src/main/kotlin/com/hippo/ehviewer/EhDB.kt index 4f97f21a9..c181a854c 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/EhDB.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/EhDB.kt @@ -15,13 +15,12 @@ */ package com.hippo.ehviewer -import android.content.Context -import android.net.Uri import arrow.fx.coroutines.resource import arrow.fx.coroutines.resourceScope import com.ehviewer.core.data.model.asEntity import com.ehviewer.core.database.EhDatabase import com.ehviewer.core.database.Schema17to18 +import com.ehviewer.core.database.getDatabasePath import com.ehviewer.core.database.model.DownloadArtist import com.ehviewer.core.database.model.DownloadDirname import com.ehviewer.core.database.model.DownloadInfo @@ -32,13 +31,13 @@ import com.ehviewer.core.database.model.HistoryInfo import com.ehviewer.core.database.model.LocalFavoriteInfo import com.ehviewer.core.database.model.ProgressInfo import com.ehviewer.core.database.model.QuickSearch +import com.ehviewer.core.database.roomDb +import com.ehviewer.core.files.delete import com.ehviewer.core.files.sendTo import com.ehviewer.core.model.GalleryInfo import com.hippo.ehviewer.download.DownloadManager import kotlinx.coroutines.flow.Flow import okio.Path -import okio.Path.Companion.toOkioPath -import splitties.arch.room.roomDb object EhDB { private const val DB_NAME = "eh.db" @@ -277,23 +276,23 @@ object EhDB { db.filterDao().update(filter) } - fun exportDB(context: Context, file: Path) { + fun exportDB(file: Path) { db.query("PRAGMA wal_checkpoint(FULL)", null).use { it.moveToNext() } - val dbFile = context.getDatabasePath(DB_NAME) - dbFile.toOkioPath() sendTo file + val dbFile = getDatabasePath(DB_NAME) + dbFile sendTo file } - suspend fun importDB(context: Context, uri: Uri) = resourceScope { + suspend fun importDB(file: Path) = resourceScope { val tempDBName = "tmp.db" + val dbFile = getDatabasePath(tempDBName) + file sendTo dbFile val oldDB = resource { - context.deleteDatabase(tempDBName) roomDb(tempDBName) { - createFromInputStream { context.contentResolver.openInputStream(uri) } addMigrations(Schema17to18()) } } release { db -> db.close() - context.deleteDatabase(tempDBName) + dbFile.delete() } db.galleryDao().insertOrIgnore(oldDB.galleryDao().list()) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AboutScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AboutScreen.kt index c5180bde4..4f413f35d 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AboutScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AboutScreen.kt @@ -123,7 +123,7 @@ fun AnimatedVisibilityScope.AboutScreen(navigator: DestinationsNavigator) = Scre } } -context(ctx: Context, _: DialogState) +context(_: Context, _: DialogState) suspend fun showNewVersion(release: Release) { awaitConfirmationOrCancel( confirmText = R.string.download, @@ -140,7 +140,7 @@ suspend fun showNewVersion(release: Release) { } if (Settings.backupBeforeUpdate.value) { val time = ReadableTime.getFilenamableTime() - EhDB.exportDB(ctx, (downloadLocation / "$time.db")) + EhDB.exportDB(downloadLocation / "$time.db") } // TODO: Download in the background and show progress in notification val path = AppConfig.tempDir / "update.apk" diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt index 0ef636527..7f1c51934 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt @@ -96,13 +96,13 @@ private fun dumplog(uri: Uri): Unit = with(ctx) { context(ctx: Context) private fun exportDatabase(uri: Uri) { ctx.grantUriPermission(BuildConfig.APPLICATION_ID, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION) - EhDB.exportDB(ctx, uri.toOkioPath()) + EhDB.exportDB(uri.toOkioPath()) } context(ctx: Context) private suspend fun importDatabase(uri: Uri) { ctx.grantUriPermission(BuildConfig.APPLICATION_ID, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION) - EhDB.importDB(ctx, uri) + EhDB.importDB(uri.toOkioPath()) } @Destination diff --git a/core/data/src/androidMain/kotlin/com/ehviewer/core/database/Room.android.kt b/core/data/src/androidMain/kotlin/com/ehviewer/core/database/Room.android.kt new file mode 100644 index 000000000..e4ac19271 --- /dev/null +++ b/core/data/src/androidMain/kotlin/com/ehviewer/core/database/Room.android.kt @@ -0,0 +1,14 @@ +package com.ehviewer.core.database + +import androidx.room.Room +import androidx.room.RoomDatabase +import androidx.sqlite.driver.AndroidSQLiteDriver +import okio.Path.Companion.toOkioPath +import splitties.init.appCtx + +actual inline fun roomDb( + name: String, + builder: RoomDatabase.Builder.() -> Unit, +) = Room.databaseBuilder(appCtx, name).setDriver(AndroidSQLiteDriver()).apply(builder).build() + +actual fun getDatabasePath(name: String) = appCtx.getDatabasePath(name).toOkioPath() diff --git a/core/data/src/commonMain/kotlin/com/ehviewer/core/database/Room.kt b/core/data/src/commonMain/kotlin/com/ehviewer/core/database/Room.kt new file mode 100644 index 000000000..7ae758736 --- /dev/null +++ b/core/data/src/commonMain/kotlin/com/ehviewer/core/database/Room.kt @@ -0,0 +1,11 @@ +package com.ehviewer.core.database + +import androidx.room.RoomDatabase +import okio.Path + +expect inline fun roomDb( + name: String, + builder: RoomDatabase.Builder.() -> Unit = {}, +): T + +expect fun getDatabasePath(name: String): Path diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4849f9e08..4cef275a8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -118,7 +118,6 @@ serialization-xml = { module = "io.github.pdvrieze.xmlutil:serialization", versi serialization-xml-io = { module = "io.github.pdvrieze.xmlutil:serialization-io", version.ref = "xmlutil" } splitties-appctx = { module = "com.louiscad.splitties:splitties-appctx", version.ref = "splitties" } -splitties-arch-room = { module = "com.louiscad.splitties:splitties-arch-room", version.ref = "splitties" } splitties-systemservices = { module = "com.louiscad.splitties:splitties-systemservices", version.ref = "splitties" } telephoto-zoomable = { module = "me.saket.telephoto:zoomable", version.ref = "telephoto" } @@ -136,7 +135,7 @@ spotless-gradlePlugin = { module = "com.diffplug.spotless:spotless-plugin-gradle arrow = ["arrow-fx-coroutines", "arrow-functions", "arrow-resilience"] coil = ["coil-compose", "coil-gif", "coil-network"] kotlinx-serialization = ["serialization-cbor", "serialization-json", "serialization-json-io", "serialization-xml", "serialization-xml-io"] -splitties = ["splitties-appctx", "splitties-arch-room", "splitties-systemservices"] +splitties = ["splitties-appctx", "splitties-systemservices"] [plugins] aboutlibraries = { id = "com.mikepenz.aboutlibraries.plugin", version.ref = "aboutlibraries" }