Merge pull request #5508 from element-hq/feature/bma/noUriInComposeState

Replace Uri by String in States that are used in Composable function.
This commit is contained in:
Benoit Marty 2025-10-13 15:32:39 +02:00 committed by GitHub
commit d441c43993
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
16 changed files with 78 additions and 87 deletions

View file

@ -62,21 +62,21 @@ class EditUserProfilePresenter(
@Composable
override fun present(): EditUserProfileState {
val cameraPermissionState = cameraPermissionPresenter.present()
var userAvatarUri by rememberSaveable { mutableStateOf(matrixUser.avatarUrl?.toUri()) }
var userAvatarUri by rememberSaveable { mutableStateOf(matrixUser.avatarUrl) }
var userDisplayName by rememberSaveable { mutableStateOf(matrixUser.displayName) }
val cameraPhotoPicker = mediaPickerProvider.registerCameraPhotoPicker(
onResult = { uri ->
if (uri != null) {
temporaryUriDeleter.delete(userAvatarUri)
userAvatarUri = uri
temporaryUriDeleter.delete(userAvatarUri?.toUri())
userAvatarUri = uri.toString()
}
}
)
val galleryImagePicker = mediaPickerProvider.registerGalleryImagePicker(
onResult = { uri ->
if (uri != null) {
temporaryUriDeleter.delete(userAvatarUri)
userAvatarUri = uri
temporaryUriDeleter.delete(userAvatarUri?.toUri())
userAvatarUri = uri.toString()
}
}
)
@ -102,7 +102,12 @@ class EditUserProfilePresenter(
val localCoroutineScope = rememberCoroutineScope()
fun handleEvents(event: EditUserProfileEvents) {
when (event) {
is EditUserProfileEvents.Save -> localCoroutineScope.saveChanges(userDisplayName, userAvatarUri, matrixUser, saveAction)
is EditUserProfileEvents.Save -> localCoroutineScope.saveChanges(
name = userDisplayName,
avatarUri = userAvatarUri?.toUri(),
currentUser = matrixUser,
action = saveAction,
)
is EditUserProfileEvents.HandleAvatarAction -> {
when (event.action) {
AvatarAction.ChoosePhoto -> galleryImagePicker.launch()
@ -113,7 +118,7 @@ class EditUserProfilePresenter(
cameraPermissionState.eventSink(PermissionsEvents.RequestPermissions)
}
AvatarAction.Remove -> {
temporaryUriDeleter.delete(userAvatarUri)
temporaryUriDeleter.delete(userAvatarUri?.toUri())
userAvatarUri = null
}
}
@ -145,9 +150,8 @@ class EditUserProfilePresenter(
private fun hasDisplayNameChanged(name: String?, currentUser: MatrixUser) =
name?.trim() != currentUser.displayName?.trim()
private fun hasAvatarUrlChanged(avatarUri: Uri?, currentUser: MatrixUser) =
// Need to call `toUri()?.toString()` to make the test pass (we mockk Uri)
avatarUri?.toString()?.trim() != currentUser.avatarUrl?.toUri()?.toString()?.trim()
private fun hasAvatarUrlChanged(avatarUri: String?, currentUser: MatrixUser) =
avatarUri?.trim() != currentUser.avatarUrl?.trim()
private fun CoroutineScope.saveChanges(
name: String?,

View file

@ -7,20 +7,16 @@
package io.element.android.features.preferences.impl.user.editprofile
import android.net.Uri
import androidx.compose.runtime.Immutable
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.ui.media.AvatarAction
import io.element.android.libraries.permissions.api.PermissionsState
import kotlinx.collections.immutable.ImmutableList
// Annotate with @Immutable since `Uri` is unstable
@Immutable
data class EditUserProfileState(
val userId: UserId,
val displayName: String,
val userAvatarUrl: Uri?,
val userAvatarUrl: String?,
val avatarActions: ImmutableList<AvatarAction>,
val saveButtonEnabled: Boolean,
val saveAction: AsyncAction<Unit>,

View file

@ -7,9 +7,7 @@
package io.element.android.features.preferences.impl.user.editprofile
import android.net.Uri
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import androidx.core.net.toUri
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.permissions.api.aPermissionsState
@ -19,13 +17,13 @@ open class EditUserProfileStateProvider : PreviewParameterProvider<EditUserProfi
override val values: Sequence<EditUserProfileState>
get() = sequenceOf(
aEditUserProfileState(),
aEditUserProfileState(userAvatarUrl = "example://uri".toUri()),
aEditUserProfileState(userAvatarUrl = "example://uri"),
// Add other states here
)
}
fun aEditUserProfileState(
userAvatarUrl: Uri? = null,
userAvatarUrl: String? = null,
) = EditUserProfileState(
userId = UserId("@john.doe:matrix.org"),
displayName = "John Doe",