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
|
|
@ -61,11 +61,11 @@ class RoomDetailsEditPresenter(
|
|||
val cameraPermissionState = cameraPermissionPresenter.present()
|
||||
val roomSyncUpdateFlow = room.syncUpdateFlow.collectAsState()
|
||||
|
||||
val roomAvatarUri = room.avatarUrl()?.toUri()
|
||||
var roomAvatarUriEdited by rememberSaveable { mutableStateOf<Uri?>(null) }
|
||||
val roomAvatarUri = room.avatarUrl()
|
||||
var roomAvatarUriEdited by rememberSaveable { mutableStateOf<String?>(null) }
|
||||
LaunchedEffect(roomAvatarUri) {
|
||||
// Every time the roomAvatar change (from sync), we can set the new avatar.
|
||||
temporaryUriDeleter.delete(roomAvatarUriEdited)
|
||||
temporaryUriDeleter.delete(roomAvatarUriEdited?.toUri())
|
||||
roomAvatarUriEdited = roomAvatarUri
|
||||
}
|
||||
|
||||
|
|
@ -107,16 +107,16 @@ class RoomDetailsEditPresenter(
|
|||
val cameraPhotoPicker = mediaPickerProvider.registerCameraPhotoPicker(
|
||||
onResult = { uri ->
|
||||
if (uri != null) {
|
||||
temporaryUriDeleter.delete(roomAvatarUriEdited)
|
||||
roomAvatarUriEdited = uri
|
||||
temporaryUriDeleter.delete(roomAvatarUriEdited?.toUri())
|
||||
roomAvatarUriEdited = uri.toString()
|
||||
}
|
||||
}
|
||||
)
|
||||
val galleryImagePicker = mediaPickerProvider.registerGalleryImagePicker(
|
||||
onResult = { uri ->
|
||||
if (uri != null) {
|
||||
temporaryUriDeleter.delete(roomAvatarUriEdited)
|
||||
roomAvatarUriEdited = uri
|
||||
temporaryUriDeleter.delete(roomAvatarUriEdited?.toUri())
|
||||
roomAvatarUriEdited = uri.toString()
|
||||
}
|
||||
}
|
||||
)
|
||||
|
|
@ -147,8 +147,8 @@ class RoomDetailsEditPresenter(
|
|||
newNameTrimmed = roomRawNameEdited.trim(),
|
||||
currentTopicTrimmed = roomTopicTrimmed,
|
||||
newTopicTrimmed = roomTopicEdited.trim(),
|
||||
currentAvatar = roomAvatarUri,
|
||||
newAvatarUri = roomAvatarUriEdited,
|
||||
currentAvatar = roomAvatarUri?.toUri(),
|
||||
newAvatarUri = roomAvatarUriEdited?.toUri(),
|
||||
action = saveAction,
|
||||
)
|
||||
is RoomDetailsEditEvents.HandleAvatarAction -> {
|
||||
|
|
@ -161,7 +161,7 @@ class RoomDetailsEditPresenter(
|
|||
cameraPermissionState.eventSink(PermissionsEvents.RequestPermissions)
|
||||
}
|
||||
AvatarAction.Remove -> {
|
||||
temporaryUriDeleter.delete(roomAvatarUriEdited)
|
||||
temporaryUriDeleter.delete(roomAvatarUriEdited?.toUri())
|
||||
roomAvatarUriEdited = null
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,16 +7,12 @@
|
|||
|
||||
package io.element.android.features.roomdetails.impl.edit
|
||||
|
||||
import android.net.Uri
|
||||
import androidx.compose.runtime.Immutable
|
||||
import io.element.android.libraries.architecture.AsyncAction
|
||||
import io.element.android.libraries.matrix.api.core.RoomId
|
||||
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 RoomDetailsEditState(
|
||||
val roomId: RoomId,
|
||||
/** The raw room name (i.e. the room name from the state event `m.room.name`), not the display name. */
|
||||
|
|
@ -24,7 +20,7 @@ data class RoomDetailsEditState(
|
|||
val canChangeName: Boolean,
|
||||
val roomTopic: String,
|
||||
val canChangeTopic: Boolean,
|
||||
val roomAvatarUrl: Uri?,
|
||||
val roomAvatarUrl: String?,
|
||||
val canChangeAvatar: Boolean,
|
||||
val avatarActions: ImmutableList<AvatarAction>,
|
||||
val saveButtonEnabled: Boolean,
|
||||
|
|
|
|||
|
|
@ -7,9 +7,7 @@
|
|||
|
||||
package io.element.android.features.roomdetails.impl.edit
|
||||
|
||||
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.RoomId
|
||||
import io.element.android.libraries.matrix.ui.media.AvatarAction
|
||||
|
|
@ -23,7 +21,7 @@ open class RoomDetailsEditStateProvider : PreviewParameterProvider<RoomDetailsEd
|
|||
aRoomDetailsEditState(),
|
||||
aRoomDetailsEditState(roomTopic = ""),
|
||||
aRoomDetailsEditState(roomRawName = ""),
|
||||
aRoomDetailsEditState(roomAvatarUrl = "example://uri".toUri()),
|
||||
aRoomDetailsEditState(roomAvatarUrl = "example://uri"),
|
||||
aRoomDetailsEditState(canChangeName = true, canChangeTopic = false, canChangeAvatar = true, saveButtonEnabled = false),
|
||||
aRoomDetailsEditState(canChangeName = false, canChangeTopic = true, canChangeAvatar = false, saveButtonEnabled = false),
|
||||
aRoomDetailsEditState(saveAction = AsyncAction.Loading),
|
||||
|
|
@ -37,7 +35,7 @@ fun aRoomDetailsEditState(
|
|||
canChangeName: Boolean = true,
|
||||
roomTopic: String = "a room topic that is quite long so should wrap onto multiple lines",
|
||||
canChangeTopic: Boolean = true,
|
||||
roomAvatarUrl: Uri? = null,
|
||||
roomAvatarUrl: String? = null,
|
||||
canChangeAvatar: Boolean = true,
|
||||
avatarActions: List<AvatarAction> = emptyList(),
|
||||
saveButtonEnabled: Boolean = true,
|
||||
|
|
|
|||
|
|
@ -66,7 +66,9 @@ class RoomDetailsEditPresenterTest {
|
|||
mockkStatic(Uri::class)
|
||||
|
||||
every { Uri.parse(AN_AVATAR_URL) } returns roomAvatarUri
|
||||
every { roomAvatarUri.toString() } returns AN_AVATAR_URL
|
||||
every { Uri.parse(ANOTHER_AVATAR_URL) } returns anotherAvatarUri
|
||||
every { anotherAvatarUri.toString() } returns ANOTHER_AVATAR_URL
|
||||
}
|
||||
|
||||
@After
|
||||
|
|
@ -107,7 +109,7 @@ class RoomDetailsEditPresenterTest {
|
|||
val initialState = awaitFirstItem()
|
||||
assertThat(initialState.roomId).isEqualTo(room.roomId)
|
||||
assertThat(initialState.roomRawName).isEqualTo(A_ROOM_RAW_NAME)
|
||||
assertThat(initialState.roomAvatarUrl).isEqualTo(roomAvatarUri)
|
||||
assertThat(initialState.roomAvatarUrl).isEqualTo(AN_AVATAR_URL)
|
||||
assertThat(initialState.roomTopic).isEqualTo(room.info().topic.orEmpty())
|
||||
assertThat(initialState.avatarActions).containsExactly(
|
||||
AvatarAction.ChoosePhoto,
|
||||
|
|
@ -233,24 +235,24 @@ class RoomDetailsEditPresenterTest {
|
|||
val initialState = awaitFirstItem()
|
||||
assertThat(initialState.roomTopic).isEqualTo("My topic")
|
||||
assertThat(initialState.roomRawName).isEqualTo("Name")
|
||||
assertThat(initialState.roomAvatarUrl).isEqualTo(roomAvatarUri)
|
||||
assertThat(initialState.roomAvatarUrl).isEqualTo(AN_AVATAR_URL)
|
||||
initialState.eventSink(RoomDetailsEditEvents.UpdateRoomName("Name II"))
|
||||
awaitItem().apply {
|
||||
assertThat(roomTopic).isEqualTo("My topic")
|
||||
assertThat(roomRawName).isEqualTo("Name II")
|
||||
assertThat(roomAvatarUrl).isEqualTo(roomAvatarUri)
|
||||
assertThat(roomAvatarUrl).isEqualTo(AN_AVATAR_URL)
|
||||
}
|
||||
initialState.eventSink(RoomDetailsEditEvents.UpdateRoomName("Name III"))
|
||||
awaitItem().apply {
|
||||
assertThat(roomTopic).isEqualTo("My topic")
|
||||
assertThat(roomRawName).isEqualTo("Name III")
|
||||
assertThat(roomAvatarUrl).isEqualTo(roomAvatarUri)
|
||||
assertThat(roomAvatarUrl).isEqualTo(AN_AVATAR_URL)
|
||||
}
|
||||
initialState.eventSink(RoomDetailsEditEvents.UpdateRoomTopic("Another topic"))
|
||||
awaitItem().apply {
|
||||
assertThat(roomTopic).isEqualTo("Another topic")
|
||||
assertThat(roomRawName).isEqualTo("Name III")
|
||||
assertThat(roomAvatarUrl).isEqualTo(roomAvatarUri)
|
||||
assertThat(roomAvatarUrl).isEqualTo(AN_AVATAR_URL)
|
||||
}
|
||||
initialState.eventSink(RoomDetailsEditEvents.HandleAvatarAction(AvatarAction.Remove))
|
||||
awaitItem().apply {
|
||||
|
|
@ -277,10 +279,10 @@ class RoomDetailsEditPresenterTest {
|
|||
)
|
||||
presenter.test {
|
||||
val initialState = awaitFirstItem()
|
||||
assertThat(initialState.roomAvatarUrl).isEqualTo(roomAvatarUri)
|
||||
assertThat(initialState.roomAvatarUrl).isEqualTo(AN_AVATAR_URL)
|
||||
initialState.eventSink(RoomDetailsEditEvents.HandleAvatarAction(AvatarAction.ChoosePhoto))
|
||||
awaitItem().apply {
|
||||
assertThat(roomAvatarUrl).isEqualTo(anotherAvatarUri)
|
||||
assertThat(roomAvatarUrl).isEqualTo(anotherAvatarUri.toString())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -303,7 +305,7 @@ class RoomDetailsEditPresenterTest {
|
|||
)
|
||||
presenter.test {
|
||||
val initialState = awaitFirstItem()
|
||||
assertThat(initialState.roomAvatarUrl).isEqualTo(roomAvatarUri)
|
||||
assertThat(initialState.roomAvatarUrl).isEqualTo(AN_AVATAR_URL)
|
||||
assertThat(initialState.cameraPermissionState.permissionGranted).isFalse()
|
||||
initialState.eventSink(RoomDetailsEditEvents.HandleAvatarAction(AvatarAction.TakePhoto))
|
||||
val stateWithAskingPermission = awaitItem()
|
||||
|
|
@ -312,12 +314,12 @@ class RoomDetailsEditPresenterTest {
|
|||
val stateWithPermission = awaitItem()
|
||||
assertThat(stateWithPermission.cameraPermissionState.permissionGranted).isTrue()
|
||||
val stateWithNewAvatar = awaitItem()
|
||||
assertThat(stateWithNewAvatar.roomAvatarUrl).isEqualTo(anotherAvatarUri)
|
||||
assertThat(stateWithNewAvatar.roomAvatarUrl).isEqualTo(anotherAvatarUri.toString())
|
||||
// Do it again, no permission is requested
|
||||
fakePickerProvider.givenResult(roomAvatarUri)
|
||||
stateWithNewAvatar.eventSink(RoomDetailsEditEvents.HandleAvatarAction(AvatarAction.TakePhoto))
|
||||
val stateWithNewAvatar2 = awaitItem()
|
||||
assertThat(stateWithNewAvatar2.roomAvatarUrl).isEqualTo(roomAvatarUri)
|
||||
assertThat(stateWithNewAvatar2.roomAvatarUrl).isEqualTo(AN_AVATAR_URL)
|
||||
deleteCallback.assertions().isCalledExactly(3).withSequence(
|
||||
listOf(value(null)),
|
||||
listOf(value(roomAvatarUri)),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue