diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.kt index d0d7084fe..78468ec2c 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.kt @@ -131,6 +131,7 @@ import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_ONE_TO_ONE import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_START_CALL_AFTER_ROOM_SWITCH import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_SWITCH_TO_ROOM +import com.nextcloud.talk.utils.bundle.BundleKeys.SILENT_FOR import com.nextcloud.talk.utils.permissions.PlatformPermissionUtil import com.nextcloud.talk.utils.power.PowerManagerUtils import com.nextcloud.talk.utils.registerPermissionHandlerBroadcastReceiver @@ -236,6 +237,7 @@ class CallActivity : CallBaseActivity() { private var microphoneOn = false private var isVoiceOnlyCall = false private var isCallWithoutNotification = false + private var silentFor: Array? = null private var isIncomingCallFromNotification = false private val callControlHandler = Handler() private val callInfosHandler = Handler() @@ -383,9 +385,9 @@ class CallActivity : CallBaseActivity() { conversationUser = currentUserProvider.currentUser.blockingGet() - credentials = ApiUtils.getCredentials(conversationUser!!.username, conversationUser!!.token) + credentials = ApiUtils.getCredentials(conversationUser.username, conversationUser.token) if (TextUtils.isEmpty(baseUrl)) { - baseUrl = conversationUser!!.baseUrl + baseUrl = conversationUser.baseUrl } powerManagerUtils = PowerManagerUtils() @@ -492,6 +494,7 @@ class CallActivity : CallBaseActivity() { conversationName = extras.getString(KEY_CONVERSATION_NAME, "") isVoiceOnlyCall = extras.getBoolean(KEY_CALL_VOICE_ONLY, false) isCallWithoutNotification = extras.getBoolean(KEY_CALL_WITHOUT_NOTIFICATION, false) + silentFor = extras.getStringArray(SILENT_FOR) canPublishAudioStream = extras.getBoolean(KEY_PARTICIPANT_PERMISSION_CAN_PUBLISH_AUDIO) canPublishVideoStream = extras.getBoolean(KEY_PARTICIPANT_PERMISSION_CAN_PUBLISH_VIDEO) isModerator = extras.getBoolean(KEY_IS_MODERATOR, false) @@ -530,12 +533,12 @@ class CallActivity : CallBaseActivity() { ) } - when (CapabilitiesUtil.getRecordingConsentType(conversationUser!!.capabilities!!.spreedCapability!!)) { + when (CapabilitiesUtil.getRecordingConsentType(conversationUser.capabilities!!.spreedCapability!!)) { CapabilitiesUtil.RECORDING_CONSENT_NOT_REQUIRED -> initiateCall() CapabilitiesUtil.RECORDING_CONSENT_REQUIRED -> askForRecordingConsent() CapabilitiesUtil.RECORDING_CONSENT_DEPEND_ON_CONVERSATION -> { val getRoomApiVersion = ApiUtils.getConversationApiVersion( - conversationUser!!, + conversationUser, intArrayOf(ApiUtils.API_V4, 1) ) ncApi!!.getRoom(credentials, ApiUtils.getUrlForRoom(getRoomApiVersion, baseUrl, roomToken)) @@ -583,7 +586,7 @@ class CallActivity : CallBaseActivity() { } fun sendReaction(emoji: String?) { - addReactionForAnimation(emoji, conversationUser!!.displayName) + addReactionForAnimation(emoji, conversationUser.displayName) if (isConnectionEstablished) { for (peerConnectionWrapper in peerConnectionWrapperList) { peerConnectionWrapper.sendReaction(emoji) @@ -1497,20 +1500,20 @@ class CallActivity : CallBaseActivity() { } Log.d(TAG, " hasExternalSignalingServer: $hasExternalSignalingServer") - if ("?" != conversationUser!!.userId && conversationUser!!.id != null) { + if ("?" != conversationUser.userId && conversationUser.id != null) { Log.d( TAG, - "Update externalSignalingServer for: " + conversationUser!!.id + - " / " + conversationUser!!.userId + "Update externalSignalingServer for: " + conversationUser.id + + " / " + conversationUser.userId ) userManager!!.updateExternalSignalingServer( - conversationUser!!.id!!, + conversationUser.id!!, externalSignalingServer!! ) .subscribeOn(Schedulers.io()) .subscribe() } else { - conversationUser!!.externalSignalingServer = externalSignalingServer + conversationUser.externalSignalingServer = externalSignalingServer } addIceServers(signalingSettingsOverall, apiVersion) @@ -1698,7 +1701,7 @@ class CallActivity : CallBaseActivity() { if (!TextUtils.isEmpty(roomToken)) { cancelExistingNotificationsForRoom( applicationContext, - conversationUser!!, + conversationUser, roomToken!! ) } @@ -1743,7 +1746,8 @@ class CallActivity : CallBaseActivity() { ApiUtils.getUrlForCall(apiVersion, baseUrl, roomToken!!), inCallFlag, isCallWithoutNotification, - recordingConsentGiven + recordingConsentGiven, + silentFor ?: arrayOf() ) .subscribeOn(Schedulers.io()) .retry(API_RETRIES) @@ -1780,7 +1784,7 @@ class CallActivity : CallBaseActivity() { private fun startCallTimeCounter(callStartTime: Long) { if (callStartTime != 0L && hasSpreedFeatureCapability( - conversationUser!!.capabilities!!.spreedCapability!!, + conversationUser.capabilities!!.spreedCapability!!, SpreedFeatures.RECORDING_V1 ) ) { @@ -2603,8 +2607,8 @@ class CallActivity : CallBaseActivity() { val dataChannelMessage = DataChannelMessage() dataChannelMessage.type = "nickChanged" val nickChangedPayload: MutableMap = HashMap() - nickChangedPayload["userid"] = conversationUser!!.userId!! - nickChangedPayload["name"] = conversationUser!!.displayName!! + nickChangedPayload["userid"] = conversationUser.userId!! + nickChangedPayload["name"] = conversationUser.displayName!! dataChannelMessage.payloadMap = nickChangedPayload.toMap() for (peerConnectionWrapper in peerConnectionWrapperList) { if (peerConnectionWrapper.isMCUPublisher) { @@ -3100,7 +3104,7 @@ class CallActivity : CallBaseActivity() { val payload = ncSignalingMessage.payload ?: // Broken message, this should not happen return - payload.nick = conversationUser!!.displayName + payload.nick = conversationUser.displayName } } @@ -3251,7 +3255,7 @@ class CallActivity : CallBaseActivity() { val isAllowedToStartOrStopRecording: Boolean get() = ( - isCallRecordingAvailable(conversationUser!!.capabilities!!.spreedCapability!!) && + isCallRecordingAvailable(conversationUser.capabilities!!.spreedCapability!!) && isModerator ) val isAllowedToRaiseHand: Boolean diff --git a/app/src/main/java/com/nextcloud/talk/api/NcApi.java b/app/src/main/java/com/nextcloud/talk/api/NcApi.java index ca5d7afe5..11614505f 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApi.java +++ b/app/src/main/java/com/nextcloud/talk/api/NcApi.java @@ -25,7 +25,6 @@ import com.nextcloud.talk.models.json.notifications.NotificationOverall; import com.nextcloud.talk.models.json.opengraph.OpenGraphOverall; import com.nextcloud.talk.models.json.participants.AddParticipantOverall; import com.nextcloud.talk.models.json.participants.ParticipantsOverall; -import com.nextcloud.talk.models.json.participants.TalkBanOverall; import com.nextcloud.talk.models.json.push.PushRegistrationOverall; import com.nextcloud.talk.models.json.reactions.ReactionsOverall; import com.nextcloud.talk.models.json.reminder.ReminderOverall; @@ -207,7 +206,8 @@ public interface NcApi { @Url String url, @Field("flags") Integer inCall, @Field("silent") Boolean callWithoutNotification, - @Nullable @Field("recordingConsent") Boolean recordingConsent); + @Nullable @Field("recordingConsent") Boolean recordingConsent, + @Field("silentFor") String[] silentFor); /* Server URL is: baseUrl + ocsApiVersion + spreedApiVersion + /call/callToken diff --git a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt index 6a5c26314..0158a3bcb 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -53,6 +53,7 @@ import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.contract.ActivityResultContracts +import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia import androidx.appcompat.app.AlertDialog import androidx.appcompat.view.ContextThemeWrapper import androidx.cardview.widget.CardView @@ -124,6 +125,7 @@ import com.nextcloud.talk.chat.data.model.ChatMessage import com.nextcloud.talk.chat.viewmodels.ChatViewModel import com.nextcloud.talk.chat.viewmodels.MessageInputViewModel import com.nextcloud.talk.conversationinfo.ConversationInfoActivity +import com.nextcloud.talk.conversationinfo.viewmodel.ConversationInfoViewModel import com.nextcloud.talk.conversationlist.ConversationsListActivity import com.nextcloud.talk.data.network.NetworkMonitor import com.nextcloud.talk.data.user.model.User @@ -142,6 +144,7 @@ import com.nextcloud.talk.models.domain.ConversationModel import com.nextcloud.talk.models.json.capabilities.SpreedCapability import com.nextcloud.talk.models.json.chat.ReadStatus import com.nextcloud.talk.models.json.conversations.ConversationEnums +import com.nextcloud.talk.models.json.participants.Participant import com.nextcloud.talk.models.json.signaling.settings.SignalingSettingsOverall import com.nextcloud.talk.polls.ui.PollCreateDialogFragment import com.nextcloud.talk.remotefilebrowser.activities.RemoteFileBrowserActivity @@ -187,6 +190,7 @@ import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_RECORDING_STATE import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_START_CALL_AFTER_ROOM_SWITCH import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_SWITCH_TO_ROOM +import com.nextcloud.talk.utils.bundle.BundleKeys.SILENT_FOR import com.nextcloud.talk.utils.permissions.PlatformPermissionUtil import com.nextcloud.talk.utils.rx.DisposableSet import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder @@ -224,9 +228,6 @@ import java.util.Locale import java.util.concurrent.ExecutionException import javax.inject.Inject import kotlin.math.roundToInt -import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia -import com.nextcloud.talk.conversationinfo.viewmodel.ConversationInfoViewModel -import com.nextcloud.talk.models.json.participants.Participant @AutoInjector(NextcloudTalkApplication::class) class ChatActivity : @@ -327,6 +328,7 @@ class ChatActivity : var pullChatMessagesPending = false var startCallFromNotification: Boolean = false var startCallFromRoomSwitch: Boolean = false + var silentFor: Array? = null var voiceOnly: Boolean = true private lateinit var path: String @@ -510,7 +512,7 @@ class ChatActivity : startCallFromNotification = extras?.getBoolean(BundleKeys.KEY_FROM_NOTIFICATION_START_CALL, false) == true startCallFromRoomSwitch = extras?.getBoolean(KEY_START_CALL_AFTER_ROOM_SWITCH, false) == true - + silentFor = extras?.getStringArray(SILENT_FOR) voiceOnly = extras?.getBoolean(KEY_CALL_VOICE_ONLY, false) == true } @@ -678,7 +680,7 @@ class ChatActivity : if (startCallFromRoomSwitch) { startCallFromRoomSwitch = false - startACall(voiceOnly, true) + startACall(voiceOnly, true, silentFor) } } @@ -1636,6 +1638,13 @@ class ChatActivity : bundle.putBoolean(KEY_CALL_VOICE_ONLY, isVoiceOnlyCall) } + val previousParticipants = mutableListOf() + if (currentConversation?.type == ConversationEnums.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL) { + previousParticipants.add(currentConversation!!.name) + val silentFor = previousParticipants.toTypedArray() + bundle.putStringArray(SILENT_FOR, silentFor) + } + leaveRoom { val chatIntent = Intent(context, ChatActivity::class.java) chatIntent.putExtras(bundle) @@ -3245,7 +3254,7 @@ class ChatActivity : private fun isPollVotedMessage(currentMessage: MutableMap.MutableEntry): Boolean = currentMessage.value.systemMessageType == ChatMessage.SystemMessageType.POLL_VOTED - private fun startACall(isVoiceOnlyCall: Boolean, callWithoutNotification: Boolean) { + private fun startACall(isVoiceOnlyCall: Boolean, callWithoutNotification: Boolean, silentFor: Array? = null) { currentConversation?.let { if (conversationUser != null) { val pp = ParticipantPermissions(spreedCapabilities, it) @@ -3290,6 +3299,7 @@ class ChatActivity : if (it.objectType == ConversationEnums.ObjectType.ROOM) { bundle.putBoolean(KEY_IS_BREAKOUT_ROOM, true) + bundle.putStringArray(SILENT_FOR, silentFor) // TODO should this go here? } val callIntent = Intent(this, CallActivity::class.java) diff --git a/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt b/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt index 4080f315a..0cf8c6b83 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt @@ -81,4 +81,5 @@ object BundleKeys { const val KEY_FIELD_MAP: String = "KEY_FIELD_MAP" const val KEY_CHAT_URL: String = "KEY_CHAT_URL" const val KEY_SCROLL_TO_NOTIFICATION_CATEGORY: String = "KEY_SCROLL_TO_NOTIFICATION_CATEGORY" + const val SILENT_FOR: String = "SILENT_FOR" }