feat: adding call service functionality and permissions for calls

This commit is contained in:
Harris
2021-10-25 18:18:47 +11:00
parent 0d62057de3
commit 40cca532c2
7 changed files with 46 additions and 24 deletions

View File

@@ -52,8 +52,9 @@
<uses-permission android:name="android.permission.RAISED_THREAD_PRIORITY" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.BLUETOOTH" tools:node="remove"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" tools:node="remove"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.CALL_PHONE" />
<queries>
<intent>

View File

@@ -42,9 +42,6 @@ class WebRtcTestsActivity: PassphraseRequiredActionBarActivity(), PeerConnection
const val EXTRA_SDP = "WebRtcTestsActivity_EXTRA_SDP"
const val EXTRA_ADDRESS = "WebRtcTestsActivity_EXTRA_ADDRESS"
const val EXTRA_CALL_ID = "WebRtcTestsActivity_EXTRA_CALL_ID"
const val EXTRA_RELAY_USED = "WebRtcTestsActivity_EXTRA_RELAY_USED"
const val EXTRA_SDP_MLINE_INDEXES = "WebRtcTestsActivity_EXTRA_SDP_MLINE_INDEXES"
const val EXTRA_SDP_MIDS = "WebRtcTestsActivity_EXTRA_SDP_MIDS"
}
@@ -92,16 +89,12 @@ class WebRtcTestsActivity: PassphraseRequiredActionBarActivity(), PeerConnection
private lateinit var callAddress: Address
private lateinit var callId: UUID
private var relayUsed: Boolean = true
private val peerConnection by lazy {
// TODO: in a lokinet world, ice servers shouldn't be needed as .loki addresses should suffice to p2p
val turn = PeerConnection.IceServer.builder("turn:freyr.getsession.org:5349").setUsername("webrtc").setPassword("webrtc").createIceServer()
// val stun = PeerConnection.IceServer.builder("stun:freyr.getsession.org").createIceServer()
val iceServers = mutableListOf(turn)
if (relayUsed) {
// add relay server
}
val rtcConfig = PeerConnection.RTCConfiguration(iceServers).apply {
this.tcpCandidatePolicy = PeerConnection.TcpCandidatePolicy.ENABLED
this.candidateNetworkPolicy = PeerConnection.CandidateNetworkPolicy.ALL
@@ -127,8 +120,6 @@ class WebRtcTestsActivity: PassphraseRequiredActionBarActivity(), PeerConnection
super.onCreate(savedInstanceState, ready)
setContentView(R.layout.activity_webrtc_tests)
relayUsed = intent.getBooleanExtra(EXTRA_RELAY_USED, true)
//TODO: better handling of permissions
Permissions.with(this)
.request(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO)

View File

@@ -190,14 +190,12 @@ object ConversationMenuHelper {
val intent = Intent(context, WebRtcTestsActivity::class.java)
intent.putExtra(WebRtcTestsActivity.EXTRA_CALL_ID, UUID.randomUUID().toString())
intent.putExtra(WebRtcTestsActivity.EXTRA_ADDRESS, thread.address)
intent.putExtra(WebRtcTestsActivity.EXTRA_RELAY_USED, false)
val activity = context as AppCompatActivity
activity.startActivity(intent)
}
.setNeutralButton("P2P only") { d, w ->
val intent = Intent(context, WebRtcTestsActivity::class.java)
intent.putExtra(WebRtcTestsActivity.EXTRA_ADDRESS, thread.address)
intent.putExtra(WebRtcTestsActivity.EXTRA_RELAY_USED, false)
val activity = context as AppCompatActivity
activity.startActivity(intent)
}

View File

@@ -1,9 +1,14 @@
package org.thoughtcrime.securesms.service
import android.app.Service
import android.content.Context
import android.content.Intent
import android.os.IBinder
import androidx.core.content.ContextCompat
import dagger.hilt.android.AndroidEntryPoint
import java.util.*
@AndroidEntryPoint
class WebRtcCallService: Service() {
companion object {
@@ -17,8 +22,38 @@ class WebRtcCallService: Service() {
private const val EXTRA_UPDATE_TYPE = "UPDATE_TYPE"
private const val EXTRA_RECIPIENT_ID = "RECIPIENT_ID"
private const val EXTRA_ENABLED = "ENABLED"
private const val EXTRA_AUDIO_COMMAND = "AUDIO_COMMAND"
private const val INVALID_NOTIFICATION_ID = -1
fun update(context: Context, type: Int, callId: UUID) {
val intent = Intent(context, WebRtcCallService::class.java)
intent.setAction(ACTION_UPDATE)
.putExtra(EXTRA_RECIPIENT_ID, callId)
.putExtra(EXTRA_UPDATE_TYPE, type)
ContextCompat.startForegroundService(context, intent)
}
fun stop(context: Context) {
val intent = Intent(context, WebRtcCallService::class.java)
intent.action = ACTION_STOP
ContextCompat.startForegroundService(context, intent)
}
fun denyCallIntent(context: Context): Intent {
return Intent(context, WebRtcCallService::class.java).setAction(ACTION_DENY_CALL)
}
fun hangupIntent(context: Context): Intent {
return Intent(context, WebRtcCallService::class.java).setAction(ACTION_LOCAL_HANGUP)
}
fun sendAudioManagerCommand(context: Context, command: AudioManagerCommand) {
}
}
override fun onBind(intent: Intent?): IBinder? = null

View File

@@ -0,0 +1,9 @@
package org.thoughtcrime.securesms.webrtc
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
@Parcelize
enum class AudioManagerCommand: Parcelable {
}

View File

@@ -57,7 +57,6 @@ class CallBottomSheet: BottomSheetDialogFragment() {
val intent = Intent(requireContext(), WebRtcTestsActivity::class.java)
val bundle = bundleOf(
WebRtcTestsActivity.EXTRA_ADDRESS to address,
WebRtcTestsActivity.EXTRA_RELAY_USED to relaySwitch.isChecked,
WebRtcTestsActivity.EXTRA_CALL_ID to callId
)
intent.action = WebRtcTestsActivity.ACTION_ANSWER

View File

@@ -40,17 +40,6 @@
</RelativeLayout>
<TextView
android:layout_marginTop="@dimen/large_spacing"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Use relay in ICE"/>
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/relaySwitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<LinearLayout
android:layout_marginTop="@dimen/medium_spacing"
android:paddingVertical="@dimen/medium_spacing"