From 9f61793c868a16186c375df72af082e34e064393 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Tue, 6 Aug 2024 23:21:36 +0200 Subject: [PATCH] add isAddParticipant flag Signed-off-by: sowjanyakch --- .../talk/contacts/ContactsActivityCompose.kt | 197 +++++------------- .../talk/contacts/ContactsViewModel.kt | 6 + .../nextcloud/talk/contacts/ContentItem.kt | 110 ++++++++++ .../talk/contacts/SearchComponent.kt | 10 +- .../ConversationCreationActivity.kt | 16 +- 5 files changed, 192 insertions(+), 147 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/talk/contacts/ContentItem.kt diff --git a/app/src/main/java/com/nextcloud/talk/contacts/ContactsActivityCompose.kt b/app/src/main/java/com/nextcloud/talk/contacts/ContactsActivityCompose.kt index d9234bac9..2241e7f6d 100644 --- a/app/src/main/java/com/nextcloud/talk/contacts/ContactsActivityCompose.kt +++ b/app/src/main/java/com/nextcloud/talk/contacts/ContactsActivityCompose.kt @@ -12,15 +12,10 @@ import android.app.Activity import android.content.Context import android.content.Intent import android.os.Bundle -import android.util.Log import androidx.activity.compose.setContent -import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.background import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth @@ -29,20 +24,15 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.wrapContentHeight -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.automirrored.filled.List import androidx.compose.material.icons.filled.Search -import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold -import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable @@ -54,7 +44,6 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.ViewModelProvider @@ -82,6 +71,8 @@ class ContactsActivityCompose : BaseActivity() { super.onCreate(savedInstanceState) NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this) contactsViewModel = ViewModelProvider(this, viewModelFactory)[ContactsViewModel::class.java] + val isAddParticipants = intent.getBooleanExtra("isAddParticipants", false) + contactsViewModel.updateIsAddParticipants(isAddParticipants) setContent { val colorScheme = viewThemeUtils.getColorScheme(this) val uiState = contactsViewModel.contactsViewState.collectAsState() @@ -99,7 +90,7 @@ class ContactsActivityCompose : BaseActivity() { }, content = { Column(Modifier.padding(it)) { - ConversationCreationOptions(context = context) + ConversationCreationOptions(context = context, contactsViewModel = contactsViewModel) ContactsList( contactsUiState = uiState.value, contactsViewModel = contactsViewModel, @@ -110,87 +101,9 @@ class ContactsActivityCompose : BaseActivity() { ) } } - setupSystemColors() } } -@Composable -fun ContactsList(contactsUiState: ContactsUiState, contactsViewModel: ContactsViewModel, context: Context) { - when (contactsUiState) { - is ContactsUiState.None -> { - } - is ContactsUiState.Loading -> { - Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { - CircularProgressIndicator() - } - } - is ContactsUiState.Success -> { - val contacts = contactsUiState.contacts - Log.d(CompanionClass.TAG, "Contacts:$contacts") - if (contacts != null) { - ContactsItem(contacts, contactsViewModel, context) - } - } - is ContactsUiState.Error -> { - val errorMessage = contactsUiState.message - Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { - Text(text = "Error: $errorMessage", color = MaterialTheme.colorScheme.error) - } - } - } -} - -@OptIn(ExperimentalFoundationApi::class) -@Composable -fun ContactsItem(contacts: List, contactsViewModel: ContactsViewModel, context: Context) { - val groupedContacts: Map> = contacts.groupBy { contact -> - ( - if (contact.source == "users") { - contact.label?.first()?.uppercase() - } else { - contact.source?.replaceFirstChar { actorType -> - actorType.uppercase() - } - } - ).toString() - } - LazyColumn( - modifier = Modifier - .padding(8.dp) - .fillMaxWidth(), - contentPadding = PaddingValues(all = 10.dp), - verticalArrangement = Arrangement.spacedBy(10.dp) - ) { - groupedContacts.forEach { (initial, contactsForInitial) -> - stickyHeader { - Column { - Surface(Modifier.fillParentMaxWidth()) { - Header(initial) - } - HorizontalDivider(thickness = 1.dp, color = MaterialTheme.colorScheme.outlineVariant) - } - } - items(contactsForInitial) { contact -> - ContactItemRow(contact = contact, contactsViewModel = contactsViewModel, context = context) - Log.d(CompanionClass.TAG, "Contacts:$contact") - } - } - } -} - -@Composable -fun Header(header: String) { - Text( - text = header, - modifier = Modifier - .fillMaxSize() - .background(Color.Transparent) - .padding(start = 60.dp), - color = MaterialTheme.colorScheme.primary, - fontWeight = FontWeight.Bold - ) -} - @Composable fun ContactItemRow(contact: AutocompleteUser, contactsViewModel: ContactsViewModel, context: Context) { val roomUiState by contactsViewModel.roomViewState.collectAsState() @@ -231,7 +144,7 @@ fun ContactItemRow(contact: AutocompleteUser, contactsViewModel: ContactsViewMod is RoomUiState.Error -> { val errorMessage = (roomUiState as RoomUiState.Error).message Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { - Text(text = "Error: $errorMessage", color = MaterialTheme.colorScheme.error) + Text(text = "Error: $errorMessage", color = Color.Red) } } is RoomUiState.None -> {} @@ -276,57 +189,61 @@ fun AppBar(title: String, context: Context, contactsViewModel: ContactsViewModel } @Composable -fun ConversationCreationOptions(context: Context) { - Column { - Row( - modifier = Modifier.padding(start = 16.dp, end = 16.dp, top = 16.dp, bottom = 8.dp) - .clickable { - val intent = Intent(context, ConversationCreationActivity::class.java) - context.startActivity(intent) - }, - verticalAlignment = Alignment.CenterVertically - ) { - Icon( - painter = painterResource(id = R.drawable.baseline_chat_bubble_outline_24), +fun ConversationCreationOptions(context: Context, contactsViewModel: ContactsViewModel) { + val isAddParticipants by contactsViewModel.isAddParticipantsView.collectAsState() + if (!isAddParticipants) { + Column { + Row( modifier = Modifier - .width(40.dp) - .height(40.dp) - .padding(8.dp), - contentDescription = null - ) - Text( + .padding(start = 16.dp, end = 16.dp, top = 16.dp, bottom = 8.dp) + .clickable { + val intent = Intent(context, ConversationCreationActivity::class.java) + context.startActivity(intent) + }, + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + painter = painterResource(id = R.drawable.baseline_chat_bubble_outline_24), + modifier = Modifier + .width(40.dp) + .height(40.dp) + .padding(8.dp), + contentDescription = null + ) + Text( + modifier = Modifier + .fillMaxWidth() + .wrapContentHeight(), + text = stringResource(R.string.nc_create_new_conversation), + maxLines = 1, + fontSize = 16.sp + ) + } + Row( modifier = Modifier - .fillMaxWidth() - .wrapContentHeight(), - text = stringResource(R.string.nc_create_new_conversation), - maxLines = 1, - fontSize = 16.sp - ) - } - Row( - modifier = Modifier - .padding(start = 16.dp, end = 16.dp, top = 8.dp, bottom = 8.dp) - .clickable { - val intent = Intent(context, ListOpenConversationsActivity::class.java) - context.startActivity(intent) - }, - verticalAlignment = Alignment.CenterVertically - ) { - Icon( - Icons.AutoMirrored.Filled.List, - modifier = Modifier - .width(40.dp) - .height(40.dp) - .padding(8.dp), - contentDescription = null - ) - Text( - modifier = Modifier - .fillMaxWidth() - .wrapContentHeight(), - text = stringResource(R.string.nc_join_open_conversations), - fontSize = 16.sp - ) + .padding(start = 16.dp, end = 16.dp, top = 8.dp, bottom = 8.dp) + .clickable { + val intent = Intent(context, ListOpenConversationsActivity::class.java) + context.startActivity(intent) + }, + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + Icons.AutoMirrored.Filled.List, + modifier = Modifier + .width(40.dp) + .height(40.dp) + .padding(8.dp), + contentDescription = null + ) + Text( + modifier = Modifier + .fillMaxWidth() + .wrapContentHeight(), + text = stringResource(R.string.nc_join_open_conversations), + fontSize = 16.sp + ) + } } } } 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 7b0a2e450..31e3466c8 100644 --- a/app/src/main/java/com/nextcloud/talk/contacts/ContactsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/contacts/ContactsViewModel.kt @@ -30,6 +30,8 @@ class ContactsViewModel @Inject constructor( val shareTypeList: List = shareTypes private val _searchState = MutableStateFlow(false) val searchState: StateFlow = _searchState + private val _isAddParticipantsView = MutableStateFlow(false) + val isAddParticipantsView: StateFlow = _isAddParticipantsView init { getContactsFromSearchParams() @@ -47,6 +49,10 @@ class ContactsViewModel @Inject constructor( shareTypes.add(value) } + fun updateIsAddParticipants(value: Boolean) { + _isAddParticipantsView.value = value + } + fun getContactsFromSearchParams() { _contactsViewState.value = ContactsUiState.Loading viewModelScope.launch { diff --git a/app/src/main/java/com/nextcloud/talk/contacts/ContentItem.kt b/app/src/main/java/com/nextcloud/talk/contacts/ContentItem.kt new file mode 100644 index 000000000..db2e01441 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/contacts/ContentItem.kt @@ -0,0 +1,110 @@ +/* + * Nextcloud Talk - Android Client + * + * SPDX-FileCopyrightText: 2024 Your Name + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package com.nextcloud.talk.contacts + +import android.content.Context +import android.util.Log +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import com.nextcloud.talk.models.json.autocomplete.AutocompleteUser + +@Composable +fun ContactsList(contactsUiState: ContactsUiState, contactsViewModel: ContactsViewModel, context: Context) { + when (contactsUiState) { + is ContactsUiState.None -> { + } + is ContactsUiState.Loading -> { + Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { + CircularProgressIndicator() + } + } + is ContactsUiState.Success -> { + val contacts = contactsUiState.contacts + Log.d(CompanionClass.TAG, "Contacts:$contacts") + if (contacts != null) { + ContactsItem(contacts, contactsViewModel, context) + } + } + is ContactsUiState.Error -> { + val errorMessage = contactsUiState.message + Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { + Text(text = "Error: $errorMessage", color = Color.Red) + } + } + } +} + +@OptIn(ExperimentalFoundationApi::class) +@Composable +fun ContactsItem(contacts: List, contactsViewModel: ContactsViewModel, context: Context) { + val groupedContacts: Map> = contacts.groupBy { contact -> + ( + if (contact.source == "users") { + contact.label?.first()?.uppercase() + } else { + contact.source?.replaceFirstChar { actorType -> + actorType.uppercase() + } + } + ).toString() + } + LazyColumn( + modifier = Modifier + .padding(8.dp) + .fillMaxWidth(), + contentPadding = PaddingValues(all = 10.dp), + verticalArrangement = Arrangement.spacedBy(10.dp) + ) { + groupedContacts.forEach { (initial, contactsForInitial) -> + stickyHeader { + Column { + Surface(Modifier.fillParentMaxWidth()) { + Header(initial) + } + HorizontalDivider(thickness = 0.1.dp, color = Color.Black) + } + } + items(contactsForInitial) { contact -> + ContactItemRow(contact = contact, contactsViewModel = contactsViewModel, context = context) + Log.d(CompanionClass.TAG, "Contacts:$contact") + } + } + } +} + +@Composable +fun Header(header: String) { + Text( + text = header, + modifier = Modifier + .fillMaxSize() + .background(Color.Transparent) + .padding(start = 60.dp), + color = Color.Blue, + fontWeight = FontWeight.Bold + ) +} diff --git a/app/src/main/java/com/nextcloud/talk/contacts/SearchComponent.kt b/app/src/main/java/com/nextcloud/talk/contacts/SearchComponent.kt index f7ba7d61b..e0c1150d9 100644 --- a/app/src/main/java/com/nextcloud/talk/contacts/SearchComponent.kt +++ b/app/src/main/java/com/nextcloud/talk/contacts/SearchComponent.kt @@ -14,11 +14,13 @@ import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.filled.Close +import androidx.compose.material3.Button import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.Text import androidx.compose.material3.TextField import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.res.stringResource @@ -30,6 +32,7 @@ import com.nextcloud.talk.R @Composable fun DisplaySearch(text: String, onTextChange: (String) -> Unit, contactsViewModel: ContactsViewModel) { + val isAddParticipants = contactsViewModel.isAddParticipantsView.collectAsState() val keyboardController = LocalSoftwareKeyboardController.current TextField( modifier = Modifier @@ -42,7 +45,6 @@ fun DisplaySearch(text: String, onTextChange: (String) -> Unit, contactsViewMode text = stringResource(R.string.nc_search) ) }, - textStyle = TextStyle( fontSize = 16.sp ), @@ -91,4 +93,10 @@ fun DisplaySearch(text: String, onTextChange: (String) -> Unit, contactsViewMode ), maxLines = 1 ) + if (isAddParticipants.value) { + Button(onClick = { + }, modifier = Modifier.fillMaxWidth(0.2f)) { + Text(text = "Done") + } + } } diff --git a/app/src/main/java/com/nextcloud/talk/conversationcreation/ConversationCreationActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationcreation/ConversationCreationActivity.kt index a4a213558..31d0c176b 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationcreation/ConversationCreationActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationcreation/ConversationCreationActivity.kt @@ -8,6 +8,8 @@ package com.nextcloud.talk.conversationcreation import android.app.Activity +import android.content.Context +import android.content.Intent import android.os.Bundle import androidx.activity.compose.setContent import androidx.compose.foundation.clickable @@ -46,6 +48,7 @@ import coil.compose.AsyncImage import com.nextcloud.talk.R import com.nextcloud.talk.activities.BaseActivity import com.nextcloud.talk.application.NextcloudTalkApplication +import com.nextcloud.talk.contacts.ContactsActivityCompose import com.nextcloud.talk.contacts.ContactsViewModel import javax.inject.Inject @@ -54,7 +57,6 @@ class ConversationCreationActivity : BaseActivity() { @Inject lateinit var viewModelFactory: ViewModelProvider.Factory private lateinit var conversationCreationViewModel: ConversationCreationViewModel - private lateinit var contactsViewModel: ContactsViewModel @OptIn(ExperimentalMaterial3Api::class) override fun onCreate(savedInstanceState: Bundle?) { @@ -62,7 +64,8 @@ class ConversationCreationActivity : BaseActivity() { NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this) conversationCreationViewModel = ViewModelProvider(this, viewModelFactory)[ConversationCreationViewModel::class.java] - contactsViewModel = ViewModelProvider(this, viewModelFactory)[ContactsViewModel::class.java] + val contactsViewModel = ViewModelProvider(this, viewModelFactory)[ContactsViewModel::class.java] + setContent { val colorScheme = viewThemeUtils.getColorScheme(this) MaterialTheme( @@ -73,7 +76,6 @@ class ConversationCreationActivity : BaseActivity() { topBar = { TopAppBar( title = { Text(text = stringResource(id = R.string.nc_new_conversation)) }, - navigationIcon = { IconButton(onClick = { (context as? Activity)?.finish() @@ -91,7 +93,7 @@ class ConversationCreationActivity : BaseActivity() { DefaultUserAvatar() UploadAvatar() ConversationNameAndDescription(conversationCreationViewModel) - AddParticipants(contactsViewModel) + AddParticipants(contactsViewModel, context) RoomCreationOptions(conversationCreationViewModel) } } @@ -190,7 +192,7 @@ fun ConversationNameAndDescription(conversationCreationViewModel: ConversationCr } @Composable -fun AddParticipants(contactsViewModel: ContactsViewModel) { +fun AddParticipants(contactsViewModel: ContactsViewModel, context: Context) { Text( text = stringResource(id = R.string.nc_participants).uppercase(), fontSize = 14.sp, @@ -201,7 +203,9 @@ fun AddParticipants(contactsViewModel: ContactsViewModel) { modifier = Modifier .padding(start = 16.dp, end = 16.dp) .clickable { - // Show contacts + val intent = Intent(context, ContactsActivityCompose::class.java) + intent.putExtra("isAddParticipants", true) + context.startActivity(intent) }, verticalAlignment = Alignment .CenterVertically