From e001fee6496b1891c0b1fd2152ad395bbd5a8760 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 6 Dec 2024 16:31:24 +0100 Subject: [PATCH] knock requests : branch banner in room --- features/knockrequests/api/build.gradle.kts | 2 +- .../api/banner/KnockRequestsBannerRenderer.kt | 16 ++++++++++ .../DefaultKnockRequestsBannerRenderer.kt | 32 +++++++++++++++++++ .../banner/KnockRequestsBannerPresenter.kt | 19 +++++++++++ features/messages/impl/build.gradle.kts | 1 + .../messages/impl/MessagesFlowNode.kt | 12 +++++++ .../features/messages/impl/MessagesNode.kt | 13 ++++++++ .../features/messages/impl/MessagesView.kt | 7 ++++ .../MessagesViewWithIdentityChangePreview.kt | 2 ++ .../messages/impl/MessagesViewTest.kt | 1 + 10 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 features/knockrequests/api/src/main/kotlin/io/element/android/features/knockrequests/api/banner/KnockRequestsBannerRenderer.kt create mode 100644 features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/DefaultKnockRequestsBannerRenderer.kt create mode 100644 features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerPresenter.kt diff --git a/features/knockrequests/api/build.gradle.kts b/features/knockrequests/api/build.gradle.kts index 90bcb6e568..c3eca7567c 100644 --- a/features/knockrequests/api/build.gradle.kts +++ b/features/knockrequests/api/build.gradle.kts @@ -6,7 +6,7 @@ */ plugins { - id("io.element.android-library") + id("io.element.android-compose-library") } android { diff --git a/features/knockrequests/api/src/main/kotlin/io/element/android/features/knockrequests/api/banner/KnockRequestsBannerRenderer.kt b/features/knockrequests/api/src/main/kotlin/io/element/android/features/knockrequests/api/banner/KnockRequestsBannerRenderer.kt new file mode 100644 index 0000000000..86483aee70 --- /dev/null +++ b/features/knockrequests/api/src/main/kotlin/io/element/android/features/knockrequests/api/banner/KnockRequestsBannerRenderer.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only + * Please see LICENSE in the repository root for full details. + */ + +package io.element.android.features.knockrequests.api.banner + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier + +interface KnockRequestsBannerRenderer { + @Composable + fun View(modifier: Modifier, onViewRequestsClick: () -> Unit) +} diff --git a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/DefaultKnockRequestsBannerRenderer.kt b/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/DefaultKnockRequestsBannerRenderer.kt new file mode 100644 index 0000000000..f77dd1fa91 --- /dev/null +++ b/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/DefaultKnockRequestsBannerRenderer.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only + * Please see LICENSE in the repository root for full details. + */ + +package io.element.android.features.knockrequests.impl.banner + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.features.knockrequests.api.banner.KnockRequestsBannerRenderer +import io.element.android.libraries.di.RoomScope +import javax.inject.Inject + +@ContributesBinding(RoomScope::class) +class DefaultKnockRequestsBannerRenderer @Inject constructor( + private val presenter: KnockRequestsBannerPresenter, +): KnockRequestsBannerRenderer { + + @Composable + override fun View(modifier: Modifier, onViewRequestsClick: () -> Unit) { + val state = presenter.present() + KnockRequestsBannerView( + state = state, + onDismissClick = {}, + onViewRequestsClick = onViewRequestsClick, + ) + } + +} diff --git a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerPresenter.kt b/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerPresenter.kt new file mode 100644 index 0000000000..3c6d0a4066 --- /dev/null +++ b/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerPresenter.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only + * Please see LICENSE in the repository root for full details. + */ + +package io.element.android.features.knockrequests.impl.banner + +import androidx.compose.runtime.Composable +import io.element.android.libraries.architecture.Presenter +import javax.inject.Inject + +class KnockRequestsBannerPresenter @Inject constructor(): Presenter { + @Composable + override fun present(): KnockRequestsBannerState { + return KnockRequestsBannerState.Hidden + } +} diff --git a/features/messages/impl/build.gradle.kts b/features/messages/impl/build.gradle.kts index 824e8c1692..e87d90cbdf 100644 --- a/features/messages/impl/build.gradle.kts +++ b/features/messages/impl/build.gradle.kts @@ -65,6 +65,7 @@ dependencies { implementation(libs.vanniktech.blurhash) implementation(libs.telephoto.zoomableimage) implementation(libs.matrix.emojibase.bindings) + implementation(projects.features.knockrequests.api) testImplementation(libs.test.junit) testImplementation(libs.coroutines.test) 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 8cbb7b6d74..27b219fc1c 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 @@ -26,6 +26,7 @@ import im.vector.app.features.analytics.plan.Interaction import io.element.android.anvilannotations.ContributesNode import io.element.android.features.call.api.CallType import io.element.android.features.call.api.ElementCallEntryPoint +import io.element.android.features.knockrequests.api.list.KnockRequestsListEntryPoint import io.element.android.features.location.api.Location import io.element.android.features.location.api.SendLocationEntryPoint import io.element.android.features.location.api.ShowLocationEntryPoint @@ -95,6 +96,7 @@ class MessagesFlowNode @AssistedInject constructor( private val mentionSpanTheme: MentionSpanTheme, private val pinnedEventsTimelineProvider: PinnedEventsTimelineProvider, private val timelineController: TimelineController, + private val knockRequestsListEntryPoint: KnockRequestsListEntryPoint, ) : BaseFlowNode( backstack = BackStack( initialElement = plugins.filterIsInstance().first().initialTarget.toNavTarget(), @@ -146,6 +148,9 @@ class MessagesFlowNode @AssistedInject constructor( @Parcelize data object PinnedMessagesList : NavTarget + + @Parcelize + data object KnockRequestsList : NavTarget } private val callbacks = plugins() @@ -226,6 +231,10 @@ class MessagesFlowNode @AssistedInject constructor( override fun onViewAllPinnedEvents() { backstack.push(NavTarget.PinnedMessagesList) } + + override fun onViewKnockRequests() { + backstack.push(NavTarget.KnockRequestsList) + } } val inputs = MessagesNode.Inputs(focusedEventId = navTarget.focusedEventId) createNode(buildContext, listOf(callback, inputs)) @@ -326,6 +335,9 @@ class MessagesFlowNode @AssistedInject constructor( NavTarget.Empty -> { node(buildContext) {} } + NavTarget.KnockRequestsList -> { + knockRequestsListEntryPoint.createNode(this, buildContext) + } } } 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 7d5bad4d63..0658309e52 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 @@ -28,6 +28,7 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedInject import io.element.android.anvilannotations.ContributesNode import io.element.android.compound.theme.ElementTheme +import io.element.android.features.knockrequests.api.banner.KnockRequestsBannerRenderer import io.element.android.features.messages.impl.actionlist.ActionListPresenter import io.element.android.features.messages.impl.actionlist.model.TimelineItemActionPostProcessor import io.element.android.features.messages.impl.attachments.Attachment @@ -71,6 +72,7 @@ class MessagesNode @AssistedInject constructor( private val timelineItemPresenterFactories: TimelineItemPresenterFactories, private val mediaPlayer: MediaPlayer, private val permalinkParser: PermalinkParser, + private val knockRequestsBannerRenderer: KnockRequestsBannerRenderer ) : Node(buildContext, plugins = plugins), MessagesNavigator { private val presenter = presenterFactory.create( navigator = this, @@ -98,6 +100,7 @@ class MessagesNode @AssistedInject constructor( fun onEditPollClick(eventId: EventId) fun onJoinCallClick(roomId: RoomId) fun onViewAllPinnedEvents() + fun onViewKnockRequests() } override fun onBuilt() { @@ -206,6 +209,10 @@ class MessagesNode @AssistedInject constructor( callbacks.forEach { it.onJoinCallClick(room.roomId) } } + private fun onViewKnockRequestsClick() { + callbacks.forEach { it.onViewKnockRequests() } + } + @Composable override fun View(modifier: Modifier) { val activity = LocalContext.current as Activity @@ -231,6 +238,12 @@ class MessagesNode @AssistedInject constructor( onCreatePollClick = this::onCreatePollClick, onJoinCallClick = this::onJoinCallClick, onViewAllPinnedMessagesClick = this::onViewAllPinnedMessagesClick, + knockRequestsBanner = { modifier -> + knockRequestsBannerRenderer.View( + modifier = modifier, + onViewRequestsClick = this::onViewKnockRequestsClick + ) + }, modifier = modifier, ) 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 47e4721f7f..28ebc2a7b4 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 @@ -118,6 +118,7 @@ fun MessagesView( onViewAllPinnedMessagesClick: () -> Unit, modifier: Modifier = Modifier, forceJumpToBottomVisibility: Boolean = false, + knockRequestsBanner: @Composable (Modifier) -> Unit, ) { OnLifecycleEvent { _, event -> state.voiceMessageComposerState.eventSink(VoiceMessageComposerEvents.LifecycleEvent(event)) @@ -215,6 +216,7 @@ fun MessagesView( forceJumpToBottomVisibility = forceJumpToBottomVisibility, onJoinCallClick = onJoinCallClick, onViewAllPinnedMessagesClick = onViewAllPinnedMessagesClick, + knockRequestsBanner = knockRequestsBanner, ) }, snackbarHost = { @@ -284,6 +286,7 @@ private fun MessagesViewContent( forceJumpToBottomVisibility: Boolean, onSwipeToReply: (TimelineItem.Event) -> Unit, modifier: Modifier = Modifier, + knockRequestsBanner: @Composable (Modifier) -> Unit, ) { Box( modifier = modifier @@ -372,6 +375,9 @@ private fun MessagesViewContent( onViewAllClick = onViewAllPinnedMessagesClick, ) } + Box(modifier = Modifier.padding(all = 16.dp)) { + knockRequestsBanner(Modifier) + } } }, sheetContent = { subcomposing: Boolean -> @@ -539,5 +545,6 @@ internal fun MessagesViewPreview(@PreviewParameter(MessagesStateProvider::class) onJoinCallClick = {}, onViewAllPinnedMessagesClick = { }, forceJumpToBottomVisibility = true, + knockRequestsBanner = {}, ) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/MessagesViewWithIdentityChangePreview.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/MessagesViewWithIdentityChangePreview.kt index 34c58bdb06..a659ce3c15 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/MessagesViewWithIdentityChangePreview.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/MessagesViewWithIdentityChangePreview.kt @@ -40,5 +40,7 @@ internal fun MessagesViewWithIdentityChangePreview( onCreatePollClick = {}, onJoinCallClick = {}, onViewAllPinnedMessagesClick = {}, + knockRequestsBanner = {} + ) } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt index 1d4e1a43b3..dc68f76ee6 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt @@ -533,6 +533,7 @@ private fun AndroidComposeTestRule.setMessa onCreatePollClick = onCreatePollClick, onJoinCallClick = onJoinCallClick, onViewAllPinnedMessagesClick = onViewAllPinnedMessagesClick, + knockRequestsBanner = {} ) } }