This commit is contained in:
Marco Romano 2023-10-13 15:17:12 +02:00
parent 0e1a8d506d
commit f32817e71f
3 changed files with 24 additions and 9 deletions

View file

@ -17,8 +17,10 @@
package io.element.encrypteddb package io.element.encrypteddb
import android.content.Context import android.content.Context
import app.cash.sqldelight.android.AndroidSqliteDriver import app.cash.sqldelight.db.QueryResult
import app.cash.sqldelight.db.SqlDriver import app.cash.sqldelight.db.SqlDriver
import app.cash.sqldelight.db.SqlSchema
import app.cash.sqldelight.driver.android.AndroidSqliteDriver
import io.element.encrypteddb.passphrase.PassphraseProvider import io.element.encrypteddb.passphrase.PassphraseProvider
import net.sqlcipher.database.SupportFactory import net.sqlcipher.database.SupportFactory
@ -35,7 +37,7 @@ class SqlCipherDriverFactory(
* @param name The name of the database to create. * @param name The name of the database to create.
* @param context Android [Context], used to instantiate the driver. * @param context Android [Context], used to instantiate the driver.
*/ */
fun create(schema: SqlDriver.Schema, name: String, context: Context): SqlDriver { fun create(schema: SqlSchema<QueryResult.Value<Unit>>, name: String, context: Context): SqlDriver {
val passphrase = passphraseProvider.getPassphrase() val passphrase = passphraseProvider.getPassphrase()
val factory = SupportFactory(passphrase) val factory = SupportFactory(passphrase)
return AndroidSqliteDriver(schema = schema, context = context, name = name, factory = factory) return AndroidSqliteDriver(schema = schema, context = context, name = name, factory = factory)

View file

@ -16,10 +16,11 @@
package io.element.android.libraries.sessionstorage.impl package io.element.android.libraries.sessionstorage.impl
import app.cash.sqldelight.coroutines.asFlow
import app.cash.sqldelight.coroutines.mapToList
import app.cash.sqldelight.coroutines.mapToOneOrNull
import com.squareup.anvil.annotations.ContributesBinding import com.squareup.anvil.annotations.ContributesBinding
import app.cash.sqldelight.runtime.coroutines.asFlow import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import app.cash.sqldelight.runtime.coroutines.mapToList
import app.cash.sqldelight.runtime.coroutines.mapToOneOrNull
import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.AppScope
import io.element.android.libraries.di.SingleIn import io.element.android.libraries.di.SingleIn
import io.element.android.libraries.sessionstorage.api.LoggedInState import io.element.android.libraries.sessionstorage.api.LoggedInState
@ -34,12 +35,13 @@ import javax.inject.Inject
@ContributesBinding(AppScope::class) @ContributesBinding(AppScope::class)
class DatabaseSessionStore @Inject constructor( class DatabaseSessionStore @Inject constructor(
private val database: SessionDatabase, private val database: SessionDatabase,
private val dispatchers: CoroutineDispatchers,
) : SessionStore { ) : SessionStore {
override fun isLoggedIn(): Flow<LoggedInState> { override fun isLoggedIn(): Flow<LoggedInState> {
return database.sessionDataQueries.selectFirst() return database.sessionDataQueries.selectFirst()
.asFlow() .asFlow()
.mapToOneOrNull() .mapToOneOrNull(dispatchers.io)
.map { .map {
if (it == null) { if (it == null) {
LoggedInState.NotLoggedIn LoggedInState.NotLoggedIn
@ -96,7 +98,7 @@ class DatabaseSessionStore @Inject constructor(
Timber.w("Observing session list!") Timber.w("Observing session list!")
return database.sessionDataQueries.selectAll() return database.sessionDataQueries.selectAll()
.asFlow() .asFlow()
.mapToList() .mapToList(dispatchers.io)
.map { it.map { sessionData -> sessionData.toApiModel() } } .map { it.map { sessionData -> sessionData.toApiModel() } }
} }

View file

@ -16,12 +16,15 @@
package io.element.android.libraries.sessionstorage.impl package io.element.android.libraries.sessionstorage.impl
import app.cash.sqldelight.driver.jdbc.sqlite.JdbcSqliteDriver
import app.cash.turbine.test import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import app.cash.sqldelight.sqlite.driver.JdbcSqliteDriver import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.matrix.session.SessionData import io.element.android.libraries.matrix.session.SessionData
import io.element.android.libraries.sessionstorage.api.LoggedInState import io.element.android.libraries.sessionstorage.api.LoggedInState
import io.element.android.libraries.sessionstorage.api.LoginType import io.element.android.libraries.sessionstorage.api.LoginType
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
@ -44,6 +47,7 @@ class DatabaseSessionStoreTests {
loginType = LoginType.UNKNOWN.name, loginType = LoginType.UNKNOWN.name,
) )
@OptIn(ExperimentalCoroutinesApi::class)
@Before @Before
fun setup() { fun setup() {
// Initialise in memory SQLite driver // Initialise in memory SQLite driver
@ -51,7 +55,14 @@ class DatabaseSessionStoreTests {
SessionDatabase.Schema.create(driver) SessionDatabase.Schema.create(driver)
database = SessionDatabase(driver) database = SessionDatabase(driver)
databaseSessionStore = DatabaseSessionStore(database) databaseSessionStore = DatabaseSessionStore(
database = database,
dispatchers = CoroutineDispatchers(
io = UnconfinedTestDispatcher(),
computation = UnconfinedTestDispatcher(),
main = UnconfinedTestDispatcher(),
)
)
} }
@Test @Test