diff --git a/app/src/main/java/com/nextcloud/talk/contacts/ContactsScreen.kt b/app/src/main/java/com/nextcloud/talk/contacts/ContactsScreen.kt index 69d70306d..172dd04b3 100644 --- a/app/src/main/java/com/nextcloud/talk/contacts/ContactsScreen.kt +++ b/app/src/main/java/com/nextcloud/talk/contacts/ContactsScreen.kt @@ -29,6 +29,7 @@ fun ContactsScreen(contactsViewModel: ContactsViewModel, uiState: ContactsUiStat val isSearchActive by contactsViewModel.isSearchActive.collectAsStateWithLifecycle() val isAddParticipants by contactsViewModel.isAddParticipantsView.collectAsStateWithLifecycle() val autocompleteUsers by contactsViewModel.selectedParticipantsList.collectAsStateWithLifecycle() + val enableAddButton by contactsViewModel.enableAddButton.collectAsStateWithLifecycle() Scaffold( topBar = { @@ -49,6 +50,10 @@ fun ContactsScreen(contactsViewModel: ContactsViewModel, uiState: ContactsUiStat }, onUpdateAutocompleteUsers = { contactsViewModel.getContactsFromSearchParams() + }, + enableAddButton = enableAddButton, + clickAddButton = { + contactsViewModel.modifyClickAddButton(it) } ) }, diff --git a/app/src/main/java/com/nextcloud/talk/contacts/ContactsViewModel.kt b/app/src/main/java/com/nextcloud/talk/contacts/ContactsViewModel.kt index 7d495226b..64727b8a7 100644 --- a/app/src/main/java/com/nextcloud/talk/contacts/ContactsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/contacts/ContactsViewModel.kt @@ -36,6 +36,15 @@ class ContactsViewModel @Inject constructor( private val _isAddParticipantsView = MutableStateFlow(false) val isAddParticipantsView: StateFlow = _isAddParticipantsView + private val _enableAddButton = MutableStateFlow(false) + val enableAddButton: StateFlow = _enableAddButton + + @Suppress("PropertyName") + private val _selectedContacts = MutableStateFlow>(emptyList()) + + @Suppress("PropertyName") + private val _clickAddButton = MutableStateFlow(false) + private var hideAlreadyAddedParticipants: Boolean = false init { @@ -46,14 +55,28 @@ class ContactsViewModel @Inject constructor( _searchQuery.value = query } + fun modifyClickAddButton(value: Boolean) { + _clickAddButton.value = value + } + fun selectContact(contact: AutocompleteUser) { val updatedParticipants = selectedParticipants.value + contact selectedParticipants.value = updatedParticipants + _selectedContacts.value = _selectedContacts.value + contact + } + + fun updateAddButtonState() { + if (_selectedContacts.value.isEmpty()) { + _enableAddButton.value = false + } else { + _enableAddButton.value = true + } } fun deselectContact(contact: AutocompleteUser) { val updatedParticipants = selectedParticipants.value - contact selectedParticipants.value = updatedParticipants + _selectedContacts.value = _selectedContacts.value - contact } fun updateSelectedParticipants(participants: List) { @@ -86,10 +109,13 @@ class ContactsViewModel @Inject constructor( ) val contactsList: MutableList? = contacts.ocs!!.data?.toMutableList() - if (hideAlreadyAddedParticipants) { + if (hideAlreadyAddedParticipants && !_clickAddButton.value) { contactsList?.removeAll(selectedParticipants.value) } - + if (_clickAddButton.value) { + contactsList?.removeAll(selectedParticipants.value) + contactsList?.addAll(_selectedContacts.value) + } _contactsViewState.value = ContactsUiState.Success(contactsList) } catch (exception: Exception) { _contactsViewState.value = ContactsUiState.Error(exception.message ?: "") diff --git a/app/src/main/java/com/nextcloud/talk/contacts/components/AppBar.kt b/app/src/main/java/com/nextcloud/talk/contacts/components/AppBar.kt index aa161023d..0e3b709ea 100644 --- a/app/src/main/java/com/nextcloud/talk/contacts/components/AppBar.kt +++ b/app/src/main/java/com/nextcloud/talk/contacts/components/AppBar.kt @@ -13,6 +13,8 @@ import android.app.Activity import android.content.Intent import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.filled.Search @@ -20,8 +22,10 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.Text +import androidx.compose.material3.TextButton import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource @@ -30,6 +34,7 @@ import com.nextcloud.talk.models.json.autocomplete.AutocompleteUser @SuppressLint("UnrememberedMutableState") @OptIn(ExperimentalMaterial3Api::class) +@Suppress("LongParameterList", "LongMethod") @Composable fun AppBar( title: String, @@ -40,12 +45,18 @@ fun AppBar( onEnableSearch: () -> Unit, onDisableSearch: () -> Unit, onUpdateSearchQuery: (String) -> Unit, - onUpdateAutocompleteUsers: () -> Unit + onUpdateAutocompleteUsers: () -> Unit, + enableAddButton: Boolean, + clickAddButton: (Boolean) -> Unit ) { val context = LocalContext.current - + val appTitle = if (!isSearchActive) { + title + } else { + "" + } TopAppBar( - title = { Text(text = title) }, + title = { Text(text = appTitle) }, navigationIcon = { IconButton(onClick = { (context as? Activity)?.finish() @@ -54,36 +65,53 @@ fun AppBar( } }, actions = { - IconButton(onClick = onEnableSearch) { - Icon(Icons.Filled.Search, contentDescription = stringResource(R.string.search_icon)) - } - if (isAddParticipants) { - Text( - text = stringResource(id = R.string.nc_contacts_done), - modifier = Modifier.clickable { - val resultIntent = Intent().apply { - putParcelableArrayListExtra( - "selectedParticipants", - ArrayList(autocompleteUsers) - ) + if (!isSearchActive) { + IconButton(onClick = onEnableSearch) { + Icon(Icons.Filled.Search, contentDescription = stringResource(R.string.search_icon)) + } + if (isAddParticipants) { + Text( + text = stringResource(id = R.string.nc_contacts_done), + modifier = Modifier.clickable { + val resultIntent = Intent().apply { + putParcelableArrayListExtra( + "selectedParticipants", + ArrayList(autocompleteUsers) + ) + } + (context as? Activity)?.setResult(Activity.RESULT_OK, resultIntent) + (context as? Activity)?.finish() } - (context as? Activity)?.setResult(Activity.RESULT_OK, resultIntent) - (context as? Activity)?.finish() - } - ) + ) + } } } ) if (isSearchActive) { - Row { + Row(modifier = Modifier.fillMaxWidth()) { SearchComponent( text = searchQuery, onTextChange = { searchQuery -> onUpdateSearchQuery(searchQuery) onUpdateAutocompleteUsers() }, - onDisableSearch = onDisableSearch + onDisableSearch = onDisableSearch, + modifier = Modifier.weight(1f) ) + if (isAddParticipants) { + TextButton( + modifier = Modifier.align(Alignment.CenterVertically).wrapContentWidth(), + onClick = { + onDisableSearch() + onUpdateSearchQuery("") + clickAddButton(true) + onUpdateAutocompleteUsers() + }, + enabled = enableAddButton + ) { + Text(text = context.getString(R.string.add_participants)) + } + } } } } diff --git a/app/src/main/java/com/nextcloud/talk/contacts/components/ContactItemRow.kt b/app/src/main/java/com/nextcloud/talk/contacts/components/ContactItemRow.kt index e45afd291..05cd8431c 100644 --- a/app/src/main/java/com/nextcloud/talk/contacts/components/ContactItemRow.kt +++ b/app/src/main/java/com/nextcloud/talk/contacts/components/ContactItemRow.kt @@ -65,8 +65,10 @@ fun ContactItemRow(contact: AutocompleteUser, contactsViewModel: ContactsViewMod isSelected = !isSelected if (isSelected) { contactsViewModel.selectContact(contact) + contactsViewModel.updateAddButtonState() } else { contactsViewModel.deselectContact(contact) + contactsViewModel.updateAddButtonState() } } } diff --git a/app/src/main/java/com/nextcloud/talk/contacts/components/SearchComponent.kt b/app/src/main/java/com/nextcloud/talk/contacts/components/SearchComponent.kt index 5a353939d..8e79c0484 100644 --- a/app/src/main/java/com/nextcloud/talk/contacts/components/SearchComponent.kt +++ b/app/src/main/java/com/nextcloud/talk/contacts/components/SearchComponent.kt @@ -8,7 +8,6 @@ package com.nextcloud.talk.contacts.components import androidx.compose.foundation.background -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions @@ -34,16 +33,19 @@ import androidx.compose.ui.unit.sp import com.nextcloud.talk.R @Composable -fun SearchComponent(text: String, onTextChange: (String) -> Unit, onDisableSearch: () -> Unit) { +fun SearchComponent( + text: String, + onTextChange: (String) -> Unit, + onDisableSearch: () -> Unit, + modifier: Modifier = Modifier +) { val keyboardController = LocalSoftwareKeyboardController.current - TextField( - modifier = Modifier - .background(MaterialTheme.colorScheme.background) - .fillMaxWidth() - .height(60.dp), value = text, onValueChange = { onTextChange(it) }, + modifier = modifier + .background(MaterialTheme.colorScheme.background) + .height(60.dp), placeholder = { Text(text = stringResource(R.string.nc_search)) }, textStyle = TextStyle(fontSize = 16.sp), singleLine = true, diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt index dae77e153..eb4782512 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt @@ -859,16 +859,13 @@ class ConversationInfoActivity : private fun selectParticipantsToAdd() { val bundle = Bundle() val existingParticipants = ArrayList() - for (userItem in userItems) { - if (userItem.model.calculatedActorType == USERS) { - val user = AutocompleteUser( - userItem.model.calculatedActorId!!, - userItem.model.displayName, - userItem.model.calculatedActorType.name.lowercase() - ) - existingParticipants.add(user) - } + val user = AutocompleteUser( + userItem.model.calculatedActorId!!, + userItem.model.displayName, + userItem.model.calculatedActorType.name.lowercase() + ) + existingParticipants.add(user) } bundle.putBoolean(BundleKeys.KEY_ADD_PARTICIPANTS, true) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 230d168bd..887a4849f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -41,6 +41,7 @@ How to translate with transifex: Settings + Add Test server connection