Trying to plumb list changes...
This commit is contained in:
@@ -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'
|
||||||
|
|||||||
@@ -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) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user