From 3954612a72f0222722dfd5a38dde2394a5a542f5 Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Mon, 8 Jan 2024 14:02:57 +0100 Subject: [PATCH] Hide keyboard when tapping on a message in the timeline (#2187) * Hide keyboard when tapping on a message in the timeline if it would result in navigating to another screen --- changelog.d/2182.bugfix | 1 + .../features/messages/impl/MessagesFlowNode.kt | 18 +++++++++++++----- .../features/messages/impl/MessagesNode.kt | 9 +++++---- .../features/messages/impl/MessagesView.kt | 9 ++++++--- 4 files changed, 25 insertions(+), 12 deletions(-) create mode 100644 changelog.d/2182.bugfix diff --git a/changelog.d/2182.bugfix b/changelog.d/2182.bugfix new file mode 100644 index 0000000000..427eb3b402 --- /dev/null +++ b/changelog.d/2182.bugfix @@ -0,0 +1 @@ +Hide keyboard when tapping on a message in the timeline. diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt index 7343e56529..1edafdd992 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt @@ -139,8 +139,8 @@ class MessagesFlowNode @AssistedInject constructor( callback?.onRoomDetailsClicked() } - override fun onEventClicked(event: TimelineItem.Event) { - processEventClicked(event) + override fun onEventClicked(event: TimelineItem.Event): Boolean { + return processEventClicked(event) } override fun onPreviewAttachments(attachments: ImmutableList) { @@ -239,8 +239,8 @@ class MessagesFlowNode @AssistedInject constructor( } } - private fun processEventClicked(event: TimelineItem.Event) { - when (event.content) { + private fun processEventClicked(event: TimelineItem.Event): Boolean { + return when (event.content) { is TimelineItemImageContent -> { val navTarget = NavTarget.MediaViewer( mediaInfo = MediaInfo( @@ -253,6 +253,7 @@ class MessagesFlowNode @AssistedInject constructor( thumbnailSource = event.content.thumbnailSource, ) overlay.show(navTarget) + true } is TimelineItemStickerContent -> { /* Sticker may have an empty url and no thumbnail @@ -269,6 +270,9 @@ class MessagesFlowNode @AssistedInject constructor( thumbnailSource = event.content.thumbnailSource, ) overlay.show(navTarget) + true + } else { + false } } is TimelineItemVideoContent -> { @@ -283,6 +287,7 @@ class MessagesFlowNode @AssistedInject constructor( thumbnailSource = event.content.thumbnailSource, ) overlay.show(navTarget) + true } is TimelineItemFileContent -> { val navTarget = NavTarget.MediaViewer( @@ -296,6 +301,7 @@ class MessagesFlowNode @AssistedInject constructor( thumbnailSource = event.content.thumbnailSource, ) overlay.show(navTarget) + true } is TimelineItemAudioContent -> { val navTarget = NavTarget.MediaViewer( @@ -309,6 +315,7 @@ class MessagesFlowNode @AssistedInject constructor( thumbnailSource = null, ) overlay.show(navTarget) + true } is TimelineItemLocationContent -> { val navTarget = NavTarget.LocationViewer( @@ -316,8 +323,9 @@ class MessagesFlowNode @AssistedInject constructor( description = event.content.description, ) overlay.show(navTarget) + true } - else -> Unit + else -> false } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt index 09883779e8..9e871b9b25 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt @@ -31,6 +31,7 @@ import io.element.android.features.messages.impl.attachments.Attachment import io.element.android.features.messages.impl.timeline.di.LocalTimelineItemPresenterFactories import io.element.android.features.messages.impl.timeline.di.TimelineItemPresenterFactories import io.element.android.features.messages.impl.timeline.model.TimelineItem +import io.element.android.libraries.core.bool.orFalse import io.element.android.libraries.mediaplayer.api.MediaPlayer import io.element.android.libraries.di.RoomScope import io.element.android.libraries.matrix.api.core.EventId @@ -48,7 +49,7 @@ class MessagesNode @AssistedInject constructor( @Assisted plugins: List, private val room: MatrixRoom, private val analyticsService: AnalyticsService, - private val presenterFactory: MessagesPresenter.Factory, + presenterFactory: MessagesPresenter.Factory, private val timelineItemPresenterFactories: TimelineItemPresenterFactories, private val mediaPlayer: MediaPlayer, ) : Node(buildContext, plugins = plugins), MessagesNavigator { @@ -58,7 +59,7 @@ class MessagesNode @AssistedInject constructor( interface Callback : Plugin { fun onRoomDetailsClicked() - fun onEventClicked(event: TimelineItem.Event) + fun onEventClicked(event: TimelineItem.Event): Boolean fun onPreviewAttachments(attachments: ImmutableList) fun onUserDataClicked(userId: UserId) fun onShowEventDebugInfoClicked(eventId: EventId?, debugInfo: TimelineItemDebugInfo) @@ -85,8 +86,8 @@ class MessagesNode @AssistedInject constructor( callback?.onRoomDetailsClicked() } - private fun onEventClicked(event: TimelineItem.Event) { - callback?.onEventClicked(event) + private fun onEventClicked(event: TimelineItem.Event): Boolean { + return callback?.onEventClicked(event).orFalse() } private fun onPreviewAttachments(attachments: ImmutableList) { diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt index d6556c9a8c..96af343a5a 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt @@ -117,7 +117,7 @@ fun MessagesView( state: MessagesState, onBackPressed: () -> Unit, onRoomDetailsClicked: () -> Unit, - onEventClicked: (event: TimelineItem.Event) -> Unit, + onEventClicked: (event: TimelineItem.Event) -> Boolean, onUserDataClicked: (UserId) -> Unit, onPreviewAttachments: (ImmutableList) -> Unit, onSendLocationClicked: () -> Unit, @@ -148,7 +148,10 @@ fun MessagesView( fun onMessageClicked(event: TimelineItem.Event) { Timber.v("OnMessageClicked= ${event.id}") - onEventClicked(event) + val hideKeyboard = onEventClicked(event) + if (hideKeyboard) { + localView.hideKeyboard() + } } fun onMessageLongClicked(event: TimelineItem.Event) { @@ -569,7 +572,7 @@ internal fun MessagesViewPreview(@PreviewParameter(MessagesStateProvider::class) state = state, onBackPressed = {}, onRoomDetailsClicked = {}, - onEventClicked = {}, + onEventClicked = { false }, onPreviewAttachments = {}, onUserDataClicked = {}, onSendLocationClicked = {},