From 00169c7be217c579cb9df3a523453755920afbcb Mon Sep 17 00:00:00 2001 From: ganfra Date: Mon, 16 Dec 2024 20:32:17 +0100 Subject: [PATCH] knock requests : makes knock can be handled and is enabled --- features/knockrequests/impl/build.gradle.kts | 1 + .../impl/banner/KnockRequestsBannerPresenter.kt | 8 +++++++- .../roomdetails/impl/RoomDetailsPresenter.kt | 16 ++++++++++------ 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/features/knockrequests/impl/build.gradle.kts b/features/knockrequests/impl/build.gradle.kts index 83f7132320..b664a0a6b4 100644 --- a/features/knockrequests/impl/build.gradle.kts +++ b/features/knockrequests/impl/build.gradle.kts @@ -26,6 +26,7 @@ dependencies { implementation(projects.libraries.matrixui) implementation(projects.libraries.uiStrings) implementation(projects.libraries.designsystem) + implementation(projects.libraries.featureflag.api) testImplementation(libs.test.junit) testImplementation(libs.coroutines.test) 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 index c95fca6a5f..a1ad661b0c 100644 --- 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 @@ -19,7 +19,10 @@ import io.element.android.features.knockrequests.impl.data.KnockRequestsService import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.core.coroutine.mapState import io.element.android.libraries.core.extensions.firstIfSingle +import io.element.android.libraries.featureflag.api.FeatureFlagService +import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.matrix.api.room.MatrixRoom +import io.element.android.libraries.matrix.ui.room.canHandleKnockRequestsAsState import io.element.android.libraries.matrix.ui.room.canInviteAsState import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.CoroutineScope @@ -33,6 +36,7 @@ class KnockRequestsBannerPresenter @Inject constructor( private val room: MatrixRoom, private val knockRequestsService: KnockRequestsService, private val appCoroutineScope: CoroutineScope, + private val featureFlagService: FeatureFlagService, ) : Presenter { @Composable override fun present(): KnockRequestsBannerState { @@ -46,11 +50,13 @@ class KnockRequestsBannerPresenter @Inject constructor( val syncUpdateFlow = room.syncUpdateFlow.collectAsState() val canAccept by room.canInviteAsState(syncUpdateFlow.value) + val canHandleKnockRequests by room.canHandleKnockRequestsAsState(syncUpdateFlow.value) val showAcceptError = remember { mutableStateOf(false) } + val isKnockRequestsEnabled by featureFlagService.isFeatureEnabledFlow(FeatureFlags.Knock).collectAsState(false) val shouldShowBanner by remember { derivedStateOf { - knockRequests.isNotEmpty() + isKnockRequestsEnabled && canHandleKnockRequests && knockRequests.isNotEmpty() } } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt index d55f4e4f7d..0fc907a867 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt @@ -36,6 +36,7 @@ import io.element.android.libraries.matrix.api.room.MatrixRoomMembersState import io.element.android.libraries.matrix.api.room.RoomMember import io.element.android.libraries.matrix.api.room.StateEventType import io.element.android.libraries.matrix.api.room.isDm +import io.element.android.libraries.matrix.api.room.join.JoinRule import io.element.android.libraries.matrix.api.room.powerlevels.canInvite import io.element.android.libraries.matrix.api.room.powerlevels.canSendState import io.element.android.libraries.matrix.api.room.roomNotificationSettings @@ -47,7 +48,9 @@ import io.element.android.services.analytics.api.AnalyticsService import io.element.android.services.analyticsproviders.api.trackers.captureInteraction import kotlinx.collections.immutable.toPersistentList import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import javax.inject.Inject @@ -77,7 +80,7 @@ class RoomDetailsPresenter @Inject constructor( val roomName by remember { derivedStateOf { (roomInfo?.name ?: room.displayName).trim() } } val roomTopic by remember { derivedStateOf { roomInfo?.topic ?: room.topic } } val isFavorite by remember { derivedStateOf { roomInfo?.isFavorite.orFalse() } } - val isPublic by remember { derivedStateOf { roomInfo?.isPublic.orFalse() } } + val joinRule by remember { derivedStateOf { roomInfo?.joinRule } } val canShowPinnedMessages = isPinnedMessagesFeatureEnabled() var canShowMediaGallery by remember { mutableStateOf(false) } @@ -106,11 +109,9 @@ class RoomDetailsPresenter @Inject constructor( val roomType by getRoomType(dmMember, currentMember) val roomCallState = roomCallStatePresenter.present() - val canHandleKnockRequests by room.canHandleKnockRequestsAsState(syncUpdateFlow.value) val topicState = remember(canEditTopic, roomTopic, roomType) { val topic = roomTopic - when { !topic.isNullOrBlank() -> RoomTopicState.ExistingTopic(topic) canEditTopic && roomType is RoomDetailsType.Room -> RoomTopicState.CanAddTopic @@ -118,10 +119,13 @@ class RoomDetailsPresenter @Inject constructor( } } + val canHandleKnockRequests by room.canHandleKnockRequestsAsState(syncUpdateFlow.value) val isKnockRequestsEnabled by featureFlagService.isFeatureEnabledFlow(FeatureFlags.Knock).collectAsState(false) - val knockRequestsCount by remember { mutableStateOf(null) } + val knockRequestsCount by produceState(null) { + room.knockRequestsFlow.collect { value = it.size } + } val canShowKnockRequests by remember { - derivedStateOf { isKnockRequestsEnabled && canHandleKnockRequests } + derivedStateOf { isKnockRequestsEnabled && canHandleKnockRequests && joinRule == JoinRule.Knock } } val roomNotificationSettingsState by room.roomNotificationSettingsStateFlow.collectAsState() @@ -164,7 +168,7 @@ class RoomDetailsPresenter @Inject constructor( roomNotificationSettings = roomNotificationSettingsState.roomNotificationSettings(), isFavorite = isFavorite, displayRolesAndPermissionsSettings = !room.isDm && isUserAdmin, - isPublic = isPublic, + isPublic = joinRule == JoinRule.Public, heroes = roomInfo?.heroes.orEmpty().toPersistentList(), canShowPinnedMessages = canShowPinnedMessages, canShowMediaGallery = canShowMediaGallery,