Skip to content

Commit a08f5ef

Browse files
authored
Merge branch 'develop' into renovate/io.nlopez.compose.rules-detekt-0.x
2 parents 85148f7 + b4afc32 commit a08f5ef

File tree

12 files changed

+120
-46
lines changed

12 files changed

+120
-46
lines changed

.github/workflows/sync-localazy.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ jobs:
3636
./tools/localazy/importSupportedLocalesFromLocalazy.py
3737
./tools/test/generateAllScreenshots.py
3838
- name: Create Pull Request for Strings
39-
uses: peter-evans/create-pull-request@v6
39+
uses: peter-evans/create-pull-request@v7
4040
with:
4141
token: ${{ secrets.DANGER_GITHUB_API_TOKEN }}
4242
commit-message: Sync Strings from Localazy

.github/workflows/sync-sas-strings.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323
- name: Run SAS String script
2424
run: ./tools/sas/import_sas_strings.py
2525
- name: Create Pull Request for SAS Strings
26-
uses: peter-evans/create-pull-request@v6
26+
uses: peter-evans/create-pull-request@v7
2727
with:
2828
commit-message: Sync SAS Strings
2929
title: Sync SAS Strings

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenter.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import io.element.android.features.messages.impl.actionlist.model.TimelineItemAc
2626
import io.element.android.features.messages.impl.pinned.PinnedEventsTimelineProvider
2727
import io.element.android.features.messages.impl.timeline.TimelineRoomInfo
2828
import io.element.android.features.messages.impl.timeline.factories.TimelineItemsFactory
29+
import io.element.android.features.messages.impl.timeline.factories.TimelineItemsFactoryConfig
2930
import io.element.android.features.messages.impl.timeline.model.TimelineItem
3031
import io.element.android.libraries.architecture.AsyncData
3132
import io.element.android.libraries.architecture.Presenter
@@ -54,7 +55,7 @@ import kotlin.time.Duration.Companion.milliseconds
5455
class PinnedMessagesListPresenter @AssistedInject constructor(
5556
@Assisted private val navigator: PinnedMessagesListNavigator,
5657
private val room: MatrixRoom,
57-
private val timelineItemsFactory: TimelineItemsFactory,
58+
timelineItemsFactoryCreator: TimelineItemsFactory.Creator,
5859
private val timelineProvider: PinnedEventsTimelineProvider,
5960
private val snackbarDispatcher: SnackbarDispatcher,
6061
actionListPresenterFactory: ActionListPresenter.Factory,
@@ -65,6 +66,12 @@ class PinnedMessagesListPresenter @AssistedInject constructor(
6566
fun create(navigator: PinnedMessagesListNavigator): PinnedMessagesListPresenter
6667
}
6768

69+
private val timelineItemsFactory: TimelineItemsFactory = timelineItemsFactoryCreator.create(
70+
config = TimelineItemsFactoryConfig(
71+
computeReadReceipts = false,
72+
computeReactions = false,
73+
)
74+
)
6875
private val actionListPresenter = actionListPresenterFactory.create(PinnedMessagesListTimelineActionPostProcessor())
6976

7077
@Composable

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import dagger.assisted.AssistedFactory
2222
import dagger.assisted.AssistedInject
2323
import io.element.android.features.messages.impl.MessagesNavigator
2424
import io.element.android.features.messages.impl.timeline.factories.TimelineItemsFactory
25+
import io.element.android.features.messages.impl.timeline.factories.TimelineItemsFactoryConfig
2526
import io.element.android.features.messages.impl.timeline.model.NewEventState
2627
import io.element.android.features.messages.impl.timeline.model.TimelineItem
2728
import io.element.android.features.messages.impl.voicemessages.timeline.RedactedVoiceMessageManager
@@ -54,7 +55,7 @@ import kotlinx.coroutines.withContext
5455
const val FOCUS_ON_PINNED_EVENT_DEBOUNCE_DURATION_IN_MILLIS = 200L
5556

5657
class TimelinePresenter @AssistedInject constructor(
57-
private val timelineItemsFactory: TimelineItemsFactory,
58+
timelineItemsFactoryCreator: TimelineItemsFactory.Creator,
5859
private val timelineItemIndexer: TimelineItemIndexer,
5960
private val room: MatrixRoom,
6061
private val dispatchers: CoroutineDispatchers,
@@ -71,6 +72,13 @@ class TimelinePresenter @AssistedInject constructor(
7172
fun create(navigator: MessagesNavigator): TimelinePresenter
7273
}
7374

75+
private val timelineItemsFactory: TimelineItemsFactory = timelineItemsFactoryCreator.create(
76+
config = TimelineItemsFactoryConfig(
77+
computeReadReceipts = true,
78+
computeReactions = true,
79+
)
80+
)
81+
7482
@Composable
7583
override fun present(): TimelineState {
7684
val localScope = rememberCoroutineScope()

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/TimelineItemsFactory.kt

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77

88
package io.element.android.features.messages.impl.timeline.factories
99

10+
import dagger.assisted.Assisted
11+
import dagger.assisted.AssistedFactory
12+
import dagger.assisted.AssistedInject
1013
import io.element.android.features.messages.impl.timeline.TimelineItemIndexer
1114
import io.element.android.features.messages.impl.timeline.diff.TimelineItemsCacheInvalidator
1215
import io.element.android.features.messages.impl.timeline.factories.event.TimelineItemEventFactory
@@ -26,15 +29,21 @@ import kotlinx.coroutines.flow.distinctUntilChanged
2629
import kotlinx.coroutines.sync.Mutex
2730
import kotlinx.coroutines.sync.withLock
2831
import kotlinx.coroutines.withContext
29-
import javax.inject.Inject
3032

31-
class TimelineItemsFactory @Inject constructor(
33+
class TimelineItemsFactory @AssistedInject constructor(
34+
@Assisted config: TimelineItemsFactoryConfig,
35+
eventItemFactoryCreator: TimelineItemEventFactory.Creator,
3236
private val dispatchers: CoroutineDispatchers,
33-
private val eventItemFactory: TimelineItemEventFactory,
3437
private val virtualItemFactory: TimelineItemVirtualFactory,
3538
private val timelineItemGrouper: TimelineItemGrouper,
3639
private val timelineItemIndexer: TimelineItemIndexer,
3740
) {
41+
@AssistedFactory
42+
interface Creator {
43+
fun create(config: TimelineItemsFactoryConfig): TimelineItemsFactory
44+
}
45+
46+
private val eventItemFactory = eventItemFactoryCreator.create(config)
3847
private val _timelineItems = MutableSharedFlow<ImmutableList<TimelineItem>>(replay = 1)
3948
private val lock = Mutex()
4049
private val diffCache = MutableListDiffCache<TimelineItem>()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
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.timeline.factories
9+
10+
/**
11+
* Some data used to configure the creation of timeline items.
12+
* @param computeReadReceipts when false, read receipts will be empty.
13+
* @param computeReactions when false, reactions will be empty.
14+
*/
15+
data class TimelineItemsFactoryConfig(
16+
val computeReadReceipts: Boolean,
17+
val computeReactions: Boolean,
18+
)

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemEventFactory.kt

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77

88
package io.element.android.features.messages.impl.timeline.factories.event
99

10+
import dagger.assisted.Assisted
11+
import dagger.assisted.AssistedFactory
12+
import dagger.assisted.AssistedInject
13+
import io.element.android.features.messages.impl.timeline.factories.TimelineItemsFactoryConfig
1014
import io.element.android.features.messages.impl.timeline.groups.canBeDisplayedInBubbleBlock
1115
import io.element.android.features.messages.impl.timeline.model.AggregatedReaction
1216
import io.element.android.features.messages.impl.timeline.model.AggregatedReactionSender
@@ -26,17 +30,23 @@ import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem
2630
import io.element.android.libraries.matrix.api.timeline.item.event.getAvatarUrl
2731
import io.element.android.libraries.matrix.api.timeline.item.event.getDisambiguatedDisplayName
2832
import io.element.android.libraries.matrix.ui.messages.reply.map
33+
import kotlinx.collections.immutable.persistentListOf
2934
import kotlinx.collections.immutable.toImmutableList
3035
import java.text.DateFormat
3136
import java.util.Date
32-
import javax.inject.Inject
3337

34-
class TimelineItemEventFactory @Inject constructor(
38+
class TimelineItemEventFactory @AssistedInject constructor(
39+
@Assisted private val config: TimelineItemsFactoryConfig,
3540
private val contentFactory: TimelineItemContentFactory,
3641
private val matrixClient: MatrixClient,
3742
private val lastMessageTimestampFormatter: LastMessageTimestampFormatter,
3843
private val permalinkParser: PermalinkParser,
3944
) {
45+
@AssistedFactory
46+
interface Creator {
47+
fun create(config: TimelineItemsFactoryConfig): TimelineItemEventFactory
48+
}
49+
4050
suspend fun create(
4151
currentTimelineItem: MatrixTimelineItem.Event,
4252
index: Int,
@@ -92,8 +102,11 @@ class TimelineItemEventFactory @Inject constructor(
92102
}
93103

94104
private fun MatrixTimelineItem.Event.computeReactionsState(): TimelineItemReactions {
105+
if (!config.computeReactions) {
106+
return TimelineItemReactions(reactions = persistentListOf())
107+
}
95108
val timeFormatter = DateFormat.getTimeInstance(DateFormat.SHORT)
96-
var aggregatedReactions = event.reactions.map { reaction ->
109+
var aggregatedReactions = this.event.reactions.map { reaction ->
97110
// Sort reactions within an aggregation by timestamp descending.
98111
// This puts the most recent at the top, useful in cases like the
99112
// reaction summary view or getting the most recent reaction.
@@ -129,6 +142,9 @@ class TimelineItemEventFactory @Inject constructor(
129142
private fun MatrixTimelineItem.Event.computeReadReceiptState(
130143
roomMembers: List<RoomMember>,
131144
): TimelineItemReadReceipts {
145+
if (!config.computeReadReceipts) {
146+
return TimelineItemReadReceipts(receipts = persistentListOf())
147+
}
132148
return TimelineItemReadReceipts(
133149
receipts = event.receipts
134150
.map { receipt ->

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import io.element.android.features.messages.impl.actionlist.FakeActionListPresen
1818
import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction
1919
import io.element.android.features.messages.impl.draft.FakeComposerDraftService
2020
import io.element.android.features.messages.impl.fixtures.aMessageEvent
21-
import io.element.android.features.messages.impl.fixtures.aTimelineItemsFactory
21+
import io.element.android.features.messages.impl.fixtures.aTimelineItemsFactoryCreator
2222
import io.element.android.features.messages.impl.messagecomposer.DefaultMessageComposerContext
2323
import io.element.android.features.messages.impl.messagecomposer.FakeRoomAliasSuggestionsDataSource
2424
import io.element.android.features.messages.impl.messagecomposer.MessageComposerPresenter
@@ -1024,7 +1024,7 @@ class MessagesPresenterTest {
10241024
permissionsPresenterFactory,
10251025
)
10261026
val timelinePresenter = TimelinePresenter(
1027-
timelineItemsFactory = aTimelineItemsFactory(),
1027+
timelineItemsFactoryCreator = aTimelineItemsFactoryCreator(),
10281028
room = matrixRoom,
10291029
dispatchers = coroutineDispatchers,
10301030
appScope = this,

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

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

1010
import io.element.android.features.messages.impl.timeline.TimelineItemIndexer
1111
import io.element.android.features.messages.impl.timeline.factories.TimelineItemsFactory
12+
import io.element.android.features.messages.impl.timeline.factories.TimelineItemsFactoryConfig
1213
import io.element.android.features.messages.impl.timeline.factories.event.TimelineItemContentFactory
1314
import io.element.android.features.messages.impl.timeline.factories.event.TimelineItemContentFailedToParseMessageFactory
1415
import io.element.android.features.messages.impl.timeline.factories.event.TimelineItemContentFailedToParseStateFactory
@@ -39,47 +40,64 @@ import io.element.android.libraries.mediaviewer.api.util.FileExtensionExtractorW
3940
import io.element.android.tests.testutils.testCoroutineDispatchers
4041
import kotlinx.coroutines.test.TestScope
4142

43+
internal fun TestScope.aTimelineItemsFactoryCreator(
44+
timelineItemIndexer: TimelineItemIndexer = TimelineItemIndexer(),
45+
): TimelineItemsFactory.Creator {
46+
return object : TimelineItemsFactory.Creator {
47+
override fun create(config: TimelineItemsFactoryConfig): TimelineItemsFactory {
48+
return aTimelineItemsFactory(config, timelineItemIndexer)
49+
}
50+
}
51+
}
52+
4253
internal fun TestScope.aTimelineItemsFactory(
43-
timelineItemIndexer: TimelineItemIndexer = TimelineItemIndexer()
54+
config: TimelineItemsFactoryConfig,
55+
timelineItemIndexer: TimelineItemIndexer = TimelineItemIndexer(),
4456
): TimelineItemsFactory {
4557
val timelineEventFormatter = aTimelineEventFormatter()
4658
val matrixClient = FakeMatrixClient()
4759
return TimelineItemsFactory(
4860
dispatchers = testCoroutineDispatchers(),
49-
eventItemFactory = TimelineItemEventFactory(
50-
contentFactory = TimelineItemContentFactory(
51-
messageFactory = TimelineItemContentMessageFactory(
52-
fileSizeFormatter = FakeFileSizeFormatter(),
53-
fileExtensionExtractor = FileExtensionExtractorWithoutValidation(),
54-
featureFlagService = FakeFeatureFlagService(),
55-
htmlConverterProvider = FakeHtmlConverterProvider(),
61+
eventItemFactoryCreator = object : TimelineItemEventFactory.Creator {
62+
override fun create(config: TimelineItemsFactoryConfig): TimelineItemEventFactory {
63+
return TimelineItemEventFactory(
64+
contentFactory = TimelineItemContentFactory(
65+
messageFactory = TimelineItemContentMessageFactory(
66+
fileSizeFormatter = FakeFileSizeFormatter(),
67+
fileExtensionExtractor = FileExtensionExtractorWithoutValidation(),
68+
featureFlagService = FakeFeatureFlagService(),
69+
htmlConverterProvider = FakeHtmlConverterProvider(),
70+
permalinkParser = FakePermalinkParser(),
71+
textPillificationHelper = FakeTextPillificationHelper(),
72+
),
73+
redactedMessageFactory = TimelineItemContentRedactedFactory(),
74+
stickerFactory = TimelineItemContentStickerFactory(
75+
fileSizeFormatter = FakeFileSizeFormatter(),
76+
fileExtensionExtractor = FileExtensionExtractorWithoutValidation()
77+
),
78+
pollFactory = TimelineItemContentPollFactory(FakeFeatureFlagService(), FakePollContentStateFactory()),
79+
utdFactory = TimelineItemContentUTDFactory(),
80+
roomMembershipFactory = TimelineItemContentRoomMembershipFactory(timelineEventFormatter),
81+
profileChangeFactory = TimelineItemContentProfileChangeFactory(timelineEventFormatter),
82+
stateFactory = TimelineItemContentStateFactory(timelineEventFormatter),
83+
failedToParseMessageFactory = TimelineItemContentFailedToParseMessageFactory(),
84+
failedToParseStateFactory = TimelineItemContentFailedToParseStateFactory(),
85+
),
86+
matrixClient = matrixClient,
87+
lastMessageTimestampFormatter = FakeLastMessageTimestampFormatter(),
5688
permalinkParser = FakePermalinkParser(),
57-
textPillificationHelper = FakeTextPillificationHelper(),
58-
),
59-
redactedMessageFactory = TimelineItemContentRedactedFactory(),
60-
stickerFactory = TimelineItemContentStickerFactory(
61-
fileSizeFormatter = FakeFileSizeFormatter(),
62-
fileExtensionExtractor = FileExtensionExtractorWithoutValidation()
63-
),
64-
pollFactory = TimelineItemContentPollFactory(FakeFeatureFlagService(), FakePollContentStateFactory()),
65-
utdFactory = TimelineItemContentUTDFactory(),
66-
roomMembershipFactory = TimelineItemContentRoomMembershipFactory(timelineEventFormatter),
67-
profileChangeFactory = TimelineItemContentProfileChangeFactory(timelineEventFormatter),
68-
stateFactory = TimelineItemContentStateFactory(timelineEventFormatter),
69-
failedToParseMessageFactory = TimelineItemContentFailedToParseMessageFactory(),
70-
failedToParseStateFactory = TimelineItemContentFailedToParseStateFactory(),
71-
),
72-
matrixClient = matrixClient,
73-
lastMessageTimestampFormatter = FakeLastMessageTimestampFormatter(),
74-
permalinkParser = FakePermalinkParser(),
75-
),
89+
config = config
90+
)
91+
}
92+
},
7693
virtualItemFactory = TimelineItemVirtualFactory(
7794
daySeparatorFactory = TimelineItemDaySeparatorFactory(
7895
FakeDaySeparatorFormatter()
7996
),
8097
),
8198
timelineItemGrouper = TimelineItemGrouper(),
8299
timelineItemIndexer = timelineItemIndexer,
100+
config = config
83101
)
84102
}
85103

features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenterTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ package io.element.android.features.messages.impl.pinned.list
1010
import com.google.common.truth.Truth.assertThat
1111
import io.element.android.features.messages.impl.actionlist.FakeActionListPresenter
1212
import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction
13-
import io.element.android.features.messages.impl.fixtures.aTimelineItemsFactory
13+
import io.element.android.features.messages.impl.fixtures.aTimelineItemsFactoryCreator
1414
import io.element.android.features.messages.impl.pinned.PinnedEventsTimelineProvider
1515
import io.element.android.features.messages.impl.timeline.model.TimelineItem
1616
import io.element.android.features.networkmonitor.api.NetworkMonitor
@@ -327,7 +327,7 @@ class PinnedMessagesListPresenterTest {
327327
return PinnedMessagesListPresenter(
328328
navigator = navigator,
329329
room = room,
330-
timelineItemsFactory = aTimelineItemsFactory(),
330+
timelineItemsFactoryCreator = aTimelineItemsFactoryCreator(),
331331
timelineProvider = timelineProvider,
332332
snackbarDispatcher = SnackbarDispatcher(),
333333
actionListPresenterFactory = FakeActionListPresenter.Factory,

0 commit comments

Comments
 (0)