diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index eadae513cf..0a49fe2a4b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,10 +13,13 @@ android:supportsRtl="true" android:theme="@style/Theme.ElementX" tools:targetApi="33"> + + android:screenOrientation="sensorPortrait" + android:windowSoftInputMode="adjustResize" + tools:ignore="LockedOrientationActivity"> diff --git a/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt b/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt index 145ffc81b4..ee738ad968 100644 --- a/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt +++ b/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt @@ -102,7 +102,12 @@ fun MessagesScreen( TimelineItemActionsScreen( sheetState = actionsSheetState, actionsSheetState = itemActionsSheetState(), - onActionClicked = viewModel::handleItemAction + onActionClicked = { + viewModel.handleItemAction(it) + coroutineScope.launch { + actionsSheetState.hide() + } + } ) } diff --git a/features/messages/src/main/java/io/element/android/x/features/messages/MessagesViewModel.kt b/features/messages/src/main/java/io/element/android/x/features/messages/MessagesViewModel.kt index b1361ba15a..028c6ef6d5 100644 --- a/features/messages/src/main/java/io/element/android/x/features/messages/MessagesViewModel.kt +++ b/features/messages/src/main/java/io/element/android/x/features/messages/MessagesViewModel.kt @@ -74,15 +74,31 @@ class MessagesViewModel( viewModelScope.launch(Dispatchers.Default) { val currentState = awaitState() Timber.v("Handle $action for ${currentState.itemActionsSheetState}") + val targetEvent = + currentState.itemActionsSheetState.invoke()?.targetItem ?: return@launch + when (action) { + MessagesItemAction.Copy -> Unit // TODO + MessagesItemAction.Forward -> Unit // TODO + MessagesItemAction.Redact -> handleActionRedact(targetEvent) + } + } + } + + private fun handleActionRedact(event: MessagesTimelineItemState.MessageEvent) { + viewModelScope.launch { + room.redactEvent(event.id) } } fun computeActionsSheetState(messagesTimelineItemState: MessagesTimelineItemState.MessageEvent) { suspend { - val actions = listOf( + val actions = mutableListOf( MessagesItemAction.Forward, MessagesItemAction.Copy, ) + if (messagesTimelineItemState.isMine) { + actions.add(MessagesItemAction.Redact) + } MessagesItemActionsSheetState( targetItem = messagesTimelineItemState, actions = actions diff --git a/features/messages/src/main/java/io/element/android/x/features/messages/components/MessagesTimelineItemActionsSheet.kt b/features/messages/src/main/java/io/element/android/x/features/messages/components/MessagesTimelineItemActionsSheet.kt index bdf497700b..3e1be96c39 100644 --- a/features/messages/src/main/java/io/element/android/x/features/messages/components/MessagesTimelineItemActionsSheet.kt +++ b/features/messages/src/main/java/io/element/android/x/features/messages/components/MessagesTimelineItemActionsSheet.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.lazy.items import androidx.compose.material.* import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import io.element.android.x.designsystem.components.VectorIcon import io.element.android.x.features.messages.model.MessagesItemAction @@ -51,8 +52,18 @@ private fun SheetContent( modifier = Modifier.clickable { onActionClicked(it) }, - text = { Text(it.title) }, - icon = { VectorIcon(it.icon) } + text = { + Text( + text = it.title, + color = if (it.destructive) MaterialTheme.colors.error else Color.Unspecified, + ) + }, + icon = { + VectorIcon( + resourceId = it.icon, + tint = if (it.destructive) MaterialTheme.colors.error else LocalContentColor.current, + ) + } ) } } diff --git a/features/messages/src/main/java/io/element/android/x/features/messages/model/MessagesItemAction.kt b/features/messages/src/main/java/io/element/android/x/features/messages/model/MessagesItemAction.kt index 5bd90c1a8c..740740fdcc 100644 --- a/features/messages/src/main/java/io/element/android/x/features/messages/model/MessagesItemAction.kt +++ b/features/messages/src/main/java/io/element/android/x/features/messages/model/MessagesItemAction.kt @@ -5,7 +5,12 @@ import androidx.compose.runtime.Stable import io.element.android.x.designsystem.VectorIcons @Stable -sealed class MessagesItemAction(val title: String, @DrawableRes val icon: Int) { +sealed class MessagesItemAction( + val title: String, + @DrawableRes val icon: Int, + val destructive: Boolean = false +) { object Forward : MessagesItemAction("Forward", VectorIcons.ArrowForward) object Copy : MessagesItemAction("Copy", VectorIcons.Copy) + object Redact : MessagesItemAction("Redact", VectorIcons.Delete, destructive = true) } \ No newline at end of file diff --git a/libraries/designsystem/src/main/java/io/element/android/x/designsystem/Icons.kt b/libraries/designsystem/src/main/java/io/element/android/x/designsystem/Icons.kt index 77b2600efb..26881ddcef 100644 --- a/libraries/designsystem/src/main/java/io/element/android/x/designsystem/Icons.kt +++ b/libraries/designsystem/src/main/java/io/element/android/x/designsystem/Icons.kt @@ -5,4 +5,5 @@ import io.element.android.x.libraries.designsystem.R object VectorIcons { val Copy = R.drawable.ic_content_copy val ArrowForward = R.drawable.ic_content_arrow_forward + val Delete = R.drawable.ic_baseline_delete_outline_24 } \ No newline at end of file diff --git a/libraries/designsystem/src/main/res/drawable/ic_baseline_delete_outline_24.xml b/libraries/designsystem/src/main/res/drawable/ic_baseline_delete_outline_24.xml new file mode 100644 index 0000000000..ef36649125 --- /dev/null +++ b/libraries/designsystem/src/main/res/drawable/ic_baseline_delete_outline_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/libraries/matrix/src/main/java/io/element/android/x/matrix/room/MatrixRoom.kt b/libraries/matrix/src/main/java/io/element/android/x/matrix/room/MatrixRoom.kt index 509396efe5..eabab5850e 100644 --- a/libraries/matrix/src/main/java/io/element/android/x/matrix/room/MatrixRoom.kt +++ b/libraries/matrix/src/main/java/io/element/android/x/matrix/room/MatrixRoom.kt @@ -2,7 +2,6 @@ package io.element.android.x.matrix.room import io.element.android.x.core.coroutine.CoroutineDispatchers import io.element.android.x.matrix.core.RoomId -import io.element.android.x.matrix.core.UserId import io.element.android.x.matrix.timeline.MatrixTimeline import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow @@ -76,4 +75,11 @@ class MatrixRoom( room.send(content, transactionId) } } + + suspend fun redactEvent(eventId: String, reason: String? = null, ) = withContext(coroutineDispatchers.io) { + val transactionId = genTransactionId() + runCatching { + room.redact(eventId, reason, transactionId) + } + } } \ No newline at end of file