Merge branch 'develop' of https://github.com/vector-im/element-x-android-poc into develop
This commit is contained in:
commit
5244e2fac6
28 changed files with 330 additions and 45 deletions
|
|
@ -1,5 +1,7 @@
|
|||
plugins {
|
||||
id("io.element.android-compose")
|
||||
// TODO Move to common config
|
||||
id("com.google.devtools.ksp") version "1.7.20-1.0.7"
|
||||
}
|
||||
|
||||
android {
|
||||
|
|
@ -16,4 +18,7 @@ dependencies {
|
|||
testImplementation("junit:junit:4.13.2")
|
||||
androidTestImplementation("androidx.test.ext:junit:1.1.3")
|
||||
androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0")
|
||||
|
||||
// TODO Move to common config
|
||||
ksp("com.airbnb.android:showkase-processor:1.0.0-beta14")
|
||||
}
|
||||
|
|
@ -202,7 +202,7 @@ fun LoginContent(
|
|||
|
||||
@Composable
|
||||
@Preview
|
||||
private fun LoginContentPreview() {
|
||||
fun LoginContentPreview() {
|
||||
ElementXTheme(darkTheme = false) {
|
||||
LoginContent(
|
||||
state = LoginViewState(
|
||||
|
|
|
|||
|
|
@ -150,7 +150,7 @@ fun ChangeServerContent(
|
|||
|
||||
@Composable
|
||||
@Preview
|
||||
private fun ChangeServerContentPreview() {
|
||||
fun ChangeServerContentPreview() {
|
||||
ChangeServerContent(
|
||||
state = ChangeServerViewState(homeserver = "matrix.org"),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
plugins {
|
||||
id("io.element.android-compose")
|
||||
// TODO Move to common config
|
||||
id("com.google.devtools.ksp") version "1.7.20-1.0.7"
|
||||
}
|
||||
|
||||
android {
|
||||
|
|
@ -20,4 +22,7 @@ dependencies {
|
|||
testImplementation("junit:junit:4.13.2")
|
||||
androidTestImplementation("androidx.test.ext:junit:1.1.3")
|
||||
androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0")
|
||||
}
|
||||
|
||||
// TODO Move to common config
|
||||
ksp("com.airbnb.android:showkase-processor:1.0.0-beta14")
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,17 +24,19 @@ import androidx.compose.ui.Modifier
|
|||
import androidx.compose.ui.layout.LastBaseline
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.text.style.TextOverflow
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import androidx.compose.ui.zIndex
|
||||
import com.airbnb.mvrx.compose.collectAsState
|
||||
import com.airbnb.mvrx.compose.mavericksViewModel
|
||||
import io.element.android.x.core.compose.LogCompositions
|
||||
import io.element.android.x.core.compose.PairCombinedPreviewParameter
|
||||
import io.element.android.x.core.data.StableCharSequence
|
||||
import io.element.android.x.designsystem.components.avatar.AvatarData
|
||||
import io.element.android.x.features.messages.components.*
|
||||
import io.element.android.x.features.messages.model.MessagesTimelineItemState
|
||||
import io.element.android.x.features.messages.model.MessagesViewState
|
||||
import io.element.android.x.features.messages.model.*
|
||||
import io.element.android.x.features.messages.model.content.*
|
||||
import io.element.android.x.features.messages.textcomposer.MessageComposerViewModel
|
||||
import io.element.android.x.features.messages.textcomposer.MessageComposerViewState
|
||||
|
|
@ -42,6 +44,7 @@ import io.element.android.x.textcomposer.TextComposer
|
|||
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||
import kotlinx.coroutines.launch
|
||||
import timber.log.Timber
|
||||
import java.lang.Math.random
|
||||
|
||||
private val COMPOSER_HEIGHT = 112.dp
|
||||
|
||||
|
|
@ -253,11 +256,11 @@ fun MessagesTopAppBar(
|
|||
fun TimelineItems(
|
||||
lazyListState: LazyListState,
|
||||
timelineItems: List<MessagesTimelineItemState>,
|
||||
hasMoreToLoad: Boolean,
|
||||
onClick: (MessagesTimelineItemState.MessageEvent) -> Unit,
|
||||
onLongClick: ((MessagesTimelineItemState.MessageEvent)) -> Unit,
|
||||
onReachedLoadMore: () -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
hasMoreToLoad: Boolean = false,
|
||||
onClick: (MessagesTimelineItemState.MessageEvent) -> Unit = {},
|
||||
onLongClick: ((MessagesTimelineItemState.MessageEvent)) -> Unit = {},
|
||||
onReachedLoadMore: () -> Unit = {},
|
||||
) {
|
||||
Box(modifier = modifier.fillMaxWidth()) {
|
||||
LazyColumn(
|
||||
|
|
@ -385,6 +388,7 @@ fun MessageEventRow(
|
|||
content = messageEvent.content,
|
||||
modifier = contentModifier
|
||||
)
|
||||
else -> TODO() /* compiler issue ? */
|
||||
}
|
||||
}
|
||||
MessagesReactionsView(
|
||||
|
|
@ -502,4 +506,76 @@ internal fun MessagesLoadingMoreIndicator() {
|
|||
)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
class MessagesItemGroupPositionToMessagesTimelineItemContentProvider :
|
||||
PairCombinedPreviewParameter<MessagesItemGroupPosition, MessagesTimelineItemContent>(
|
||||
MessagesItemGroupPositionProvider() to MessagesTimelineItemContentProvider()
|
||||
)
|
||||
|
||||
@Preview(showBackground = true)
|
||||
@Composable
|
||||
fun TimelineItemsPreview(
|
||||
@PreviewParameter(MessagesTimelineItemContentProvider::class)
|
||||
content: MessagesTimelineItemContent
|
||||
) {
|
||||
TimelineItems(
|
||||
lazyListState = LazyListState(),
|
||||
timelineItems = listOf(
|
||||
// 3 items (First Middle Last) with isMine = false
|
||||
createMessageEvent(
|
||||
isMine = false,
|
||||
content = content,
|
||||
groupPosition = MessagesItemGroupPosition.First
|
||||
),
|
||||
createMessageEvent(
|
||||
isMine = false,
|
||||
content = content,
|
||||
groupPosition = MessagesItemGroupPosition.Middle
|
||||
),
|
||||
createMessageEvent(
|
||||
isMine = false,
|
||||
content = content,
|
||||
groupPosition = MessagesItemGroupPosition.Last
|
||||
),
|
||||
// 3 items (First Middle Last) with isMine = true
|
||||
createMessageEvent(
|
||||
isMine = true,
|
||||
content = content,
|
||||
groupPosition = MessagesItemGroupPosition.First
|
||||
),
|
||||
createMessageEvent(
|
||||
isMine = true,
|
||||
content = content,
|
||||
groupPosition = MessagesItemGroupPosition.Middle
|
||||
),
|
||||
createMessageEvent(
|
||||
isMine = true,
|
||||
content = content,
|
||||
groupPosition = MessagesItemGroupPosition.Last
|
||||
),
|
||||
),
|
||||
hasMoreToLoad = true,
|
||||
)
|
||||
}
|
||||
|
||||
private fun createMessageEvent(
|
||||
isMine: Boolean,
|
||||
content: MessagesTimelineItemContent,
|
||||
groupPosition: MessagesItemGroupPosition
|
||||
): MessagesTimelineItemState {
|
||||
return MessagesTimelineItemState.MessageEvent(
|
||||
id = random().toString(),
|
||||
senderId = "senderId",
|
||||
senderAvatar = AvatarData("sender"),
|
||||
content = content,
|
||||
reactionsState = MessagesItemReactionState(
|
||||
listOf(
|
||||
AggregatedReaction("👍", "1")
|
||||
)
|
||||
),
|
||||
isMine = isMine,
|
||||
senderDisplayName = "sender",
|
||||
groupPosition = groupPosition,
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ import io.element.android.x.features.messages.model.MessagesItemAction
|
|||
import io.element.android.x.features.messages.model.MessagesItemActionsSheetState
|
||||
import io.element.android.x.features.messages.model.MessagesTimelineItemState
|
||||
import io.element.android.x.features.messages.model.MessagesViewState
|
||||
import io.element.android.x.features.messages.model.content.MessagesTimelineItemRedactedContent
|
||||
import io.element.android.x.matrix.MatrixClient
|
||||
import io.element.android.x.matrix.MatrixInstance
|
||||
import io.element.android.x.matrix.media.MediaResolver
|
||||
|
|
@ -104,13 +105,19 @@ class MessagesViewModel(
|
|||
|
||||
fun computeActionsSheetState(messagesTimelineItemState: MessagesTimelineItemState.MessageEvent) {
|
||||
suspend {
|
||||
val actions = mutableListOf(
|
||||
MessagesItemAction.Forward,
|
||||
MessagesItemAction.Copy,
|
||||
)
|
||||
if (messagesTimelineItemState.isMine) {
|
||||
actions.add(MessagesItemAction.Redact)
|
||||
}
|
||||
val actions =
|
||||
if (messagesTimelineItemState.content is MessagesTimelineItemRedactedContent) {
|
||||
emptyList()
|
||||
} else {
|
||||
mutableListOf(
|
||||
MessagesItemAction.Forward,
|
||||
MessagesItemAction.Copy,
|
||||
).also {
|
||||
if (messagesTimelineItemState.isMine) {
|
||||
it.add(MessagesItemAction.Redact)
|
||||
}
|
||||
}
|
||||
}
|
||||
MessagesItemActionsSheetState(
|
||||
targetItem = messagesTimelineItemState,
|
||||
actions = actions
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
package io.element.android.x.features.messages.model
|
||||
|
||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||
|
||||
sealed interface MessagesItemGroupPosition {
|
||||
object First : MessagesItemGroupPosition
|
||||
object Middle : MessagesItemGroupPosition
|
||||
|
|
@ -12,3 +14,12 @@ sealed interface MessagesItemGroupPosition {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
internal class MessagesItemGroupPositionProvider : PreviewParameterProvider<MessagesItemGroupPosition> {
|
||||
override val values = sequenceOf(
|
||||
MessagesItemGroupPosition.First,
|
||||
MessagesItemGroupPosition.Middle,
|
||||
MessagesItemGroupPosition.Last,
|
||||
MessagesItemGroupPosition.None,
|
||||
)
|
||||
}
|
||||
|
|
@ -9,7 +9,7 @@ sealed interface MessagesTimelineItemState {
|
|||
) : MessagesTimelineItemState
|
||||
|
||||
data class MessageEvent(
|
||||
val id: String = "",
|
||||
val id: String,
|
||||
val senderId: String,
|
||||
val senderDisplayName: String?,
|
||||
val senderAvatar: AvatarData,
|
||||
|
|
|
|||
|
|
@ -1,3 +1,31 @@
|
|||
package io.element.android.x.features.messages.model.content
|
||||
|
||||
sealed interface MessagesTimelineItemContent
|
||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||
import org.matrix.rustcomponents.sdk.EncryptedMessage
|
||||
import org.matrix.rustcomponents.sdk.FormattedBody
|
||||
import org.matrix.rustcomponents.sdk.MessageFormat
|
||||
|
||||
sealed interface MessagesTimelineItemContent
|
||||
|
||||
class MessagesTimelineItemContentProvider : PreviewParameterProvider<MessagesTimelineItemContent> {
|
||||
override val values = sequenceOf(
|
||||
MessagesTimelineItemEmoteContent(
|
||||
body = "Emote",
|
||||
formattedBody = FormattedBody(MessageFormat.HTML, "Formatted emote")
|
||||
),
|
||||
MessagesTimelineItemEncryptedContent(
|
||||
encryptedMessage = EncryptedMessage.Unknown
|
||||
),
|
||||
// TODO MessagesTimelineItemImageContent(),
|
||||
MessagesTimelineItemNoticeContent(
|
||||
body = "Notice",
|
||||
formattedBody = FormattedBody(MessageFormat.HTML, "Formatted notice")
|
||||
),
|
||||
MessagesTimelineItemRedactedContent,
|
||||
MessagesTimelineItemTextContent(
|
||||
body = "Text",
|
||||
formattedBody = FormattedBody(MessageFormat.HTML, "Formatted text")
|
||||
),
|
||||
MessagesTimelineItemUnknownContent,
|
||||
)
|
||||
}
|
||||
|
|
@ -1,5 +1,7 @@
|
|||
plugins {
|
||||
id("io.element.android-compose")
|
||||
// TODO Move to common config
|
||||
id("com.google.devtools.ksp") version "1.7.20-1.0.7"
|
||||
}
|
||||
|
||||
android {
|
||||
|
|
@ -17,4 +19,6 @@ dependencies {
|
|||
testImplementation("junit:junit:4.13.2")
|
||||
androidTestImplementation("androidx.test.ext:junit:1.1.3")
|
||||
androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0")
|
||||
// TODO Move to common config
|
||||
ksp("com.airbnb.android:showkase-processor:1.0.0-beta14")
|
||||
}
|
||||
|
|
@ -1,5 +1,7 @@
|
|||
plugins {
|
||||
id("io.element.android-compose")
|
||||
// TODO Move to common config
|
||||
id("com.google.devtools.ksp") version "1.7.20-1.0.7"
|
||||
}
|
||||
|
||||
android {
|
||||
|
|
@ -17,4 +19,6 @@ dependencies {
|
|||
testImplementation("junit:junit:4.13.2")
|
||||
androidTestImplementation("androidx.test.ext:junit:1.1.3")
|
||||
androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0")
|
||||
// TODO Move to common config
|
||||
ksp("com.airbnb.android:showkase-processor:1.0.0-beta14")
|
||||
}
|
||||
|
|
@ -145,7 +145,7 @@ private fun LazyListState.isScrolled(): Boolean {
|
|||
|
||||
@Preview
|
||||
@Composable
|
||||
private fun PreviewableRoomListContent() {
|
||||
fun PreviewableRoomListContent() {
|
||||
ElementXTheme(darkTheme = false) {
|
||||
RoomListContent(
|
||||
roomSummaries = stubbedRoomSummaries(),
|
||||
|
|
@ -162,7 +162,7 @@ private fun PreviewableRoomListContent() {
|
|||
|
||||
@Preview
|
||||
@Composable
|
||||
private fun PreviewableDarkRoomListContent() {
|
||||
fun PreviewableDarkRoomListContent() {
|
||||
ElementXTheme(darkTheme = true) {
|
||||
RoomListContent(
|
||||
roomSummaries = stubbedRoomSummaries(),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue