Use client.cachedAvatarUrl(), to be able to render the user avatar faster, and even if there is no network (#2488).

This commit is contained in:
Benoit Marty 2024-03-18 13:55:41 +01:00 committed by Benoit Marty
parent a0cbe1087b
commit 68fd649424
15 changed files with 105 additions and 124 deletions

View file

@ -24,7 +24,6 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.produceState
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import io.element.android.features.logout.api.direct.DirectLogoutPresenter
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.core.meta.BuildType
@ -35,8 +34,6 @@ import io.element.android.libraries.featureflag.api.FeatureFlags
import io.element.android.libraries.indicator.api.IndicatorService
import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.oidc.AccountManagementAction
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.api.user.getCurrentUser
import io.element.android.libraries.matrix.api.verification.SessionVerificationService
import io.element.android.services.analytics.api.AnalyticsService
import kotlinx.coroutines.CoroutineScope
@ -58,11 +55,10 @@ class PreferencesRootPresenter @Inject constructor(
) : Presenter<PreferencesRootState> {
@Composable
override fun present(): PreferencesRootState {
val matrixUser: MutableState<MatrixUser?> = rememberSaveable {
mutableStateOf(null)
}
val matrixUser = matrixClient.userProfile.collectAsState()
LaunchedEffect(Unit) {
initialLoad(matrixUser)
// Force a refresh of the profile
matrixClient.getUserProfile()
}
val snackbarMessage by snackbarDispatcher.collectSnackbarMessageAsState()
@ -121,10 +117,6 @@ class PreferencesRootPresenter @Inject constructor(
)
}
private fun CoroutineScope.initialLoad(matrixUser: MutableState<MatrixUser?>) = launch {
matrixUser.value = matrixClient.getCurrentUser()
}
private fun CoroutineScope.initAccountManagementUrl(
accountManagementUrl: MutableState<String?>,
devicesManagementUrl: MutableState<String?>,

View file

@ -21,7 +21,7 @@ import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage
import io.element.android.libraries.matrix.api.user.MatrixUser
data class PreferencesRootState(
val myUser: MatrixUser?,
val myUser: MatrixUser,
val version: String,
val deviceId: String?,
val showCompleteVerification: Boolean,

View file

@ -18,10 +18,13 @@ package io.element.android.features.preferences.impl.root
import io.element.android.features.logout.api.direct.aDirectLogoutState
import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.ui.strings.CommonStrings
fun aPreferencesRootState() = PreferencesRootState(
myUser = null,
fun aPreferencesRootState(
myUser: MatrixUser,
) = PreferencesRootState(
myUser = myUser,
version = "Version 1.1 (1)",
deviceId = "ILAKNDNASDLK",
showCompleteVerification = true,

View file

@ -77,7 +77,7 @@ fun PreferencesRootView(
) {
UserPreferences(
modifier = Modifier.clickable {
state.myUser?.let(onOpenUserProfile)
onOpenUserProfile(state.myUser)
},
user = state.myUser,
)
@ -225,7 +225,7 @@ internal fun PreferencesRootViewDarkPreview(@PreviewParameter(MatrixUserProvider
@Composable
private fun ContentToPreview(matrixUser: MatrixUser) {
PreferencesRootView(
state = aPreferencesRootState().copy(myUser = matrixUser),
state = aPreferencesRootState(myUser = matrixUser),
onBackPressed = {},
onOpenAnalytics = {},
onOpenRageShake = {},

View file

@ -75,7 +75,13 @@ class PreferencesRootPresenterTest {
presenter.present()
}.test {
val initialState = awaitItem()
assertThat(initialState.myUser).isNull()
assertThat(initialState.myUser).isEqualTo(
MatrixUser(
userId = matrixClient.sessionId,
displayName = A_USER_NAME,
avatarUrl = AN_AVATAR_URL
)
)
assertThat(initialState.version).isEqualTo("A Version")
val loadedState = awaitItem()
assertThat(loadedState.myUser).isEqualTo(