Explorar o código

Make contacts select and deselect via search

Signed-off-by: sowjanyakch <sowjanya.kch@gmail.com>
sowjanyakch hai 7 meses
pai
achega
9fcb1427db

+ 14 - 36
app/src/main/java/com/nextcloud/talk/contacts/ContactsActivityCompose.kt

@@ -52,9 +52,7 @@ import androidx.compose.runtime.Composable
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Color
@@ -116,9 +114,9 @@ class ContactsActivityCompose : BaseActivity() {
                     @Suppress("DEPRECATION")
                     @Suppress("DEPRECATION")
                     intent.getParcelableArrayListExtra("selectedParticipants") ?: emptyList()
                     intent.getParcelableArrayListExtra("selectedParticipants") ?: emptyList()
                 }
                 }
-            }
-            val participants = selectedParticipants.toSet().toMutableList()
-            contactsViewModel.updateSelectedParticipants(participants)
+            }.toSet().toMutableList()
+            contactsViewModel.updateSelectedParticipants(selectedParticipants)
+
             MaterialTheme(
             MaterialTheme(
                 colorScheme = colorScheme
                 colorScheme = colorScheme
             ) {
             ) {
@@ -137,8 +135,7 @@ class ContactsActivityCompose : BaseActivity() {
                             ContactsList(
                             ContactsList(
                                 contactsUiState = uiState.value,
                                 contactsUiState = uiState.value,
                                 contactsViewModel = contactsViewModel,
                                 contactsViewModel = contactsViewModel,
-                                context = context,
-                                selectedParticipants = selectedParticipants.toMutableList()
+                                context = context
                             )
                             )
                         }
                         }
                     }
                     }
@@ -168,13 +165,8 @@ class ContactsActivityCompose : BaseActivity() {
 }
 }
 
 
 @Composable
 @Composable
-fun ContactItemRow(
-    contact: AutocompleteUser,
-    contactsViewModel: ContactsViewModel,
-    context: Context,
-    selectedContacts: MutableList<AutocompleteUser>
-) {
-    var isSelected by remember { mutableStateOf(selectedContacts.contains(contact)) }
+fun ContactItemRow(contact: AutocompleteUser, contactsViewModel: ContactsViewModel, context: Context) {
+    var isSelected = remember(contact) { contactsViewModel.selectedParticipantsList.value.contains(contact) }
     val roomUiState by contactsViewModel.roomViewState.collectAsState()
     val roomUiState by contactsViewModel.roomViewState.collectAsState()
     val isAddParticipants = contactsViewModel.isAddParticipantsView.collectAsState()
     val isAddParticipants = contactsViewModel.isAddParticipantsView.collectAsState()
     Row(
     Row(
@@ -191,14 +183,11 @@ fun ContactItemRow(
                         )
                         )
                     } else {
                     } else {
                         isSelected = !isSelected
                         isSelected = !isSelected
-                        selectedContacts.apply {
-                            if (isSelected) {
-                                add(contact)
-                            } else {
-                                remove(contact)
-                            }
+                        if (isSelected) {
+                            contactsViewModel.selectContact(contact)
+                        } else {
+                            contactsViewModel.deselectContact(contact)
                         }
                         }
-                        contactsViewModel.updateSelectedParticipants(selectedContacts)
                     }
                     }
                 }
                 }
             ),
             ),
@@ -363,12 +352,7 @@ fun ConversationCreationOptions(context: Context, contactsViewModel: ContactsVie
 }
 }
 
 
 @Composable
 @Composable
-fun ContactsList(
-    contactsUiState: ContactsUiState,
-    contactsViewModel: ContactsViewModel,
-    context: Context,
-    selectedParticipants: MutableList<AutocompleteUser>
-) {
+fun ContactsList(contactsUiState: ContactsUiState, contactsViewModel: ContactsViewModel, context: Context) {
     when (contactsUiState) {
     when (contactsUiState) {
         is ContactsUiState.None -> {
         is ContactsUiState.None -> {
         }
         }
@@ -381,7 +365,7 @@ fun ContactsList(
             val contacts = contactsUiState.contacts
             val contacts = contactsUiState.contacts
             Log.d(CompanionClass.TAG, "Contacts:$contacts")
             Log.d(CompanionClass.TAG, "Contacts:$contacts")
             if (contacts != null) {
             if (contacts != null) {
-                ContactsItem(contacts, contactsViewModel, context, selectedParticipants)
+                ContactsItem(contacts, contactsViewModel, context)
             }
             }
         }
         }
         is ContactsUiState.Error -> {
         is ContactsUiState.Error -> {
@@ -395,12 +379,7 @@ fun ContactsList(
 
 
 @OptIn(ExperimentalFoundationApi::class)
 @OptIn(ExperimentalFoundationApi::class)
 @Composable
 @Composable
-fun ContactsItem(
-    contacts: List<AutocompleteUser>,
-    contactsViewModel: ContactsViewModel,
-    context: Context,
-    selectedParticipants: MutableList<AutocompleteUser>
-) {
+fun ContactsItem(contacts: List<AutocompleteUser>, contactsViewModel: ContactsViewModel, context: Context) {
     val groupedContacts: Map<String, List<AutocompleteUser>> = contacts.groupBy { contact ->
     val groupedContacts: Map<String, List<AutocompleteUser>> = contacts.groupBy { contact ->
         (
         (
             if (contact.source == "users") {
             if (contact.source == "users") {
@@ -432,8 +411,7 @@ fun ContactsItem(
                 ContactItemRow(
                 ContactItemRow(
                     contact = contact,
                     contact = contact,
                     contactsViewModel = contactsViewModel,
                     contactsViewModel = contactsViewModel,
-                    context = context,
-                    selectedContacts = selectedParticipants
+                    context = context
                 )
                 )
                 Log.d(CompanionClass.TAG, "Contacts:$contact")
                 Log.d(CompanionClass.TAG, "Contacts:$contact")
             }
             }

+ 12 - 1
app/src/main/java/com/nextcloud/talk/contacts/ContactsViewModel.kt

@@ -13,6 +13,7 @@ import com.nextcloud.talk.models.json.autocomplete.AutocompleteUser
 import com.nextcloud.talk.models.json.conversations.Conversation
 import com.nextcloud.talk.models.json.conversations.Conversation
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.launch
 import javax.inject.Inject
 import javax.inject.Inject
 
 
@@ -31,7 +32,7 @@ class ContactsViewModel @Inject constructor(
     private val _searchState = MutableStateFlow(false)
     private val _searchState = MutableStateFlow(false)
     val searchState: StateFlow<Boolean> = _searchState
     val searchState: StateFlow<Boolean> = _searchState
     private val selectedParticipants = MutableStateFlow<List<AutocompleteUser>>(emptyList())
     private val selectedParticipants = MutableStateFlow<List<AutocompleteUser>>(emptyList())
-    val selectedParticipantsList: StateFlow<List<AutocompleteUser>> = selectedParticipants
+    val selectedParticipantsList: StateFlow<List<AutocompleteUser>> = selectedParticipants.asStateFlow()
     private val _isAddParticipantsView = MutableStateFlow(false)
     private val _isAddParticipantsView = MutableStateFlow(false)
     val isAddParticipantsView: StateFlow<Boolean> = _isAddParticipantsView
     val isAddParticipantsView: StateFlow<Boolean> = _isAddParticipantsView
 
 
@@ -43,6 +44,16 @@ class ContactsViewModel @Inject constructor(
         _searchQuery.value = query
         _searchQuery.value = query
     }
     }
 
 
+    fun selectContact(contact: AutocompleteUser) {
+        val updatedParticipants = selectedParticipants.value + contact
+        selectedParticipants.value = updatedParticipants
+    }
+
+    fun deselectContact(contact: AutocompleteUser) {
+        val updatedParticipants = selectedParticipants.value - contact
+        selectedParticipants.value = updatedParticipants
+    }
+
     fun updateSelectedParticipants(participants: List<AutocompleteUser>) {
     fun updateSelectedParticipants(participants: List<AutocompleteUser>) {
         selectedParticipants.value = participants
         selectedParticipants.value = participants
     }
     }

+ 0 - 2
app/src/main/java/com/nextcloud/talk/contacts/SearchComponent.kt

@@ -19,7 +19,6 @@ import androidx.compose.material3.IconButton
 import androidx.compose.material3.Text
 import androidx.compose.material3.Text
 import androidx.compose.material3.TextField
 import androidx.compose.material3.TextField
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.collectAsState
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.LocalSoftwareKeyboardController
 import androidx.compose.ui.platform.LocalSoftwareKeyboardController
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.res.stringResource
@@ -31,7 +30,6 @@ import com.nextcloud.talk.R
 
 
 @Composable
 @Composable
 fun DisplaySearch(text: String, onTextChange: (String) -> Unit, contactsViewModel: ContactsViewModel) {
 fun DisplaySearch(text: String, onTextChange: (String) -> Unit, contactsViewModel: ContactsViewModel) {
-    val isAddParticipants = contactsViewModel.isAddParticipantsView.collectAsState()
     val keyboardController = LocalSoftwareKeyboardController.current
     val keyboardController = LocalSoftwareKeyboardController.current
     TextField(
     TextField(
         modifier = Modifier
         modifier = Modifier