Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
811 changes: 811 additions & 0 deletions app/schemas/com.nextcloud.talk.data.source.local.TalkDatabase/25.json

Large diffs are not rendered by default.

21 changes: 18 additions & 3 deletions app/src/main/java/com/nextcloud/talk/activities/CallActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ import android.view.OrientationEventListener
import android.view.View
import android.view.View.OnTouchListener
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.app.NotificationManagerCompat
import androidx.annotation.DrawableRes
import androidx.appcompat.app.AlertDialog
import androidx.compose.material3.MaterialTheme
Expand All @@ -50,6 +49,7 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.core.app.NotificationManagerCompat
import androidx.core.graphics.drawable.DrawableCompat
import androidx.core.net.toUri
import androidx.lifecycle.ViewModelProvider
Expand Down Expand Up @@ -78,13 +78,16 @@ import com.nextcloud.talk.camera.BackgroundBlurFrameProcessor
import com.nextcloud.talk.camera.BlurBackgroundViewModel
import com.nextcloud.talk.camera.BlurBackgroundViewModel.BackgroundBlurOn
import com.nextcloud.talk.chat.ChatActivity
import com.nextcloud.talk.conversationlist.ConversationsListActivity
import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.databinding.CallActivityBinding
import com.nextcloud.talk.events.ConfigurationChangeEvent
import com.nextcloud.talk.events.NetworkEvent
import com.nextcloud.talk.events.ProximitySensorEvent
import com.nextcloud.talk.events.WebSocketCommunicationEvent
import com.nextcloud.talk.models.ExternalSignalingServer
import com.nextcloud.talk.models.domain.ConversationModel
import com.nextcloud.talk.models.domain.ConversationModel.Companion.checkIfVoiceRoom
import com.nextcloud.talk.models.json.capabilities.CapabilitiesOverall
import com.nextcloud.talk.models.json.conversations.Conversation
import com.nextcloud.talk.models.json.conversations.RoomOverall
Expand Down Expand Up @@ -121,10 +124,10 @@ import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_CALL_WITHOUT_NOTIFICATION
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_CONVERSATION_NAME
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_CONVERSATION_PASSWORD
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_FROM_NOTIFICATION_START_CALL
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_NOTIFICATION_TIMESTAMP
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_IS_BREAKOUT_ROOM
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_IS_MODERATOR
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_MODIFIED_BASE_URL
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_NOTIFICATION_TIMESTAMP
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_PARTICIPANT_PERMISSION_CAN_PUBLISH_AUDIO
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_PARTICIPANT_PERMISSION_CAN_PUBLISH_VIDEO
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_RECORDING_STATE
Expand Down Expand Up @@ -364,6 +367,7 @@ class CallActivity : CallBaseActivity() {
private var reactionAnimator: ReactionAnimator? = null
private var othersInCall = false
private var isOneToOneConversation = false
private var currentConversation: Conversation? = null

private lateinit var micInputAudioRecorder: AudioRecord
private var micInputAudioRecordThread: Thread? = null
Expand Down Expand Up @@ -629,6 +633,7 @@ class CallActivity : CallBaseActivity() {

override fun onNext(roomOverall: RoomOverall) {
val conversation = roomOverall.ocs!!.data
currentConversation = conversation
if (conversation?.recordingConsentRequired == 1) {
askForRecordingConsent()
} else {
Expand Down Expand Up @@ -1553,6 +1558,7 @@ class CallActivity : CallBaseActivity() {

override fun onNext(roomOverall: RoomOverall) {
val conversation = roomOverall.ocs!!.data
currentConversation = conversation
callRecordingViewModel!!.setRecordingState(conversation!!.callRecording)
callSession = conversation.sessionId
Log.d(TAG, " new callSession by joinRoom= $callSession")
Expand Down Expand Up @@ -1605,6 +1611,7 @@ class CallActivity : CallBaseActivity() {

override fun onNext(roomOverall: RoomOverall) {
val conversation = roomOverall.ocs!!.data
currentConversation = conversation
callRecordingViewModel!!.setRecordingState(conversation!!.callRecording)
callSession = conversation.sessionId

Expand Down Expand Up @@ -2037,7 +2044,15 @@ class CallActivity : CallBaseActivity() {
}

override fun onNext(genericOverall: GenericOverall) {
if (switchToRoomToken.isNotEmpty()) {
val conversationModel = currentConversation?.let {
ConversationModel.mapToConversationModel(it, conversationUser)
}

if (conversationModel?.checkIfVoiceRoom() == true) {
val intent = Intent(context, ConversationsListActivity::class.java)
startActivity(intent)
finish()
} else if (switchToRoomToken.isNotEmpty()) {
val intent = Intent(context, ChatActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
val bundle = Bundle()
Expand Down
10 changes: 7 additions & 3 deletions app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ import com.nextcloud.talk.api.NcApi
import com.nextcloud.talk.api.NcApiCoroutines
import com.nextcloud.talk.application.NextcloudTalkApplication
import com.nextcloud.talk.chat.data.model.ChatMessage
import com.nextcloud.talk.chat.ui.ShowReactionsModalBottomSheet
import com.nextcloud.talk.chat.ui.model.MessageTypeContent
import com.nextcloud.talk.chat.viewmodels.ChatViewModel
import com.nextcloud.talk.chat.viewmodels.MessageInputViewModel
Expand All @@ -137,6 +138,7 @@ import com.nextcloud.talk.location.LocationPickerActivity
import com.nextcloud.talk.messagesearch.MessageSearchActivity
import com.nextcloud.talk.models.ExternalSignalingServer
import com.nextcloud.talk.models.domain.ConversationModel
import com.nextcloud.talk.models.domain.ConversationModel.Companion.checkIfVoiceRoom
import com.nextcloud.talk.models.json.capabilities.SpreedCapability
import com.nextcloud.talk.models.json.chat.ChatMessageJson
import com.nextcloud.talk.models.json.conversations.ConversationEnums
Expand All @@ -154,16 +156,15 @@ import com.nextcloud.talk.translate.ui.TranslateActivity
import com.nextcloud.talk.ui.PinnedMessageView
import com.nextcloud.talk.ui.PlaybackSpeed
import com.nextcloud.talk.ui.StatusDrawable
import com.nextcloud.talk.ui.chat.ChatView
import com.nextcloud.talk.ui.chat.ChatMessageCallbacks
import com.nextcloud.talk.ui.chat.ChatView
import com.nextcloud.talk.ui.chat.ChatViewCallbacks
import com.nextcloud.talk.ui.chat.ChatViewState
import com.nextcloud.talk.ui.dialog.DateTimeCompose
import com.nextcloud.talk.ui.dialog.FileAttachmentPreviewFragment
import com.nextcloud.talk.ui.dialog.GetPinnedOptionsDialog
import com.nextcloud.talk.ui.dialog.MessageActionsDialog
import com.nextcloud.talk.ui.dialog.SaveToStorageDialogFragment
import com.nextcloud.talk.chat.ui.ShowReactionsModalBottomSheet
import com.nextcloud.talk.ui.dialog.TempMessageActionsDialog
import com.nextcloud.talk.ui.theme.LocalMessageUtils
import com.nextcloud.talk.ui.theme.LocalOpenGraphFetcher
Expand Down Expand Up @@ -997,6 +998,10 @@ class ChatActivity :

setupWebsocket()

if (currentConversation.checkIfVoiceRoom()) {
startACall(false, true)
}

if (startCallFromNotification) {
startCallFromNotification = false
startACall(voiceOnly, false)
Expand Down Expand Up @@ -3571,7 +3576,6 @@ class ChatActivity :

if (noteToSelfConversation != null) {
var shareUri: Uri? = null
val data: HashMap<String, String>?
var metaData = ""
var objectId = ""
if (message.hasFileAttachment) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import androidx.activity.compose.setContent
import androidx.activity.result.ActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
Expand All @@ -41,6 +42,9 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Chat
import androidx.compose.material.icons.outlined.VolumeUp
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.Card
Expand Down Expand Up @@ -69,7 +73,6 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import com.nextcloud.talk.utils.DisplayUtils
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
Expand All @@ -94,7 +97,9 @@ import com.nextcloud.talk.conversationcreation.viewmodel.ConversationCreationVie
import com.nextcloud.talk.extensions.getParcelableArrayListExtraProvider
import com.nextcloud.talk.models.json.autocomplete.AutocompleteUser
import com.nextcloud.talk.utils.CapabilitiesUtil
import com.nextcloud.talk.utils.DisplayUtils
import com.nextcloud.talk.utils.PickImage
import com.nextcloud.talk.utils.SpreedFeatures
import com.nextcloud.talk.utils.bundle.BundleKeys
import com.nextcloud.talk.utils.preview.ComposePreviewUtils
import javax.inject.Inject
Expand Down Expand Up @@ -219,6 +224,15 @@ fun ConversationCreationScreen(
}

ConversationNameAndDescription(conversationCreationViewModel)

if (
CapabilitiesUtil.hasSpreedFeatureCapability(
conversationCreationViewModel.currentUser.capabilities?.spreedCapability!!,
SpreedFeatures.CONVERSATION_PRESETS
)
) {
ConversationPresets(conversationCreationViewModel)
}
AddParticipants(launcher, context, conversationCreationViewModel)
RoomCreationOptions(conversationCreationViewModel)
CreateConversation(conversationCreationViewModel, context)
Expand Down Expand Up @@ -362,6 +376,87 @@ fun ConversationNameAndDescription(conversationCreationViewModel: ConversationCr
)
}

@Suppress("LongMethod")
@SuppressLint("SuspiciousIndentation")
@Composable
fun ConversationPresets(conversationCreationViewModel: ConversationCreationViewModel) {
val preset by conversationCreationViewModel.conversationPreset

Row(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
horizontalArrangement = Arrangement.spacedBy(12.dp)
) {
SelectableCard(
modifier = Modifier.weight(1f),
title = stringResource(R.string.default_room),
subtitle = stringResource(R.string.default_room_preset),
icon = Icons.Outlined.Chat,
isSelected = preset == "default",
onClick = { conversationCreationViewModel.conversationPreset.value = "default" }
)

SelectableCard(
modifier = Modifier.weight(1f),
title = stringResource(R.string.voice_room),
subtitle = stringResource(R.string.voice_room_preset),
icon = Icons.Outlined.VolumeUp,
isSelected = preset == "voiceroom",
onClick = { conversationCreationViewModel.conversationPreset.value = "voiceroom" }
)
}
}

@Composable
fun SelectableCard(
modifier: Modifier = Modifier,
title: String,
subtitle: String,
icon: ImageVector,
isSelected: Boolean,
onClick: () -> Unit
) {
val borderColor = if (isSelected) Color.LightGray else Color.Transparent
val borderWidth = 1.dp

Column(
modifier = modifier
.clip(RoundedCornerShape(8.dp))
.clickable { onClick() }
.border(
width = borderWidth,
color = borderColor,
shape = RoundedCornerShape(8.dp)
)
.padding(16.dp)
) {
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
Icon(
imageVector = icon,
contentDescription = null,
modifier = Modifier.size(20.dp)
)
Text(
text = title,
fontWeight = FontWeight.Bold,
fontSize = 15.sp
)
}

Spacer(modifier = Modifier.height(12.dp))

Text(
text = subtitle,
fontSize = 13.sp,
lineHeight = 18.sp
)
}
}

@Suppress("LongMethod")
@SuppressLint("SuspiciousIndentation")
@Composable
Expand Down Expand Up @@ -469,7 +564,7 @@ fun RoomCreationOptions(conversationCreationViewModel: ConversationCreationViewM
color = MaterialTheme.colorScheme.primary,
modifier = Modifier.padding(top = 24.dp, start = 16.dp, end = 16.dp)
)
ConversationOptions(
ConversationOption(
icon = R.drawable.ic_avatar_link,
text = R.string.nc_guest_access_allow_title,
switch = {
Expand All @@ -484,22 +579,22 @@ fun RoomCreationOptions(conversationCreationViewModel: ConversationCreationViewM
)

if (isGuestsAllowed && !isPasswordSet) {
ConversationOptions(
ConversationOption(
icon = R.drawable.baseline_lock_open_24,
text = R.string.nc_set_password,
conversationCreationViewModel = conversationCreationViewModel
)
}

if (isGuestsAllowed && isPasswordSet) {
ConversationOptions(
ConversationOption(
icon = R.drawable.ic_lock_grey600_24px,
text = R.string.nc_change_password,
conversationCreationViewModel = conversationCreationViewModel
)
}

ConversationOptions(
ConversationOption(
icon = R.drawable.baseline_format_list_bulleted_24,
text = R.string.nc_open_conversation_to_registered_users,
switch = {
Expand All @@ -514,7 +609,7 @@ fun RoomCreationOptions(conversationCreationViewModel: ConversationCreationViewM
)

if (isConversationAvailableForRegisteredUsers) {
ConversationOptions(
ConversationOption(
text = R.string.nc_open_to_guest_app_users,
switch = {
Switch(
Expand All @@ -530,7 +625,7 @@ fun RoomCreationOptions(conversationCreationViewModel: ConversationCreationViewM
}

@Composable
fun ConversationOptions(
fun ConversationOption(
icon: Int? = null,
text: Int,
switch: @Composable (() -> Unit)? = null,
Expand Down Expand Up @@ -721,7 +816,8 @@ fun CreateConversation(conversationCreationViewModel: ConversationCreationViewMo
conversationCreationViewModel.createRoomAndAddParticipants(
roomType = CompanionClass.ROOM_TYPE_GROUP,
conversationName = conversationCreationViewModel.roomName.value,
participants = selectedParticipants.toSet()
participants = selectedParticipants.toSet(),
preset = conversationCreationViewModel.conversationPreset.value
) { roomToken ->
val bundle = Bundle()
bundle.putString(BundleKeys.KEY_ROOM_TOKEN, roomToken)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ class ConversationCreationViewModel @Inject constructor(
val conversationDescription: StateFlow<String> = _conversationDescription
var isGuestsAllowed = mutableStateOf(false)
var isConversationAvailableForRegisteredUsers = mutableStateOf(false)
val conversationPreset = mutableStateOf("default")
var openForGuestAppUsers = mutableStateOf(false)
private val addParticipantsViewState = MutableStateFlow<AddParticipantsUiState>(AddParticipantsUiState.None)
private val allowGuestsResult = MutableStateFlow<AllowGuestsUiState>(AllowGuestsUiState.None)
Expand All @@ -85,6 +86,7 @@ class ConversationCreationViewModel @Inject constructor(
fun createRoomAndAddParticipants(
roomType: String,
conversationName: String,
preset: String = "default",
participants: Set<AutocompleteUser>,
onRoomCreated: (String) -> Unit
) {
Expand All @@ -103,6 +105,7 @@ class ConversationCreationViewModel @Inject constructor(
version = apiVersion,
baseUrl = _currentUser.baseUrl,
roomType = roomType,
preset = preset,
conversationName = conversationName
)
val roomResult = repository.createRoom(
Expand Down
Loading
Loading