Skip to content

Commit 1f99169

Browse files
committed
Sort action list item.
It will also ensure that the preview are closer to reality.
1 parent 9857868 commit 1f99169

File tree

4 files changed

+76
-34
lines changed

4 files changed

+76
-34
lines changed

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import dagger.assisted.AssistedInject
2121
import io.element.android.features.messages.api.pinned.IsPinnedMessagesFeatureEnabled
2222
import io.element.android.features.messages.impl.UserEventPermissions
2323
import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction
24+
import io.element.android.features.messages.impl.actionlist.model.TimelineItemActionComparator
2425
import io.element.android.features.messages.impl.actionlist.model.TimelineItemActionPostProcessor
2526
import io.element.android.features.messages.impl.crypto.sendfailure.VerifiedUserSendFailure
2627
import io.element.android.features.messages.impl.crypto.sendfailure.VerifiedUserSendFailureFactory
@@ -70,6 +71,8 @@ class DefaultActionListPresenter @AssistedInject constructor(
7071
override fun create(postProcessor: TimelineItemActionPostProcessor): DefaultActionListPresenter
7172
}
7273

74+
private val comparator = TimelineItemActionComparator()
75+
7376
@Composable
7477
override fun present(): ActionListState {
7578
val localCoroutineScope = rememberCoroutineScope()
@@ -137,7 +140,6 @@ class DefaultActionListPresenter @AssistedInject constructor(
137140
}
138141
}
139142

140-
// See order in https://www.figma.com/design/ux3tYoZV9WghC7hHT9Fhk0/Compound-iOS-Components?node-id=2946-2392
141143
private suspend fun buildActions(
142144
timelineItem: TimelineItem.Event,
143145
usersEventPermissions: UserEventPermissions,
@@ -146,7 +148,7 @@ class DefaultActionListPresenter @AssistedInject constructor(
146148
isEventPinned: Boolean,
147149
): List<TimelineItemAction> {
148150
val canRedact = timelineItem.isMine && usersEventPermissions.canRedactOwn || !timelineItem.isMine && usersEventPermissions.canRedactOther
149-
return buildList {
151+
return buildSet {
150152
if (timelineItem.canBeRepliedTo && usersEventPermissions.canSendMessage) {
151153
if (timelineItem.isThreaded) {
152154
add(TimelineItemAction.ReplyInThread)
@@ -202,14 +204,15 @@ class DefaultActionListPresenter @AssistedInject constructor(
202204
}
203205
}
204206
.postFilter(timelineItem.content)
207+
.sortedWith(comparator)
205208
.let(postProcessor::process)
206209
}
207210
}
208211

209212
/**
210213
* Post filter the actions based on the content of the event.
211214
*/
212-
private fun List<TimelineItemAction>.postFilter(content: TimelineItemEventContent): List<TimelineItemAction> {
215+
private fun Iterable<TimelineItemAction>.postFilter(content: TimelineItemEventContent): Iterable<TimelineItemAction> {
213216
return filter { action ->
214217
when (content) {
215218
is TimelineItemCallNotifyContent,

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

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ package io.element.android.features.messages.impl.actionlist
99

1010
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
1111
import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction
12+
import io.element.android.features.messages.impl.actionlist.model.TimelineItemActionComparator
1213
import io.element.android.features.messages.impl.crypto.sendfailure.VerifiedUserSendFailure
1314
import io.element.android.features.messages.impl.crypto.sendfailure.resolve.anUnsignedDeviceSendFailure
1415
import io.element.android.features.messages.impl.timeline.aTimelineItemEvent
@@ -22,7 +23,6 @@ import io.element.android.features.messages.impl.timeline.model.event.aTimelineI
2223
import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemVoiceContent
2324
import io.element.android.libraries.matrix.api.timeline.item.event.MessageShield
2425
import kotlinx.collections.immutable.ImmutableList
25-
import kotlinx.collections.immutable.persistentListOf
2626
import kotlinx.collections.immutable.toPersistentList
2727

2828
open class ActionListStateProvider : PreviewParameterProvider<ActionListState> {
@@ -175,7 +175,7 @@ fun anActionListState(
175175
fun aTimelineItemActionList(
176176
copyAction: TimelineItemAction? = TimelineItemAction.CopyText
177177
): ImmutableList<TimelineItemAction> {
178-
return listOfNotNull(
178+
return setOfNotNull(
179179
TimelineItemAction.Reply,
180180
TimelineItemAction.Forward,
181181
copyAction,
@@ -184,17 +184,19 @@ fun aTimelineItemActionList(
184184
TimelineItemAction.Redact,
185185
TimelineItemAction.ReportContent,
186186
TimelineItemAction.ViewSource,
187-
).toPersistentList()
187+
)
188+
.sortedWith(TimelineItemActionComparator())
189+
.toPersistentList()
188190
}
189191

190192
fun aTimelineItemPollActionList(): ImmutableList<TimelineItemAction> {
191-
return persistentListOf(
193+
return setOf(
192194
TimelineItemAction.EndPoll,
193195
TimelineItemAction.Reply,
194-
TimelineItemAction.CopyText,
196+
TimelineItemAction.Pin,
195197
TimelineItemAction.CopyLink,
196-
TimelineItemAction.ViewSource,
197-
TimelineItemAction.ReportContent,
198198
TimelineItemAction.Redact,
199199
)
200+
.sortedWith(TimelineItemActionComparator())
201+
.toPersistentList()
200202
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Copyright 2024 New Vector Ltd.
3+
*
4+
* SPDX-License-Identifier: AGPL-3.0-only
5+
* Please see LICENSE in the repository root for full details.
6+
*/
7+
8+
package io.element.android.features.messages.impl.actionlist.model
9+
10+
class TimelineItemActionComparator : Comparator<TimelineItemAction> {
11+
// See order in https://www.figma.com/design/ux3tYoZV9WghC7hHT9Fhk0/Compound-iOS-Components?node-id=2946-2392
12+
private val orderedList = listOf(
13+
TimelineItemAction.EndPoll,
14+
TimelineItemAction.ViewInTimeline,
15+
TimelineItemAction.Reply,
16+
TimelineItemAction.ReplyInThread,
17+
TimelineItemAction.Forward,
18+
TimelineItemAction.Pin,
19+
TimelineItemAction.Unpin,
20+
TimelineItemAction.CopyLink,
21+
TimelineItemAction.Edit,
22+
TimelineItemAction.CopyText,
23+
TimelineItemAction.AddCaption,
24+
TimelineItemAction.EditCaption,
25+
TimelineItemAction.CopyCaption,
26+
TimelineItemAction.RemoveCaption,
27+
TimelineItemAction.ViewSource,
28+
TimelineItemAction.ReportContent,
29+
TimelineItemAction.Redact,
30+
)
31+
32+
override fun compare(o1: TimelineItemAction, o2: TimelineItemAction): Int {
33+
val index1 = orderedList.indexOf(o1)
34+
val index2 = orderedList.indexOf(o2)
35+
return index1.compareTo(index2)
36+
}
37+
}

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

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,8 @@ class ActionListPresenterTest {
176176
TimelineItemAction.Reply,
177177
TimelineItemAction.Forward,
178178
TimelineItemAction.Pin,
179-
TimelineItemAction.CopyText,
180179
TimelineItemAction.CopyLink,
180+
TimelineItemAction.CopyText,
181181
TimelineItemAction.ViewSource,
182182
TimelineItemAction.ReportContent,
183183
)
@@ -221,8 +221,8 @@ class ActionListPresenterTest {
221221
TimelineItemAction.ReplyInThread,
222222
TimelineItemAction.Forward,
223223
TimelineItemAction.Pin,
224-
TimelineItemAction.CopyText,
225224
TimelineItemAction.CopyLink,
225+
TimelineItemAction.CopyText,
226226
TimelineItemAction.ViewSource,
227227
TimelineItemAction.ReportContent,
228228
)
@@ -268,8 +268,8 @@ class ActionListPresenterTest {
268268
actions = persistentListOf(
269269
TimelineItemAction.Forward,
270270
TimelineItemAction.Pin,
271-
TimelineItemAction.CopyText,
272271
TimelineItemAction.CopyLink,
272+
TimelineItemAction.CopyText,
273273
TimelineItemAction.ViewSource,
274274
TimelineItemAction.ReportContent,
275275
)
@@ -314,8 +314,8 @@ class ActionListPresenterTest {
314314
TimelineItemAction.Reply,
315315
TimelineItemAction.Forward,
316316
TimelineItemAction.Pin,
317-
TimelineItemAction.CopyText,
318317
TimelineItemAction.CopyLink,
318+
TimelineItemAction.CopyText,
319319
TimelineItemAction.ViewSource,
320320
TimelineItemAction.ReportContent,
321321
TimelineItemAction.Redact,
@@ -361,8 +361,8 @@ class ActionListPresenterTest {
361361
TimelineItemAction.Reply,
362362
TimelineItemAction.Forward,
363363
TimelineItemAction.Pin,
364-
TimelineItemAction.CopyText,
365364
TimelineItemAction.CopyLink,
365+
TimelineItemAction.CopyText,
366366
TimelineItemAction.ViewSource,
367367
TimelineItemAction.ReportContent,
368368
TimelineItemAction.Redact,
@@ -408,10 +408,10 @@ class ActionListPresenterTest {
408408
actions = persistentListOf(
409409
TimelineItemAction.Reply,
410410
TimelineItemAction.Forward,
411-
TimelineItemAction.Edit,
412411
TimelineItemAction.Pin,
413-
TimelineItemAction.CopyText,
414412
TimelineItemAction.CopyLink,
413+
TimelineItemAction.Edit,
414+
TimelineItemAction.CopyText,
415415
TimelineItemAction.ViewSource,
416416
TimelineItemAction.Redact,
417417
)
@@ -453,10 +453,10 @@ class ActionListPresenterTest {
453453
actions = persistentListOf(
454454
TimelineItemAction.ReplyInThread,
455455
TimelineItemAction.Forward,
456-
TimelineItemAction.Edit,
457456
TimelineItemAction.Pin,
458-
TimelineItemAction.CopyText,
459457
TimelineItemAction.CopyLink,
458+
TimelineItemAction.Edit,
459+
TimelineItemAction.CopyText,
460460
TimelineItemAction.ViewSource,
461461
TimelineItemAction.Redact,
462462
)
@@ -501,10 +501,10 @@ class ActionListPresenterTest {
501501
actions = persistentListOf(
502502
TimelineItemAction.Reply,
503503
TimelineItemAction.Forward,
504-
TimelineItemAction.Edit,
505504
TimelineItemAction.Pin,
506-
TimelineItemAction.CopyText,
507505
TimelineItemAction.CopyLink,
506+
TimelineItemAction.Edit,
507+
TimelineItemAction.CopyText,
508508
TimelineItemAction.ViewSource,
509509
)
510510
)
@@ -547,9 +547,9 @@ class ActionListPresenterTest {
547547
actions = persistentListOf(
548548
TimelineItemAction.Reply,
549549
TimelineItemAction.Forward,
550-
TimelineItemAction.AddCaption,
551550
TimelineItemAction.Pin,
552551
TimelineItemAction.CopyLink,
552+
TimelineItemAction.AddCaption,
553553
TimelineItemAction.ViewSource,
554554
TimelineItemAction.Redact,
555555
)
@@ -646,11 +646,11 @@ class ActionListPresenterTest {
646646
actions = persistentListOf(
647647
TimelineItemAction.Reply,
648648
TimelineItemAction.Forward,
649+
TimelineItemAction.Pin,
650+
TimelineItemAction.CopyLink,
649651
TimelineItemAction.EditCaption,
650652
TimelineItemAction.CopyCaption,
651653
TimelineItemAction.RemoveCaption,
652-
TimelineItemAction.Pin,
653-
TimelineItemAction.CopyLink,
654654
TimelineItemAction.ViewSource,
655655
TimelineItemAction.Redact,
656656
)
@@ -696,11 +696,11 @@ class ActionListPresenterTest {
696696
actions = persistentListOf(
697697
TimelineItemAction.Reply,
698698
TimelineItemAction.Forward,
699-
TimelineItemAction.CopyCaption,
700699
TimelineItemAction.Pin,
701700
TimelineItemAction.CopyLink,
701+
TimelineItemAction.CopyCaption,
702702
TimelineItemAction.ViewSource,
703-
TimelineItemAction.Redact,
703+
TimelineItemAction.ReportContent,
704704
)
705705
)
706706
)
@@ -813,10 +813,10 @@ class ActionListPresenterTest {
813813
actions = persistentListOf(
814814
TimelineItemAction.Reply,
815815
TimelineItemAction.Forward,
816-
TimelineItemAction.Edit,
817816
TimelineItemAction.Pin,
818-
TimelineItemAction.CopyText,
819817
TimelineItemAction.CopyLink,
818+
TimelineItemAction.Edit,
819+
TimelineItemAction.CopyText,
820820
TimelineItemAction.Redact,
821821
)
822822
)
@@ -860,9 +860,9 @@ class ActionListPresenterTest {
860860
actions = persistentListOf(
861861
TimelineItemAction.Reply,
862862
TimelineItemAction.Forward,
863+
TimelineItemAction.CopyLink,
863864
TimelineItemAction.Edit,
864865
TimelineItemAction.CopyText,
865-
TimelineItemAction.CopyLink,
866866
TimelineItemAction.ViewSource,
867867
TimelineItemAction.Redact,
868868
)
@@ -914,10 +914,10 @@ class ActionListPresenterTest {
914914
actions = persistentListOf(
915915
TimelineItemAction.Reply,
916916
TimelineItemAction.Forward,
917-
TimelineItemAction.Edit,
918917
TimelineItemAction.Unpin,
919-
TimelineItemAction.CopyText,
920918
TimelineItemAction.CopyLink,
919+
TimelineItemAction.Edit,
920+
TimelineItemAction.CopyText,
921921
TimelineItemAction.ViewSource,
922922
TimelineItemAction.Redact,
923923
)
@@ -1049,11 +1049,11 @@ class ActionListPresenterTest {
10491049
displayEmojiReactions = true,
10501050
verifiedUserSendFailure = VerifiedUserSendFailure.None,
10511051
actions = persistentListOf(
1052-
TimelineItemAction.Reply,
1053-
TimelineItemAction.Edit,
10541052
TimelineItemAction.EndPoll,
1053+
TimelineItemAction.Reply,
10551054
TimelineItemAction.Pin,
10561055
TimelineItemAction.CopyLink,
1056+
TimelineItemAction.Edit,
10571057
TimelineItemAction.Redact,
10581058
)
10591059
)
@@ -1092,8 +1092,8 @@ class ActionListPresenterTest {
10921092
displayEmojiReactions = true,
10931093
verifiedUserSendFailure = VerifiedUserSendFailure.None,
10941094
actions = persistentListOf(
1095-
TimelineItemAction.Reply,
10961095
TimelineItemAction.EndPoll,
1096+
TimelineItemAction.Reply,
10971097
TimelineItemAction.Pin,
10981098
TimelineItemAction.CopyLink,
10991099
TimelineItemAction.Redact,

0 commit comments

Comments
 (0)