diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/data/KiwixRoomDatabase.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/data/KiwixRoomDatabase.kt index 85eb451a6..d0eefc8b7 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/data/KiwixRoomDatabase.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/data/KiwixRoomDatabase.kt @@ -22,11 +22,8 @@ import android.content.Context import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase -import org.kiwix.kiwixmobile.core.BuildConfig import org.kiwix.kiwixmobile.core.dao.RecentSearchRoomDao import org.kiwix.kiwixmobile.core.dao.entities.RecentSearchRoomEntity -import org.kiwix.kiwixmobile.core.data.remote.FdroidDatabaseCallback -import org.kiwix.kiwixmobile.core.data.remote.RoomDatabaseCallback @Suppress("UnnecessaryAbstractClass") @Database(entities = [RecentSearchRoomEntity::class], version = 1) @@ -36,16 +33,11 @@ abstract class KiwixRoomDatabase : RoomDatabase() { companion object { private var db: KiwixRoomDatabase? = null fun getInstance(context: Context): KiwixRoomDatabase { - val callback = - if (BuildConfig.BUILD_TYPE != "fdroid") - RoomDatabaseCallback(context) - else FdroidDatabaseCallback() return db ?: synchronized(KiwixRoomDatabase::class) { return@getInstance db ?: Room.databaseBuilder(context, KiwixRoomDatabase::class.java, "KiwixRoom.db") // We have already database name called kiwix.db in order to avoid complexity we named as // kiwixRoom.db - .addCallback(callback) .build() } } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/data/remote/RoomDatabaseCallback.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/data/remote/ObjectBoxToRoomMigrator.kt similarity index 73% rename from core/src/main/java/org/kiwix/kiwixmobile/core/data/remote/RoomDatabaseCallback.kt rename to core/src/main/java/org/kiwix/kiwixmobile/core/data/remote/ObjectBoxToRoomMigrator.kt index 1097d9dbc..df9d500b4 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/data/remote/RoomDatabaseCallback.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/data/remote/ObjectBoxToRoomMigrator.kt @@ -18,43 +18,39 @@ package org.kiwix.kiwixmobile.core.data.remote -import android.content.Context -import androidx.room.RoomDatabase -import androidx.sqlite.db.SupportSQLiteDatabase import io.objectbox.Box import io.objectbox.BoxStore import io.objectbox.kotlin.boxFor import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import org.kiwix.kiwixmobile.core.BuildConfig import org.kiwix.kiwixmobile.core.CoreApp import org.kiwix.kiwixmobile.core.dao.entities.RecentSearchEntity import org.kiwix.kiwixmobile.core.data.KiwixRoomDatabase import javax.inject.Inject -class RoomDatabaseCallback(val context: Context) : - RoomDatabase.Callback() { +class ObjectBoxToRoomMigrator { @Inject lateinit var kiwixRoomDatabase: KiwixRoomDatabase @Inject lateinit var boxStore: BoxStore - override fun onCreate(db: SupportSQLiteDatabase) { - super.onCreate(db) - CoreApp.coreComponent.inject(this) - boxStore.let(::migrateRecentSearch) + + init { + // Migrate data for non-fdroid variant + if (BuildConfig.BUILD_TYPE != "fdroid") { + CoreApp.coreComponent.inject(this) + migrateRecentSearch(boxStore.boxFor()) + // TODO we will migrate here for other entities + } } - fun migrateRecentSearch(boxStore: BoxStore) { - migrationToRoomInsert(boxStore.boxFor()) - } - - private fun migrationToRoomInsert( - box: Box - ) { + private fun migrateRecentSearch(box: Box) { val searchRoomEntityList = box.all searchRoomEntityList.forEachIndexed { _, recentSearchEntity -> CoroutineScope(Dispatchers.IO).launch { kiwixRoomDatabase.recentSearchRoomDao() .saveSearch(recentSearchEntity.searchTerm, recentSearchEntity.zimId) - // Todo Should we remove object store data now? + // removing the single entity from the object box after migration. + box.remove(recentSearchEntity.id) } } } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/di/components/CoreComponent.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/di/components/CoreComponent.kt index 4722cc664..9eb7ced7e 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/di/components/CoreComponent.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/di/components/CoreComponent.kt @@ -37,7 +37,7 @@ import org.kiwix.kiwixmobile.core.dao.RecentSearchRoomDao import org.kiwix.kiwixmobile.core.data.DataModule import org.kiwix.kiwixmobile.core.data.DataSource import org.kiwix.kiwixmobile.core.data.remote.KiwixService -import org.kiwix.kiwixmobile.core.data.remote.RoomDatabaseCallback +import org.kiwix.kiwixmobile.core.data.remote.ObjectBoxToRoomMigrator import org.kiwix.kiwixmobile.core.di.modules.ApplicationModule import org.kiwix.kiwixmobile.core.di.modules.CoreViewModelModule import org.kiwix.kiwixmobile.core.di.modules.JNIModule @@ -94,6 +94,7 @@ interface CoreComponent { fun newBookmarksDao(): NewBookmarksDao fun connectivityManager(): ConnectivityManager fun recentSearchRoomDao(): RecentSearchRoomDao + fun objectBoxToRoomMigrator(): ObjectBoxToRoomMigrator fun context(): Context fun downloader(): Downloader @@ -106,7 +107,7 @@ interface CoreComponent { fun inject(errorActivity: ErrorActivity) fun inject(searchFragment: SearchFragment) - fun inject(roomDatabaseCallback: RoomDatabaseCallback) + fun inject(objectBoxToRoomMigrator: ObjectBoxToRoomMigrator) fun inject(settingsFragment: CoreSettingsFragment) fun coreServiceComponent(): CoreServiceComponent.Builder diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/ApplicationModule.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/ApplicationModule.kt index cf5460579..8c0439e8e 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/ApplicationModule.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/ApplicationModule.kt @@ -29,6 +29,7 @@ import io.reactivex.Scheduler import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers import org.kiwix.kiwixmobile.core.NightModeConfig +import org.kiwix.kiwixmobile.core.data.remote.ObjectBoxToRoomMigrator import org.kiwix.kiwixmobile.core.di.qualifiers.Computation import org.kiwix.kiwixmobile.core.di.qualifiers.IO import org.kiwix.kiwixmobile.core.di.qualifiers.MainThread @@ -65,6 +66,10 @@ class ApplicationModule { @Singleton internal fun provideBookUtils(): BookUtils = BookUtils() + @Provides + @Singleton + fun provideObjectBoxToRoomMigrator() = ObjectBoxToRoomMigrator() + @IO @Provides fun provideIoThread(): Scheduler = Schedulers.io() diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.kt index 0919cb88e..b2b930dd6 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.kt @@ -40,6 +40,7 @@ import org.kiwix.kiwixmobile.core.BuildConfig import org.kiwix.kiwixmobile.core.R import org.kiwix.kiwixmobile.core.base.BaseActivity import org.kiwix.kiwixmobile.core.base.FragmentActivityExtensions +import org.kiwix.kiwixmobile.core.data.remote.ObjectBoxToRoomMigrator import org.kiwix.kiwixmobile.core.di.components.CoreActivityComponent import org.kiwix.kiwixmobile.core.error.ErrorActivity import org.kiwix.kiwixmobile.core.extensions.browserIntent @@ -78,6 +79,7 @@ abstract class CoreMainActivity : BaseActivity(), WebViewProvider { abstract val cachedComponent: CoreActivityComponent abstract val topLevelDestinations: Set abstract val navHostContainer: FragmentContainerView + @Inject lateinit var objectBoxToRoomMigrator: ObjectBoxToRoomMigrator override fun onCreate(savedInstanceState: Bundle?) { setTheme(R.style.KiwixTheme)