feat: added basic call functionality

This commit is contained in:
Harris
2021-08-30 16:39:47 +10:00
parent 5ea37254b9
commit 9e5e137919
14 changed files with 1775 additions and 240 deletions

View File

@@ -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<String> = listOf()
var sdpMLineIndexes: List<Int> = listOf()
var sdpMids: List<String> = listOf()
override val isSelfSendValid: Boolean = false
override fun isValid(): Boolean = super.isValid() && type != null && !sdps.isNullOrEmpty()
constructor(type: SignalServiceProtos.CallMessage.Type,
sdps: List<String>,
sdpMLineIndexes: List<Int>,
sdpMids: List<String>) : 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()
}
}

View File

@@ -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

View File

@@ -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!!)

View File

@@ -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<CallMessage>(Channel.UNLIMITED)
}