|
@@ -13,6 +13,7 @@ import android.annotation.SuppressLint
|
|
|
import android.app.Activity
|
|
|
import android.content.Context
|
|
|
import android.content.Intent
|
|
|
+import android.net.Uri
|
|
|
import android.os.Bundle
|
|
|
import androidx.activity.compose.ManagedActivityResultLauncher
|
|
|
import androidx.activity.compose.rememberLauncherForActivityResult
|
|
@@ -77,6 +78,7 @@ import com.nextcloud.talk.chat.ChatActivity
|
|
|
import com.nextcloud.talk.contacts.ContactsActivityCompose
|
|
|
import com.nextcloud.talk.contacts.loadImage
|
|
|
import com.nextcloud.talk.models.json.autocomplete.AutocompleteUser
|
|
|
+import com.nextcloud.talk.utils.PickImage
|
|
|
import com.nextcloud.talk.utils.bundle.BundleKeys
|
|
|
import javax.inject.Inject
|
|
|
|
|
@@ -84,7 +86,7 @@ import javax.inject.Inject
|
|
|
class ConversationCreationActivity : BaseActivity() {
|
|
|
@Inject
|
|
|
lateinit var viewModelFactory: ViewModelProvider.Factory
|
|
|
-
|
|
|
+ private lateinit var pickImage: PickImage
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
|
super.onCreate(savedInstanceState)
|
|
|
|
|
@@ -93,13 +95,16 @@ class ConversationCreationActivity : BaseActivity() {
|
|
|
this,
|
|
|
viewModelFactory
|
|
|
)[ConversationCreationViewModel::class.java]
|
|
|
+ val conversationUser = conversationCreationViewModel.currentUser
|
|
|
+ pickImage = PickImage(this, conversationUser)
|
|
|
+
|
|
|
setContent {
|
|
|
val colorScheme = viewThemeUtils.getColorScheme(this)
|
|
|
val context = LocalContext.current
|
|
|
MaterialTheme(
|
|
|
colorScheme = colorScheme
|
|
|
) {
|
|
|
- ConversationCreationScreen(conversationCreationViewModel, context)
|
|
|
+ ConversationCreationScreen(conversationCreationViewModel, context, pickImage)
|
|
|
}
|
|
|
SetStatusBarColor()
|
|
|
}
|
|
@@ -125,15 +130,47 @@ private fun SetStatusBarColor() {
|
|
|
|
|
|
@OptIn(ExperimentalMaterial3Api::class)
|
|
|
@Composable
|
|
|
-fun ConversationCreationScreen(conversationCreationViewModel: ConversationCreationViewModel, context: Context) {
|
|
|
+fun ConversationCreationScreen(
|
|
|
+ conversationCreationViewModel: ConversationCreationViewModel,
|
|
|
+ context: Context,
|
|
|
+ pickImage: PickImage
|
|
|
+) {
|
|
|
+ var selectedImageUri by remember { mutableStateOf<Uri?>(null) }
|
|
|
+
|
|
|
+ val imagePickerLauncher = rememberLauncherForActivityResult(
|
|
|
+ contract = ActivityResultContracts.StartActivityForResult()
|
|
|
+ ) { result ->
|
|
|
+ if (result.resultCode == Activity.RESULT_OK) {
|
|
|
+ pickImage.onImagePickerResult(result.data) { uri ->
|
|
|
+ selectedImageUri = uri
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ val remoteFilePickerLauncher = rememberLauncherForActivityResult(
|
|
|
+ contract = ActivityResultContracts.StartActivityForResult()
|
|
|
+ ) { result ->
|
|
|
+ if (result.resultCode == Activity.RESULT_OK) {
|
|
|
+ pickImage.onSelectRemoteFilesResult(imagePickerLauncher, result.data)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ val cameraLauncher = rememberLauncherForActivityResult(
|
|
|
+ contract = ActivityResultContracts.StartActivityForResult()
|
|
|
+ ) { result ->
|
|
|
+ if (result.resultCode == Activity.RESULT_OK) {
|
|
|
+ pickImage.onTakePictureResult(imagePickerLauncher, result.data)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
val launcher = rememberLauncherForActivityResult(
|
|
|
contract = ActivityResultContracts.StartActivityForResult(),
|
|
|
-
|
|
|
onResult = { result ->
|
|
|
if (result.resultCode == Activity.RESULT_OK) {
|
|
|
val data = result.data
|
|
|
- val selectedParticipants = data?.getParcelableArrayListExtra<AutocompleteUser>("selectedParticipants")
|
|
|
- ?: emptyList()
|
|
|
+ val selectedParticipants =
|
|
|
+ data?.getParcelableArrayListExtra<AutocompleteUser>("selectedParticipants")
|
|
|
+ ?: emptyList()
|
|
|
val participants = selectedParticipants.toMutableList()
|
|
|
conversationCreationViewModel.updateSelectedParticipants(participants)
|
|
|
}
|
|
@@ -162,8 +199,16 @@ fun ConversationCreationScreen(conversationCreationViewModel: ConversationCreati
|
|
|
.padding(paddingValues)
|
|
|
.verticalScroll(rememberScrollState())
|
|
|
) {
|
|
|
- DefaultUserAvatar()
|
|
|
- UploadAvatar()
|
|
|
+ DefaultUserAvatar(selectedImageUri)
|
|
|
+ UploadAvatar(
|
|
|
+ pickImage = pickImage,
|
|
|
+ onImageSelected = { uri -> selectedImageUri = uri },
|
|
|
+ imagePickerLauncher = imagePickerLauncher,
|
|
|
+ remoteFilePickerLauncher = remoteFilePickerLauncher,
|
|
|
+ cameraLauncher = cameraLauncher,
|
|
|
+ onDeleteImage = { selectedImageUri = null }
|
|
|
+ )
|
|
|
+
|
|
|
ConversationNameAndDescription(conversationCreationViewModel)
|
|
|
AddParticipants(launcher, context, conversationCreationViewModel)
|
|
|
RoomCreationOptions(conversationCreationViewModel)
|
|
@@ -174,31 +219,51 @@ fun ConversationCreationScreen(conversationCreationViewModel: ConversationCreati
|
|
|
}
|
|
|
|
|
|
@Composable
|
|
|
-fun DefaultUserAvatar() {
|
|
|
+fun DefaultUserAvatar(selectedImageUri: Uri?) {
|
|
|
Box(
|
|
|
modifier = Modifier.fillMaxWidth(),
|
|
|
contentAlignment = Alignment.Center
|
|
|
) {
|
|
|
- AsyncImage(
|
|
|
- model = R.drawable.ic_circular_group,
|
|
|
- contentDescription = stringResource(id = R.string.user_avatar),
|
|
|
- modifier = Modifier
|
|
|
- .size(width = 84.dp, height = 84.dp)
|
|
|
- .padding(top = 8.dp)
|
|
|
- )
|
|
|
+ if (selectedImageUri != null) {
|
|
|
+ AsyncImage(
|
|
|
+ model = selectedImageUri,
|
|
|
+ contentDescription = stringResource(id = R.string.user_avatar),
|
|
|
+ modifier = Modifier
|
|
|
+ .size(84.dp)
|
|
|
+ .padding(top = 8.dp)
|
|
|
+ )
|
|
|
+ } else {
|
|
|
+ AsyncImage(
|
|
|
+ model = R.drawable.ic_circular_group,
|
|
|
+ contentDescription = stringResource(id = R.string.user_avatar),
|
|
|
+ modifier = Modifier
|
|
|
+ .size(84.dp)
|
|
|
+ .padding(top = 8.dp)
|
|
|
+ )
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@Composable
|
|
|
-fun UploadAvatar() {
|
|
|
+fun UploadAvatar(
|
|
|
+ pickImage: PickImage,
|
|
|
+ onImageSelected: (Uri) -> Unit,
|
|
|
+ imagePickerLauncher: ManagedActivityResultLauncher<Intent, ActivityResult>,
|
|
|
+ remoteFilePickerLauncher: ManagedActivityResultLauncher<Intent, ActivityResult>,
|
|
|
+ cameraLauncher: ManagedActivityResultLauncher<Intent, ActivityResult>,
|
|
|
+ onDeleteImage: () -> Unit
|
|
|
+) {
|
|
|
Row(
|
|
|
modifier = Modifier
|
|
|
.fillMaxWidth()
|
|
|
.padding(16.dp),
|
|
|
horizontalArrangement = Arrangement.Center
|
|
|
) {
|
|
|
- IconButton(onClick = {
|
|
|
- }) {
|
|
|
+ IconButton(
|
|
|
+ onClick = {
|
|
|
+ pickImage.takePicture(cameraLauncher)
|
|
|
+ }
|
|
|
+ ) {
|
|
|
Icon(
|
|
|
painter = painterResource(id = R.drawable.ic_baseline_photo_camera_24),
|
|
|
contentDescription = null,
|
|
@@ -207,6 +272,7 @@ fun UploadAvatar() {
|
|
|
}
|
|
|
|
|
|
IconButton(onClick = {
|
|
|
+ pickImage.selectLocal(imagePickerLauncher)
|
|
|
}) {
|
|
|
Icon(
|
|
|
painter = painterResource(id = R.drawable.ic_folder_multiple_image),
|
|
@@ -214,9 +280,11 @@ fun UploadAvatar() {
|
|
|
modifier = Modifier.size(24.dp)
|
|
|
)
|
|
|
}
|
|
|
-
|
|
|
- IconButton(onClick = {
|
|
|
- }) {
|
|
|
+ IconButton(
|
|
|
+ onClick = {
|
|
|
+ pickImage.selectRemote(remoteFilePickerLauncher)
|
|
|
+ }
|
|
|
+ ) {
|
|
|
Icon(
|
|
|
painter = painterResource(id = R.drawable.baseline_tag_faces_24),
|
|
|
contentDescription = null,
|
|
@@ -225,6 +293,7 @@ fun UploadAvatar() {
|
|
|
}
|
|
|
|
|
|
IconButton(onClick = {
|
|
|
+ onDeleteImage()
|
|
|
}) {
|
|
|
Icon(
|
|
|
painter = painterResource(id = R.drawable.ic_delete_grey600_24dp),
|
|
@@ -530,6 +599,7 @@ fun CreateConversation(conversationCreationViewModel: ConversationCreationViewMo
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
class CompanionClass {
|
|
|
companion object {
|
|
|
internal val TAG = ConversationCreationActivity::class.simpleName
|