Skip to content

Commit 3353419

Browse files
authored
Merge pull request #1801 from vector-im/feature/bma/timelineBeginning
Add a View to show the beginning of the timeline (parity with iOS)
2 parents 5209627 + be2bd99 commit 3353419

File tree

39 files changed

+162
-28
lines changed

39 files changed

+162
-28
lines changed

changelog.d/1801.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add item "This is the beginning of..." at the beginning of the timeline.

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,7 @@ private fun MessagesViewContent(
373373
TimelineView(
374374
modifier = Modifier.padding(paddingValues),
375375
state = state.timelineState,
376+
roomName = state.roomName.dataOrNull(),
376377
onMessageClicked = onMessageClicked,
377378
onMessageLongClicked = onMessageLongClicked,
378379
onUserDataClicked = onUserDataClicked,

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,11 @@ import kotlin.random.Random
4343

4444
fun aTimelineState(timelineItems: ImmutableList<TimelineItem> = persistentListOf()) = TimelineState(
4545
timelineItems = timelineItems,
46-
paginationState = MatrixTimeline.PaginationState(isBackPaginating = false, hasMoreToLoadBackwards = true),
46+
paginationState = MatrixTimeline.PaginationState(
47+
isBackPaginating = false,
48+
hasMoreToLoadBackwards = true,
49+
beginningOfRoomReached = false,
50+
),
4751
highlightedEventId = null,
4852
userHasPermissionToSendMessage = true,
4953
hasNewItems = false,

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ import io.element.android.features.messages.impl.timeline.components.TimelineIte
5959
import io.element.android.features.messages.impl.timeline.components.TimelineItemStateEventRow
6060
import io.element.android.features.messages.impl.timeline.components.TimelineItemVirtualRow
6161
import io.element.android.features.messages.impl.timeline.components.group.GroupHeaderView
62+
import io.element.android.features.messages.impl.timeline.components.virtual.TimelineItemRoomBeginningView
6263
import io.element.android.features.messages.impl.timeline.components.virtual.TimelineLoadingMoreIndicator
6364
import io.element.android.features.messages.impl.timeline.di.LocalTimelineItemPresenterFactories
6465
import io.element.android.features.messages.impl.timeline.di.aFakeTimelineItemPresenterFactories
@@ -82,6 +83,7 @@ import kotlinx.coroutines.launch
8283
@Composable
8384
fun TimelineView(
8485
state: TimelineState,
86+
roomName: String?,
8587
onUserDataClicked: (UserId) -> Unit,
8688
onMessageClicked: (TimelineItem.Event) -> Unit,
8789
onMessageLongClicked: (TimelineItem.Event) -> Unit,
@@ -148,6 +150,11 @@ fun TimelineView(
148150
}
149151
}
150152
}
153+
if (state.paginationState.beginningOfRoomReached) {
154+
item(contentType = "BeginningOfRoomReached") {
155+
TimelineItemRoomBeginningView(roomName = roomName)
156+
}
157+
}
151158
}
152159

153160
TimelineScrollHelper(
@@ -346,6 +353,7 @@ internal fun TimelineViewPreview(
346353
) {
347354
TimelineView(
348355
state = aTimelineState(timelineItems),
356+
roomName = null,
349357
onMessageClicked = {},
350358
onTimestampClicked = {},
351359
onUserDataClicked = {},
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/*
2+
* Copyright (c) 2023 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+
* http://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.timeline.components.virtual
18+
19+
import androidx.compose.foundation.layout.Box
20+
import androidx.compose.foundation.layout.Column
21+
import androidx.compose.foundation.layout.fillMaxWidth
22+
import androidx.compose.foundation.layout.padding
23+
import androidx.compose.material3.MaterialTheme
24+
import androidx.compose.runtime.Composable
25+
import androidx.compose.ui.Alignment
26+
import androidx.compose.ui.Modifier
27+
import androidx.compose.ui.res.stringResource
28+
import androidx.compose.ui.text.style.TextAlign
29+
import androidx.compose.ui.unit.dp
30+
import io.element.android.features.messages.impl.R
31+
import io.element.android.libraries.designsystem.preview.ElementPreview
32+
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
33+
import io.element.android.libraries.designsystem.theme.components.Text
34+
import io.element.android.libraries.theme.ElementTheme
35+
36+
@Composable
37+
fun TimelineItemRoomBeginningView(
38+
roomName: String?,
39+
modifier: Modifier = Modifier
40+
) {
41+
Box(
42+
modifier = modifier
43+
.fillMaxWidth()
44+
.padding(horizontal = 16.dp, vertical = 8.dp),
45+
contentAlignment = Alignment.Center,
46+
) {
47+
val text = if (roomName == null) {
48+
stringResource(id = R.string.room_timeline_beginning_of_room_no_name)
49+
} else {
50+
stringResource(id = R.string.room_timeline_beginning_of_room, roomName)
51+
}
52+
Text(
53+
color = MaterialTheme.colorScheme.secondary,
54+
style = ElementTheme.typography.fontBodyMdRegular,
55+
text = text,
56+
textAlign = TextAlign.Center,
57+
)
58+
}
59+
}
60+
61+
@PreviewsDayNight
62+
@Composable
63+
internal fun TimelineItemRoomBeginningViewPreview() = ElementPreview {
64+
Column {
65+
TimelineItemRoomBeginningView(
66+
roomName = null,
67+
)
68+
TimelineItemRoomBeginningView(
69+
roomName = "Room Name",
70+
)
71+
}
72+
}

features/messages/impl/src/main/res/values-cs/translations.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
</plurals>
1616
<string name="report_content_explanation">"Tato zpráva bude nahlášena správci vašeho domovského serveru. Nebude si moci přečíst žádné šifrované zprávy."</string>
1717
<string name="report_content_hint">"Důvod nahlášení tohoto obsahu"</string>
18+
<string name="room_timeline_beginning_of_room">"Toto je začátek %1$s."</string>
19+
<string name="room_timeline_beginning_of_room_no_name">"Toto je začátek této konverzace."</string>
1820
<string name="screen_room_mentions_at_room_subtitle">"Informujte celou místnost"</string>
1921
<string name="screen_report_content_block_user_hint">"Zaškrtněte, pokud chcete skrýt všechny aktuální a budoucí zprávy od tohoto uživatele"</string>
2022
<string name="screen_room_attachment_source_camera">"Fotoaparát"</string>

features/messages/impl/src/main/res/values-de/translations.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
</plurals>
1515
<string name="report_content_explanation">"Diese Meldung wird an den Administrator deines Homeservers weitergeleitet. Dieser kann keine verschlüsselten Nachrichten lesen."</string>
1616
<string name="report_content_hint">"Grund für die Meldung dieses Inhalts"</string>
17+
<string name="room_timeline_beginning_of_room">"Dies ist der Anfang von %1$s."</string>
18+
<string name="room_timeline_beginning_of_room_no_name">"Dies ist der Anfang dieses Gesprächs."</string>
1719
<string name="screen_report_content_block_user_hint">"Prüfe, ob du alle aktuellen und zukünftigen Nachrichten dieses Benutzers ausblenden möchtest"</string>
1820
<string name="screen_room_attachment_source_camera">"Kamera"</string>
1921
<string name="screen_room_attachment_source_camera_photo">"Foto machen"</string>

features/messages/impl/src/main/res/values-es/translations.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
</plurals>
1515
<string name="report_content_explanation">"Este mensaje se notificará al administrador de su homeserver. No podrán leer ningún mensaje cifrado."</string>
1616
<string name="report_content_hint">"Motivo para denunciar este contenido"</string>
17+
<string name="room_timeline_beginning_of_room">"Este es el principio de %1$s."</string>
18+
<string name="room_timeline_beginning_of_room_no_name">"Este es el principio de esta conversación."</string>
1719
<string name="screen_report_content_block_user_hint">"Marque si quieres ocultar todos los mensajes actuales y futuros de este usuario"</string>
1820
<string name="screen_report_content_block_user">"Bloquear usuario"</string>
1921
</resources>

features/messages/impl/src/main/res/values-fr/translations.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
</plurals>
1515
<string name="report_content_explanation">"Ce message sera signalé à l’administrateur de votre serveur d’accueil. Il ne pourra lire aucun message chiffré."</string>
1616
<string name="report_content_hint">"Raison du signalement de ce contenu"</string>
17+
<string name="room_timeline_beginning_of_room">"Ceci est le début de %1$s."</string>
18+
<string name="room_timeline_beginning_of_room_no_name">"Ceci est le début de cette conversation."</string>
1719
<string name="screen_room_mentions_at_room_subtitle">"Notifier tout le salon"</string>
1820
<string name="screen_report_content_block_user_hint">"Cochez si vous souhaitez masquer tous les messages actuels et futurs de cet utilisateur."</string>
1921
<string name="screen_room_attachment_source_camera">"Appareil photo"</string>

features/messages/impl/src/main/res/values-it/translations.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
</plurals>
1515
<string name="report_content_explanation">"Questo messaggio verrà segnalato all\'amministratore dell\'homeserver. Questi non sarà in grado di leggere i messaggi criptati."</string>
1616
<string name="report_content_hint">"Motivo della segnalazione di questo contenuto"</string>
17+
<string name="room_timeline_beginning_of_room">"Questo è l\'inizio di %1$s."</string>
18+
<string name="room_timeline_beginning_of_room_no_name">"Questo è l\'inizio della conversazione."</string>
1719
<string name="screen_report_content_block_user_hint">"Seleziona se vuoi nascondere tutti i messaggi attuali e futuri di questo utente"</string>
1820
<string name="screen_report_content_block_user">"Blocca utente"</string>
1921
</resources>

0 commit comments

Comments
 (0)