mirror of
https://github.com/nextcloud/talk-android
synced 2025-07-21 19:55:07 +01:00
Add Change Password dialogue
Signed-off-by: sowjanyakch <sowjanya.kch@gmail.com>
This commit is contained in:
parent
454c829313
commit
381804c892
@ -20,6 +20,7 @@ import androidx.activity.compose.rememberLauncherForActivityResult
|
|||||||
import androidx.activity.compose.setContent
|
import androidx.activity.compose.setContent
|
||||||
import androidx.activity.result.ActivityResult
|
import androidx.activity.result.ActivityResult
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
|
import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
import androidx.compose.foundation.isSystemInDarkTheme
|
import androidx.compose.foundation.isSystemInDarkTheme
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
@ -28,17 +29,21 @@ import androidx.compose.foundation.layout.Column
|
|||||||
import androidx.compose.foundation.layout.Row
|
import androidx.compose.foundation.layout.Row
|
||||||
import androidx.compose.foundation.layout.Spacer
|
import androidx.compose.foundation.layout.Spacer
|
||||||
import androidx.compose.foundation.layout.fillMaxHeight
|
import androidx.compose.foundation.layout.fillMaxHeight
|
||||||
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
|
import androidx.compose.foundation.layout.height
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.foundation.layout.size
|
import androidx.compose.foundation.layout.size
|
||||||
import androidx.compose.foundation.layout.width
|
import androidx.compose.foundation.layout.width
|
||||||
import androidx.compose.foundation.rememberScrollState
|
import androidx.compose.foundation.rememberScrollState
|
||||||
import androidx.compose.foundation.shape.CircleShape
|
import androidx.compose.foundation.shape.CircleShape
|
||||||
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||||
import androidx.compose.foundation.verticalScroll
|
import androidx.compose.foundation.verticalScroll
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.automirrored.filled.ArrowBack
|
import androidx.compose.material.icons.automirrored.filled.ArrowBack
|
||||||
import androidx.compose.material3.AlertDialog
|
import androidx.compose.material3.AlertDialog
|
||||||
import androidx.compose.material3.Button
|
import androidx.compose.material3.Button
|
||||||
|
import androidx.compose.material3.Card
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
import androidx.compose.material3.HorizontalDivider
|
import androidx.compose.material3.HorizontalDivider
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.Icon
|
||||||
@ -48,6 +53,7 @@ import androidx.compose.material3.OutlinedTextField
|
|||||||
import androidx.compose.material3.Scaffold
|
import androidx.compose.material3.Scaffold
|
||||||
import androidx.compose.material3.Switch
|
import androidx.compose.material3.Switch
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.material3.TextButton
|
||||||
import androidx.compose.material3.TextField
|
import androidx.compose.material3.TextField
|
||||||
import androidx.compose.material3.TopAppBar
|
import androidx.compose.material3.TopAppBar
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
@ -56,6 +62,7 @@ import androidx.compose.runtime.collectAsState
|
|||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.runtime.saveable.rememberSaveable
|
||||||
import androidx.compose.runtime.setValue
|
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
|
||||||
@ -70,6 +77,7 @@ import androidx.compose.ui.res.stringResource
|
|||||||
import androidx.compose.ui.text.style.TextAlign
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
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.compose.ui.window.Dialog
|
||||||
import androidx.core.view.WindowCompat
|
import androidx.core.view.WindowCompat
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
import autodagger.AutoInjector
|
import autodagger.AutoInjector
|
||||||
@ -436,6 +444,9 @@ fun RoomCreationOptions(conversationCreationViewModel: ConversationCreationViewM
|
|||||||
.isConversationAvailableForRegisteredUsers.value
|
.isConversationAvailableForRegisteredUsers.value
|
||||||
val isOpenForGuestAppUsers = conversationCreationViewModel.openForGuestAppUsers.value
|
val isOpenForGuestAppUsers = conversationCreationViewModel.openForGuestAppUsers.value
|
||||||
|
|
||||||
|
val isPasswordSet = conversationCreationViewModel.isPasswordEnabled.value
|
||||||
|
val isPasswordChanged = conversationCreationViewModel.isPasswordChanged.value
|
||||||
|
|
||||||
Text(
|
Text(
|
||||||
text = stringResource(id = R.string.nc_new_conversation_visibility).uppercase(),
|
text = stringResource(id = R.string.nc_new_conversation_visibility).uppercase(),
|
||||||
fontSize = 14.sp,
|
fontSize = 14.sp,
|
||||||
@ -456,7 +467,7 @@ fun RoomCreationOptions(conversationCreationViewModel: ConversationCreationViewM
|
|||||||
conversationCreationViewModel = conversationCreationViewModel
|
conversationCreationViewModel = conversationCreationViewModel
|
||||||
)
|
)
|
||||||
|
|
||||||
if (isGuestsAllowed) {
|
if (isGuestsAllowed && !isPasswordSet) {
|
||||||
ConversationOptions(
|
ConversationOptions(
|
||||||
icon = R.drawable.ic_lock_grey600_24px,
|
icon = R.drawable.ic_lock_grey600_24px,
|
||||||
text = R.string.nc_set_password,
|
text = R.string.nc_set_password,
|
||||||
@ -465,6 +476,15 @@ fun RoomCreationOptions(conversationCreationViewModel: ConversationCreationViewM
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isGuestsAllowed && isPasswordSet) {
|
||||||
|
ConversationOptions(
|
||||||
|
icon = R.drawable.ic_lock_grey600_24px,
|
||||||
|
text = R.string.nc_change_password,
|
||||||
|
showDialog = false,
|
||||||
|
conversationCreationViewModel = conversationCreationViewModel
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
ConversationOptions(
|
ConversationOptions(
|
||||||
icon = R.drawable.baseline_format_list_bulleted_24,
|
icon = R.drawable.baseline_format_list_bulleted_24,
|
||||||
text = R.string.nc_open_conversation_to_registered_users,
|
text = R.string.nc_open_conversation_to_registered_users,
|
||||||
@ -505,7 +525,7 @@ fun ConversationOptions(
|
|||||||
showDialog: Boolean,
|
showDialog: Boolean,
|
||||||
conversationCreationViewModel: ConversationCreationViewModel
|
conversationCreationViewModel: ConversationCreationViewModel
|
||||||
) {
|
) {
|
||||||
var showPasswordDialog by remember { mutableStateOf(false) }
|
var showPasswordDialog by rememberSaveable { mutableStateOf(false) }
|
||||||
Row(
|
Row(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
@ -545,19 +565,84 @@ fun ConversationOptions(
|
|||||||
conversationCreationViewModel = conversationCreationViewModel
|
conversationCreationViewModel = conversationCreationViewModel
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
if (conversationCreationViewModel.isPasswordChanged.value) {
|
||||||
|
ShowChangePassword(
|
||||||
|
onDismiss = {
|
||||||
|
},
|
||||||
|
conversationCreationViewModel = conversationCreationViewModel
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun ShowChangePassword(onDismiss: () -> Unit, conversationCreationViewModel: ConversationCreationViewModel) {
|
||||||
|
var changedPassword by rememberSaveable { mutableStateOf("") }
|
||||||
|
Dialog(onDismissRequest = { }) {
|
||||||
|
Card(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.height(375.dp)
|
||||||
|
.padding(16.dp)
|
||||||
|
.background(color = colorResource(id = R.color.appbar))
|
||||||
|
.clickable {
|
||||||
|
if (conversationCreationViewModel.isPasswordEnabled.value) {
|
||||||
|
}
|
||||||
|
},
|
||||||
|
shape = RoundedCornerShape(16.dp)
|
||||||
|
) {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxSize(),
|
||||||
|
verticalArrangement = Arrangement.Center,
|
||||||
|
horizontalAlignment = Alignment.CenterHorizontally
|
||||||
|
) {
|
||||||
|
Text(text = stringResource(id = R.string.nc_change_password))
|
||||||
|
OutlinedTextField(
|
||||||
|
value = changedPassword,
|
||||||
|
onValueChange = {
|
||||||
|
changedPassword = it
|
||||||
|
},
|
||||||
|
label = { Text(text = stringResource(id = R.string.nc_set_new_password)) },
|
||||||
|
singleLine = true
|
||||||
|
)
|
||||||
|
|
||||||
|
TextButton(
|
||||||
|
onClick = { },
|
||||||
|
modifier = Modifier.padding(8.dp)
|
||||||
|
) {
|
||||||
|
Text(text = stringResource(id = R.string.nc_change_password))
|
||||||
|
}
|
||||||
|
TextButton(
|
||||||
|
onClick = { },
|
||||||
|
modifier = Modifier.padding(8.dp)
|
||||||
|
) {
|
||||||
|
Text(text = stringResource(id = R.string.nc_remove_password))
|
||||||
|
}
|
||||||
|
TextButton(
|
||||||
|
onClick = { },
|
||||||
|
modifier = Modifier.padding(8.dp)
|
||||||
|
) {
|
||||||
|
Text(text = stringResource(id = R.string.nc_cancel))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun ShowPasswordDialog(onDismiss: () -> Unit, conversationCreationViewModel: ConversationCreationViewModel) {
|
fun ShowPasswordDialog(onDismiss: () -> Unit, conversationCreationViewModel: ConversationCreationViewModel) {
|
||||||
var password by remember { mutableStateOf("") }
|
var password by rememberSaveable { mutableStateOf("") }
|
||||||
|
|
||||||
AlertDialog(
|
AlertDialog(
|
||||||
containerColor = colorResource(id = R.color.dialog_background),
|
containerColor = colorResource(id = R.color.dialog_background),
|
||||||
onDismissRequest = onDismiss,
|
onDismissRequest = onDismiss,
|
||||||
confirmButton = {
|
confirmButton = {
|
||||||
Button(onClick = {
|
Button(onClick = {
|
||||||
|
if (password.isNotEmpty()) {
|
||||||
conversationCreationViewModel.updatePassword(password)
|
conversationCreationViewModel.updatePassword(password)
|
||||||
|
conversationCreationViewModel.isPasswordEnabled(true)
|
||||||
|
}
|
||||||
onDismiss()
|
onDismiss()
|
||||||
}) {
|
}) {
|
||||||
Text(text = stringResource(id = R.string.save))
|
Text(text = stringResource(id = R.string.save))
|
||||||
|
@ -38,6 +38,12 @@ class ConversationCreationViewModel @Inject constructor(
|
|||||||
private val _currentUser = userManager.currentUser.blockingGet()
|
private val _currentUser = userManager.currentUser.blockingGet()
|
||||||
val currentUser: User = _currentUser
|
val currentUser: User = _currentUser
|
||||||
|
|
||||||
|
private val _isPasswordEnabled = mutableStateOf(false)
|
||||||
|
val isPasswordEnabled = _isPasswordEnabled
|
||||||
|
|
||||||
|
private val _isPasswordChanged = mutableStateOf(false)
|
||||||
|
val isPasswordChanged = _isPasswordChanged
|
||||||
|
|
||||||
fun updateSelectedParticipants(participants: List<AutocompleteUser>) {
|
fun updateSelectedParticipants(participants: List<AutocompleteUser>) {
|
||||||
_selectedParticipants.value = participants
|
_selectedParticipants.value = participants
|
||||||
}
|
}
|
||||||
@ -73,6 +79,7 @@ class ConversationCreationViewModel @Inject constructor(
|
|||||||
roomType: String,
|
roomType: String,
|
||||||
conversationName: String,
|
conversationName: String,
|
||||||
participants: Set<AutocompleteUser>,
|
participants: Set<AutocompleteUser>,
|
||||||
|
selectedImageUri: Uri?,
|
||||||
onRoomCreated: (String) -> Unit
|
onRoomCreated: (String) -> Unit
|
||||||
) {
|
) {
|
||||||
val scope = when {
|
val scope = when {
|
||||||
|
@ -434,6 +434,9 @@ How to translate with transifex:
|
|||||||
<string name="nc_guest_access_allow_summary">Allow guests to share a public link to join this conversation.</string>
|
<string name="nc_guest_access_allow_summary">Allow guests to share a public link to join this conversation.</string>
|
||||||
<string name="nc_guest_access_allow_failed">Cannot enable/disable guest access.</string>
|
<string name="nc_guest_access_allow_failed">Cannot enable/disable guest access.</string>
|
||||||
<string name="nc_set_password">Set Password</string>
|
<string name="nc_set_password">Set Password</string>
|
||||||
|
<string name="nc_change_password">Change Password</string>
|
||||||
|
<string name="nc_remove_password">Remove Password</string>
|
||||||
|
<string name="nc_set_new_password">Set a new password</string>
|
||||||
<string name="nc_guest_access_password_title">Password protection</string>
|
<string name="nc_guest_access_password_title">Password protection</string>
|
||||||
<string name="nc_guest_access_password_summary">Set a password to restrict who can use the public link.</string>
|
<string name="nc_guest_access_password_summary">Set a password to restrict who can use the public link.</string>
|
||||||
<string name="nc_guest_access_password_dialog_title">Guest access password</string>
|
<string name="nc_guest_access_password_dialog_title">Guest access password</string>
|
||||||
|
Loading…
Reference in New Issue
Block a user