From 1e36ab805d51bb5f6994530f1ab7186587eb408d Mon Sep 17 00:00:00 2001 From: David Perez Date: Mon, 19 Oct 2026 14:05:20 +0000 Subject: [PATCH] [PM-45008] deps: Migrate the app from Room to Room3 (#7471) --- README.md | 4 ++-- app/build.gradle.kts | 9 ++++----- .../datasource/disk/dao/PrivilegedAppDao.kt | 8 ++++---- .../disk/database/PrivilegedAppDatabase.kt | 4 ++-- .../datasource/disk/di/CredentialsDiskModule.kt | 7 ++++--- .../disk/entity/PrivilegedAppEntity.kt | 4 ++-- .../datasource/disk/dao/OrganizationEventDao.kt | 8 ++++---- .../datasource/disk/database/PlatformDatabase.kt | 10 +++++----- .../datasource/disk/di/PlatformDiskModule.kt | 12 +++++------- .../disk/entity/OrganizationEventEntity.kt | 6 +++--- .../datasource/disk/dao/PasswordHistoryDao.kt | 6 +++--- .../disk/database/PasswordHistoryDatabase.kt | 4 ++-- .../datasource/disk/di/GeneratorDiskModule.kt | 12 ++++++------ .../disk/entity/PasswordHistoryEntity.kt | 6 +++--- .../disk/callback/DatabaseSchemeCallback.kt | 4 ++-- .../disk/convertor/InstantTypeConverter.kt | 16 ++++++++-------- .../data/vault/datasource/disk/dao/CiphersDao.kt | 10 +++++----- .../vault/datasource/disk/dao/CollectionsDao.kt | 10 +++++----- .../data/vault/datasource/disk/dao/DomainsDao.kt | 8 ++++---- .../data/vault/datasource/disk/dao/FoldersDao.kt | 12 ++++++------ .../data/vault/datasource/disk/dao/SendsDao.kt | 10 +++++----- .../datasource/disk/database/VaultDatabase.kt | 14 +++++++------- .../vault/datasource/disk/di/VaultDiskModule.kt | 12 +++++------- .../vault/datasource/disk/entity/CipherEntity.kt | 8 ++++---- .../datasource/disk/entity/CollectionEntity.kt | 6 +++--- .../datasource/disk/entity/DomainsEntity.kt | 6 +++--- .../vault/datasource/disk/entity/FolderEntity.kt | 6 +++--- .../vault/datasource/disk/entity/SendEntity.kt | 6 +++--- .../disk/callback/DatabaseSchemeCallbackTest.kt | 3 ++- .../vault/datasource/disk/dao/FakeFoldersDao.kt | 2 +- authenticator/build.gradle.kts | 9 ++++----- .../AuthenticatorItemAlgorithmConverter.kt | 16 ++++++++-------- .../convertor/AuthenticatorItemTypeConverter.kt | 16 ++++++++-------- .../authenticator/datasource/disk/dao/ItemDao.kt | 8 ++++---- .../disk/database/AuthenticatorDatabase.kt | 10 +++++----- .../disk/di/AuthenticatorDiskModule.kt | 14 ++++++-------- .../disk/entity/AuthenticatorItemEntity.kt | 6 +++--- build.gradle.kts | 2 +- buildscript-gradle.lockfile | 4 ++-- docs/ARCHITECTURE.md | 2 +- gradle/libs.versions.toml | 9 ++++----- 41 files changed, 161 insertions(+), 168 deletions(-) diff --git a/README.md b/README.md index 4b531d958b..f7cf67011a 100644 --- a/README.md +++ b/README.md @@ -153,8 +153,8 @@ The following is a list of all third-party dependencies included as part of the - Purpose: Provides a consistent API for navigating between Android components. - License: Apache 2.0 -- **AndroidX Room** - - https://developer.android.com/jetpack/androidx/releases/room +- **AndroidX Room3** + - https://developer.android.com/jetpack/androidx/releases/room3 - Purpose: A convenient SQLite-based persistence layer for Android. - License: Apache 2.0 diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 682e66af91..b82ed0651e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -11,7 +11,7 @@ import java.util.Properties plugins { alias(libs.plugins.android.application) - alias(libs.plugins.androidx.room) + alias(libs.plugins.androidx.room3) // Crashlytics is enabled for all builds initially but removed for FDroid builds in gradle and // standardDebug builds in the merged manifest. alias(libs.plugins.crashlytics) @@ -49,7 +49,7 @@ base { archivesName.set("com.x8bit.bitwarden") } -room { +room3 { schemaDirectory("$projectDir/schemas") } @@ -268,9 +268,8 @@ dependencies { implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.androidx.lifecycle.runtime.ktx) implementation(libs.androidx.navigation.compose) - ksp(libs.androidx.room.compiler) - implementation(libs.androidx.room.ktx) - implementation(libs.androidx.room.runtime) + ksp(libs.androidx.room3.compiler) + implementation(libs.androidx.room3.runtime) implementation(libs.androidx.security.crypto) implementation(libs.androidx.splashscreen) implementation(libs.androidx.work.runtime.ktx) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/datasource/disk/dao/PrivilegedAppDao.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/datasource/disk/dao/PrivilegedAppDao.kt index de3d94b114..9167a37389 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/datasource/disk/dao/PrivilegedAppDao.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/datasource/disk/dao/PrivilegedAppDao.kt @@ -1,9 +1,9 @@ package com.x8bit.bitwarden.data.credentials.datasource.disk.dao -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query +import androidx.room3.Dao +import androidx.room3.Insert +import androidx.room3.OnConflictStrategy +import androidx.room3.Query import com.x8bit.bitwarden.data.credentials.datasource.disk.entity.PrivilegedAppEntity import kotlinx.coroutines.flow.Flow diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/datasource/disk/database/PrivilegedAppDatabase.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/datasource/disk/database/PrivilegedAppDatabase.kt index 35c9a284d8..90ce4cd0de 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/datasource/disk/database/PrivilegedAppDatabase.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/datasource/disk/database/PrivilegedAppDatabase.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.data.credentials.datasource.disk.database -import androidx.room.Database -import androidx.room.RoomDatabase +import androidx.room3.Database +import androidx.room3.RoomDatabase import com.x8bit.bitwarden.data.credentials.datasource.disk.dao.PrivilegedAppDao import com.x8bit.bitwarden.data.credentials.datasource.disk.entity.PrivilegedAppEntity diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/datasource/disk/di/CredentialsDiskModule.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/datasource/disk/di/CredentialsDiskModule.kt index f7fd3cbc56..96f7c718b0 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/datasource/disk/di/CredentialsDiskModule.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/datasource/disk/di/CredentialsDiskModule.kt @@ -1,7 +1,8 @@ package com.x8bit.bitwarden.data.credentials.datasource.disk.di import android.app.Application -import androidx.room.Room +import androidx.room3.Room +import androidx.sqlite.driver.AndroidSQLiteDriver import com.x8bit.bitwarden.data.credentials.datasource.disk.PrivilegedAppDiskSource import com.x8bit.bitwarden.data.credentials.datasource.disk.PrivilegedAppDiskSourceImpl import com.x8bit.bitwarden.data.credentials.datasource.disk.dao.PrivilegedAppDao @@ -25,12 +26,12 @@ object CredentialsDiskModule { app: Application, ): PrivilegedAppDatabase = Room - .databaseBuilder( + .databaseBuilder( context = app, - klass = PrivilegedAppDatabase::class.java, name = "privileged_apps_database", ) .fallbackToDestructiveMigration(dropAllTables = true) + .setDriver(driver = AndroidSQLiteDriver()) .build() @Provides diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/datasource/disk/entity/PrivilegedAppEntity.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/datasource/disk/entity/PrivilegedAppEntity.kt index 9495507baa..0898835d96 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/datasource/disk/entity/PrivilegedAppEntity.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/datasource/disk/entity/PrivilegedAppEntity.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.data.credentials.datasource.disk.entity -import androidx.room.ColumnInfo -import androidx.room.Entity +import androidx.room3.ColumnInfo +import androidx.room3.Entity /** * Entity representing a trusted privileged app in the database. diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/datasource/disk/dao/OrganizationEventDao.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/datasource/disk/dao/OrganizationEventDao.kt index 67524a24ba..b4f630b44b 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/datasource/disk/dao/OrganizationEventDao.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/datasource/disk/dao/OrganizationEventDao.kt @@ -1,9 +1,9 @@ package com.x8bit.bitwarden.data.platform.datasource.disk.dao -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query +import androidx.room3.Dao +import androidx.room3.Insert +import androidx.room3.OnConflictStrategy +import androidx.room3.Query import com.x8bit.bitwarden.data.platform.datasource.disk.entity.OrganizationEventEntity /** diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/datasource/disk/database/PlatformDatabase.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/datasource/disk/database/PlatformDatabase.kt index 1c739c37ca..a97541e27a 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/datasource/disk/database/PlatformDatabase.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/datasource/disk/database/PlatformDatabase.kt @@ -1,9 +1,9 @@ package com.x8bit.bitwarden.data.platform.datasource.disk.database -import androidx.room.AutoMigration -import androidx.room.Database -import androidx.room.RoomDatabase -import androidx.room.TypeConverters +import androidx.room3.AutoMigration +import androidx.room3.ColumnTypeConverters +import androidx.room3.Database +import androidx.room3.RoomDatabase import com.x8bit.bitwarden.data.platform.datasource.disk.dao.OrganizationEventDao import com.x8bit.bitwarden.data.platform.datasource.disk.entity.OrganizationEventEntity import com.x8bit.bitwarden.data.vault.datasource.disk.convertor.InstantTypeConverter @@ -21,7 +21,7 @@ import com.x8bit.bitwarden.data.vault.datasource.disk.convertor.InstantTypeConve AutoMigration(from = 1, to = 2), ], ) -@TypeConverters(InstantTypeConverter::class) +@ColumnTypeConverters(InstantTypeConverter::class) abstract class PlatformDatabase : RoomDatabase() { /** * Provides the DAO for accessing organization event data. diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/datasource/disk/di/PlatformDiskModule.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/datasource/disk/di/PlatformDiskModule.kt index 8de5326008..8e718fd97a 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/datasource/disk/di/PlatformDiskModule.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/datasource/disk/di/PlatformDiskModule.kt @@ -3,7 +3,8 @@ package com.x8bit.bitwarden.data.platform.datasource.disk.di import android.app.Application import android.content.Context import android.content.SharedPreferences -import androidx.room.Room +import androidx.room3.Room +import androidx.sqlite.driver.AndroidSQLiteDriver import com.bitwarden.core.data.manager.dispatcher.DispatcherManager import com.bitwarden.data.datasource.disk.FlightRecorderDiskSource import com.bitwarden.data.datasource.disk.di.EncryptedPreferences @@ -69,14 +70,11 @@ object PlatformDiskModule { databaseSchemeManager: DatabaseSchemeManager, ): PlatformDatabase = Room - .databaseBuilder( - context = app, - klass = PlatformDatabase::class.java, - name = "platform_database", - ) + .databaseBuilder(context = app, name = "platform_database") .fallbackToDestructiveMigration(dropAllTables = false) - .addTypeConverter(InstantTypeConverter()) + .addColumnTypeConverter(typeConverter = InstantTypeConverter()) .addCallback(DatabaseSchemeCallback(databaseSchemeManager = databaseSchemeManager)) + .setDriver(driver = AndroidSQLiteDriver()) .build() @Provides diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/datasource/disk/entity/OrganizationEventEntity.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/datasource/disk/entity/OrganizationEventEntity.kt index 21b6475feb..13e5c3fc27 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/datasource/disk/entity/OrganizationEventEntity.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/datasource/disk/entity/OrganizationEventEntity.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.data.platform.datasource.disk.entity -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.PrimaryKey +import androidx.room3.ColumnInfo +import androidx.room3.Entity +import androidx.room3.PrimaryKey import java.time.Instant /** diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/tools/generator/datasource/disk/dao/PasswordHistoryDao.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/tools/generator/datasource/disk/dao/PasswordHistoryDao.kt index 236aa9d2f8..ae3a944163 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/tools/generator/datasource/disk/dao/PasswordHistoryDao.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/tools/generator/datasource/disk/dao/PasswordHistoryDao.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.data.tools.generator.datasource.disk.dao -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.Query +import androidx.room3.Dao +import androidx.room3.Insert +import androidx.room3.Query import com.x8bit.bitwarden.data.tools.generator.datasource.disk.entity.PasswordHistoryEntity import kotlinx.coroutines.flow.Flow diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/tools/generator/datasource/disk/database/PasswordHistoryDatabase.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/tools/generator/datasource/disk/database/PasswordHistoryDatabase.kt index 8880a6cc92..6b0c1ef232 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/tools/generator/datasource/disk/database/PasswordHistoryDatabase.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/tools/generator/datasource/disk/database/PasswordHistoryDatabase.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.data.tools.generator.datasource.disk.database -import androidx.room.Database -import androidx.room.RoomDatabase +import androidx.room3.Database +import androidx.room3.RoomDatabase import com.x8bit.bitwarden.data.tools.generator.datasource.disk.dao.PasswordHistoryDao import com.x8bit.bitwarden.data.tools.generator.datasource.disk.entity.PasswordHistoryEntity diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/tools/generator/datasource/disk/di/GeneratorDiskModule.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/tools/generator/datasource/disk/di/GeneratorDiskModule.kt index 77f6eaeab7..cb6c259f52 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/tools/generator/datasource/disk/di/GeneratorDiskModule.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/tools/generator/datasource/disk/di/GeneratorDiskModule.kt @@ -2,7 +2,8 @@ package com.x8bit.bitwarden.data.tools.generator.datasource.disk.di import android.app.Application import android.content.SharedPreferences -import androidx.room.Room +import androidx.room3.Room +import androidx.sqlite.driver.AndroidSQLiteDriver import com.bitwarden.data.datasource.disk.di.UnencryptedPreferences import com.x8bit.bitwarden.data.platform.manager.DatabaseSchemeManager import com.x8bit.bitwarden.data.tools.generator.datasource.disk.GeneratorDiskSource @@ -50,16 +51,15 @@ object GeneratorDiskModule { fun providePasswordHistoryDatabase( app: Application, databaseSchemeManager: DatabaseSchemeManager, - ): PasswordHistoryDatabase { - return Room - .databaseBuilder( + ): PasswordHistoryDatabase = + Room + .databaseBuilder( context = app, - klass = PasswordHistoryDatabase::class.java, name = "passcode_history_database", ) .addCallback(DatabaseSchemeCallback(databaseSchemeManager = databaseSchemeManager)) + .setDriver(driver = AndroidSQLiteDriver()) .build() - } @Provides @Singleton diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/tools/generator/datasource/disk/entity/PasswordHistoryEntity.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/tools/generator/datasource/disk/entity/PasswordHistoryEntity.kt index 2864e514f4..28126152d8 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/tools/generator/datasource/disk/entity/PasswordHistoryEntity.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/tools/generator/datasource/disk/entity/PasswordHistoryEntity.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.data.tools.generator.datasource.disk.entity -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.PrimaryKey +import androidx.room3.ColumnInfo +import androidx.room3.Entity +import androidx.room3.PrimaryKey import com.bitwarden.vault.PasswordHistory import java.time.Instant diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/callback/DatabaseSchemeCallback.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/callback/DatabaseSchemeCallback.kt index f81485ed56..44c11fcb62 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/callback/DatabaseSchemeCallback.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/callback/DatabaseSchemeCallback.kt @@ -1,6 +1,6 @@ package com.x8bit.bitwarden.data.vault.datasource.disk.callback -import androidx.room.RoomDatabase +import androidx.room3.RoomDatabase import androidx.sqlite.SQLiteConnection import com.x8bit.bitwarden.data.platform.manager.DatabaseSchemeManager @@ -10,7 +10,7 @@ import com.x8bit.bitwarden.data.platform.manager.DatabaseSchemeManager class DatabaseSchemeCallback( private val databaseSchemeManager: DatabaseSchemeManager, ) : RoomDatabase.Callback() { - override fun onDestructiveMigration(connection: SQLiteConnection) { + override suspend fun onDestructiveMigration(connection: SQLiteConnection) { super.onDestructiveMigration(connection) databaseSchemeManager.clearSyncState() } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/convertor/InstantTypeConverter.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/convertor/InstantTypeConverter.kt index 1baaae9094..bae08d7818 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/convertor/InstantTypeConverter.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/convertor/InstantTypeConverter.kt @@ -1,26 +1,26 @@ package com.x8bit.bitwarden.data.vault.datasource.disk.convertor -import androidx.room.ProvidedTypeConverter -import androidx.room.TypeConverter +import androidx.room3.ColumnTypeConverter +import androidx.room3.ProvidedColumnTypeConverter import java.time.Instant /** - * A [TypeConverter] to convert an [Instant] to and from a [Long]. + * A [ColumnTypeConverter] to convert an [Instant] to and from a [Long]. */ -@ProvidedTypeConverter +@ProvidedColumnTypeConverter class InstantTypeConverter { /** - * A [TypeConverter] to convert a [Long] to an [Instant]. + * A [ColumnTypeConverter] to convert a [Long] to an [Instant]. */ - @TypeConverter + @ColumnTypeConverter fun fromTimestamp( value: Long?, ): Instant? = value?.let { Instant.ofEpochSecond(it) } /** - * A [TypeConverter] to convert an [Instant] to a [Long]. + * A [ColumnTypeConverter] to convert an [Instant] to a [Long]. */ - @TypeConverter + @ColumnTypeConverter fun toTimestamp( instant: Instant?, ): Long? = instant?.epochSecond diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/CiphersDao.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/CiphersDao.kt index 832ea367bc..124a5f312f 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/CiphersDao.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/CiphersDao.kt @@ -1,10 +1,10 @@ package com.x8bit.bitwarden.data.vault.datasource.disk.dao -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query -import androidx.room.Transaction +import androidx.room3.Dao +import androidx.room3.Insert +import androidx.room3.OnConflictStrategy +import androidx.room3.Query +import androidx.room3.Transaction import com.x8bit.bitwarden.data.vault.datasource.disk.entity.CipherEntity import kotlinx.coroutines.flow.Flow diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/CollectionsDao.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/CollectionsDao.kt index 0119b93e78..c6e86ec313 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/CollectionsDao.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/CollectionsDao.kt @@ -1,10 +1,10 @@ package com.x8bit.bitwarden.data.vault.datasource.disk.dao -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query -import androidx.room.Transaction +import androidx.room3.Dao +import androidx.room3.Insert +import androidx.room3.OnConflictStrategy +import androidx.room3.Query +import androidx.room3.Transaction import com.x8bit.bitwarden.data.vault.datasource.disk.entity.CollectionEntity import kotlinx.coroutines.flow.Flow diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/DomainsDao.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/DomainsDao.kt index 38f6a413c7..4e17944bf2 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/DomainsDao.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/DomainsDao.kt @@ -1,9 +1,9 @@ package com.x8bit.bitwarden.data.vault.datasource.disk.dao -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query +import androidx.room3.Dao +import androidx.room3.Insert +import androidx.room3.OnConflictStrategy +import androidx.room3.Query import com.x8bit.bitwarden.data.vault.datasource.disk.entity.DomainsEntity import kotlinx.coroutines.flow.Flow diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/FoldersDao.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/FoldersDao.kt index fb7c23c75c..9864ff09e4 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/FoldersDao.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/FoldersDao.kt @@ -1,10 +1,10 @@ package com.x8bit.bitwarden.data.vault.datasource.disk.dao -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query -import androidx.room.Transaction +import androidx.room3.Dao +import androidx.room3.Insert +import androidx.room3.OnConflictStrategy +import androidx.room3.Query +import androidx.room3.Transaction import com.x8bit.bitwarden.data.vault.datasource.disk.entity.FolderEntity import kotlinx.coroutines.flow.Flow @@ -39,7 +39,7 @@ interface FoldersDao { * Retrieves all folders from the database for a given [userId]. */ @Query("SELECT * FROM folders WHERE user_id = :userId") - fun getAllFolders( + suspend fun getAllFolders( userId: String, ): List diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/SendsDao.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/SendsDao.kt index b21db7f003..b6f8286f8c 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/SendsDao.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/SendsDao.kt @@ -1,10 +1,10 @@ package com.x8bit.bitwarden.data.vault.datasource.disk.dao -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query -import androidx.room.Transaction +import androidx.room3.Dao +import androidx.room3.Insert +import androidx.room3.OnConflictStrategy +import androidx.room3.Query +import androidx.room3.Transaction import com.x8bit.bitwarden.data.vault.datasource.disk.entity.SendEntity import kotlinx.coroutines.flow.Flow diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/database/VaultDatabase.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/database/VaultDatabase.kt index 0dbbf2d1f4..49701af274 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/database/VaultDatabase.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/database/VaultDatabase.kt @@ -1,11 +1,11 @@ package com.x8bit.bitwarden.data.vault.datasource.disk.database -import androidx.room.AutoMigration -import androidx.room.Database -import androidx.room.DeleteColumn -import androidx.room.RoomDatabase -import androidx.room.TypeConverters -import androidx.room.migration.AutoMigrationSpec +import androidx.room3.AutoMigration +import androidx.room3.ColumnTypeConverters +import androidx.room3.Database +import androidx.room3.DeleteColumn +import androidx.room3.RoomDatabase +import androidx.room3.migration.AutoMigrationSpec import com.x8bit.bitwarden.data.vault.datasource.disk.convertor.InstantTypeConverter import com.x8bit.bitwarden.data.vault.datasource.disk.dao.CiphersDao import com.x8bit.bitwarden.data.vault.datasource.disk.dao.CollectionsDao @@ -38,7 +38,7 @@ import com.x8bit.bitwarden.data.vault.datasource.disk.entity.SendEntity AutoMigration(from = 9, to = 10, RemoveTotpAutoMigration::class), ], ) -@TypeConverters(InstantTypeConverter::class) +@ColumnTypeConverters(InstantTypeConverter::class) abstract class VaultDatabase : RoomDatabase() { /** diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/di/VaultDiskModule.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/di/VaultDiskModule.kt index 1dcb9bdea8..c1f9e5723d 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/di/VaultDiskModule.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/di/VaultDiskModule.kt @@ -1,7 +1,8 @@ package com.x8bit.bitwarden.data.vault.datasource.disk.di import android.app.Application -import androidx.room.Room +import androidx.room3.Room +import androidx.sqlite.driver.AndroidSQLiteDriver import com.bitwarden.core.data.manager.dispatcher.DispatcherManager import com.x8bit.bitwarden.data.platform.manager.DatabaseSchemeManager import com.x8bit.bitwarden.data.vault.datasource.disk.VaultDiskSource @@ -35,14 +36,11 @@ class VaultDiskModule { databaseSchemeManager: DatabaseSchemeManager, ): VaultDatabase = Room - .databaseBuilder( - context = app, - klass = VaultDatabase::class.java, - name = "vault_database", - ) + .databaseBuilder(context = app, name = "vault_database") .fallbackToDestructiveMigration(dropAllTables = false) .addCallback(DatabaseSchemeCallback(databaseSchemeManager = databaseSchemeManager)) - .addTypeConverter(InstantTypeConverter()) + .addColumnTypeConverter(typeConverter = InstantTypeConverter()) + .setDriver(driver = AndroidSQLiteDriver()) .build() @Provides diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/entity/CipherEntity.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/entity/CipherEntity.kt index 5e47e5ec5a..4e464dde2f 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/entity/CipherEntity.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/entity/CipherEntity.kt @@ -1,9 +1,9 @@ package com.x8bit.bitwarden.data.vault.datasource.disk.entity -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.Index -import androidx.room.PrimaryKey +import androidx.room3.ColumnInfo +import androidx.room3.Entity +import androidx.room3.Index +import androidx.room3.PrimaryKey /** * Entity representing a cipher in the database. diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/entity/CollectionEntity.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/entity/CollectionEntity.kt index f31b19943b..49e0645b46 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/entity/CollectionEntity.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/entity/CollectionEntity.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.data.vault.datasource.disk.entity -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.PrimaryKey +import androidx.room3.ColumnInfo +import androidx.room3.Entity +import androidx.room3.PrimaryKey /** * Entity representing a collection in the database. diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/entity/DomainsEntity.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/entity/DomainsEntity.kt index ee9414ba89..c3e6818c16 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/entity/DomainsEntity.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/entity/DomainsEntity.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.data.vault.datasource.disk.entity -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.PrimaryKey +import androidx.room3.ColumnInfo +import androidx.room3.Entity +import androidx.room3.PrimaryKey /** * Entity representing a set of domains in the database. diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/entity/FolderEntity.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/entity/FolderEntity.kt index a4bf8377a2..11c4024db1 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/entity/FolderEntity.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/entity/FolderEntity.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.data.vault.datasource.disk.entity -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.PrimaryKey +import androidx.room3.ColumnInfo +import androidx.room3.Entity +import androidx.room3.PrimaryKey import java.time.Instant /** diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/entity/SendEntity.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/entity/SendEntity.kt index dcb819ea51..602990a6e5 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/entity/SendEntity.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/entity/SendEntity.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.data.vault.datasource.disk.entity -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.PrimaryKey +import androidx.room3.ColumnInfo +import androidx.room3.Entity +import androidx.room3.PrimaryKey /** * Entity representing a send in the database. diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/callback/DatabaseSchemeCallbackTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/callback/DatabaseSchemeCallbackTest.kt index 7e9162abf0..e5603b95b5 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/callback/DatabaseSchemeCallbackTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/callback/DatabaseSchemeCallbackTest.kt @@ -7,6 +7,7 @@ import io.mockk.just import io.mockk.mockk import io.mockk.runs import io.mockk.verify +import kotlinx.coroutines.test.runTest import org.junit.Test class DatabaseSchemeCallbackTest { @@ -17,7 +18,7 @@ class DatabaseSchemeCallbackTest { private val callback = DatabaseSchemeCallback(databaseSchemeManager) @Test - fun `onDestructiveMigration calls clearSyncState`() { + fun `onDestructiveMigration calls clearSyncState`() = runTest { callback.onDestructiveMigration(mockk()) verify(exactly = 1) { databaseSchemeManager.clearSyncState() } } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/FakeFoldersDao.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/FakeFoldersDao.kt index 6aee7fbc76..57824ed000 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/FakeFoldersDao.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/dao/FakeFoldersDao.kt @@ -54,7 +54,7 @@ class FakeFoldersDao : FoldersDao { folderId: String, ): FolderEntity? = storedFolders.find { it.userId == userId && it.id == folderId } - override fun getAllFolders( + override suspend fun getAllFolders( userId: String, ): List = storedFolders.filter { it.userId == userId } diff --git a/authenticator/build.gradle.kts b/authenticator/build.gradle.kts index d54b6b9400..40b17661a3 100644 --- a/authenticator/build.gradle.kts +++ b/authenticator/build.gradle.kts @@ -8,7 +8,7 @@ import java.util.Properties plugins { alias(libs.plugins.android.application) - alias(libs.plugins.androidx.room) + alias(libs.plugins.androidx.room3) alias(libs.plugins.crashlytics) alias(libs.plugins.hilt) alias(libs.plugins.kotlin.compose.compiler) @@ -35,7 +35,7 @@ base { archivesName.set("com.bitwarden.authenticator") } -room { +room3 { schemaDirectory("$projectDir/schemas") } @@ -220,9 +220,8 @@ dependencies { implementation(libs.androidx.lifecycle.runtime.ktx) implementation(libs.androidx.navigation.compose) testImplementation(libs.testng) - ksp(libs.androidx.room.compiler) - implementation(libs.androidx.room.ktx) - implementation(libs.androidx.room.runtime) + ksp(libs.androidx.room3.compiler) + implementation(libs.androidx.room3.runtime) implementation(libs.androidx.security.crypto) implementation(libs.androidx.splashscreen) implementation(libs.androidx.work.runtime.ktx) diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/convertor/AuthenticatorItemAlgorithmConverter.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/convertor/AuthenticatorItemAlgorithmConverter.kt index a4208a52ef..a33b3ef827 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/convertor/AuthenticatorItemAlgorithmConverter.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/convertor/AuthenticatorItemAlgorithmConverter.kt @@ -1,25 +1,25 @@ package com.bitwarden.authenticator.data.authenticator.datasource.disk.convertor -import androidx.room.ProvidedTypeConverter -import androidx.room.TypeConverter +import androidx.room3.ColumnTypeConverter +import androidx.room3.ProvidedColumnTypeConverter import com.bitwarden.authenticator.data.authenticator.datasource.disk.entity.AuthenticatorItemAlgorithm /** - * A [TypeConverter] to convert [AuthenticatorItemAlgorithm] to and from a [String]. + * A [ColumnTypeConverter] to convert [AuthenticatorItemAlgorithm] to and from a [String]. */ -@ProvidedTypeConverter +@ProvidedColumnTypeConverter class AuthenticatorItemAlgorithmConverter { /** - * A [TypeConverter] to convert an [AuthenticatorItemAlgorithm] to a [String]. + * A [ColumnTypeConverter] to convert an [AuthenticatorItemAlgorithm] to a [String]. */ - @TypeConverter + @ColumnTypeConverter fun toString(item: AuthenticatorItemAlgorithm): String = item.name /** - * A [TypeConverter] to convert a [String] to an [AuthenticatorItemAlgorithm]. + * A [ColumnTypeConverter] to convert a [String] to an [AuthenticatorItemAlgorithm]. */ - @TypeConverter + @ColumnTypeConverter fun fromString(itemName: String) = AuthenticatorItemAlgorithm .entries .find { it.name == itemName } diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/convertor/AuthenticatorItemTypeConverter.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/convertor/AuthenticatorItemTypeConverter.kt index dba98d4f9e..78d2c8a130 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/convertor/AuthenticatorItemTypeConverter.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/convertor/AuthenticatorItemTypeConverter.kt @@ -1,25 +1,25 @@ package com.bitwarden.authenticator.data.authenticator.datasource.disk.convertor -import androidx.room.ProvidedTypeConverter -import androidx.room.TypeConverter +import androidx.room3.ColumnTypeConverter +import androidx.room3.ProvidedColumnTypeConverter import com.bitwarden.authenticator.data.authenticator.datasource.disk.entity.AuthenticatorItemType /** - * A [TypeConverter] to convert [AuthenticatorItemType] to and from a [String]. + * A [ColumnTypeConverter] to convert [AuthenticatorItemType] to and from a [String]. */ -@ProvidedTypeConverter +@ProvidedColumnTypeConverter class AuthenticatorItemTypeConverter { /** - * A [TypeConverter] to convert an [AuthenticatorItemType] to a [String]. + * A [ColumnTypeConverter] to convert an [AuthenticatorItemType] to a [String]. */ - @TypeConverter + @ColumnTypeConverter fun toString(item: AuthenticatorItemType): String = item.name /** - * A [TypeConverter] to convert a [String] to an [AuthenticatorItemType]. + * A [ColumnTypeConverter] to convert a [String] to an [AuthenticatorItemType]. */ - @TypeConverter + @ColumnTypeConverter fun fromString(itemName: String) = AuthenticatorItemType .entries .find { it.name == itemName } diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/dao/ItemDao.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/dao/ItemDao.kt index 305f820202..9946d2dbae 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/dao/ItemDao.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/dao/ItemDao.kt @@ -1,9 +1,9 @@ package com.bitwarden.authenticator.data.authenticator.datasource.disk.dao -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query +import androidx.room3.Dao +import androidx.room3.Insert +import androidx.room3.OnConflictStrategy +import androidx.room3.Query import com.bitwarden.authenticator.data.authenticator.datasource.disk.entity.AuthenticatorItemEntity import kotlinx.coroutines.flow.Flow diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/database/AuthenticatorDatabase.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/database/AuthenticatorDatabase.kt index c5a7a41555..0573f5c170 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/database/AuthenticatorDatabase.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/database/AuthenticatorDatabase.kt @@ -1,9 +1,9 @@ package com.bitwarden.authenticator.data.authenticator.datasource.disk.database -import androidx.room.AutoMigration -import androidx.room.Database -import androidx.room.RoomDatabase -import androidx.room.TypeConverters +import androidx.room3.AutoMigration +import androidx.room3.ColumnTypeConverters +import androidx.room3.Database +import androidx.room3.RoomDatabase import com.bitwarden.authenticator.data.authenticator.datasource.disk.convertor.AuthenticatorItemAlgorithmConverter import com.bitwarden.authenticator.data.authenticator.datasource.disk.convertor.AuthenticatorItemTypeConverter import com.bitwarden.authenticator.data.authenticator.datasource.disk.dao.ItemDao @@ -22,7 +22,7 @@ import com.bitwarden.authenticator.data.authenticator.datasource.disk.entity.Aut version = 2, exportSchema = true, ) -@TypeConverters( +@ColumnTypeConverters( AuthenticatorItemTypeConverter::class, AuthenticatorItemAlgorithmConverter::class, ) diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/di/AuthenticatorDiskModule.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/di/AuthenticatorDiskModule.kt index 1aad5e5cc1..ed8683b6f3 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/di/AuthenticatorDiskModule.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/di/AuthenticatorDiskModule.kt @@ -1,7 +1,8 @@ package com.bitwarden.authenticator.data.authenticator.datasource.disk.di import android.app.Application -import androidx.room.Room +import androidx.room3.Room +import androidx.sqlite.driver.AndroidSQLiteDriver import com.bitwarden.authenticator.data.authenticator.datasource.disk.AuthenticatorDiskSource import com.bitwarden.authenticator.data.authenticator.datasource.disk.AuthenticatorDiskSourceImpl import com.bitwarden.authenticator.data.authenticator.datasource.disk.convertor.AuthenticatorItemAlgorithmConverter @@ -25,14 +26,11 @@ object AuthenticatorDiskModule { @Singleton fun provideAuthenticatorDatabase(app: Application): AuthenticatorDatabase = Room - .databaseBuilder( - context = app, - klass = AuthenticatorDatabase::class.java, - name = "authenticator_database", - ) + .databaseBuilder(context = app, name = "authenticator_database") .fallbackToDestructiveMigration(dropAllTables = true) - .addTypeConverter(AuthenticatorItemTypeConverter()) - .addTypeConverter(AuthenticatorItemAlgorithmConverter()) + .addColumnTypeConverter(typeConverter = AuthenticatorItemTypeConverter()) + .addColumnTypeConverter(typeConverter = AuthenticatorItemAlgorithmConverter()) + .setDriver(driver = AndroidSQLiteDriver()) .build() @Provides diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/entity/AuthenticatorItemEntity.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/entity/AuthenticatorItemEntity.kt index d761faed53..c1738bec41 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/entity/AuthenticatorItemEntity.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/datasource/disk/entity/AuthenticatorItemEntity.kt @@ -2,9 +2,9 @@ package com.bitwarden.authenticator.data.authenticator.datasource.disk.entity import android.net.Uri import androidx.core.text.htmlEncode -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.PrimaryKey +import androidx.room3.ColumnInfo +import androidx.room3.Entity +import androidx.room3.PrimaryKey /** * Entity representing an authenticator item in the database. diff --git a/build.gradle.kts b/build.gradle.kts index 16477d1997..f98c9e1450 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,7 @@ import io.gitlab.arturbosch.detekt.Detekt plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.android.library) apply false - alias(libs.plugins.androidx.room) apply false + alias(libs.plugins.androidx.room3) apply false alias(libs.plugins.detekt) apply true alias(libs.plugins.hilt) apply false alias(libs.plugins.kotlin.compose.compiler) apply false diff --git a/buildscript-gradle.lockfile b/buildscript-gradle.lockfile index 1ef124f244..eb547eb64b 100644 --- a/buildscript-gradle.lockfile +++ b/buildscript-gradle.lockfile @@ -3,8 +3,8 @@ # This file is expected to be part of source control. androidx.databinding:databinding-common:9.4.1=classpath androidx.databinding:databinding-compiler-common:9.4.1=classpath -androidx.room:androidx.room.gradle.plugin:2.8.5=classpath -androidx.room:room-gradle-plugin:2.8.5=classpath +androidx.room3:androidx.room3.gradle.plugin:3.0.3=classpath +androidx.room3:room3-gradle-plugin:3.0.3=classpath com.android.application:com.android.application.gradle.plugin:9.4.1=classpath com.android.databinding:baseLibrary:9.4.1=classpath com.android.library:com.android.library.gradle.plugin:9.4.1=classpath diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index fd62779e13..839e225677 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -72,7 +72,7 @@ Note that any functions exposed by a data layer class that must perform asynchro ### Data Sources -The lowest level of the data layer are the "data source" classes. These are the raw sources of data that include data persisted in [Room](https://developer.android.com/jetpack/androidx/releases/room) / [SharedPreferences](https://developer.android.com/reference/android/content/SharedPreferences), data retrieved from network requests using [Retrofit](https://github.com/square/retrofit), and data retrieved via interactions with the [Bitwarden SDK](https://github.com/bitwarden/sdk). +The lowest level of the data layer are the "data source" classes. These are the raw sources of data that include data persisted in [Room](https://developer.android.com/jetpack/androidx/releases/room3) / [SharedPreferences](https://developer.android.com/reference/android/content/SharedPreferences), data retrieved from network requests using [Retrofit](https://github.com/square/retrofit), and data retrieved via interactions with the [Bitwarden SDK](https://github.com/bitwarden/sdk). Note that these data sources are constructed in a manner that adheres to a very important principle of the app: **that function calls should not throw exceptions** (see the [style and best practices documentation](STYLE_AND_BEST_PRACTICES.md#best-practices--kotlin) for more details.) In the case of data sources, this tends to mean that suspending functions like those representing network requests or Bitwarden SDK calls should return a [Result](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-result/) type. This is an important responsibility of the data layer as a wrapper around other third party libraries, as dependencies like Retrofit and the Bitwarden SDK tend to throw exceptions to indicate errors instead. diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8dfec98215..91d7f576fa 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -25,7 +25,7 @@ androidxCredentialsProviderEvents = "1.0.0-alpha06" androidxHiltNavigationCompose = "1.4.0" androidxLifecycle = "2.11.0" androidxNavigation = "2.9.8" -androidxRoom = "2.8.5" +androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" @@ -91,9 +91,8 @@ androidx-lifecycle-process = { module = "androidx.lifecycle:lifecycle-process", androidx-lifecycle-runtime-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose", version.ref = "androidxLifecycle" } androidx-lifecycle-runtime-ktx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "androidxLifecycle" } androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "androidxNavigation" } -androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "androidxRoom" } -androidx-room-ktx = { module = "androidx.room:room-ktx", version.ref = "androidxRoom" } -androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "androidxRoom" } +androidx-room3-compiler = { module = "androidx.room3:room3-compiler", version.ref = "androidxRoom3" } +androidx-room3-runtime = { module = "androidx.room3:room3-runtime", version.ref = "androidxRoom3" } androidx-security-crypto = { module = "androidx.security:security-crypto", version.ref = "androidxSecurityCrypto" } androidx-splashscreen = { module = "androidx.core:core-splashscreen", version.ref = "androidxSplash" } androidx-work-runtime-ktx = { module = "androidx.work:work-runtime-ktx", version.ref = "androidxWork" } @@ -144,7 +143,7 @@ testng = { group = "org.testng", name = "testng", version.ref = "testng" } [plugins] android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" } android-library = { id = "com.android.library", version.ref = "androidGradlePlugin" } -androidx-room = { id = "androidx.room", version.ref = "androidxRoom" } +androidx-room3 = { id = "androidx.room3", version.ref = "androidxRoom3" } crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "crashlytics" } detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" } google-protobuf = { id = "com.google.protobuf", version.ref = "googleProtoBufPlugin" }