Private
Public Access
1
0

Trying to plumb list changes...

This commit is contained in:
2023-08-17 01:07:15 -07:00
parent b38c51d108
commit 770bb496f5
4 changed files with 28 additions and 6 deletions

View File

@@ -83,8 +83,12 @@ dependencies {
implementation "androidx.navigation:navigation-compose:$nav_version" implementation "androidx.navigation:navigation-compose:$nav_version"
implementation 'androidx.activity:activity-compose:1.4.3' implementation 'androidx.activity:activity-compose:1.4.3'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1' // Lifecycle
def lifecycle_version = "2.6.1"
implementation "androidx.lifecycle:lifecycle-runtime-compose:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycle_version"
implementation "androidx.compose.ui:ui:1.4.3" implementation "androidx.compose.ui:ui:1.4.3"
implementation 'androidx.compose.material:material:1.4.3' implementation 'androidx.compose.material:material:1.4.3'

View File

@@ -21,6 +21,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import net.buzzert.kordophone.backend.model.Conversation import net.buzzert.kordophone.backend.model.Conversation
@@ -29,7 +30,7 @@ fun ConversationListScreen(
viewModel: ConversationListViewModel = hiltViewModel(), viewModel: ConversationListViewModel = hiltViewModel(),
onConversationSelected: (conversationID: String) -> Unit onConversationSelected: (conversationID: String) -> Unit
) { ) {
val conversations by viewModel.conversations.collectAsState(initial = listOf()) val conversations by viewModel.conversations.collectAsStateWithLifecycle(initialValue = listOf())
ConversationListView(conversations = conversations, onConversationSelected = onConversationSelected) ConversationListView(conversations = conversations, onConversationSelected = onConversationSelected)
} }
@@ -56,6 +57,7 @@ fun ConversationListView(
name = conversation.formattedDisplayName(), name = conversation.formattedDisplayName(),
id = conversation.guid, id = conversation.guid,
isUnread = conversation.unreadCount > 0, isUnread = conversation.unreadCount > 0,
lastMessagePreview = conversation.lastMessagePreview ?: "",
onClick = { onConversationSelected(conversation.guid) } onClick = { onConversationSelected(conversation.guid) }
) )
} }
@@ -68,6 +70,7 @@ fun ConversationListItem(
name: String, name: String,
id: String, id: String,
isUnread: Boolean, isUnread: Boolean,
lastMessagePreview: String,
onClick: () -> Unit onClick: () -> Unit
) { ) {
val unreadSize = 12.dp val unreadSize = 12.dp
@@ -113,7 +116,7 @@ fun ConversationListItem(
Spacer(Modifier.width(horizontalPadding)) Spacer(Modifier.width(horizontalPadding))
} }
Text("This is a test.") Text(lastMessagePreview)
Spacer(Modifier.height(verticalPadding)) Spacer(Modifier.height(verticalPadding))
Divider() Divider()
@@ -139,7 +142,7 @@ fun UnreadIndicator(size: Dp, modifier: Modifier = Modifier) {
@Composable @Composable
fun ConversationListItemPreview() { fun ConversationListItemPreview() {
Column(modifier = Modifier.background(MaterialTheme.colors.background)) { Column(modifier = Modifier.background(MaterialTheme.colors.background)) {
ConversationListItem(name = "James Magahern", id = "asdf", isUnread = true) {} ConversationListItem(name = "James Magahern", id = "asdf", lastMessagePreview = "This is a test", isUnread = true) {}
} }
} }

View File

@@ -1,9 +1,12 @@
package net.buzzert.kordophonedroid.ui.conversationlist package net.buzzert.kordophonedroid.ui.conversationlist
import android.util.Log
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import net.buzzert.kordophone.backend.model.Conversation import net.buzzert.kordophone.backend.model.Conversation
import net.buzzert.kordophone.backend.server.ChatRepository import net.buzzert.kordophone.backend.server.ChatRepository
@@ -15,6 +18,10 @@ class ConversationListViewModel @Inject constructor(
) : ViewModel() { ) : ViewModel() {
val conversations: Flow<List<Conversation>> val conversations: Flow<List<Conversation>>
get() = repository.conversationChanges get() = repository.conversationChanges
.map {
it.sortedBy { it.date }
.reversed()
}
init { init {
viewModelScope.launch { viewModelScope.launch {
@@ -24,5 +31,11 @@ class ConversationListViewModel @Inject constructor(
viewModelScope.launch { viewModelScope.launch {
repository.beginWatchingForUpdates(this) repository.beginWatchingForUpdates(this)
} }
viewModelScope.launch {
repository.conversationChanges.collect {
Log.v("ViewModel", "Got conversationChanges")
}
}
} }
} }

View File

@@ -122,9 +122,11 @@ class ChatRepository(
val conversations = fetchConversations() val conversations = fetchConversations()
database.writeConversations(conversations) database.writeConversations(conversations)
// TODO: Delete non-existent conversations.
// Sync top N number of conversations' message content // Sync top N number of conversations' message content
Log.d(REPO_LOG, "Synchronizing messages") Log.d(REPO_LOG, "Synchronizing messages")
val sortedConversations = conversations.sortedBy { it.date } val sortedConversations = conversations.sortedBy { it.date }.reversed()
for (conversation in sortedConversations.take(CONVERSATION_MESSAGE_SYNC_COUNT)) { for (conversation in sortedConversations.take(CONVERSATION_MESSAGE_SYNC_COUNT)) {
val messages = fetchMessages(conversation) val messages = fetchMessages(conversation)
database.writeMessages(messages, conversation) database.writeMessages(messages, conversation)