talk-android/app/src/main/java/com/nextcloud/talk/conversationcreation/ConversationCreationActivity.kt
sowjanyakch 9f61793c86
add isAddParticipant flag
Signed-off-by: sowjanyakch <sowjanya.kch@gmail.com>
2024-09-05 15:41:09 +02:00

310 lines
11 KiB
Kotlin

/*
* Nextcloud Talk - Android Client
*
* SPDX-FileCopyrightText: 2024 Sowjanya Kota <sowjanya.kch@gmail.com>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
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
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.lifecycle.ViewModelProvider
import autodagger.AutoInjector
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
@AutoInjector(NextcloudTalkApplication::class)
class ConversationCreationActivity : BaseActivity() {
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory
private lateinit var conversationCreationViewModel: ConversationCreationViewModel
@OptIn(ExperimentalMaterial3Api::class)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this)
conversationCreationViewModel =
ViewModelProvider(this, viewModelFactory)[ConversationCreationViewModel::class.java]
val contactsViewModel = ViewModelProvider(this, viewModelFactory)[ContactsViewModel::class.java]
setContent {
val colorScheme = viewThemeUtils.getColorScheme(this)
MaterialTheme(
colorScheme = colorScheme
) {
val context = LocalContext.current
Scaffold(
topBar = {
TopAppBar(
title = { Text(text = stringResource(id = R.string.nc_new_conversation)) },
navigationIcon = {
IconButton(onClick = {
(context as? Activity)?.finish()
}) {
Icon(
Icons.AutoMirrored.Filled.ArrowBack,
contentDescription = stringResource(R.string.back_button)
)
}
}
)
},
content = {
Column(Modifier.padding(it)) {
DefaultUserAvatar()
UploadAvatar()
ConversationNameAndDescription(conversationCreationViewModel)
AddParticipants(contactsViewModel, context)
RoomCreationOptions(conversationCreationViewModel)
}
}
)
}
}
}
}
@Composable
fun DefaultUserAvatar() {
Box(
modifier = Modifier.fillMaxWidth(),
contentAlignment = Alignment.Center
) {
AsyncImage(
model = R.drawable.ic_circular_group,
contentDescription = "User Avatar",
modifier = Modifier
.size(width = 84.dp, height = 84.dp)
.padding(top = 8.dp)
)
}
}
@Composable
fun UploadAvatar() {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
horizontalArrangement = Arrangement.Center
) {
IconButton(onClick = {
}) {
Icon(
painter = painterResource(id = R.drawable.ic_baseline_photo_camera_24),
contentDescription = null,
modifier = Modifier.size(24.dp)
)
}
IconButton(onClick = {
}) {
Icon(
painter = painterResource(id = R.drawable.ic_folder_multiple_image),
contentDescription = null,
modifier = Modifier.size(24.dp)
)
}
IconButton(onClick = {
}) {
Icon(
painter = painterResource(id = R.drawable.baseline_tag_faces_24),
contentDescription = null,
modifier = Modifier.size(24.dp)
)
}
IconButton(onClick = {
}) {
Icon(
painter = painterResource(id = R.drawable.ic_delete_grey600_24dp),
contentDescription = null,
modifier = Modifier.size(24.dp)
)
}
}
}
@Composable
fun ConversationNameAndDescription(conversationCreationViewModel: ConversationCreationViewModel) {
val conversationRoomName = conversationCreationViewModel.roomName.collectAsState()
val conversationDescription = conversationCreationViewModel.conversationDescription.collectAsState()
OutlinedTextField(
value = conversationRoomName.value,
onValueChange = {
conversationCreationViewModel.updateRoomName(it)
},
label = { Text(text = stringResource(id = R.string.nc_call_name)) },
modifier = Modifier
.padding(start = 16.dp, end = 16.dp)
.fillMaxWidth()
)
OutlinedTextField(
value = conversationDescription.value,
onValueChange = {
conversationCreationViewModel.updateRoomName(it)
},
label = { Text(text = stringResource(id = R.string.nc_conversation_description)) },
modifier = Modifier
.padding(top = 8.dp, start = 16.dp, end = 16.dp)
.fillMaxWidth()
)
}
@Composable
fun AddParticipants(contactsViewModel: ContactsViewModel, context: Context) {
Text(
text = stringResource(id = R.string.nc_participants).uppercase(),
fontSize = 14.sp,
modifier = Modifier.padding(top = 24.dp, start = 16.dp, end = 16.dp, bottom = 16.dp)
)
Row(
modifier = Modifier
.padding(start = 16.dp, end = 16.dp)
.clickable {
val intent = Intent(context, ContactsActivityCompose::class.java)
intent.putExtra("isAddParticipants", true)
context.startActivity(intent)
},
verticalAlignment = Alignment
.CenterVertically
) {
Icon(
painter = painterResource(id = R.drawable.ic_account_plus),
contentDescription = null,
modifier = Modifier.size(24.dp)
)
Text(text = stringResource(id = R.string.nc_add_participants), modifier = Modifier.padding(start = 16.dp))
}
}
@Composable
fun RoomCreationOptions(conversationCreationViewModel: ConversationCreationViewModel) {
var isGuestsAllowed = conversationCreationViewModel.isGuestsAllowed.value
var isConversationAvailableForRegisteredUsers = conversationCreationViewModel
.isConversationAvailableForRegisteredUsers.value
var isOpenForGuestAppUsers = conversationCreationViewModel.openForGuestAppUsers.value
Text(
text = stringResource(id = R.string.nc_visible).uppercase(),
fontSize = 14.sp,
modifier = Modifier.padding(top = 24.dp, start = 16.dp, end = 16.dp)
)
ConversationOptions(
icon = R.drawable.ic_avatar_link,
text = R.string.nc_guest_access_allow_title,
switch = {
Switch(
checked = isGuestsAllowed,
onCheckedChange = {
conversationCreationViewModel.isGuestsAllowed.value = it
}
)
}
)
if (isGuestsAllowed) {
ConversationOptions(
icon = R.drawable.ic_lock_grey600_24px,
text = R.string.nc_set_password
)
}
ConversationOptions(
icon = R.drawable.baseline_format_list_bulleted_24,
text = R.string.nc_open_conversation_to_registered_users,
switch = {
Switch(
checked = isConversationAvailableForRegisteredUsers,
onCheckedChange = {
conversationCreationViewModel.isConversationAvailableForRegisteredUsers.value = it
}
)
}
)
if (isConversationAvailableForRegisteredUsers) {
ConversationOptions(
text = R.string.nc_open_to_guest_app_users,
switch = {
Switch(
checked = isOpenForGuestAppUsers,
onCheckedChange = {
conversationCreationViewModel.openForGuestAppUsers.value = it
}
)
}
)
}
}
@Composable
fun ConversationOptions(icon: Int? = null, text: Int, switch: @Composable (() -> Unit)? = null) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(start = 16.dp, end = 16.dp, bottom = 8.dp),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
if (icon != null) {
Icon(
painter = painterResource(id = icon),
contentDescription = null,
modifier = Modifier.size(24.dp)
)
Spacer(modifier = Modifier.width(16.dp))
} else {
Spacer(modifier = Modifier.width(40.dp))
}
Text(
text = stringResource(id = text),
modifier = Modifier.weight(1f)
)
switch?.invoke()
}
}