Skip to content

Commit c9a89c7

Browse files
committed
Pinned event: add action on timeline
1 parent 0149007 commit c9a89c7

File tree

8 files changed

+26
-3
lines changed

8 files changed

+26
-3
lines changed

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,7 @@ class MessagesPresenter @AssistedInject constructor(
245245
canRedactOwn = userHasPermissionToRedactOwn,
246246
canRedactOther = userHasPermissionToRedactOther,
247247
canSendReaction = userHasPermissionToSendReaction,
248+
canPin = false,
248249
)
249250
}
250251
}
@@ -283,6 +284,7 @@ class MessagesPresenter @AssistedInject constructor(
283284
TimelineItemAction.Forward -> handleForwardAction(targetEvent)
284285
TimelineItemAction.ReportContent -> handleReportAction(targetEvent)
285286
TimelineItemAction.EndPoll -> handleEndPollAction(targetEvent, timelineState)
287+
TimelineItemAction.Pin -> Timber.d("Pin action not implemented")
286288
}
287289
}
288290

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,11 +144,13 @@ fun aUserEventPermissions(
144144
canRedactOther: Boolean = false,
145145
canSendMessage: Boolean = true,
146146
canSendReaction: Boolean = true,
147+
canPin: Boolean = false,
147148
) = UserEventPermissions(
148149
canRedactOwn = canRedactOwn,
149150
canRedactOther = canRedactOther,
150151
canSendMessage = canSendMessage,
151152
canSendReaction = canSendReaction,
153+
canPin = canPin,
152154
)
153155

154156
fun aReactionSummaryState(

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/UserEventPermissions.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,5 @@ data class UserEventPermissions(
2525
val canRedactOther: Boolean,
2626
val canSendMessage: Boolean,
2727
val canSendReaction: Boolean,
28+
val canPin: Boolean,
2829
)

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenter.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ import io.element.android.features.messages.impl.timeline.model.event.canBeCopie
3636
import io.element.android.features.messages.impl.timeline.model.event.canBeForwarded
3737
import io.element.android.features.messages.impl.timeline.model.event.canReact
3838
import io.element.android.libraries.architecture.Presenter
39+
import io.element.android.libraries.featureflag.api.FeatureFlagService
40+
import io.element.android.libraries.featureflag.api.FeatureFlags
3941
import io.element.android.libraries.preferences.api.store.AppPreferencesStore
4042
import kotlinx.collections.immutable.toImmutableList
4143
import kotlinx.coroutines.CoroutineScope
@@ -44,6 +46,7 @@ import javax.inject.Inject
4446

4547
class ActionListPresenter @Inject constructor(
4648
private val appPreferencesStore: AppPreferencesStore,
49+
private val featureFlagsService: FeatureFlagService,
4750
) : Presenter<ActionListState> {
4851
@Composable
4952
override fun present(): ActionListState {
@@ -54,6 +57,7 @@ class ActionListPresenter @Inject constructor(
5457
}
5558

5659
val isDeveloperModeEnabled by appPreferencesStore.isDeveloperModeEnabledFlow().collectAsState(initial = false)
60+
val isPinnedEventsEnabled by featureFlagsService.isFeatureEnabledFlow(FeatureFlags.PinnedEvents).collectAsState(initial = false)
5761

5862
fun handleEvents(event: ActionListEvents) {
5963
when (event) {
@@ -62,6 +66,7 @@ class ActionListPresenter @Inject constructor(
6266
timelineItem = event.event,
6367
usersEventPermissions = event.userEventPermissions,
6468
isDeveloperModeEnabled = isDeveloperModeEnabled,
69+
isPinnedEventsEnabled = isPinnedEventsEnabled,
6570
target = target,
6671
)
6772
}
@@ -77,6 +82,7 @@ class ActionListPresenter @Inject constructor(
7782
timelineItem: TimelineItem.Event,
7883
usersEventPermissions: UserEventPermissions,
7984
isDeveloperModeEnabled: Boolean,
85+
isPinnedEventsEnabled: Boolean,
8086
target: MutableState<ActionListState.Target>
8187
) = launch {
8288
target.value = ActionListState.Target.Loading(timelineItem)
@@ -85,6 +91,7 @@ class ActionListPresenter @Inject constructor(
8591
timelineItem = timelineItem,
8692
usersEventPermissions = usersEventPermissions,
8793
isDeveloperModeEnabled = isDeveloperModeEnabled,
94+
isPinnedEventsEnabled = isPinnedEventsEnabled,
8895
)
8996
val displayEmojiReactions = usersEventPermissions.canSendReaction &&
9097
timelineItem.isRemote &&
@@ -105,6 +112,7 @@ private fun buildActions(
105112
timelineItem: TimelineItem.Event,
106113
usersEventPermissions: UserEventPermissions,
107114
isDeveloperModeEnabled: Boolean,
115+
isPinnedEventsEnabled: Boolean,
108116
): List<TimelineItemAction> {
109117
val canRedact = timelineItem.isMine && usersEventPermissions.canRedactOwn || !timelineItem.isMine && usersEventPermissions.canRedactOther
110118
return buildList {
@@ -124,6 +132,11 @@ private fun buildActions(
124132
if (canRedact && timelineItem.content is TimelineItemPollContent && !timelineItem.content.isEnded) {
125133
add(TimelineItemAction.EndPoll)
126134
}
135+
// TODO: handle unpin
136+
val canPin = isPinnedEventsEnabled && usersEventPermissions.canPin && timelineItem.isRemote
137+
if (canPin) {
138+
add(TimelineItemAction.Pin)
139+
}
127140
if (timelineItem.content.canBeCopied()) {
128141
add(TimelineItemAction.Copy)
129142
}

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/model/TimelineItemAction.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,5 @@ sealed class TimelineItemAction(
3939
data object ViewSource : TimelineItemAction(CommonStrings.action_view_source, CommonDrawables.ic_developer_options)
4040
data object ReportContent : TimelineItemAction(CommonStrings.action_report_content, CompoundDrawables.ic_compound_chat_problem, destructive = true)
4141
data object EndPoll : TimelineItemAction(CommonStrings.action_end_poll, CompoundDrawables.ic_compound_polls_end)
42+
data object Pin : TimelineItemAction(CommonStrings.action_pin, CompoundDrawables.ic_compound_pin)
4243
}

features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -958,7 +958,8 @@ class MessagesPresenterTest {
958958
return timelinePresenter
959959
}
960960
}
961-
val actionListPresenter = ActionListPresenter(appPreferencesStore = appPreferencesStore)
961+
val featureFlagService = FakeFeatureFlagService()
962+
val actionListPresenter = ActionListPresenter(appPreferencesStore = appPreferencesStore, featureFlagsService = featureFlagService)
962963
val typingNotificationPresenter = TypingNotificationPresenter(
963964
room = matrixRoom,
964965
sessionPreferencesStore = sessionPreferencesStore,
@@ -981,7 +982,7 @@ class MessagesPresenterTest {
981982
snackbarDispatcher = SnackbarDispatcher(),
982983
navigator = navigator,
983984
clipboardHelper = clipboardHelper,
984-
featureFlagsService = FakeFeatureFlagService(),
985+
featureFlagsService = featureFlagService,
985986
buildMeta = aBuildMeta(),
986987
dispatchers = coroutineDispatchers,
987988
htmlConverterProvider = FakeHtmlConverterProvider(),

features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ class MessagesViewTest {
169169
userHasPermissionToRedactOwn: Boolean = false,
170170
userHasPermissionToRedactOther: Boolean = false,
171171
userHasPermissionToSendReaction: Boolean = false,
172+
userCanPinEvent: Boolean = false,
172173
) {
173174
val eventsRecorder = EventsRecorder<ActionListEvents>()
174175
val state = aMessagesState(
@@ -180,6 +181,7 @@ class MessagesViewTest {
180181
canRedactOwn = userHasPermissionToRedactOwn,
181182
canRedactOther = userHasPermissionToRedactOther,
182183
canSendReaction = userHasPermissionToSendReaction,
184+
canPin = userCanPinEvent,
183185
),
184186
)
185187
val timelineItem = state.timelineState.timelineItems.first() as TimelineItem.Event

features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenterTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -835,5 +835,6 @@ class ActionListPresenterTest {
835835

836836
private fun createActionListPresenter(isDeveloperModeEnabled: Boolean): ActionListPresenter {
837837
val preferencesStore = InMemoryAppPreferencesStore(isDeveloperModeEnabled = isDeveloperModeEnabled)
838-
return ActionListPresenter(appPreferencesStore = preferencesStore)
838+
val featureFlagsService = FakeFeatureFlagService()
839+
return ActionListPresenter(appPreferencesStore = preferencesStore, featureFlagsService = featureFlagsService)
839840
}

0 commit comments

Comments
 (0)