mirror of
https://github.com/bitwarden/android.git
synced 2026-11-09 10:34:18 -06:00
[PM-45008] deps: Migrate the app from Room to Room3 (#7471)
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
+4
-4
@@ -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
|
||||
|
||||
|
||||
+2
-2
@@ -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
|
||||
|
||||
|
||||
+4
-3
@@ -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<PrivilegedAppDatabase>(
|
||||
context = app,
|
||||
klass = PrivilegedAppDatabase::class.java,
|
||||
name = "privileged_apps_database",
|
||||
)
|
||||
.fallbackToDestructiveMigration(dropAllTables = true)
|
||||
.setDriver(driver = AndroidSQLiteDriver())
|
||||
.build()
|
||||
|
||||
@Provides
|
||||
|
||||
+2
-2
@@ -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.
|
||||
|
||||
+4
-4
@@ -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
|
||||
|
||||
/**
|
||||
|
||||
+5
-5
@@ -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.
|
||||
|
||||
+5
-7
@@ -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<PlatformDatabase>(context = app, name = "platform_database")
|
||||
.fallbackToDestructiveMigration(dropAllTables = false)
|
||||
.addTypeConverter(InstantTypeConverter())
|
||||
.addColumnTypeConverter(typeConverter = InstantTypeConverter())
|
||||
.addCallback(DatabaseSchemeCallback(databaseSchemeManager = databaseSchemeManager))
|
||||
.setDriver(driver = AndroidSQLiteDriver())
|
||||
.build()
|
||||
|
||||
@Provides
|
||||
|
||||
+3
-3
@@ -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
|
||||
|
||||
/**
|
||||
|
||||
+3
-3
@@ -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
|
||||
|
||||
|
||||
+2
-2
@@ -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
|
||||
|
||||
|
||||
+6
-6
@@ -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<PasswordHistoryDatabase>(
|
||||
context = app,
|
||||
klass = PasswordHistoryDatabase::class.java,
|
||||
name = "passcode_history_database",
|
||||
)
|
||||
.addCallback(DatabaseSchemeCallback(databaseSchemeManager = databaseSchemeManager))
|
||||
.setDriver(driver = AndroidSQLiteDriver())
|
||||
.build()
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
|
||||
+3
-3
@@ -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
|
||||
|
||||
|
||||
+2
-2
@@ -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()
|
||||
}
|
||||
|
||||
+8
-8
@@ -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
|
||||
|
||||
+5
-5
@@ -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
|
||||
|
||||
|
||||
+5
-5
@@ -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
|
||||
|
||||
|
||||
+4
-4
@@ -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
|
||||
|
||||
|
||||
+6
-6
@@ -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<FolderEntity>
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
+7
-7
@@ -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() {
|
||||
|
||||
/**
|
||||
|
||||
+5
-7
@@ -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<VaultDatabase>(context = app, name = "vault_database")
|
||||
.fallbackToDestructiveMigration(dropAllTables = false)
|
||||
.addCallback(DatabaseSchemeCallback(databaseSchemeManager = databaseSchemeManager))
|
||||
.addTypeConverter(InstantTypeConverter())
|
||||
.addColumnTypeConverter(typeConverter = InstantTypeConverter())
|
||||
.setDriver(driver = AndroidSQLiteDriver())
|
||||
.build()
|
||||
|
||||
@Provides
|
||||
|
||||
+4
-4
@@ -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.
|
||||
|
||||
+3
-3
@@ -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.
|
||||
|
||||
+3
-3
@@ -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.
|
||||
|
||||
+3
-3
@@ -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
|
||||
|
||||
/**
|
||||
|
||||
+3
-3
@@ -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.
|
||||
|
||||
+2
-1
@@ -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<SQLiteConnection>())
|
||||
verify(exactly = 1) { databaseSchemeManager.clearSyncState() }
|
||||
}
|
||||
|
||||
+1
-1
@@ -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<FolderEntity> = storedFolders.filter { it.userId == userId }
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
+8
-8
@@ -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 }
|
||||
|
||||
+8
-8
@@ -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 }
|
||||
|
||||
+4
-4
@@ -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
|
||||
|
||||
|
||||
+5
-5
@@ -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,
|
||||
)
|
||||
|
||||
+6
-8
@@ -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<AuthenticatorDatabase>(context = app, name = "authenticator_database")
|
||||
.fallbackToDestructiveMigration(dropAllTables = true)
|
||||
.addTypeConverter(AuthenticatorItemTypeConverter())
|
||||
.addTypeConverter(AuthenticatorItemAlgorithmConverter())
|
||||
.addColumnTypeConverter(typeConverter = AuthenticatorItemTypeConverter())
|
||||
.addColumnTypeConverter(typeConverter = AuthenticatorItemAlgorithmConverter())
|
||||
.setDriver(driver = AndroidSQLiteDriver())
|
||||
.build()
|
||||
|
||||
@Provides
|
||||
|
||||
+3
-3
@@ -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.
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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" }
|
||||
|
||||
Reference in New Issue
Block a user