From 52446c5cc1778705a68368f20efd70215bf9fe1a Mon Sep 17 00:00:00 2001 From: Yogesh Choudhary Paliyal Date: Sun, 21 Apr 2024 11:41:25 +0530 Subject: [PATCH] Fix duplicate unique_id (#834) * feat: fix duplicate unique id * feat: fix duplicate unique id issue --- .../keypass/ui/detail/AccountDetailPage.kt | 6 +++--- .../keypass/ui/detail/DetailViewModel.kt | 4 ++-- .../keypass/ui/home/components/AccountsList.kt | 2 +- .../keypass/ui/redux/states/AccountDetailState.kt | 2 +- .../java/com/yogeshpaliyal/common/AppDatabase.kt | 3 ++- .../main/java/com/yogeshpaliyal/common/db/DbDao.kt | 4 ++-- .../yogeshpaliyal/common/di/module/AppModule.kt | 14 ++++++++++++++ 7 files changed, 25 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/yogeshpaliyal/keypass/ui/detail/AccountDetailPage.kt b/app/src/main/java/com/yogeshpaliyal/keypass/ui/detail/AccountDetailPage.kt index eddce3e8..2dd8173b 100644 --- a/app/src/main/java/com/yogeshpaliyal/keypass/ui/detail/AccountDetailPage.kt +++ b/app/src/main/java/com/yogeshpaliyal/keypass/ui/detail/AccountDetailPage.kt @@ -52,7 +52,7 @@ import java.util.Locale @Composable fun AccountDetailPage( - uniqueId: String?, + id: Long?, viewModel: DetailViewModel = hiltViewModel() ) { val dispatchAction = rememberDispatcher() @@ -67,8 +67,8 @@ fun AccountDetailPage( } // Set initial object - LaunchedEffect(key1 = uniqueId) { - viewModel.loadAccount(uniqueId) { + LaunchedEffect(key1 = id) { + viewModel.loadAccount(id) { setAccountModel(it.copy()) } } diff --git a/app/src/main/java/com/yogeshpaliyal/keypass/ui/detail/DetailViewModel.kt b/app/src/main/java/com/yogeshpaliyal/keypass/ui/detail/DetailViewModel.kt index b70b1cb5..2d0e8edf 100644 --- a/app/src/main/java/com/yogeshpaliyal/keypass/ui/detail/DetailViewModel.kt +++ b/app/src/main/java/com/yogeshpaliyal/keypass/ui/detail/DetailViewModel.kt @@ -36,9 +36,9 @@ class DetailViewModel @Inject constructor( private val _accountModel by lazy { MutableLiveData() } val accountModel: LiveData = _accountModel - fun loadAccount(uniqueId: String?, getAccount: (AccountModel) -> Unit) { + fun loadAccount(id: Long?, getAccount: (AccountModel) -> Unit) { viewModelScope.launch(Dispatchers.IO) { - getAccount(appDb.getDao().getAccount(uniqueId) ?: AccountModel()) + getAccount(appDb.getDao().getAccount(id) ?: AccountModel()) } } diff --git a/app/src/main/java/com/yogeshpaliyal/keypass/ui/home/components/AccountsList.kt b/app/src/main/java/com/yogeshpaliyal/keypass/ui/home/components/AccountsList.kt index f4b85c99..9034f7ec 100644 --- a/app/src/main/java/com/yogeshpaliyal/keypass/ui/home/components/AccountsList.kt +++ b/app/src/main/java/com/yogeshpaliyal/keypass/ui/home/components/AccountsList.kt @@ -74,7 +74,7 @@ fun AccountsList(accounts: List? = null) { modifier = Modifier.animateItemPlacement(), account, onClick = { - dispatch(NavigationAction(AccountDetailState(it.uniqueId))) + dispatch(NavigationAction(AccountDetailState(it.id))) } ) } diff --git a/app/src/main/java/com/yogeshpaliyal/keypass/ui/redux/states/AccountDetailState.kt b/app/src/main/java/com/yogeshpaliyal/keypass/ui/redux/states/AccountDetailState.kt index 2de2bc76..90fa47c7 100644 --- a/app/src/main/java/com/yogeshpaliyal/keypass/ui/redux/states/AccountDetailState.kt +++ b/app/src/main/java/com/yogeshpaliyal/keypass/ui/redux/states/AccountDetailState.kt @@ -1,3 +1,3 @@ package com.yogeshpaliyal.keypass.ui.redux.states -data class AccountDetailState(val accountId: String? = null) : ScreenState() +data class AccountDetailState(val accountId: Long? = null) : ScreenState() diff --git a/common/src/main/java/com/yogeshpaliyal/common/AppDatabase.kt b/common/src/main/java/com/yogeshpaliyal/common/AppDatabase.kt index a9572f57..24bfce6c 100644 --- a/common/src/main/java/com/yogeshpaliyal/common/AppDatabase.kt +++ b/common/src/main/java/com/yogeshpaliyal/common/AppDatabase.kt @@ -17,10 +17,11 @@ const val DB_VERSION_4 = 4 const val DB_VERSION_5 = 5 const val DB_VERSION_6 = 6 const val DB_VERSION_7 = 7 +const val DB_VERSION_8 = 8 @Database( entities = [AccountModel::class], - version = DB_VERSION_7, + version = DB_VERSION_8, exportSchema = false ) abstract class AppDatabase : RoomDatabase() { diff --git a/common/src/main/java/com/yogeshpaliyal/common/db/DbDao.kt b/common/src/main/java/com/yogeshpaliyal/common/db/DbDao.kt index 99554058..c6e92a74 100644 --- a/common/src/main/java/com/yogeshpaliyal/common/db/DbDao.kt +++ b/common/src/main/java/com/yogeshpaliyal/common/db/DbDao.kt @@ -75,8 +75,8 @@ interface DbDao { sortingField: String? ): List - @Query("SELECT * FROM account WHERE unique_id = :uniqueId") - suspend fun getAccount(uniqueId: String?): AccountModel? + @Query("SELECT * FROM account WHERE id = :id") + suspend fun getAccount(id: Long?): AccountModel? @Query("SELECT DISTINCT tags FROM account WHERE tags IS NOT NULL AND tags <> ''") fun getTags(): Flow> diff --git a/common/src/main/java/com/yogeshpaliyal/common/di/module/AppModule.kt b/common/src/main/java/com/yogeshpaliyal/common/di/module/AppModule.kt index 4c252833..30a8224f 100644 --- a/common/src/main/java/com/yogeshpaliyal/common/di/module/AppModule.kt +++ b/common/src/main/java/com/yogeshpaliyal/common/di/module/AppModule.kt @@ -11,6 +11,7 @@ import com.yogeshpaliyal.common.DB_VERSION_4 import com.yogeshpaliyal.common.DB_VERSION_5 import com.yogeshpaliyal.common.DB_VERSION_6 import com.yogeshpaliyal.common.DB_VERSION_7 +import com.yogeshpaliyal.common.DB_VERSION_8 import com.yogeshpaliyal.common.R import com.yogeshpaliyal.common.utils.getRandomString import com.yogeshpaliyal.common.utils.getUserSettingsOrNull @@ -92,6 +93,19 @@ object AppModule { database.execSQL("UPDATE `account` SET `unique_id` = '${getRandomString()}' WHERE `unique_id` IS NULL") } }) + builder.addMigrations(object : Migration(DB_VERSION_7, DB_VERSION_8) { + override fun migrate(database: SupportSQLiteDatabase) { + database.query("select id from `account` where unique_id IN (SELECT unique_id FROM `account` GROUP BY unique_id HAVING COUNT(unique_id) > 1)") + .use { + while (it.moveToNext()) { + val id = it.getInt(0) + val query = + "update `account` set `unique_id` = '${getRandomString()}' where `id` = '$id'" + database.execSQL(query) + } + } + } + }) return builder.build() }