Skip to content

Commit e96a11f

Browse files
committed
Pinned events : clean up banner code and add small test.
1 parent 8852735 commit e96a11f

File tree

6 files changed

+69
-27
lines changed

6 files changed

+69
-27
lines changed

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ import io.element.android.features.messages.impl.actionlist.model.TimelineItemAc
4141
import io.element.android.features.messages.impl.messagecomposer.MessageComposerEvents
4242
import io.element.android.features.messages.impl.messagecomposer.MessageComposerPresenter
4343
import io.element.android.features.messages.impl.messagecomposer.MessageComposerState
44-
import io.element.android.features.messages.impl.pinned.banner.PinnedMessagesBannerPresenter
4544
import io.element.android.features.messages.impl.pinned.banner.PinnedMessagesBannerState
4645
import io.element.android.features.messages.impl.timeline.TimelineController
4746
import io.element.android.features.messages.impl.timeline.TimelineEvents

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenter.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import io.element.android.libraries.architecture.Presenter
2626
import javax.inject.Inject
2727

2828
class PinnedMessagesBannerPresenter @Inject constructor() : Presenter<PinnedMessagesBannerState> {
29-
3029
@Composable
3130
override fun present(): PinnedMessagesBannerState {
3231
var pinnedMessageCount by remember {

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerStateProvider.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package io.element.android.features.messages.impl.pinned.banner
1919
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
2020

2121
internal class PinnedMessagesBannerStateProvider : PreviewParameterProvider<PinnedMessagesBannerState> {
22-
2322
override val values: Sequence<PinnedMessagesBannerState>
2423
get() = sequenceOf(
2524
aPinnedMessagesBannerState(pinnedMessagesCount = 1, currentPinnedMessageIndex = 0),

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerView.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,12 @@ import androidx.compose.foundation.layout.heightIn
3232
import androidx.compose.foundation.layout.size
3333
import androidx.compose.foundation.layout.width
3434
import androidx.compose.foundation.lazy.LazyColumn
35-
import androidx.compose.foundation.lazy.LazyListState
3635
import androidx.compose.foundation.lazy.rememberLazyListState
3736
import androidx.compose.runtime.Composable
3837
import androidx.compose.runtime.LaunchedEffect
3938
import androidx.compose.runtime.derivedStateOf
4039
import androidx.compose.runtime.getValue
41-
import androidx.compose.runtime.mutableIntStateOf
4240
import androidx.compose.runtime.remember
43-
import androidx.compose.runtime.setValue
4441
import androidx.compose.ui.Alignment
4542
import androidx.compose.ui.Modifier
4643
import androidx.compose.ui.draw.drawBehind
@@ -138,7 +135,7 @@ private fun PinIndicators(
138135
val viewportSize = lazyListState.layoutInfo.viewportSize
139136
lazyListState.animateScrollToItem(
140137
pinIndex,
141-
(indicatorHeight / 2 - viewportSize.height / 2)
138+
indicatorHeight / 2 - viewportSize.height / 2
142139
)
143140
}
144141
LazyColumn(
@@ -192,13 +189,12 @@ private fun PinnedMessageItem(
192189
overflow = TextOverflow.Ellipsis,
193190
maxLines = 1,
194191
)
195-
196192
}
197193
}
198194

199195
@PreviewsDayNight
200196
@Composable
201-
fun PinnedMessagesBannerViewPreview(@PreviewParameter(PinnedMessagesBannerStateProvider::class) state: PinnedMessagesBannerState) = ElementPreview {
197+
internal fun PinnedMessagesBannerViewPreview(@PreviewParameter(PinnedMessagesBannerStateProvider::class) state: PinnedMessagesBannerState) = ElementPreview {
202198
PinnedMessagesBannerView(
203199
state = state,
204200
)

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

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ import io.element.android.features.poll.test.actions.FakeEndPollAction
5858
import io.element.android.features.poll.test.actions.FakeSendPollResponseAction
5959
import io.element.android.libraries.androidutils.clipboard.FakeClipboardHelper
6060
import io.element.android.libraries.architecture.AsyncData
61-
import io.element.android.libraries.architecture.Presenter
6261
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
6362
import io.element.android.libraries.core.mimetype.MimeTypes
6463
import io.element.android.libraries.designsystem.components.avatar.AvatarData
@@ -160,7 +159,7 @@ class MessagesPresenterTest {
160159
canUserJoinCallResult = { Result.success(true) },
161160
typingNoticeResult = { Result.success(Unit) },
162161
canUserPinUnpinResult = { Result.success(true) },
163-
)
162+
)
164163
assertThat(room.markAsReadCalls).isEmpty()
165164
val presenter = createMessagesPresenter(matrixRoom = room)
166165
moleculeFlow(RecompositionMode.Immediate) {
@@ -181,7 +180,7 @@ class MessagesPresenterTest {
181180
canRedactOtherResult = { Result.success(true) },
182181
typingNoticeResult = { Result.success(Unit) },
183182
canUserPinUnpinResult = { Result.success(true) },
184-
).apply {
183+
).apply {
185184
givenRoomInfo(aRoomInfo(hasRoomCall = true))
186185
}
187186
val presenter = createMessagesPresenter(matrixRoom = room)
@@ -210,7 +209,7 @@ class MessagesPresenterTest {
210209
canUserJoinCallResult = { Result.success(true) },
211210
typingNoticeResult = { Result.success(Unit) },
212211
canUserPinUnpinResult = { Result.success(true) },
213-
)
212+
)
214213
val presenter = createMessagesPresenter(matrixRoom = room, coroutineDispatchers = coroutineDispatchers)
215214
moleculeFlow(RecompositionMode.Immediate) {
216215
presenter.present()
@@ -248,7 +247,7 @@ class MessagesPresenterTest {
248247
canUserJoinCallResult = { Result.success(true) },
249248
typingNoticeResult = { Result.success(Unit) },
250249
canUserPinUnpinResult = { Result.success(true) },
251-
)
250+
)
252251
val presenter = createMessagesPresenter(matrixRoom = room, coroutineDispatchers = coroutineDispatchers)
253252
moleculeFlow(RecompositionMode.Immediate) {
254253
presenter.present()
@@ -307,7 +306,7 @@ class MessagesPresenterTest {
307306
canUserJoinCallResult = { Result.success(true) },
308307
typingNoticeResult = { Result.success(Unit) },
309308
canUserPinUnpinResult = { Result.success(true) },
310-
)
309+
)
311310
val presenter = createMessagesPresenter(
312311
clipboardHelper = clipboardHelper,
313312
matrixRoom = matrixRoom,
@@ -497,7 +496,7 @@ class MessagesPresenterTest {
497496
canUserJoinCallResult = { Result.success(true) },
498497
typingNoticeResult = { Result.success(Unit) },
499498
canUserPinUnpinResult = { Result.success(true) },
500-
)
499+
)
501500

502501
val redactEventLambda = lambdaRecorder { _: EventId?, _: TransactionId?, _: String? -> Result.success(true) }
503502
liveTimeline.redactEventLambda = redactEventLambda
@@ -572,7 +571,7 @@ class MessagesPresenterTest {
572571
canUserJoinCallResult = { Result.success(true) },
573572
typingNoticeResult = { Result.success(Unit) },
574573
canUserPinUnpinResult = { Result.success(true) },
575-
)
574+
)
576575
val presenter = createMessagesPresenter(matrixRoom = room)
577576
moleculeFlow(RecompositionMode.Immediate) {
578577
presenter.present()
@@ -608,7 +607,7 @@ class MessagesPresenterTest {
608607
canUserJoinCallResult = { Result.success(true) },
609608
typingNoticeResult = { Result.success(Unit) },
610609
canUserPinUnpinResult = { Result.success(true) },
611-
)
610+
)
612611
val presenter = createMessagesPresenter(matrixRoom = room)
613612
moleculeFlow(RecompositionMode.Immediate) {
614613
presenter.present()
@@ -633,7 +632,7 @@ class MessagesPresenterTest {
633632
canUserJoinCallResult = { Result.success(true) },
634633
typingNoticeResult = { Result.success(Unit) },
635634
canUserPinUnpinResult = { Result.success(true) },
636-
)
635+
)
637636
val presenter = createMessagesPresenter(matrixRoom = room)
638637
moleculeFlow(RecompositionMode.Immediate) {
639638
presenter.present()
@@ -658,7 +657,7 @@ class MessagesPresenterTest {
658657
canUserJoinCallResult = { Result.success(true) },
659658
typingNoticeResult = { Result.success(Unit) },
660659
canUserPinUnpinResult = { Result.success(true) },
661-
)
660+
)
662661
room.givenRoomMembersState(
663662
MatrixRoomMembersState.Ready(
664663
persistentListOf(
@@ -694,7 +693,7 @@ class MessagesPresenterTest {
694693
canUserJoinCallResult = { Result.success(true) },
695694
typingNoticeResult = { Result.success(Unit) },
696695
canUserPinUnpinResult = { Result.success(true) },
697-
)
696+
)
698697
room.givenRoomMembersState(
699698
MatrixRoomMembersState.Error(
700699
failure = Throwable(),
@@ -731,7 +730,7 @@ class MessagesPresenterTest {
731730
canUserJoinCallResult = { Result.success(true) },
732731
typingNoticeResult = { Result.success(Unit) },
733732
canUserPinUnpinResult = { Result.success(true) },
734-
)
733+
)
735734
room.givenRoomMembersState(MatrixRoomMembersState.Unknown)
736735
val presenter = createMessagesPresenter(matrixRoom = room)
737736
moleculeFlow(RecompositionMode.Immediate) {
@@ -758,7 +757,7 @@ class MessagesPresenterTest {
758757
canUserJoinCallResult = { Result.success(true) },
759758
typingNoticeResult = { Result.success(Unit) },
760759
canUserPinUnpinResult = { Result.success(true) },
761-
)
760+
)
762761
room.givenRoomMembersState(
763762
MatrixRoomMembersState.Ready(
764763
persistentListOf(
@@ -799,7 +798,7 @@ class MessagesPresenterTest {
799798
canUserJoinCallResult = { Result.success(true) },
800799
typingNoticeResult = { Result.success(Unit) },
801800
canUserPinUnpinResult = { Result.success(true) },
802-
)
801+
)
803802
val presenter = createMessagesPresenter(matrixRoom = matrixRoom)
804803
moleculeFlow(RecompositionMode.Immediate) {
805804
presenter.present()
@@ -824,7 +823,7 @@ class MessagesPresenterTest {
824823
canUserJoinCallResult = { Result.success(true) },
825824
typingNoticeResult = { Result.success(Unit) },
826825
canUserPinUnpinResult = { Result.success(true) },
827-
)
826+
)
828827
val presenter = createMessagesPresenter(matrixRoom = matrixRoom)
829828
moleculeFlow(RecompositionMode.Immediate) {
830829
presenter.present()
@@ -846,7 +845,7 @@ class MessagesPresenterTest {
846845
canUserJoinCallResult = { Result.success(true) },
847846
typingNoticeResult = { Result.success(Unit) },
848847
canUserPinUnpinResult = { Result.success(true) },
849-
)
848+
)
850849
val presenter = createMessagesPresenter(matrixRoom = matrixRoom)
851850
moleculeFlow(RecompositionMode.Immediate) {
852851
presenter.present()
@@ -867,7 +866,7 @@ class MessagesPresenterTest {
867866
canUserJoinCallResult = { Result.success(true) },
868867
typingNoticeResult = { Result.success(Unit) },
869868
canUserPinUnpinResult = { Result.success(true) },
870-
)
869+
)
871870
val presenter = createMessagesPresenter(matrixRoom = matrixRoom)
872871
moleculeFlow(RecompositionMode.Immediate) {
873872
presenter.present()
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* Copyright (c) 2024 New Vector Ltd
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package io.element.android.features.messages.impl.pinned.banner
18+
19+
import com.google.common.truth.Truth.assertThat
20+
import io.element.android.tests.testutils.test
21+
import kotlinx.coroutines.test.runTest
22+
import org.junit.Test
23+
24+
class PinnedMessagesBannerPresenterTest {
25+
26+
@Test
27+
fun `present - initial state`() = runTest {
28+
val presenter = createPinnedMessagesBannerPresenter()
29+
presenter.test {
30+
val initialState = awaitItem()
31+
assertThat(initialState.pinnedMessagesCount).isEqualTo(0)
32+
assertThat(initialState.currentPinnedMessageIndex).isEqualTo(0)
33+
}
34+
}
35+
36+
@Test
37+
fun `present - move to next pinned message when there is no pinned events`() = runTest {
38+
val presenter = createPinnedMessagesBannerPresenter()
39+
presenter.test {
40+
val initialState = awaitItem()
41+
initialState.eventSink(PinnedMessagesBannerEvents.MoveToNextPinned)
42+
// Nothing is emitted
43+
ensureAllEventsConsumed()
44+
}
45+
}
46+
47+
private fun createPinnedMessagesBannerPresenter(): PinnedMessagesBannerPresenter {
48+
return PinnedMessagesBannerPresenter()
49+
}
50+
}

0 commit comments

Comments
 (0)