Benoit Marty
2 years ago
5 changed files with 92 additions and 4 deletions
@ -0,0 +1,12 @@
@@ -0,0 +1,12 @@
|
||||
package io.element.android.x |
||||
|
||||
import androidx.lifecycle.ViewModel |
||||
import io.element.android.x.sdk.matrix.MatrixInstance |
||||
|
||||
class MainViewModel : ViewModel() { |
||||
private val matrix = MatrixInstance.getInstance() |
||||
|
||||
suspend fun hasSession(): Boolean { |
||||
return matrix.restoreSession() != null |
||||
} |
||||
} |
@ -1,18 +1,35 @@
@@ -1,18 +1,35 @@
|
||||
package io.element.android.x.sdk.matrix |
||||
|
||||
import android.content.Context |
||||
import io.element.android.x.sdk.matrix.store.SessionStore |
||||
import org.matrix.rustcomponents.sdk.AuthenticationService |
||||
import org.matrix.rustcomponents.sdk.ClientBuilder |
||||
import java.io.File |
||||
|
||||
class Matrix( |
||||
context: Context, |
||||
) { |
||||
private val authFolder = File(context.filesDir, "auth") |
||||
private val sessionStore = SessionStore(context) |
||||
|
||||
fun login(homeserver: String, username: String, password: String): MatrixClient { |
||||
suspend fun restoreSession(): MatrixClient? { |
||||
return sessionStore.getStoredData() |
||||
?.let { sessionData -> |
||||
val client = ClientBuilder() |
||||
.username(sessionData.userId) |
||||
.build() |
||||
client.restoreLogin(sessionData.restoreToken) |
||||
client |
||||
}?.let { |
||||
MatrixClient(it) |
||||
} |
||||
} |
||||
|
||||
suspend fun login(homeserver: String, username: String, password: String): MatrixClient { |
||||
val authService = AuthenticationService(authFolder.absolutePath) |
||||
authService.configureHomeserver(homeserver) |
||||
val client = authService.login(username, password, "MatrixRustSDKSample", null) |
||||
sessionStore.storeData(SessionStore.SessionData(username, client.restoreToken())) |
||||
return MatrixClient(client) |
||||
} |
||||
} |
@ -0,0 +1,48 @@
@@ -0,0 +1,48 @@
|
||||
package io.element.android.x.sdk.matrix.store |
||||
|
||||
import android.content.Context |
||||
import androidx.datastore.core.DataStore |
||||
import androidx.datastore.preferences.core.Preferences |
||||
import androidx.datastore.preferences.core.edit |
||||
import androidx.datastore.preferences.core.stringPreferencesKey |
||||
import androidx.datastore.preferences.preferencesDataStore |
||||
import kotlinx.coroutines.flow.firstOrNull |
||||
|
||||
|
||||
private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "elementx_sessions") |
||||
|
||||
internal class SessionStore( |
||||
context: Context |
||||
) { |
||||
data class SessionData( |
||||
val userId: String, |
||||
val restoreToken: String, |
||||
) |
||||
|
||||
private val store = context.dataStore |
||||
|
||||
private val userIdPreference = stringPreferencesKey("userId") |
||||
private val restoreTokenPreference = stringPreferencesKey("restoreToken") |
||||
|
||||
suspend fun storeData(sessionData: SessionData) { |
||||
store.edit { prefs -> |
||||
prefs[userIdPreference] = sessionData.userId |
||||
prefs[restoreTokenPreference] = sessionData.restoreToken |
||||
} |
||||
} |
||||
|
||||
suspend fun getStoredData(): SessionData? { |
||||
return store.data.firstOrNull()?.let { prefs -> |
||||
val userId = prefs[userIdPreference] ?: return@let null |
||||
val restoreToken = prefs[restoreTokenPreference] ?: return@let null |
||||
SessionData( |
||||
userId = userId, |
||||
restoreToken = restoreToken, |
||||
) |
||||
} |
||||
} |
||||
|
||||
suspend fun reset() { |
||||
store.edit { it.clear() } |
||||
} |
||||
} |
Loading…
Reference in new issue