From 9e5e137919df076ae45eb7205dda047faffe6200 Mon Sep 17 00:00:00 2001 From: Harris Date: Mon, 30 Aug 2021 16:39:47 +1000 Subject: [PATCH] feat: added basic call functionality --- app/build.gradle | 6 +- app/src/main/AndroidManifest.xml | 1 + .../securesms/calls/WebRtcTestsActivity.kt | 220 ++- .../v2/menus/ConversationMenuHelper.kt | 14 + .../securesms/home/HomeActivity.kt | 37 +- .../main/res/drawable/ic_baseline_call_24.xml | 10 + .../main/res/menu/menu_conversation_call.xml | 9 + app/src/main/res/values/strings.xml | 1 + .../messaging/messages/control/CallMessage.kt | 57 + .../sending_receiving/MessageReceiver.kt | 1 + .../ReceivedMessageHandler.kt | 20 +- .../messaging/utilities/WebRtcUtils.kt | 11 + libsignal/protobuf/SignalService.proto | 9 +- .../libsignal/protos/SignalServiceProtos.java | 1619 +++++++++++++++-- 14 files changed, 1775 insertions(+), 240 deletions(-) create mode 100644 app/src/main/res/drawable/ic_baseline_call_24.xml create mode 100644 app/src/main/res/menu/menu_conversation_call.xml create mode 100644 libsession/src/main/java/org/session/libsession/messaging/messages/control/CallMessage.kt create mode 100644 libsession/src/main/java/org/session/libsession/messaging/utilities/WebRtcUtils.kt diff --git a/app/build.gradle b/app/build.gradle index 556f88241f..3b0f537176 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -53,7 +53,8 @@ dependencies { implementation 'com.google.android.exoplayer:exoplayer-ui:2.9.1' implementation 'org.conscrypt:conscrypt-android:2.0.0' implementation 'org.signal:aesgcmprovider:0.0.3' - implementation 'org.whispersystems:webrtc-android:M77' +// implementation 'org.whispersystems:webrtc-android:M77' + implementation 'org.webrtc:google-webrtc:1.0.32006' implementation "me.leolin:ShortcutBadger:1.1.16" implementation 'se.emilsjolander:stickylistheaders:2.7.0' implementation 'com.jpardogo.materialtabstrip:library:1.0.9' @@ -153,7 +154,7 @@ dependencies { testImplementation 'org.robolectric:shadows-multidex:4.4' } -def canonicalVersionCode = 220 +def canonicalVersionCode = 222 def canonicalVersionName = "1.11.9" def postFixSize = 10 @@ -232,6 +233,7 @@ android { buildTypes { release { + debuggable true minifyEnabled false } debug { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a51159b529..67033b4bca 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -297,6 +297,7 @@ android:theme="@style/Theme.Session.DayNight.NoActionBar" /> = mutableListOf() + private val iceDebouncer = Debouncer(2_000) + + private lateinit var callAddress: Address + private val peerConnection by lazy { + // TODO: in a lokinet world, ice servers shouldn't be needed as .loki addresses should suffice to p2p + val server = PeerConnection.IceServer.builder("stun:stun.l.google.com:19302").createIceServer() + val server1 = PeerConnection.IceServer.builder("stun:stun1.l.google.com:19302").createIceServer() + val server2 = PeerConnection.IceServer.builder("stun:stun2.l.google.com:19302").createIceServer() + val server3 = PeerConnection.IceServer.builder("stun:stun3.l.google.com:19302").createIceServer() + val server4 = PeerConnection.IceServer.builder("stun:stun4.l.google.com:19302").createIceServer() + val rtcConfig = PeerConnection.RTCConfiguration(listOf(server, server1, server2, server3, server4)) + rtcConfig.keyType = PeerConnection.KeyType.ECDSA + connectionFactory.createPeerConnection(rtcConfig, this)!! + } override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) { super.onCreate(savedInstanceState, ready) setContentView(R.layout.activity_webrtc_tests) - val server = PeerConnection.IceServer.builder("stun:stun.l.google.com:19302").createIceServer() + local_renderer.run { + setMirror(true) + setEnableHardwareScaler(true) + init(eglBase.eglBaseContext, null) + } + remote_renderer.run { + setMirror(true) + setEnableHardwareScaler(true) + init(eglBase.eglBaseContext, null) + } - val rtcConfig = PeerConnection.RTCConfiguration(listOf(server)) - rtcConfig.keyType = PeerConnection.KeyType.ECDSA - rtcConfig.sdpSemantics = PeerConnection.SdpSemantics.UNIFIED_PLAN - - val peerConnection = connectionFactory.createPeerConnection(rtcConfig, this) ?: return - - Log.d("Loki-RTC", "peer connecting?") - val stream = connectionFactory.createLocalMediaStream("stream") val audioSource = connectionFactory.createAudioSource(MediaConstraints()) - val audioTrack = connectionFactory.createAudioTrack("audio", audioSource) val videoSource = connectionFactory.createVideoSource(false) - val videoTrack = connectionFactory.createVideoTrack("video", videoSource) - stream.addTrack(audioTrack) - stream.addTrack(videoTrack) - val remoteTrack = getRemoteVideoTrack(peerConnection) ?: return - videoTrack.addSink(localVideoSink) - remoteTrack.addSink(remoteVideoSink) - remoteTrack.setEnabled(true) - videoTrack.setEnabled(true) - - val eglBase = EglBase.create() - local_renderer.init(eglBase.eglBaseContext, this) - local_renderer.setScalingType(ScalingType.SCALE_ASPECT_FILL) - remote_renderer.init(eglBase.eglBaseContext, this) val videoCapturer = createCameraCapturer(Camera2Enumerator(this)) ?: kotlin.run { finish(); return } - val surfaceHelper = SurfaceTextureHelper.create("video-thread", eglBase.eglBaseContext) - surfaceHelper.startListening(localVideoSink) - videoCapturer.initialize(surfaceHelper, this, null) + videoCapturer.initialize(surfaceHelper, local_renderer.context, videoSource.capturerObserver) + videoCapturer.startCapture(HD_VIDEO_WIDTH, HD_VIDEO_HEIGHT, 10) - videoCapturer.startCapture(HD_VIDEO_WIDTH, HD_VIDEO_HEIGHT, 30) - peerConnection.createOffer(this, MediaConstraints()) + val audioTrack = connectionFactory.createAudioTrack(LOCAL_TRACK_ID + "_audio", audioSource) + val videoTrack = connectionFactory.createVideoTrack(LOCAL_TRACK_ID, videoSource) + videoTrack.addSink(local_renderer) + + val stream = connectionFactory.createLocalMediaStream(LOCAL_STREAM_ID) + stream.addTrack(videoTrack) + stream.addTrack(audioTrack) + + peerConnection.addStream(stream) + + // create either call or answer + if (intent.action == ACTION_ANSWER) { + callAddress = intent.getParcelableExtra(EXTRA_ADDRESS) ?: run { finish(); return } + val offerSdp = intent.getStringArrayExtra(EXTRA_SDP)!![0] + peerConnection.setRemoteDescription(this, SessionDescription(SessionDescription.Type.OFFER, offerSdp)) + peerConnection.createAnswer(this, MediaConstraints()) + } else { + callAddress = intent.getParcelableExtra(EXTRA_ADDRESS) ?: run { finish(); return } + peerConnection.createOffer(this, MediaConstraints()) + } } - private fun getRemoteVideoTrack(peerConnection: PeerConnection): VideoTrack? = peerConnection.transceivers.firstOrNull { it.receiver.track() is VideoTrack } as VideoTrack? + override fun onNewIntent(intent: Intent?) { + super.onNewIntent(intent) + if (intent == null) return + callAddress = intent.getParcelableExtra(EXTRA_ADDRESS) ?: run { finish(); return } + when (intent.action) { + ACTION_ANSWER -> { + peerConnection.setRemoteDescription(this, + SessionDescription(SessionDescription.Type.ANSWER, intent.getStringArrayExtra(EXTRA_SDP)!![0]) + ) + } + ACTION_UPDATE_ICE -> { + val sdpIndexes = intent.getIntArrayExtra(EXTRA_SDP_MLINE_INDEXES)!! + val sdpMids = intent.getStringArrayExtra(EXTRA_SDP_MIDS)!! + val sdp = intent.getStringArrayExtra(EXTRA_SDP)!! + val amount = minOf(sdpIndexes.size, sdpMids.size) + (0 until amount).map { index -> + val candidate = IceCandidate(sdpMids[index], sdpIndexes[index], sdp[index]) + peerConnection.addIceCandidate(candidate) + } + } + } + } private fun createCameraCapturer(enumerator: CameraEnumerator): VideoCapturer? { val deviceNames = enumerator.deviceNames @@ -96,8 +147,6 @@ class WebRtcTestsActivity: PassphraseRequiredActionBarActivity(), PeerConnection } } - // Front facing camera not found, try something else - // Front facing camera not found, try something else Log.d("Loki-RTC-vid", "Looking for other cameras.") for (deviceName in deviceNames) { @@ -113,14 +162,6 @@ class WebRtcTestsActivity: PassphraseRequiredActionBarActivity(), PeerConnection return null } - override fun onFirstFrameRendered() { - Log.d("Loki-RTC-vid", "first frame rendered") - } - - override fun onFrameResolutionChanged(p0: Int, p1: Int, p2: Int) { - Log.d("Loki-RTC-vid", "frame resolution changed") - } - override fun onSignalingChange(p0: PeerConnection.SignalingState?) { Log.d("Loki-RTC", "onSignalingChange: $p0") } @@ -135,18 +176,48 @@ class WebRtcTestsActivity: PassphraseRequiredActionBarActivity(), PeerConnection override fun onIceGatheringChange(p0: PeerConnection.IceGatheringState?) { Log.d("Loki-RTC", "onIceGatheringChange: $p0") + p0 ?: return + Log.d("Loki-RTC","sending IceCandidates of size: ${candidates.size}") + MessageSender.sendNonDurably( + CallMessage(SignalServiceProtos.CallMessage.Type.ICE_CANDIDATES, + candidates.map { it.sdp }, + candidates.map { it.sdpMLineIndex }, + candidates.map { it.sdpMid } + ), + callAddress + ) } - override fun onIceCandidate(p0: IceCandidate?) { - Log.d("Loki-RTC", "onIceCandidate: $p0") + override fun onIceCandidate(iceCandidate: IceCandidate?) { + Log.d("Loki-RTC", "onIceCandidate: $iceCandidate") + if (iceCandidate == null) return + // TODO: in a lokinet world, these might have to be filtered specifically to drop anything that is not .loki + peerConnection.addIceCandidate(iceCandidate) + candidates.add(iceCandidate) + iceDebouncer.publish { + MessageSender.sendNonDurably( + CallMessage(SignalServiceProtos.CallMessage.Type.ICE_CANDIDATES, + candidates.map { it.sdp }, + candidates.map { it.sdpMLineIndex }, + candidates.map { it.sdpMid } + ), + callAddress + ) + } } override fun onIceCandidatesRemoved(p0: Array?) { Log.d("Loki-RTC", "onIceCandidatesRemoved: $p0") + peerConnection.removeIceCandidates(p0) } - override fun onAddStream(p0: MediaStream?) { - Log.d("Loki-RTC", "onAddStream: $p0") + override fun onAddStream(remoteStream: MediaStream?) { + Log.d("Loki-RTC", "onAddStream: $remoteStream") + if (remoteStream == null) { + return + } + + remoteStream.videoTracks.firstOrNull()?.addSink(remote_renderer) } override fun onRemoveStream(p0: MediaStream?) { @@ -165,8 +236,25 @@ class WebRtcTestsActivity: PassphraseRequiredActionBarActivity(), PeerConnection Log.d("Loki-RTC", "onAddTrack: $p0: $p1") } - override fun onCreateSuccess(p0: SessionDescription) { - Log.d("Loki-RTC", "onCreateSuccess: ${p0.description}, ${p0.type}") + override fun onCreateSuccess(sdp: SessionDescription) { + Log.d("Loki-RTC", "onCreateSuccess: ${sdp.type}") + when (sdp.type) { + SessionDescription.Type.OFFER -> { + peerConnection.setLocalDescription(this, sdp) + MessageSender.sendNonDurably( + CallMessage(SignalServiceProtos.CallMessage.Type.OFFER, listOf(sdp.description), listOf(), listOf()), + callAddress + ) + } + SessionDescription.Type.ANSWER -> { + peerConnection.setLocalDescription(this, sdp) + MessageSender.sendNonDurably( + CallMessage(SignalServiceProtos.CallMessage.Type.ANSWER, listOf(sdp.description), listOf(), listOf()), + callAddress + ) + } + SessionDescription.Type.PRANSWER -> TODO("do the PR answer create success handling") // MessageSender.send() + } } override fun onSetSuccess() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuHelper.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuHelper.kt index 395d68bf34..10d909cd8f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuHelper.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuHelper.kt @@ -36,6 +36,7 @@ import org.session.libsession.utilities.recipients.Recipient import org.session.libsignal.utilities.guava.Optional import org.session.libsignal.utilities.toHexString import org.thoughtcrime.securesms.* +import org.thoughtcrime.securesms.calls.WebRtcTestsActivity import org.thoughtcrime.securesms.contacts.SelectContactsActivity import org.thoughtcrime.securesms.conversation.v2.ConversationActivityV2 import org.thoughtcrime.securesms.conversation.v2.utilities.NotificationUtils @@ -98,6 +99,11 @@ object ConversationMenuHelper { inflater.inflate(R.menu.menu_conversation_notification_settings, menu) } + // Call Tests + if (!isOpenGroup) { + inflater.inflate(R.menu.menu_conversation_call, menu) + } + // Search val searchViewItem = menu.findItem(R.id.menu_search) (context as ConversationActivityV2).searchViewItem = searchViewItem @@ -158,6 +164,7 @@ object ConversationMenuHelper { R.id.menu_unmute_notifications -> { unmute(context, thread) } R.id.menu_mute_notifications -> { mute(context, thread) } R.id.menu_notification_settings -> { setNotifyType(context, thread) } + R.id.menu_call -> { call(context, thread) } } return true } @@ -174,6 +181,13 @@ object ConversationMenuHelper { searchViewModel.onSearchOpened() } + private fun call(context: Context, thread: Recipient) { + val intent = Intent(context, WebRtcTestsActivity::class.java) + intent.putExtra(WebRtcTestsActivity.EXTRA_ADDRESS, thread.address) + val activity = context as AppCompatActivity + activity.startActivity(intent) + } + @SuppressLint("StaticFieldLeak") private fun addShortcut(context: Context, thread: Recipient) { object : AsyncTask() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt index a566fba895..c60f5c177c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt @@ -12,6 +12,7 @@ import android.text.SpannableString import android.text.style.ForegroundColorSpan import android.view.View import android.widget.Toast +import androidx.core.os.bundleOf import androidx.core.view.isVisible import androidx.lifecycle.Observer import androidx.lifecycle.lifecycleScope @@ -32,8 +33,10 @@ import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import org.session.libsession.messaging.jobs.JobQueue import org.session.libsession.messaging.sending_receiving.MessageSender +import org.session.libsession.messaging.utilities.WebRtcUtils import org.session.libsession.utilities.* import org.session.libsession.utilities.Util +import org.session.libsignal.utilities.Log import org.session.libsignal.utilities.ThreadUtils import org.session.libsignal.utilities.toHexString import org.thoughtcrime.securesms.ApplicationContext @@ -53,6 +56,7 @@ import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.mms.GlideRequests import org.thoughtcrime.securesms.onboarding.SeedActivity import org.thoughtcrime.securesms.onboarding.SeedReminderViewDelegate +import org.thoughtcrime.securesms.preferences.SettingsActivity import org.thoughtcrime.securesms.util.* import java.io.IOException import java.util.* @@ -131,6 +135,36 @@ class HomeActivity : PassphraseRequiredActionBarActivity(), ConversationClickLis } this.broadcastReceiver = broadcastReceiver LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, IntentFilter("blockedContactsChanged")) + lifecycleScope.launchWhenCreated { + // web rtc channel handling + for (message in WebRtcUtils.SIGNAL_QUEUE) { + val sender = Address.fromSerialized(message.sender!!) + val intent = Intent(this@HomeActivity, WebRtcTestsActivity::class.java) + val bundle = bundleOf( + WebRtcTestsActivity.EXTRA_ADDRESS to sender, + ) + if (message.sdps.isNotEmpty() && message.sdpMids.isEmpty()) { + // offer message + Log.d("Loki-RTC", "answer receive") + val sdps = message.sdps + intent.action = WebRtcTestsActivity.ACTION_ANSWER + bundle.putStringArray(WebRtcTestsActivity.EXTRA_SDP, sdps.toTypedArray()) + } else if (message.sdpMids.isNotEmpty()) { + // ice candidates message + Log.d("Loki-RTC", "update ice intent") + val sdpMLineIndexes = message.sdpMLineIndexes + val sdpMids = message.sdpMids + val sdps = message.sdps + intent.action = WebRtcTestsActivity.ACTION_UPDATE_ICE + bundle.putStringArray(WebRtcTestsActivity.EXTRA_SDP, sdps.toTypedArray()) + bundle.putIntArray(WebRtcTestsActivity.EXTRA_SDP_MLINE_INDEXES, sdpMLineIndexes.toIntArray()) + bundle.putStringArray(WebRtcTestsActivity.EXTRA_SDP_MIDS, sdpMids.toTypedArray()) + } + + intent.putExtras(bundle) + startActivity(intent) + } + } lifecycleScope.launchWhenStarted { launch(Dispatchers.IO) { // Double check that the long poller is up @@ -400,8 +434,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(), ConversationClickLis } private fun openSettings() { - val intent = Intent(this, WebRtcTestsActivity::class.java) -// val intent = Intent(this, SettingsActivity::class.java) + val intent = Intent(this, SettingsActivity::class.java) show(intent, isForResult = false) } diff --git a/app/src/main/res/drawable/ic_baseline_call_24.xml b/app/src/main/res/drawable/ic_baseline_call_24.xml new file mode 100644 index 0000000000..567e303fc5 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_call_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/menu/menu_conversation_call.xml b/app/src/main/res/menu/menu_conversation_call.xml new file mode 100644 index 0000000000..8ebfeb8c8d --- /dev/null +++ b/app/src/main/res/menu/menu_conversation_call.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 360bd4bece..aaa000eb8f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -585,6 +585,7 @@ Ban and delete all Resend message Reply to message + Call Save attachment diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/control/CallMessage.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/CallMessage.kt new file mode 100644 index 0000000000..8353da0cb7 --- /dev/null +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/control/CallMessage.kt @@ -0,0 +1,57 @@ +package org.session.libsession.messaging.messages.control + +import org.session.libsignal.protos.SignalServiceProtos +import org.session.libsignal.utilities.Log + +class CallMessage(): ControlMessage() { + var type: SignalServiceProtos.CallMessage.Type? = null + var sdps: List = listOf() + var sdpMLineIndexes: List = listOf() + var sdpMids: List = listOf() + + override val isSelfSendValid: Boolean = false + + override fun isValid(): Boolean = super.isValid() && type != null && !sdps.isNullOrEmpty() + + constructor(type: SignalServiceProtos.CallMessage.Type, + sdps: List, + sdpMLineIndexes: List, + sdpMids: List) : this() { + this.type = type + this.sdps = sdps + this.sdpMLineIndexes = sdpMLineIndexes + this.sdpMids = sdpMids + } + + companion object { + const val TAG = "CallMessage" + + fun fromProto(proto: SignalServiceProtos.Content): CallMessage? { + val callMessageProto = if (proto.hasCallMessage()) proto.callMessage else return null + val type = callMessageProto.type + val sdps = callMessageProto.sdpsList + val sdpMLineIndexes = callMessageProto.sdpMLineIndexesList + val sdpMids = callMessageProto.sdpMidsList + return CallMessage(type,sdps, sdpMLineIndexes, sdpMids) + } + } + + override fun toProto(): SignalServiceProtos.Content? { + val nonNullType = type ?: run { + Log.w(TAG,"Couldn't construct call message request proto from: $this") + return null + } + + val callMessage = SignalServiceProtos.CallMessage.newBuilder() + .setType(nonNullType) + .addAllSdps(sdps) + .addAllSdpMLineIndexes(sdpMLineIndexes) + .addAllSdpMids(sdpMids) + + return SignalServiceProtos.Content.newBuilder() + .setCallMessage( + callMessage + ) + .build() + } +} \ No newline at end of file diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageReceiver.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageReceiver.kt index 0a00892107..8f9e8b39e7 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageReceiver.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageReceiver.kt @@ -95,6 +95,7 @@ object MessageReceiver { ExpirationTimerUpdate.fromProto(proto) ?: ConfigurationMessage.fromProto(proto) ?: UnsendRequest.fromProto(proto) ?: + CallMessage.fromProto(proto) ?: VisibleMessage.fromProto(proto) ?: throw Error.UnknownMessage // Ignore self send if needed if (!message.isSelfSendValid && sender == userPublicKey) throw Error.SelfSend diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt index de2b8a349c..f844b0ae35 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt @@ -14,24 +14,20 @@ import org.session.libsession.messaging.sending_receiving.link_preview.LinkPrevi import org.session.libsession.messaging.sending_receiving.notifications.PushNotificationAPI import org.session.libsession.messaging.sending_receiving.pollers.ClosedGroupPollerV2 import org.session.libsession.messaging.sending_receiving.quotes.QuoteModel +import org.session.libsession.messaging.utilities.WebRtcUtils import org.session.libsession.snode.SnodeAPI -import org.session.libsession.utilities.Address -import org.session.libsession.utilities.GroupRecord +import org.session.libsession.utilities.* import org.session.libsession.utilities.recipients.Recipient -import org.session.libsession.utilities.GroupUtil -import org.session.libsession.utilities.SSKEnvironment -import org.session.libsession.utilities.TextSecurePreferences -import org.session.libsession.utilities.ProfileKeyUtil import org.session.libsignal.crypto.ecc.DjbECPrivateKey import org.session.libsignal.crypto.ecc.DjbECPublicKey import org.session.libsignal.crypto.ecc.ECKeyPair -import org.session.libsignal.utilities.guava.Optional import org.session.libsignal.messages.SignalServiceGroup import org.session.libsignal.protos.SignalServiceProtos -import org.session.libsignal.utilities.removing05PrefixIfNeeded -import org.session.libsignal.utilities.toHexString import org.session.libsignal.utilities.Base64 import org.session.libsignal.utilities.Log +import org.session.libsignal.utilities.guava.Optional +import org.session.libsignal.utilities.removing05PrefixIfNeeded +import org.session.libsignal.utilities.toHexString import java.security.MessageDigest import java.util.* import kotlin.collections.ArrayList @@ -52,6 +48,7 @@ fun MessageReceiver.handle(message: Message, proto: SignalServiceProtos.Content, is ConfigurationMessage -> handleConfigurationMessage(message) is UnsendRequest -> handleUnsendRequest(message) is VisibleMessage -> handleVisibleMessage(message, proto, openGroupID) + is CallMessage -> handleCallMessage(message) } } @@ -61,6 +58,11 @@ private fun MessageReceiver.handleReadReceipt(message: ReadReceipt) { SSKEnvironment.shared.readReceiptManager.processReadReceipts(context, message.sender!!, message.timestamps!!, message.receivedTimestamp!!) } +private fun MessageReceiver.handleCallMessage(message: CallMessage) { + // TODO: refactor this out to persistence, just to help debug the flow and send/receive in synchronous testing + WebRtcUtils.SIGNAL_QUEUE.offer(message) +} + private fun MessageReceiver.handleTypingIndicator(message: TypingIndicator) { when (message.kind!!) { TypingIndicator.Kind.STARTED -> showTypingIndicatorIfNeeded(message.sender!!) diff --git a/libsession/src/main/java/org/session/libsession/messaging/utilities/WebRtcUtils.kt b/libsession/src/main/java/org/session/libsession/messaging/utilities/WebRtcUtils.kt new file mode 100644 index 0000000000..93812f2687 --- /dev/null +++ b/libsession/src/main/java/org/session/libsession/messaging/utilities/WebRtcUtils.kt @@ -0,0 +1,11 @@ +package org.session.libsession.messaging.utilities + +import kotlinx.coroutines.channels.Channel +import org.session.libsession.messaging.messages.control.CallMessage + +object WebRtcUtils { + + // TODO: move this to a better place that is persistent + val SIGNAL_QUEUE = Channel(Channel.UNLIMITED) + +} \ No newline at end of file diff --git a/libsignal/protobuf/SignalService.proto b/libsignal/protobuf/SignalService.proto index 0feaad306c..92409e4702 100644 --- a/libsignal/protobuf/SignalService.proto +++ b/libsignal/protobuf/SignalService.proto @@ -168,12 +168,15 @@ message CallMessage { OFFER = 1; ANSWER = 2; PROVISIONAL_ANSWER = 3; + ICE_CANDIDATES = 4; + END_CALL = 5; } // @required - required Type type = 1; - // @required - required string sdp = 2; + required Type type = 1; + repeated string sdps = 2; + repeated uint32 sdpMLineIndexes = 3; + repeated string sdpMids = 4; } diff --git a/libsignal/src/main/java/org/session/libsignal/protos/SignalServiceProtos.java b/libsignal/src/main/java/org/session/libsignal/protos/SignalServiceProtos.java index 4dce0ba511..f76a2e2e67 100644 --- a/libsignal/src/main/java/org/session/libsignal/protos/SignalServiceProtos.java +++ b/libsignal/src/main/java/org/session/libsignal/protos/SignalServiceProtos.java @@ -2371,6 +2371,20 @@ public final class SignalServiceProtos { */ org.session.libsignal.protos.SignalServiceProtos.DataMessageOrBuilder getDataMessageOrBuilder(); + // optional .signalservice.CallMessage callMessage = 3; + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + boolean hasCallMessage(); + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + org.session.libsignal.protos.SignalServiceProtos.CallMessage getCallMessage(); + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + org.session.libsignal.protos.SignalServiceProtos.CallMessageOrBuilder getCallMessageOrBuilder(); + // optional .signalservice.ReceiptMessage receiptMessage = 5; /** * optional .signalservice.ReceiptMessage receiptMessage = 5; @@ -2505,9 +2519,22 @@ public final class SignalServiceProtos { bitField0_ |= 0x00000001; break; } + case 26: { + org.session.libsignal.protos.SignalServiceProtos.CallMessage.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) == 0x00000002)) { + subBuilder = callMessage_.toBuilder(); + } + callMessage_ = input.readMessage(org.session.libsignal.protos.SignalServiceProtos.CallMessage.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(callMessage_); + callMessage_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } case 42: { org.session.libsignal.protos.SignalServiceProtos.ReceiptMessage.Builder subBuilder = null; - if (((bitField0_ & 0x00000002) == 0x00000002)) { + if (((bitField0_ & 0x00000004) == 0x00000004)) { subBuilder = receiptMessage_.toBuilder(); } receiptMessage_ = input.readMessage(org.session.libsignal.protos.SignalServiceProtos.ReceiptMessage.PARSER, extensionRegistry); @@ -2515,12 +2542,12 @@ public final class SignalServiceProtos { subBuilder.mergeFrom(receiptMessage_); receiptMessage_ = subBuilder.buildPartial(); } - bitField0_ |= 0x00000002; + bitField0_ |= 0x00000004; break; } case 50: { org.session.libsignal.protos.SignalServiceProtos.TypingMessage.Builder subBuilder = null; - if (((bitField0_ & 0x00000004) == 0x00000004)) { + if (((bitField0_ & 0x00000008) == 0x00000008)) { subBuilder = typingMessage_.toBuilder(); } typingMessage_ = input.readMessage(org.session.libsignal.protos.SignalServiceProtos.TypingMessage.PARSER, extensionRegistry); @@ -2528,12 +2555,12 @@ public final class SignalServiceProtos { subBuilder.mergeFrom(typingMessage_); typingMessage_ = subBuilder.buildPartial(); } - bitField0_ |= 0x00000004; + bitField0_ |= 0x00000008; break; } case 58: { org.session.libsignal.protos.SignalServiceProtos.ConfigurationMessage.Builder subBuilder = null; - if (((bitField0_ & 0x00000008) == 0x00000008)) { + if (((bitField0_ & 0x00000010) == 0x00000010)) { subBuilder = configurationMessage_.toBuilder(); } configurationMessage_ = input.readMessage(org.session.libsignal.protos.SignalServiceProtos.ConfigurationMessage.PARSER, extensionRegistry); @@ -2541,12 +2568,12 @@ public final class SignalServiceProtos { subBuilder.mergeFrom(configurationMessage_); configurationMessage_ = subBuilder.buildPartial(); } - bitField0_ |= 0x00000008; + bitField0_ |= 0x00000010; break; } case 66: { org.session.libsignal.protos.SignalServiceProtos.DataExtractionNotification.Builder subBuilder = null; - if (((bitField0_ & 0x00000010) == 0x00000010)) { + if (((bitField0_ & 0x00000020) == 0x00000020)) { subBuilder = dataExtractionNotification_.toBuilder(); } dataExtractionNotification_ = input.readMessage(org.session.libsignal.protos.SignalServiceProtos.DataExtractionNotification.PARSER, extensionRegistry); @@ -2554,12 +2581,12 @@ public final class SignalServiceProtos { subBuilder.mergeFrom(dataExtractionNotification_); dataExtractionNotification_ = subBuilder.buildPartial(); } - bitField0_ |= 0x00000010; + bitField0_ |= 0x00000020; break; } case 74: { org.session.libsignal.protos.SignalServiceProtos.UnsendRequest.Builder subBuilder = null; - if (((bitField0_ & 0x00000020) == 0x00000020)) { + if (((bitField0_ & 0x00000040) == 0x00000040)) { subBuilder = unsendRequest_.toBuilder(); } unsendRequest_ = input.readMessage(org.session.libsignal.protos.SignalServiceProtos.UnsendRequest.PARSER, extensionRegistry); @@ -2567,7 +2594,7 @@ public final class SignalServiceProtos { subBuilder.mergeFrom(unsendRequest_); unsendRequest_ = subBuilder.buildPartial(); } - bitField0_ |= 0x00000020; + bitField0_ |= 0x00000040; break; } } @@ -2632,6 +2659,28 @@ public final class SignalServiceProtos { return dataMessage_; } + // optional .signalservice.CallMessage callMessage = 3; + public static final int CALLMESSAGE_FIELD_NUMBER = 3; + private org.session.libsignal.protos.SignalServiceProtos.CallMessage callMessage_; + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + public boolean hasCallMessage() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + public org.session.libsignal.protos.SignalServiceProtos.CallMessage getCallMessage() { + return callMessage_; + } + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + public org.session.libsignal.protos.SignalServiceProtos.CallMessageOrBuilder getCallMessageOrBuilder() { + return callMessage_; + } + // optional .signalservice.ReceiptMessage receiptMessage = 5; public static final int RECEIPTMESSAGE_FIELD_NUMBER = 5; private org.session.libsignal.protos.SignalServiceProtos.ReceiptMessage receiptMessage_; @@ -2639,7 +2688,7 @@ public final class SignalServiceProtos { * optional .signalservice.ReceiptMessage receiptMessage = 5; */ public boolean hasReceiptMessage() { - return ((bitField0_ & 0x00000002) == 0x00000002); + return ((bitField0_ & 0x00000004) == 0x00000004); } /** * optional .signalservice.ReceiptMessage receiptMessage = 5; @@ -2661,7 +2710,7 @@ public final class SignalServiceProtos { * optional .signalservice.TypingMessage typingMessage = 6; */ public boolean hasTypingMessage() { - return ((bitField0_ & 0x00000004) == 0x00000004); + return ((bitField0_ & 0x00000008) == 0x00000008); } /** * optional .signalservice.TypingMessage typingMessage = 6; @@ -2683,7 +2732,7 @@ public final class SignalServiceProtos { * optional .signalservice.ConfigurationMessage configurationMessage = 7; */ public boolean hasConfigurationMessage() { - return ((bitField0_ & 0x00000008) == 0x00000008); + return ((bitField0_ & 0x00000010) == 0x00000010); } /** * optional .signalservice.ConfigurationMessage configurationMessage = 7; @@ -2705,7 +2754,7 @@ public final class SignalServiceProtos { * optional .signalservice.DataExtractionNotification dataExtractionNotification = 8; */ public boolean hasDataExtractionNotification() { - return ((bitField0_ & 0x00000010) == 0x00000010); + return ((bitField0_ & 0x00000020) == 0x00000020); } /** * optional .signalservice.DataExtractionNotification dataExtractionNotification = 8; @@ -2727,7 +2776,7 @@ public final class SignalServiceProtos { * optional .signalservice.UnsendRequest unsendRequest = 9; */ public boolean hasUnsendRequest() { - return ((bitField0_ & 0x00000020) == 0x00000020); + return ((bitField0_ & 0x00000040) == 0x00000040); } /** * optional .signalservice.UnsendRequest unsendRequest = 9; @@ -2744,6 +2793,7 @@ public final class SignalServiceProtos { private void initFields() { dataMessage_ = org.session.libsignal.protos.SignalServiceProtos.DataMessage.getDefaultInstance(); + callMessage_ = org.session.libsignal.protos.SignalServiceProtos.CallMessage.getDefaultInstance(); receiptMessage_ = org.session.libsignal.protos.SignalServiceProtos.ReceiptMessage.getDefaultInstance(); typingMessage_ = org.session.libsignal.protos.SignalServiceProtos.TypingMessage.getDefaultInstance(); configurationMessage_ = org.session.libsignal.protos.SignalServiceProtos.ConfigurationMessage.getDefaultInstance(); @@ -2761,6 +2811,12 @@ public final class SignalServiceProtos { return false; } } + if (hasCallMessage()) { + if (!getCallMessage().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } if (hasReceiptMessage()) { if (!getReceiptMessage().isInitialized()) { memoizedIsInitialized = 0; @@ -2802,18 +2858,21 @@ public final class SignalServiceProtos { output.writeMessage(1, dataMessage_); } if (((bitField0_ & 0x00000002) == 0x00000002)) { - output.writeMessage(5, receiptMessage_); + output.writeMessage(3, callMessage_); } if (((bitField0_ & 0x00000004) == 0x00000004)) { - output.writeMessage(6, typingMessage_); + output.writeMessage(5, receiptMessage_); } if (((bitField0_ & 0x00000008) == 0x00000008)) { - output.writeMessage(7, configurationMessage_); + output.writeMessage(6, typingMessage_); } if (((bitField0_ & 0x00000010) == 0x00000010)) { - output.writeMessage(8, dataExtractionNotification_); + output.writeMessage(7, configurationMessage_); } if (((bitField0_ & 0x00000020) == 0x00000020)) { + output.writeMessage(8, dataExtractionNotification_); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { output.writeMessage(9, unsendRequest_); } getUnknownFields().writeTo(output); @@ -2831,21 +2890,25 @@ public final class SignalServiceProtos { } if (((bitField0_ & 0x00000002) == 0x00000002)) { size += com.google.protobuf.CodedOutputStream - .computeMessageSize(5, receiptMessage_); + .computeMessageSize(3, callMessage_); } if (((bitField0_ & 0x00000004) == 0x00000004)) { size += com.google.protobuf.CodedOutputStream - .computeMessageSize(6, typingMessage_); + .computeMessageSize(5, receiptMessage_); } if (((bitField0_ & 0x00000008) == 0x00000008)) { size += com.google.protobuf.CodedOutputStream - .computeMessageSize(7, configurationMessage_); + .computeMessageSize(6, typingMessage_); } if (((bitField0_ & 0x00000010) == 0x00000010)) { size += com.google.protobuf.CodedOutputStream - .computeMessageSize(8, dataExtractionNotification_); + .computeMessageSize(7, configurationMessage_); } if (((bitField0_ & 0x00000020) == 0x00000020)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(8, dataExtractionNotification_); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { size += com.google.protobuf.CodedOutputStream .computeMessageSize(9, unsendRequest_); } @@ -2958,6 +3021,7 @@ public final class SignalServiceProtos { private void maybeForceBuilderInitialization() { if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { getDataMessageFieldBuilder(); + getCallMessageFieldBuilder(); getReceiptMessageFieldBuilder(); getTypingMessageFieldBuilder(); getConfigurationMessageFieldBuilder(); @@ -2977,36 +3041,42 @@ public final class SignalServiceProtos { dataMessageBuilder_.clear(); } bitField0_ = (bitField0_ & ~0x00000001); + if (callMessageBuilder_ == null) { + callMessage_ = org.session.libsignal.protos.SignalServiceProtos.CallMessage.getDefaultInstance(); + } else { + callMessageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); if (receiptMessageBuilder_ == null) { receiptMessage_ = org.session.libsignal.protos.SignalServiceProtos.ReceiptMessage.getDefaultInstance(); } else { receiptMessageBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000002); + bitField0_ = (bitField0_ & ~0x00000004); if (typingMessageBuilder_ == null) { typingMessage_ = org.session.libsignal.protos.SignalServiceProtos.TypingMessage.getDefaultInstance(); } else { typingMessageBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000004); + bitField0_ = (bitField0_ & ~0x00000008); if (configurationMessageBuilder_ == null) { configurationMessage_ = org.session.libsignal.protos.SignalServiceProtos.ConfigurationMessage.getDefaultInstance(); } else { configurationMessageBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000008); + bitField0_ = (bitField0_ & ~0x00000010); if (dataExtractionNotificationBuilder_ == null) { dataExtractionNotification_ = org.session.libsignal.protos.SignalServiceProtos.DataExtractionNotification.getDefaultInstance(); } else { dataExtractionNotificationBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000010); + bitField0_ = (bitField0_ & ~0x00000020); if (unsendRequestBuilder_ == null) { unsendRequest_ = org.session.libsignal.protos.SignalServiceProtos.UnsendRequest.getDefaultInstance(); } else { unsendRequestBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000020); + bitField0_ = (bitField0_ & ~0x00000040); return this; } @@ -3046,37 +3116,45 @@ public final class SignalServiceProtos { if (((from_bitField0_ & 0x00000002) == 0x00000002)) { to_bitField0_ |= 0x00000002; } + if (callMessageBuilder_ == null) { + result.callMessage_ = callMessage_; + } else { + result.callMessage_ = callMessageBuilder_.build(); + } + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } if (receiptMessageBuilder_ == null) { result.receiptMessage_ = receiptMessage_; } else { result.receiptMessage_ = receiptMessageBuilder_.build(); } - if (((from_bitField0_ & 0x00000004) == 0x00000004)) { - to_bitField0_ |= 0x00000004; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; } if (typingMessageBuilder_ == null) { result.typingMessage_ = typingMessage_; } else { result.typingMessage_ = typingMessageBuilder_.build(); } - if (((from_bitField0_ & 0x00000008) == 0x00000008)) { - to_bitField0_ |= 0x00000008; + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000010; } if (configurationMessageBuilder_ == null) { result.configurationMessage_ = configurationMessage_; } else { result.configurationMessage_ = configurationMessageBuilder_.build(); } - if (((from_bitField0_ & 0x00000010) == 0x00000010)) { - to_bitField0_ |= 0x00000010; + if (((from_bitField0_ & 0x00000020) == 0x00000020)) { + to_bitField0_ |= 0x00000020; } if (dataExtractionNotificationBuilder_ == null) { result.dataExtractionNotification_ = dataExtractionNotification_; } else { result.dataExtractionNotification_ = dataExtractionNotificationBuilder_.build(); } - if (((from_bitField0_ & 0x00000020) == 0x00000020)) { - to_bitField0_ |= 0x00000020; + if (((from_bitField0_ & 0x00000040) == 0x00000040)) { + to_bitField0_ |= 0x00000040; } if (unsendRequestBuilder_ == null) { result.unsendRequest_ = unsendRequest_; @@ -3102,6 +3180,9 @@ public final class SignalServiceProtos { if (other.hasDataMessage()) { mergeDataMessage(other.getDataMessage()); } + if (other.hasCallMessage()) { + mergeCallMessage(other.getCallMessage()); + } if (other.hasReceiptMessage()) { mergeReceiptMessage(other.getReceiptMessage()); } @@ -3128,6 +3209,12 @@ public final class SignalServiceProtos { return false; } } + if (hasCallMessage()) { + if (!getCallMessage().isInitialized()) { + + return false; + } + } if (hasReceiptMessage()) { if (!getReceiptMessage().isInitialized()) { @@ -3297,6 +3384,123 @@ public final class SignalServiceProtos { return dataMessageBuilder_; } + // optional .signalservice.CallMessage callMessage = 3; + private org.session.libsignal.protos.SignalServiceProtos.CallMessage callMessage_ = org.session.libsignal.protos.SignalServiceProtos.CallMessage.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.protos.SignalServiceProtos.CallMessage, org.session.libsignal.protos.SignalServiceProtos.CallMessage.Builder, org.session.libsignal.protos.SignalServiceProtos.CallMessageOrBuilder> callMessageBuilder_; + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + public boolean hasCallMessage() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + public org.session.libsignal.protos.SignalServiceProtos.CallMessage getCallMessage() { + if (callMessageBuilder_ == null) { + return callMessage_; + } else { + return callMessageBuilder_.getMessage(); + } + } + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + public Builder setCallMessage(org.session.libsignal.protos.SignalServiceProtos.CallMessage value) { + if (callMessageBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + callMessage_ = value; + onChanged(); + } else { + callMessageBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + public Builder setCallMessage( + org.session.libsignal.protos.SignalServiceProtos.CallMessage.Builder builderForValue) { + if (callMessageBuilder_ == null) { + callMessage_ = builderForValue.build(); + onChanged(); + } else { + callMessageBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + public Builder mergeCallMessage(org.session.libsignal.protos.SignalServiceProtos.CallMessage value) { + if (callMessageBuilder_ == null) { + if (((bitField0_ & 0x00000002) == 0x00000002) && + callMessage_ != org.session.libsignal.protos.SignalServiceProtos.CallMessage.getDefaultInstance()) { + callMessage_ = + org.session.libsignal.protos.SignalServiceProtos.CallMessage.newBuilder(callMessage_).mergeFrom(value).buildPartial(); + } else { + callMessage_ = value; + } + onChanged(); + } else { + callMessageBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + public Builder clearCallMessage() { + if (callMessageBuilder_ == null) { + callMessage_ = org.session.libsignal.protos.SignalServiceProtos.CallMessage.getDefaultInstance(); + onChanged(); + } else { + callMessageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + public org.session.libsignal.protos.SignalServiceProtos.CallMessage.Builder getCallMessageBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getCallMessageFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + public org.session.libsignal.protos.SignalServiceProtos.CallMessageOrBuilder getCallMessageOrBuilder() { + if (callMessageBuilder_ != null) { + return callMessageBuilder_.getMessageOrBuilder(); + } else { + return callMessage_; + } + } + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.protos.SignalServiceProtos.CallMessage, org.session.libsignal.protos.SignalServiceProtos.CallMessage.Builder, org.session.libsignal.protos.SignalServiceProtos.CallMessageOrBuilder> + getCallMessageFieldBuilder() { + if (callMessageBuilder_ == null) { + callMessageBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.protos.SignalServiceProtos.CallMessage, org.session.libsignal.protos.SignalServiceProtos.CallMessage.Builder, org.session.libsignal.protos.SignalServiceProtos.CallMessageOrBuilder>( + callMessage_, + getParentForChildren(), + isClean()); + callMessage_ = null; + } + return callMessageBuilder_; + } + // optional .signalservice.ReceiptMessage receiptMessage = 5; private org.session.libsignal.protos.SignalServiceProtos.ReceiptMessage receiptMessage_ = org.session.libsignal.protos.SignalServiceProtos.ReceiptMessage.getDefaultInstance(); private com.google.protobuf.SingleFieldBuilder< @@ -3305,7 +3509,7 @@ public final class SignalServiceProtos { * optional .signalservice.ReceiptMessage receiptMessage = 5; */ public boolean hasReceiptMessage() { - return ((bitField0_ & 0x00000002) == 0x00000002); + return ((bitField0_ & 0x00000004) == 0x00000004); } /** * optional .signalservice.ReceiptMessage receiptMessage = 5; @@ -3330,7 +3534,7 @@ public final class SignalServiceProtos { } else { receiptMessageBuilder_.setMessage(value); } - bitField0_ |= 0x00000002; + bitField0_ |= 0x00000004; return this; } /** @@ -3344,7 +3548,7 @@ public final class SignalServiceProtos { } else { receiptMessageBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000002; + bitField0_ |= 0x00000004; return this; } /** @@ -3352,7 +3556,7 @@ public final class SignalServiceProtos { */ public Builder mergeReceiptMessage(org.session.libsignal.protos.SignalServiceProtos.ReceiptMessage value) { if (receiptMessageBuilder_ == null) { - if (((bitField0_ & 0x00000002) == 0x00000002) && + if (((bitField0_ & 0x00000004) == 0x00000004) && receiptMessage_ != org.session.libsignal.protos.SignalServiceProtos.ReceiptMessage.getDefaultInstance()) { receiptMessage_ = org.session.libsignal.protos.SignalServiceProtos.ReceiptMessage.newBuilder(receiptMessage_).mergeFrom(value).buildPartial(); @@ -3363,7 +3567,7 @@ public final class SignalServiceProtos { } else { receiptMessageBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000002; + bitField0_ |= 0x00000004; return this; } /** @@ -3376,14 +3580,14 @@ public final class SignalServiceProtos { } else { receiptMessageBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000002); + bitField0_ = (bitField0_ & ~0x00000004); return this; } /** * optional .signalservice.ReceiptMessage receiptMessage = 5; */ public org.session.libsignal.protos.SignalServiceProtos.ReceiptMessage.Builder getReceiptMessageBuilder() { - bitField0_ |= 0x00000002; + bitField0_ |= 0x00000004; onChanged(); return getReceiptMessageFieldBuilder().getBuilder(); } @@ -3422,7 +3626,7 @@ public final class SignalServiceProtos { * optional .signalservice.TypingMessage typingMessage = 6; */ public boolean hasTypingMessage() { - return ((bitField0_ & 0x00000004) == 0x00000004); + return ((bitField0_ & 0x00000008) == 0x00000008); } /** * optional .signalservice.TypingMessage typingMessage = 6; @@ -3447,7 +3651,7 @@ public final class SignalServiceProtos { } else { typingMessageBuilder_.setMessage(value); } - bitField0_ |= 0x00000004; + bitField0_ |= 0x00000008; return this; } /** @@ -3461,7 +3665,7 @@ public final class SignalServiceProtos { } else { typingMessageBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000004; + bitField0_ |= 0x00000008; return this; } /** @@ -3469,7 +3673,7 @@ public final class SignalServiceProtos { */ public Builder mergeTypingMessage(org.session.libsignal.protos.SignalServiceProtos.TypingMessage value) { if (typingMessageBuilder_ == null) { - if (((bitField0_ & 0x00000004) == 0x00000004) && + if (((bitField0_ & 0x00000008) == 0x00000008) && typingMessage_ != org.session.libsignal.protos.SignalServiceProtos.TypingMessage.getDefaultInstance()) { typingMessage_ = org.session.libsignal.protos.SignalServiceProtos.TypingMessage.newBuilder(typingMessage_).mergeFrom(value).buildPartial(); @@ -3480,7 +3684,7 @@ public final class SignalServiceProtos { } else { typingMessageBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000004; + bitField0_ |= 0x00000008; return this; } /** @@ -3493,14 +3697,14 @@ public final class SignalServiceProtos { } else { typingMessageBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000004); + bitField0_ = (bitField0_ & ~0x00000008); return this; } /** * optional .signalservice.TypingMessage typingMessage = 6; */ public org.session.libsignal.protos.SignalServiceProtos.TypingMessage.Builder getTypingMessageBuilder() { - bitField0_ |= 0x00000004; + bitField0_ |= 0x00000008; onChanged(); return getTypingMessageFieldBuilder().getBuilder(); } @@ -3539,7 +3743,7 @@ public final class SignalServiceProtos { * optional .signalservice.ConfigurationMessage configurationMessage = 7; */ public boolean hasConfigurationMessage() { - return ((bitField0_ & 0x00000008) == 0x00000008); + return ((bitField0_ & 0x00000010) == 0x00000010); } /** * optional .signalservice.ConfigurationMessage configurationMessage = 7; @@ -3564,7 +3768,7 @@ public final class SignalServiceProtos { } else { configurationMessageBuilder_.setMessage(value); } - bitField0_ |= 0x00000008; + bitField0_ |= 0x00000010; return this; } /** @@ -3578,7 +3782,7 @@ public final class SignalServiceProtos { } else { configurationMessageBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000008; + bitField0_ |= 0x00000010; return this; } /** @@ -3586,7 +3790,7 @@ public final class SignalServiceProtos { */ public Builder mergeConfigurationMessage(org.session.libsignal.protos.SignalServiceProtos.ConfigurationMessage value) { if (configurationMessageBuilder_ == null) { - if (((bitField0_ & 0x00000008) == 0x00000008) && + if (((bitField0_ & 0x00000010) == 0x00000010) && configurationMessage_ != org.session.libsignal.protos.SignalServiceProtos.ConfigurationMessage.getDefaultInstance()) { configurationMessage_ = org.session.libsignal.protos.SignalServiceProtos.ConfigurationMessage.newBuilder(configurationMessage_).mergeFrom(value).buildPartial(); @@ -3597,7 +3801,7 @@ public final class SignalServiceProtos { } else { configurationMessageBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000008; + bitField0_ |= 0x00000010; return this; } /** @@ -3610,14 +3814,14 @@ public final class SignalServiceProtos { } else { configurationMessageBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000008); + bitField0_ = (bitField0_ & ~0x00000010); return this; } /** * optional .signalservice.ConfigurationMessage configurationMessage = 7; */ public org.session.libsignal.protos.SignalServiceProtos.ConfigurationMessage.Builder getConfigurationMessageBuilder() { - bitField0_ |= 0x00000008; + bitField0_ |= 0x00000010; onChanged(); return getConfigurationMessageFieldBuilder().getBuilder(); } @@ -3656,7 +3860,7 @@ public final class SignalServiceProtos { * optional .signalservice.DataExtractionNotification dataExtractionNotification = 8; */ public boolean hasDataExtractionNotification() { - return ((bitField0_ & 0x00000010) == 0x00000010); + return ((bitField0_ & 0x00000020) == 0x00000020); } /** * optional .signalservice.DataExtractionNotification dataExtractionNotification = 8; @@ -3681,7 +3885,7 @@ public final class SignalServiceProtos { } else { dataExtractionNotificationBuilder_.setMessage(value); } - bitField0_ |= 0x00000010; + bitField0_ |= 0x00000020; return this; } /** @@ -3695,7 +3899,7 @@ public final class SignalServiceProtos { } else { dataExtractionNotificationBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000010; + bitField0_ |= 0x00000020; return this; } /** @@ -3703,7 +3907,7 @@ public final class SignalServiceProtos { */ public Builder mergeDataExtractionNotification(org.session.libsignal.protos.SignalServiceProtos.DataExtractionNotification value) { if (dataExtractionNotificationBuilder_ == null) { - if (((bitField0_ & 0x00000010) == 0x00000010) && + if (((bitField0_ & 0x00000020) == 0x00000020) && dataExtractionNotification_ != org.session.libsignal.protos.SignalServiceProtos.DataExtractionNotification.getDefaultInstance()) { dataExtractionNotification_ = org.session.libsignal.protos.SignalServiceProtos.DataExtractionNotification.newBuilder(dataExtractionNotification_).mergeFrom(value).buildPartial(); @@ -3714,7 +3918,7 @@ public final class SignalServiceProtos { } else { dataExtractionNotificationBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000010; + bitField0_ |= 0x00000020; return this; } /** @@ -3727,14 +3931,14 @@ public final class SignalServiceProtos { } else { dataExtractionNotificationBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000010); + bitField0_ = (bitField0_ & ~0x00000020); return this; } /** * optional .signalservice.DataExtractionNotification dataExtractionNotification = 8; */ public org.session.libsignal.protos.SignalServiceProtos.DataExtractionNotification.Builder getDataExtractionNotificationBuilder() { - bitField0_ |= 0x00000010; + bitField0_ |= 0x00000020; onChanged(); return getDataExtractionNotificationFieldBuilder().getBuilder(); } @@ -3773,7 +3977,7 @@ public final class SignalServiceProtos { * optional .signalservice.UnsendRequest unsendRequest = 9; */ public boolean hasUnsendRequest() { - return ((bitField0_ & 0x00000020) == 0x00000020); + return ((bitField0_ & 0x00000040) == 0x00000040); } /** * optional .signalservice.UnsendRequest unsendRequest = 9; @@ -3798,7 +4002,7 @@ public final class SignalServiceProtos { } else { unsendRequestBuilder_.setMessage(value); } - bitField0_ |= 0x00000020; + bitField0_ |= 0x00000040; return this; } /** @@ -3812,7 +4016,7 @@ public final class SignalServiceProtos { } else { unsendRequestBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000020; + bitField0_ |= 0x00000040; return this; } /** @@ -3820,7 +4024,7 @@ public final class SignalServiceProtos { */ public Builder mergeUnsendRequest(org.session.libsignal.protos.SignalServiceProtos.UnsendRequest value) { if (unsendRequestBuilder_ == null) { - if (((bitField0_ & 0x00000020) == 0x00000020) && + if (((bitField0_ & 0x00000040) == 0x00000040) && unsendRequest_ != org.session.libsignal.protos.SignalServiceProtos.UnsendRequest.getDefaultInstance()) { unsendRequest_ = org.session.libsignal.protos.SignalServiceProtos.UnsendRequest.newBuilder(unsendRequest_).mergeFrom(value).buildPartial(); @@ -3831,7 +4035,7 @@ public final class SignalServiceProtos { } else { unsendRequestBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000020; + bitField0_ |= 0x00000040; return this; } /** @@ -3844,14 +4048,14 @@ public final class SignalServiceProtos { } else { unsendRequestBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000020); + bitField0_ = (bitField0_ & ~0x00000040); return this; } /** * optional .signalservice.UnsendRequest unsendRequest = 9; */ public org.session.libsignal.protos.SignalServiceProtos.UnsendRequest.Builder getUnsendRequestBuilder() { - bitField0_ |= 0x00000020; + bitField0_ |= 0x00000040; onChanged(); return getUnsendRequestFieldBuilder().getBuilder(); } @@ -14636,6 +14840,1087 @@ public final class SignalServiceProtos { // @@protoc_insertion_point(class_scope:signalservice.DataMessage) } + public interface CallMessageOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // required .signalservice.CallMessage.Type type = 1; + /** + * required .signalservice.CallMessage.Type type = 1; + * + *
+     * @required
+     * 
+ */ + boolean hasType(); + /** + * required .signalservice.CallMessage.Type type = 1; + * + *
+     * @required
+     * 
+ */ + org.session.libsignal.protos.SignalServiceProtos.CallMessage.Type getType(); + + // repeated string sdps = 2; + /** + * repeated string sdps = 2; + */ + java.util.List + getSdpsList(); + /** + * repeated string sdps = 2; + */ + int getSdpsCount(); + /** + * repeated string sdps = 2; + */ + java.lang.String getSdps(int index); + /** + * repeated string sdps = 2; + */ + com.google.protobuf.ByteString + getSdpsBytes(int index); + + // repeated uint32 sdpMLineIndexes = 3; + /** + * repeated uint32 sdpMLineIndexes = 3; + */ + java.util.List getSdpMLineIndexesList(); + /** + * repeated uint32 sdpMLineIndexes = 3; + */ + int getSdpMLineIndexesCount(); + /** + * repeated uint32 sdpMLineIndexes = 3; + */ + int getSdpMLineIndexes(int index); + + // repeated string sdpMids = 4; + /** + * repeated string sdpMids = 4; + */ + java.util.List + getSdpMidsList(); + /** + * repeated string sdpMids = 4; + */ + int getSdpMidsCount(); + /** + * repeated string sdpMids = 4; + */ + java.lang.String getSdpMids(int index); + /** + * repeated string sdpMids = 4; + */ + com.google.protobuf.ByteString + getSdpMidsBytes(int index); + } + /** + * Protobuf type {@code signalservice.CallMessage} + */ + public static final class CallMessage extends + com.google.protobuf.GeneratedMessage + implements CallMessageOrBuilder { + // Use CallMessage.newBuilder() to construct. + private CallMessage(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private CallMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final CallMessage defaultInstance; + public static CallMessage getDefaultInstance() { + return defaultInstance; + } + + public CallMessage getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private CallMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + int rawValue = input.readEnum(); + org.session.libsignal.protos.SignalServiceProtos.CallMessage.Type value = org.session.libsignal.protos.SignalServiceProtos.CallMessage.Type.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(1, rawValue); + } else { + bitField0_ |= 0x00000001; + type_ = value; + } + break; + } + case 18: { + if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) { + sdps_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000002; + } + sdps_.add(input.readBytes()); + break; + } + case 24: { + if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) { + sdpMLineIndexes_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000004; + } + sdpMLineIndexes_.add(input.readUInt32()); + break; + } + case 26: { + int length = input.readRawVarint32(); + int limit = input.pushLimit(length); + if (!((mutable_bitField0_ & 0x00000004) == 0x00000004) && input.getBytesUntilLimit() > 0) { + sdpMLineIndexes_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000004; + } + while (input.getBytesUntilLimit() > 0) { + sdpMLineIndexes_.add(input.readUInt32()); + } + input.popLimit(limit); + break; + } + case 34: { + if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + sdpMids_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000008; + } + sdpMids_.add(input.readBytes()); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) { + sdps_ = new com.google.protobuf.UnmodifiableLazyStringList(sdps_); + } + if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) { + sdpMLineIndexes_ = java.util.Collections.unmodifiableList(sdpMLineIndexes_); + } + if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + sdpMids_ = new com.google.protobuf.UnmodifiableLazyStringList(sdpMids_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.protos.SignalServiceProtos.internal_static_signalservice_CallMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.protos.SignalServiceProtos.internal_static_signalservice_CallMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.protos.SignalServiceProtos.CallMessage.class, org.session.libsignal.protos.SignalServiceProtos.CallMessage.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public CallMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CallMessage(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + /** + * Protobuf enum {@code signalservice.CallMessage.Type} + */ + public enum Type + implements com.google.protobuf.ProtocolMessageEnum { + /** + * OFFER = 1; + */ + OFFER(0, 1), + /** + * ANSWER = 2; + */ + ANSWER(1, 2), + /** + * PROVISIONAL_ANSWER = 3; + */ + PROVISIONAL_ANSWER(2, 3), + /** + * ICE_CANDIDATES = 4; + */ + ICE_CANDIDATES(3, 4), + /** + * END_CALL = 5; + */ + END_CALL(4, 5), + ; + + /** + * OFFER = 1; + */ + public static final int OFFER_VALUE = 1; + /** + * ANSWER = 2; + */ + public static final int ANSWER_VALUE = 2; + /** + * PROVISIONAL_ANSWER = 3; + */ + public static final int PROVISIONAL_ANSWER_VALUE = 3; + /** + * ICE_CANDIDATES = 4; + */ + public static final int ICE_CANDIDATES_VALUE = 4; + /** + * END_CALL = 5; + */ + public static final int END_CALL_VALUE = 5; + + + public final int getNumber() { return value; } + + public static Type valueOf(int value) { + switch (value) { + case 1: return OFFER; + case 2: return ANSWER; + case 3: return PROVISIONAL_ANSWER; + case 4: return ICE_CANDIDATES; + case 5: return END_CALL; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static com.google.protobuf.Internal.EnumLiteMap + internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Type findValueByNumber(int number) { + return Type.valueOf(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(index); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return org.session.libsignal.protos.SignalServiceProtos.CallMessage.getDescriptor().getEnumTypes().get(0); + } + + private static final Type[] VALUES = values(); + + public static Type valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int index; + private final int value; + + private Type(int index, int value) { + this.index = index; + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:signalservice.CallMessage.Type) + } + + private int bitField0_; + // required .signalservice.CallMessage.Type type = 1; + public static final int TYPE_FIELD_NUMBER = 1; + private org.session.libsignal.protos.SignalServiceProtos.CallMessage.Type type_; + /** + * required .signalservice.CallMessage.Type type = 1; + * + *
+     * @required
+     * 
+ */ + public boolean hasType() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required .signalservice.CallMessage.Type type = 1; + * + *
+     * @required
+     * 
+ */ + public org.session.libsignal.protos.SignalServiceProtos.CallMessage.Type getType() { + return type_; + } + + // repeated string sdps = 2; + public static final int SDPS_FIELD_NUMBER = 2; + private com.google.protobuf.LazyStringList sdps_; + /** + * repeated string sdps = 2; + */ + public java.util.List + getSdpsList() { + return sdps_; + } + /** + * repeated string sdps = 2; + */ + public int getSdpsCount() { + return sdps_.size(); + } + /** + * repeated string sdps = 2; + */ + public java.lang.String getSdps(int index) { + return sdps_.get(index); + } + /** + * repeated string sdps = 2; + */ + public com.google.protobuf.ByteString + getSdpsBytes(int index) { + return sdps_.getByteString(index); + } + + // repeated uint32 sdpMLineIndexes = 3; + public static final int SDPMLINEINDEXES_FIELD_NUMBER = 3; + private java.util.List sdpMLineIndexes_; + /** + * repeated uint32 sdpMLineIndexes = 3; + */ + public java.util.List + getSdpMLineIndexesList() { + return sdpMLineIndexes_; + } + /** + * repeated uint32 sdpMLineIndexes = 3; + */ + public int getSdpMLineIndexesCount() { + return sdpMLineIndexes_.size(); + } + /** + * repeated uint32 sdpMLineIndexes = 3; + */ + public int getSdpMLineIndexes(int index) { + return sdpMLineIndexes_.get(index); + } + + // repeated string sdpMids = 4; + public static final int SDPMIDS_FIELD_NUMBER = 4; + private com.google.protobuf.LazyStringList sdpMids_; + /** + * repeated string sdpMids = 4; + */ + public java.util.List + getSdpMidsList() { + return sdpMids_; + } + /** + * repeated string sdpMids = 4; + */ + public int getSdpMidsCount() { + return sdpMids_.size(); + } + /** + * repeated string sdpMids = 4; + */ + public java.lang.String getSdpMids(int index) { + return sdpMids_.get(index); + } + /** + * repeated string sdpMids = 4; + */ + public com.google.protobuf.ByteString + getSdpMidsBytes(int index) { + return sdpMids_.getByteString(index); + } + + private void initFields() { + type_ = org.session.libsignal.protos.SignalServiceProtos.CallMessage.Type.OFFER; + sdps_ = com.google.protobuf.LazyStringArrayList.EMPTY; + sdpMLineIndexes_ = java.util.Collections.emptyList(); + sdpMids_ = com.google.protobuf.LazyStringArrayList.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + if (!hasType()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeEnum(1, type_.getNumber()); + } + for (int i = 0; i < sdps_.size(); i++) { + output.writeBytes(2, sdps_.getByteString(i)); + } + for (int i = 0; i < sdpMLineIndexes_.size(); i++) { + output.writeUInt32(3, sdpMLineIndexes_.get(i)); + } + for (int i = 0; i < sdpMids_.size(); i++) { + output.writeBytes(4, sdpMids_.getByteString(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, type_.getNumber()); + } + { + int dataSize = 0; + for (int i = 0; i < sdps_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream + .computeBytesSizeNoTag(sdps_.getByteString(i)); + } + size += dataSize; + size += 1 * getSdpsList().size(); + } + { + int dataSize = 0; + for (int i = 0; i < sdpMLineIndexes_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream + .computeUInt32SizeNoTag(sdpMLineIndexes_.get(i)); + } + size += dataSize; + size += 1 * getSdpMLineIndexesList().size(); + } + { + int dataSize = 0; + for (int i = 0; i < sdpMids_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream + .computeBytesSizeNoTag(sdpMids_.getByteString(i)); + } + size += dataSize; + size += 1 * getSdpMidsList().size(); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.protos.SignalServiceProtos.CallMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.protos.SignalServiceProtos.CallMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.protos.SignalServiceProtos.CallMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.protos.SignalServiceProtos.CallMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.protos.SignalServiceProtos.CallMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.protos.SignalServiceProtos.CallMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.protos.SignalServiceProtos.CallMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.protos.SignalServiceProtos.CallMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.protos.SignalServiceProtos.CallMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.protos.SignalServiceProtos.CallMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.protos.SignalServiceProtos.CallMessage prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.CallMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.protos.SignalServiceProtos.CallMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.protos.SignalServiceProtos.internal_static_signalservice_CallMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.protos.SignalServiceProtos.internal_static_signalservice_CallMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.protos.SignalServiceProtos.CallMessage.class, org.session.libsignal.protos.SignalServiceProtos.CallMessage.Builder.class); + } + + // Construct using org.session.libsignal.protos.SignalServiceProtos.CallMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + type_ = org.session.libsignal.protos.SignalServiceProtos.CallMessage.Type.OFFER; + bitField0_ = (bitField0_ & ~0x00000001); + sdps_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + sdpMLineIndexes_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + sdpMids_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.protos.SignalServiceProtos.internal_static_signalservice_CallMessage_descriptor; + } + + public org.session.libsignal.protos.SignalServiceProtos.CallMessage getDefaultInstanceForType() { + return org.session.libsignal.protos.SignalServiceProtos.CallMessage.getDefaultInstance(); + } + + public org.session.libsignal.protos.SignalServiceProtos.CallMessage build() { + org.session.libsignal.protos.SignalServiceProtos.CallMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.protos.SignalServiceProtos.CallMessage buildPartial() { + org.session.libsignal.protos.SignalServiceProtos.CallMessage result = new org.session.libsignal.protos.SignalServiceProtos.CallMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.type_ = type_; + if (((bitField0_ & 0x00000002) == 0x00000002)) { + sdps_ = new com.google.protobuf.UnmodifiableLazyStringList( + sdps_); + bitField0_ = (bitField0_ & ~0x00000002); + } + result.sdps_ = sdps_; + if (((bitField0_ & 0x00000004) == 0x00000004)) { + sdpMLineIndexes_ = java.util.Collections.unmodifiableList(sdpMLineIndexes_); + bitField0_ = (bitField0_ & ~0x00000004); + } + result.sdpMLineIndexes_ = sdpMLineIndexes_; + if (((bitField0_ & 0x00000008) == 0x00000008)) { + sdpMids_ = new com.google.protobuf.UnmodifiableLazyStringList( + sdpMids_); + bitField0_ = (bitField0_ & ~0x00000008); + } + result.sdpMids_ = sdpMids_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.protos.SignalServiceProtos.CallMessage) { + return mergeFrom((org.session.libsignal.protos.SignalServiceProtos.CallMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.protos.SignalServiceProtos.CallMessage other) { + if (other == org.session.libsignal.protos.SignalServiceProtos.CallMessage.getDefaultInstance()) return this; + if (other.hasType()) { + setType(other.getType()); + } + if (!other.sdps_.isEmpty()) { + if (sdps_.isEmpty()) { + sdps_ = other.sdps_; + bitField0_ = (bitField0_ & ~0x00000002); + } else { + ensureSdpsIsMutable(); + sdps_.addAll(other.sdps_); + } + onChanged(); + } + if (!other.sdpMLineIndexes_.isEmpty()) { + if (sdpMLineIndexes_.isEmpty()) { + sdpMLineIndexes_ = other.sdpMLineIndexes_; + bitField0_ = (bitField0_ & ~0x00000004); + } else { + ensureSdpMLineIndexesIsMutable(); + sdpMLineIndexes_.addAll(other.sdpMLineIndexes_); + } + onChanged(); + } + if (!other.sdpMids_.isEmpty()) { + if (sdpMids_.isEmpty()) { + sdpMids_ = other.sdpMids_; + bitField0_ = (bitField0_ & ~0x00000008); + } else { + ensureSdpMidsIsMutable(); + sdpMids_.addAll(other.sdpMids_); + } + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + if (!hasType()) { + + return false; + } + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.protos.SignalServiceProtos.CallMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.protos.SignalServiceProtos.CallMessage) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // required .signalservice.CallMessage.Type type = 1; + private org.session.libsignal.protos.SignalServiceProtos.CallMessage.Type type_ = org.session.libsignal.protos.SignalServiceProtos.CallMessage.Type.OFFER; + /** + * required .signalservice.CallMessage.Type type = 1; + * + *
+       * @required
+       * 
+ */ + public boolean hasType() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required .signalservice.CallMessage.Type type = 1; + * + *
+       * @required
+       * 
+ */ + public org.session.libsignal.protos.SignalServiceProtos.CallMessage.Type getType() { + return type_; + } + /** + * required .signalservice.CallMessage.Type type = 1; + * + *
+       * @required
+       * 
+ */ + public Builder setType(org.session.libsignal.protos.SignalServiceProtos.CallMessage.Type value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + type_ = value; + onChanged(); + return this; + } + /** + * required .signalservice.CallMessage.Type type = 1; + * + *
+       * @required
+       * 
+ */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000001); + type_ = org.session.libsignal.protos.SignalServiceProtos.CallMessage.Type.OFFER; + onChanged(); + return this; + } + + // repeated string sdps = 2; + private com.google.protobuf.LazyStringList sdps_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureSdpsIsMutable() { + if (!((bitField0_ & 0x00000002) == 0x00000002)) { + sdps_ = new com.google.protobuf.LazyStringArrayList(sdps_); + bitField0_ |= 0x00000002; + } + } + /** + * repeated string sdps = 2; + */ + public java.util.List + getSdpsList() { + return java.util.Collections.unmodifiableList(sdps_); + } + /** + * repeated string sdps = 2; + */ + public int getSdpsCount() { + return sdps_.size(); + } + /** + * repeated string sdps = 2; + */ + public java.lang.String getSdps(int index) { + return sdps_.get(index); + } + /** + * repeated string sdps = 2; + */ + public com.google.protobuf.ByteString + getSdpsBytes(int index) { + return sdps_.getByteString(index); + } + /** + * repeated string sdps = 2; + */ + public Builder setSdps( + int index, java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureSdpsIsMutable(); + sdps_.set(index, value); + onChanged(); + return this; + } + /** + * repeated string sdps = 2; + */ + public Builder addSdps( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureSdpsIsMutable(); + sdps_.add(value); + onChanged(); + return this; + } + /** + * repeated string sdps = 2; + */ + public Builder addAllSdps( + java.lang.Iterable values) { + ensureSdpsIsMutable(); + super.addAll(values, sdps_); + onChanged(); + return this; + } + /** + * repeated string sdps = 2; + */ + public Builder clearSdps() { + sdps_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + return this; + } + /** + * repeated string sdps = 2; + */ + public Builder addSdpsBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureSdpsIsMutable(); + sdps_.add(value); + onChanged(); + return this; + } + + // repeated uint32 sdpMLineIndexes = 3; + private java.util.List sdpMLineIndexes_ = java.util.Collections.emptyList(); + private void ensureSdpMLineIndexesIsMutable() { + if (!((bitField0_ & 0x00000004) == 0x00000004)) { + sdpMLineIndexes_ = new java.util.ArrayList(sdpMLineIndexes_); + bitField0_ |= 0x00000004; + } + } + /** + * repeated uint32 sdpMLineIndexes = 3; + */ + public java.util.List + getSdpMLineIndexesList() { + return java.util.Collections.unmodifiableList(sdpMLineIndexes_); + } + /** + * repeated uint32 sdpMLineIndexes = 3; + */ + public int getSdpMLineIndexesCount() { + return sdpMLineIndexes_.size(); + } + /** + * repeated uint32 sdpMLineIndexes = 3; + */ + public int getSdpMLineIndexes(int index) { + return sdpMLineIndexes_.get(index); + } + /** + * repeated uint32 sdpMLineIndexes = 3; + */ + public Builder setSdpMLineIndexes( + int index, int value) { + ensureSdpMLineIndexesIsMutable(); + sdpMLineIndexes_.set(index, value); + onChanged(); + return this; + } + /** + * repeated uint32 sdpMLineIndexes = 3; + */ + public Builder addSdpMLineIndexes(int value) { + ensureSdpMLineIndexesIsMutable(); + sdpMLineIndexes_.add(value); + onChanged(); + return this; + } + /** + * repeated uint32 sdpMLineIndexes = 3; + */ + public Builder addAllSdpMLineIndexes( + java.lang.Iterable values) { + ensureSdpMLineIndexesIsMutable(); + super.addAll(values, sdpMLineIndexes_); + onChanged(); + return this; + } + /** + * repeated uint32 sdpMLineIndexes = 3; + */ + public Builder clearSdpMLineIndexes() { + sdpMLineIndexes_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + return this; + } + + // repeated string sdpMids = 4; + private com.google.protobuf.LazyStringList sdpMids_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureSdpMidsIsMutable() { + if (!((bitField0_ & 0x00000008) == 0x00000008)) { + sdpMids_ = new com.google.protobuf.LazyStringArrayList(sdpMids_); + bitField0_ |= 0x00000008; + } + } + /** + * repeated string sdpMids = 4; + */ + public java.util.List + getSdpMidsList() { + return java.util.Collections.unmodifiableList(sdpMids_); + } + /** + * repeated string sdpMids = 4; + */ + public int getSdpMidsCount() { + return sdpMids_.size(); + } + /** + * repeated string sdpMids = 4; + */ + public java.lang.String getSdpMids(int index) { + return sdpMids_.get(index); + } + /** + * repeated string sdpMids = 4; + */ + public com.google.protobuf.ByteString + getSdpMidsBytes(int index) { + return sdpMids_.getByteString(index); + } + /** + * repeated string sdpMids = 4; + */ + public Builder setSdpMids( + int index, java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureSdpMidsIsMutable(); + sdpMids_.set(index, value); + onChanged(); + return this; + } + /** + * repeated string sdpMids = 4; + */ + public Builder addSdpMids( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureSdpMidsIsMutable(); + sdpMids_.add(value); + onChanged(); + return this; + } + /** + * repeated string sdpMids = 4; + */ + public Builder addAllSdpMids( + java.lang.Iterable values) { + ensureSdpMidsIsMutable(); + super.addAll(values, sdpMids_); + onChanged(); + return this; + } + /** + * repeated string sdpMids = 4; + */ + public Builder clearSdpMids() { + sdpMids_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + return this; + } + /** + * repeated string sdpMids = 4; + */ + public Builder addSdpMidsBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureSdpMidsIsMutable(); + sdpMids_.add(value); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.CallMessage) + } + + static { + defaultInstance = new CallMessage(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.CallMessage) + } + public interface ConfigurationMessageOrBuilder extends com.google.protobuf.MessageOrBuilder { @@ -22166,6 +23451,11 @@ public final class SignalServiceProtos { private static com.google.protobuf.GeneratedMessage.FieldAccessorTable internal_static_signalservice_DataMessage_ClosedGroupControlMessage_KeyPairWrapper_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_CallMessage_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_CallMessage_fieldAccessorTable; private static com.google.protobuf.Descriptors.Descriptor internal_static_signalservice_ConfigurationMessage_descriptor; private static @@ -22215,89 +23505,96 @@ public final class SignalServiceProtos { "\002(\004\0223\n\006action\030\002 \002(\0162#.signalservice.Typi" + "ngMessage.Action\"\"\n\006Action\022\013\n\007STARTED\020\000\022" + "\013\n\007STOPPED\020\001\"2\n\rUnsendRequest\022\021\n\ttimesta", - "mp\030\001 \002(\004\022\016\n\006author\030\002 \002(\t\"\355\002\n\007Content\022/\n\013" + + "mp\030\001 \002(\004\022\016\n\006author\030\002 \002(\t\"\236\003\n\007Content\022/\n\013" + "dataMessage\030\001 \001(\0132\032.signalservice.DataMe" + - "ssage\0225\n\016receiptMessage\030\005 \001(\0132\035.signalse" + - "rvice.ReceiptMessage\0223\n\rtypingMessage\030\006 " + - "\001(\0132\034.signalservice.TypingMessage\022A\n\024con" + - "figurationMessage\030\007 \001(\0132#.signalservice." + - "ConfigurationMessage\022M\n\032dataExtractionNo" + - "tification\030\010 \001(\0132).signalservice.DataExt" + - "ractionNotification\0223\n\runsendRequest\030\t \001" + - "(\0132\034.signalservice.UnsendRequest\"0\n\007KeyP", - "air\022\021\n\tpublicKey\030\001 \002(\014\022\022\n\nprivateKey\030\002 \002" + - "(\014\"\226\001\n\032DataExtractionNotification\022<\n\004typ" + - "e\030\001 \002(\0162..signalservice.DataExtractionNo" + - "tification.Type\022\021\n\ttimestamp\030\002 \001(\004\"\'\n\004Ty" + - "pe\022\016\n\nSCREENSHOT\020\001\022\017\n\013MEDIA_SAVED\020\002\"\245\014\n\013" + - "DataMessage\022\014\n\004body\030\001 \001(\t\0225\n\013attachments" + - "\030\002 \003(\0132 .signalservice.AttachmentPointer" + - "\022*\n\005group\030\003 \001(\0132\033.signalservice.GroupCon" + - "text\022\r\n\005flags\030\004 \001(\r\022\023\n\013expireTimer\030\005 \001(\r" + - "\022\022\n\nprofileKey\030\006 \001(\014\022\021\n\ttimestamp\030\007 \001(\004\022", - "/\n\005quote\030\010 \001(\0132 .signalservice.DataMessa" + - "ge.Quote\0223\n\007preview\030\n \003(\0132\".signalservic" + - "e.DataMessage.Preview\0227\n\007profile\030e \001(\0132&" + - ".signalservice.DataMessage.LokiProfile\022K" + - "\n\023openGroupInvitation\030f \001(\0132..signalserv" + - "ice.DataMessage.OpenGroupInvitation\022W\n\031c" + - "losedGroupControlMessage\030h \001(\01324.signals" + - "ervice.DataMessage.ClosedGroupControlMes" + - "sage\022\022\n\nsyncTarget\030i \001(\t\032\225\002\n\005Quote\022\n\n\002id" + - "\030\001 \002(\004\022\016\n\006author\030\002 \002(\t\022\014\n\004text\030\003 \001(\t\022F\n\013", - "attachments\030\004 \003(\01321.signalservice.DataMe" + - "ssage.Quote.QuotedAttachment\032\231\001\n\020QuotedA" + - "ttachment\022\023\n\013contentType\030\001 \001(\t\022\020\n\010fileNa" + - "me\030\002 \001(\t\0223\n\tthumbnail\030\003 \001(\0132 .signalserv" + - "ice.AttachmentPointer\022\r\n\005flags\030\004 \001(\r\"\032\n\005" + - "Flags\022\021\n\rVOICE_MESSAGE\020\001\032V\n\007Preview\022\013\n\003u" + - "rl\030\001 \002(\t\022\r\n\005title\030\002 \001(\t\022/\n\005image\030\003 \001(\0132 " + - ".signalservice.AttachmentPointer\032:\n\013Loki" + - "Profile\022\023\n\013displayName\030\001 \001(\t\022\026\n\016profileP" + - "icture\030\002 \001(\t\0320\n\023OpenGroupInvitation\022\013\n\003u", - "rl\030\001 \002(\t\022\014\n\004name\030\003 \002(\t\032\374\003\n\031ClosedGroupCo" + - "ntrolMessage\022G\n\004type\030\001 \002(\01629.signalservi" + - "ce.DataMessage.ClosedGroupControlMessage" + - ".Type\022\021\n\tpublicKey\030\002 \001(\014\022\014\n\004name\030\003 \001(\t\0221" + - "\n\021encryptionKeyPair\030\004 \001(\0132\026.signalservic" + - "e.KeyPair\022\017\n\007members\030\005 \003(\014\022\016\n\006admins\030\006 \003" + - "(\014\022U\n\010wrappers\030\007 \003(\0132C.signalservice.Dat" + - "aMessage.ClosedGroupControlMessage.KeyPa" + - "irWrapper\022\027\n\017expirationTimer\030\010 \001(\r\032=\n\016Ke" + - "yPairWrapper\022\021\n\tpublicKey\030\001 \002(\014\022\030\n\020encry", - "ptedKeyPair\030\002 \002(\014\"r\n\004Type\022\007\n\003NEW\020\001\022\027\n\023EN" + - "CRYPTION_KEY_PAIR\020\003\022\017\n\013NAME_CHANGE\020\004\022\021\n\r" + - "MEMBERS_ADDED\020\005\022\023\n\017MEMBERS_REMOVED\020\006\022\017\n\013" + - "MEMBER_LEFT\020\007\"$\n\005Flags\022\033\n\027EXPIRATION_TIM" + - "ER_UPDATE\020\002\"\347\003\n\024ConfigurationMessage\022E\n\014" + - "closedGroups\030\001 \003(\0132/.signalservice.Confi" + - "gurationMessage.ClosedGroup\022\022\n\nopenGroup" + - "s\030\002 \003(\t\022\023\n\013displayName\030\003 \001(\t\022\026\n\016profileP" + - "icture\030\004 \001(\t\022\022\n\nprofileKey\030\005 \001(\014\022=\n\010cont" + - "acts\030\006 \003(\0132+.signalservice.Configuration", - "Message.Contact\032\233\001\n\013ClosedGroup\022\021\n\tpubli" + - "cKey\030\001 \001(\014\022\014\n\004name\030\002 \001(\t\0221\n\021encryptionKe" + - "yPair\030\003 \001(\0132\026.signalservice.KeyPair\022\017\n\007m" + - "embers\030\004 \003(\014\022\016\n\006admins\030\005 \003(\014\022\027\n\017expirati" + - "onTimer\030\006 \001(\r\032V\n\007Contact\022\021\n\tpublicKey\030\001 " + - "\002(\014\022\014\n\004name\030\002 \002(\t\022\026\n\016profilePicture\030\003 \001(" + - "\t\022\022\n\nprofileKey\030\004 \001(\014\"u\n\016ReceiptMessage\022" + - "0\n\004type\030\001 \002(\0162\".signalservice.ReceiptMes" + - "sage.Type\022\021\n\ttimestamp\030\002 \003(\004\"\036\n\004Type\022\014\n\010" + - "DELIVERY\020\000\022\010\n\004READ\020\001\"\354\001\n\021AttachmentPoint", - "er\022\n\n\002id\030\001 \002(\006\022\023\n\013contentType\030\002 \001(\t\022\013\n\003k" + - "ey\030\003 \001(\014\022\014\n\004size\030\004 \001(\r\022\021\n\tthumbnail\030\005 \001(" + - "\014\022\016\n\006digest\030\006 \001(\014\022\020\n\010fileName\030\007 \001(\t\022\r\n\005f" + - "lags\030\010 \001(\r\022\r\n\005width\030\t \001(\r\022\016\n\006height\030\n \001(" + - "\r\022\017\n\007caption\030\013 \001(\t\022\013\n\003url\030e \001(\t\"\032\n\005Flags" + - "\022\021\n\rVOICE_MESSAGE\020\001\"\365\001\n\014GroupContext\022\n\n\002" + - "id\030\001 \001(\014\022.\n\004type\030\002 \001(\0162 .signalservice.G" + - "roupContext.Type\022\014\n\004name\030\003 \001(\t\022\017\n\007member" + - "s\030\004 \003(\t\0220\n\006avatar\030\005 \001(\0132 .signalservice." + - "AttachmentPointer\022\016\n\006admins\030\006 \003(\t\"H\n\004Typ", - "e\022\013\n\007UNKNOWN\020\000\022\n\n\006UPDATE\020\001\022\013\n\007DELIVER\020\002\022" + - "\010\n\004QUIT\020\003\022\020\n\014REQUEST_INFO\020\004B3\n\034org.sessi" + - "on.libsignal.protosB\023SignalServiceProtos" + "ssage\022/\n\013callMessage\030\003 \001(\0132\032.signalservi" + + "ce.CallMessage\0225\n\016receiptMessage\030\005 \001(\0132\035" + + ".signalservice.ReceiptMessage\0223\n\rtypingM" + + "essage\030\006 \001(\0132\034.signalservice.TypingMessa" + + "ge\022A\n\024configurationMessage\030\007 \001(\0132#.signa" + + "lservice.ConfigurationMessage\022M\n\032dataExt" + + "ractionNotification\030\010 \001(\0132).signalservic" + + "e.DataExtractionNotification\0223\n\runsendRe", + "quest\030\t \001(\0132\034.signalservice.UnsendReques" + + "t\"0\n\007KeyPair\022\021\n\tpublicKey\030\001 \002(\014\022\022\n\npriva" + + "teKey\030\002 \002(\014\"\226\001\n\032DataExtractionNotificati" + + "on\022<\n\004type\030\001 \002(\0162..signalservice.DataExt" + + "ractionNotification.Type\022\021\n\ttimestamp\030\002 " + + "\001(\004\"\'\n\004Type\022\016\n\nSCREENSHOT\020\001\022\017\n\013MEDIA_SAV" + + "ED\020\002\"\245\014\n\013DataMessage\022\014\n\004body\030\001 \001(\t\0225\n\013at" + + "tachments\030\002 \003(\0132 .signalservice.Attachme" + + "ntPointer\022*\n\005group\030\003 \001(\0132\033.signalservice" + + ".GroupContext\022\r\n\005flags\030\004 \001(\r\022\023\n\013expireTi", + "mer\030\005 \001(\r\022\022\n\nprofileKey\030\006 \001(\014\022\021\n\ttimesta" + + "mp\030\007 \001(\004\022/\n\005quote\030\010 \001(\0132 .signalservice." + + "DataMessage.Quote\0223\n\007preview\030\n \003(\0132\".sig" + + "nalservice.DataMessage.Preview\0227\n\007profil" + + "e\030e \001(\0132&.signalservice.DataMessage.Loki" + + "Profile\022K\n\023openGroupInvitation\030f \001(\0132..s" + + "ignalservice.DataMessage.OpenGroupInvita" + + "tion\022W\n\031closedGroupControlMessage\030h \001(\0132" + + "4.signalservice.DataMessage.ClosedGroupC" + + "ontrolMessage\022\022\n\nsyncTarget\030i \001(\t\032\225\002\n\005Qu", + "ote\022\n\n\002id\030\001 \002(\004\022\016\n\006author\030\002 \002(\t\022\014\n\004text\030" + + "\003 \001(\t\022F\n\013attachments\030\004 \003(\01321.signalservi" + + "ce.DataMessage.Quote.QuotedAttachment\032\231\001" + + "\n\020QuotedAttachment\022\023\n\013contentType\030\001 \001(\t\022" + + "\020\n\010fileName\030\002 \001(\t\0223\n\tthumbnail\030\003 \001(\0132 .s" + + "ignalservice.AttachmentPointer\022\r\n\005flags\030" + + "\004 \001(\r\"\032\n\005Flags\022\021\n\rVOICE_MESSAGE\020\001\032V\n\007Pre" + + "view\022\013\n\003url\030\001 \002(\t\022\r\n\005title\030\002 \001(\t\022/\n\005imag" + + "e\030\003 \001(\0132 .signalservice.AttachmentPointe" + + "r\032:\n\013LokiProfile\022\023\n\013displayName\030\001 \001(\t\022\026\n", + "\016profilePicture\030\002 \001(\t\0320\n\023OpenGroupInvita" + + "tion\022\013\n\003url\030\001 \002(\t\022\014\n\004name\030\003 \002(\t\032\374\003\n\031Clos" + + "edGroupControlMessage\022G\n\004type\030\001 \002(\01629.si" + + "gnalservice.DataMessage.ClosedGroupContr" + + "olMessage.Type\022\021\n\tpublicKey\030\002 \001(\014\022\014\n\004nam" + + "e\030\003 \001(\t\0221\n\021encryptionKeyPair\030\004 \001(\0132\026.sig" + + "nalservice.KeyPair\022\017\n\007members\030\005 \003(\014\022\016\n\006a" + + "dmins\030\006 \003(\014\022U\n\010wrappers\030\007 \003(\0132C.signalse" + + "rvice.DataMessage.ClosedGroupControlMess" + + "age.KeyPairWrapper\022\027\n\017expirationTimer\030\010 ", + "\001(\r\032=\n\016KeyPairWrapper\022\021\n\tpublicKey\030\001 \002(\014" + + "\022\030\n\020encryptedKeyPair\030\002 \002(\014\"r\n\004Type\022\007\n\003NE" + + "W\020\001\022\027\n\023ENCRYPTION_KEY_PAIR\020\003\022\017\n\013NAME_CHA" + + "NGE\020\004\022\021\n\rMEMBERS_ADDED\020\005\022\023\n\017MEMBERS_REMO" + + "VED\020\006\022\017\n\013MEMBER_LEFT\020\007\"$\n\005Flags\022\033\n\027EXPIR" + + "ATION_TIMER_UPDATE\020\002\"\315\001\n\013CallMessage\022-\n\004" + + "type\030\001 \002(\0162\037.signalservice.CallMessage.T" + + "ype\022\014\n\004sdps\030\002 \003(\t\022\027\n\017sdpMLineIndexes\030\003 \003" + + "(\r\022\017\n\007sdpMids\030\004 \003(\t\"W\n\004Type\022\t\n\005OFFER\020\001\022\n" + + "\n\006ANSWER\020\002\022\026\n\022PROVISIONAL_ANSWER\020\003\022\022\n\016IC", + "E_CANDIDATES\020\004\022\014\n\010END_CALL\020\005\"\347\003\n\024Configu" + + "rationMessage\022E\n\014closedGroups\030\001 \003(\0132/.si" + + "gnalservice.ConfigurationMessage.ClosedG" + + "roup\022\022\n\nopenGroups\030\002 \003(\t\022\023\n\013displayName\030" + + "\003 \001(\t\022\026\n\016profilePicture\030\004 \001(\t\022\022\n\nprofile" + + "Key\030\005 \001(\014\022=\n\010contacts\030\006 \003(\0132+.signalserv" + + "ice.ConfigurationMessage.Contact\032\233\001\n\013Clo" + + "sedGroup\022\021\n\tpublicKey\030\001 \001(\014\022\014\n\004name\030\002 \001(" + + "\t\0221\n\021encryptionKeyPair\030\003 \001(\0132\026.signalser" + + "vice.KeyPair\022\017\n\007members\030\004 \003(\014\022\016\n\006admins\030", + "\005 \003(\014\022\027\n\017expirationTimer\030\006 \001(\r\032V\n\007Contac" + + "t\022\021\n\tpublicKey\030\001 \002(\014\022\014\n\004name\030\002 \002(\t\022\026\n\016pr" + + "ofilePicture\030\003 \001(\t\022\022\n\nprofileKey\030\004 \001(\014\"u" + + "\n\016ReceiptMessage\0220\n\004type\030\001 \002(\0162\".signals" + + "ervice.ReceiptMessage.Type\022\021\n\ttimestamp\030" + + "\002 \003(\004\"\036\n\004Type\022\014\n\010DELIVERY\020\000\022\010\n\004READ\020\001\"\354\001" + + "\n\021AttachmentPointer\022\n\n\002id\030\001 \002(\006\022\023\n\013conte" + + "ntType\030\002 \001(\t\022\013\n\003key\030\003 \001(\014\022\014\n\004size\030\004 \001(\r\022" + + "\021\n\tthumbnail\030\005 \001(\014\022\016\n\006digest\030\006 \001(\014\022\020\n\010fi" + + "leName\030\007 \001(\t\022\r\n\005flags\030\010 \001(\r\022\r\n\005width\030\t \001", + "(\r\022\016\n\006height\030\n \001(\r\022\017\n\007caption\030\013 \001(\t\022\013\n\003u" + + "rl\030e \001(\t\"\032\n\005Flags\022\021\n\rVOICE_MESSAGE\020\001\"\365\001\n" + + "\014GroupContext\022\n\n\002id\030\001 \001(\014\022.\n\004type\030\002 \001(\0162" + + " .signalservice.GroupContext.Type\022\014\n\004nam" + + "e\030\003 \001(\t\022\017\n\007members\030\004 \003(\t\0220\n\006avatar\030\005 \001(\013" + + "2 .signalservice.AttachmentPointer\022\016\n\006ad" + + "mins\030\006 \003(\t\"H\n\004Type\022\013\n\007UNKNOWN\020\000\022\n\n\006UPDAT" + + "E\020\001\022\013\n\007DELIVER\020\002\022\010\n\004QUIT\020\003\022\020\n\014REQUEST_IN" + + "FO\020\004B3\n\034org.session.libsignal.protosB\023Si" + + "gnalServiceProtos" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { @@ -22327,7 +23624,7 @@ public final class SignalServiceProtos { internal_static_signalservice_Content_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_signalservice_Content_descriptor, - new java.lang.String[] { "DataMessage", "ReceiptMessage", "TypingMessage", "ConfigurationMessage", "DataExtractionNotification", "UnsendRequest", }); + new java.lang.String[] { "DataMessage", "CallMessage", "ReceiptMessage", "TypingMessage", "ConfigurationMessage", "DataExtractionNotification", "UnsendRequest", }); internal_static_signalservice_KeyPair_descriptor = getDescriptor().getMessageTypes().get(4); internal_static_signalservice_KeyPair_fieldAccessorTable = new @@ -22388,8 +23685,14 @@ public final class SignalServiceProtos { com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_signalservice_DataMessage_ClosedGroupControlMessage_KeyPairWrapper_descriptor, new java.lang.String[] { "PublicKey", "EncryptedKeyPair", }); - internal_static_signalservice_ConfigurationMessage_descriptor = + internal_static_signalservice_CallMessage_descriptor = getDescriptor().getMessageTypes().get(7); + internal_static_signalservice_CallMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_CallMessage_descriptor, + new java.lang.String[] { "Type", "Sdps", "SdpMLineIndexes", "SdpMids", }); + internal_static_signalservice_ConfigurationMessage_descriptor = + getDescriptor().getMessageTypes().get(8); internal_static_signalservice_ConfigurationMessage_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_signalservice_ConfigurationMessage_descriptor, @@ -22407,19 +23710,19 @@ public final class SignalServiceProtos { internal_static_signalservice_ConfigurationMessage_Contact_descriptor, new java.lang.String[] { "PublicKey", "Name", "ProfilePicture", "ProfileKey", }); internal_static_signalservice_ReceiptMessage_descriptor = - getDescriptor().getMessageTypes().get(8); + getDescriptor().getMessageTypes().get(9); internal_static_signalservice_ReceiptMessage_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_signalservice_ReceiptMessage_descriptor, new java.lang.String[] { "Type", "Timestamp", }); internal_static_signalservice_AttachmentPointer_descriptor = - getDescriptor().getMessageTypes().get(9); + getDescriptor().getMessageTypes().get(10); internal_static_signalservice_AttachmentPointer_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_signalservice_AttachmentPointer_descriptor, new java.lang.String[] { "Id", "ContentType", "Key", "Size", "Thumbnail", "Digest", "FileName", "Flags", "Width", "Height", "Caption", "Url", }); internal_static_signalservice_GroupContext_descriptor = - getDescriptor().getMessageTypes().get(10); + getDescriptor().getMessageTypes().get(11); internal_static_signalservice_GroupContext_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_signalservice_GroupContext_descriptor,