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:
commit
d441c43993
16 changed files with 78 additions and 87 deletions
|
|
@ -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?,
|
||||
|
|
|
|||
|
|
@ -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>,
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -66,7 +66,9 @@ class EditUserProfilePresenterTest {
|
|||
mockkStatic(Uri::class)
|
||||
|
||||
every { Uri.parse(AN_AVATAR_URL) } returns userAvatarUri
|
||||
every { userAvatarUri.toString() } returns AN_AVATAR_URL
|
||||
every { Uri.parse(ANOTHER_AVATAR_URL) } returns anotherAvatarUri
|
||||
every { anotherAvatarUri.toString() } returns ANOTHER_AVATAR_URL
|
||||
}
|
||||
|
||||
@After
|
||||
|
|
@ -102,7 +104,7 @@ class EditUserProfilePresenterTest {
|
|||
val initialState = awaitItem()
|
||||
assertThat(initialState.userId).isEqualTo(user.userId)
|
||||
assertThat(initialState.displayName).isEqualTo(user.displayName)
|
||||
assertThat(initialState.userAvatarUrl).isEqualTo(userAvatarUri)
|
||||
assertThat(initialState.userAvatarUrl).isEqualTo(AN_AVATAR_URL)
|
||||
assertThat(initialState.avatarActions).containsExactly(
|
||||
AvatarAction.ChoosePhoto,
|
||||
AvatarAction.TakePhoto,
|
||||
|
|
@ -127,16 +129,16 @@ class EditUserProfilePresenterTest {
|
|||
}.test {
|
||||
val initialState = awaitItem()
|
||||
assertThat(initialState.displayName).isEqualTo("Name")
|
||||
assertThat(initialState.userAvatarUrl).isEqualTo(userAvatarUri)
|
||||
assertThat(initialState.userAvatarUrl).isEqualTo(AN_AVATAR_URL)
|
||||
initialState.eventSink(EditUserProfileEvents.UpdateDisplayName("Name II"))
|
||||
awaitItem().apply {
|
||||
assertThat(displayName).isEqualTo("Name II")
|
||||
assertThat(userAvatarUrl).isEqualTo(userAvatarUri)
|
||||
assertThat(userAvatarUrl).isEqualTo(AN_AVATAR_URL)
|
||||
}
|
||||
initialState.eventSink(EditUserProfileEvents.UpdateDisplayName("Name III"))
|
||||
awaitItem().apply {
|
||||
assertThat(displayName).isEqualTo("Name III")
|
||||
assertThat(userAvatarUrl).isEqualTo(userAvatarUri)
|
||||
assertThat(userAvatarUrl).isEqualTo(AN_AVATAR_URL)
|
||||
}
|
||||
initialState.eventSink(EditUserProfileEvents.HandleAvatarAction(AvatarAction.Remove))
|
||||
awaitItem().apply {
|
||||
|
|
@ -160,10 +162,10 @@ class EditUserProfilePresenterTest {
|
|||
presenter.present()
|
||||
}.test {
|
||||
val initialState = awaitItem()
|
||||
assertThat(initialState.userAvatarUrl).isEqualTo(userAvatarUri)
|
||||
assertThat(initialState.userAvatarUrl).isEqualTo(AN_AVATAR_URL)
|
||||
initialState.eventSink(EditUserProfileEvents.HandleAvatarAction(AvatarAction.ChoosePhoto))
|
||||
awaitItem().apply {
|
||||
assertThat(userAvatarUrl).isEqualTo(anotherAvatarUri)
|
||||
assertThat(userAvatarUrl).isEqualTo(ANOTHER_AVATAR_URL)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -185,7 +187,7 @@ class EditUserProfilePresenterTest {
|
|||
presenter.present()
|
||||
}.test {
|
||||
val initialState = awaitItem()
|
||||
assertThat(initialState.userAvatarUrl).isEqualTo(userAvatarUri)
|
||||
assertThat(initialState.userAvatarUrl).isEqualTo(AN_AVATAR_URL)
|
||||
assertThat(initialState.cameraPermissionState.permissionGranted).isFalse()
|
||||
initialState.eventSink(EditUserProfileEvents.HandleAvatarAction(AvatarAction.TakePhoto))
|
||||
val stateWithAskingPermission = awaitItem()
|
||||
|
|
@ -194,12 +196,12 @@ class EditUserProfilePresenterTest {
|
|||
val stateWithPermission = awaitItem()
|
||||
assertThat(stateWithPermission.cameraPermissionState.permissionGranted).isTrue()
|
||||
val stateWithNewAvatar = awaitItem()
|
||||
assertThat(stateWithNewAvatar.userAvatarUrl).isEqualTo(anotherAvatarUri)
|
||||
assertThat(stateWithNewAvatar.userAvatarUrl).isEqualTo(ANOTHER_AVATAR_URL)
|
||||
// Do it again, no permission is requested
|
||||
fakePickerProvider.givenResult(userAvatarUri)
|
||||
stateWithNewAvatar.eventSink(EditUserProfileEvents.HandleAvatarAction(AvatarAction.TakePhoto))
|
||||
val stateWithNewAvatar2 = awaitItem()
|
||||
assertThat(stateWithNewAvatar2.userAvatarUrl).isEqualTo(userAvatarUri)
|
||||
assertThat(stateWithNewAvatar2.userAvatarUrl).isEqualTo(AN_AVATAR_URL)
|
||||
deleteCallback.assertions().isCalledExactly(2).withSequence(
|
||||
listOf(value(userAvatarUri)),
|
||||
listOf(value(anotherAvatarUri)),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue