srctree

Robin Linden parent d04e3436 b1f9a118
Support toggling speakerphone during calls

inlinesplit
atox/src/main/kotlin/ui/call/CallFragment.kt added: 54, removed: 9, total 45
@@ -80,6 +80,12 @@ class CallFragment : BaseFragment<FragmentCallBinding>(FragmentCallBinding::infl
}
}
 
updateSpeakerphoneIcon()
speakerphone.setOnClickListener {
vm.speakerphoneOn = !vm.speakerphoneOn
updateSpeakerphoneIcon()
}
 
backToChat.setOnClickListener {
findNavController().popBackStack()
}
@@ -100,6 +106,11 @@ class CallFragment : BaseFragment<FragmentCallBinding>(FragmentCallBinding::infl
}
}
 
private fun updateSpeakerphoneIcon() {
val icon = if (vm.speakerphoneOn) R.drawable.ic_speakerphone else R.drawable.ic_speakerphone_off
binding.speakerphone.setImageResource(icon)
}
 
private fun startCall() {
vm.startCall()
vm.inCall.asLiveData().observe(viewLifecycleOwner) { inCall ->
 
atox/src/main/kotlin/ui/call/CallViewModel.kt added: 54, removed: 9, total 45
@@ -48,4 +48,6 @@ class CallViewModel @Inject constructor(
 
val inCall = callManager.inCall
val sendingAudio = callManager.sendingAudio
 
var speakerphoneOn by callManager::speakerphoneOn
}
 
filename was Deleted added: 54, removed: 9, total 45
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M3,9v6h4l5,5L12,4L7,9L3,9zM16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM14,3.23v2.06c2.89,0.86 5,3.54 5,6.71s-2.11,5.85 -5,6.71v2.06c4.01,-0.91 7,-4.49 7,-8.77s-2.99,-7.86 -7,-8.77z"/>
</vector>
 
filename was Deleted added: 54, removed: 9, total 45
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v2.21l2.45,2.45c0.03,-0.2 0.05,-0.41 0.05,-0.63zM19,12c0,0.94 -0.2,1.82 -0.54,2.64l1.51,1.51C20.63,14.91 21,13.5 21,12c0,-4.28 -2.99,-7.86 -7,-8.77v2.06c2.89,0.86 5,3.54 5,6.71zM4.27,3L3,4.27 7.73,9L3,9v6h4l5,5v-6.73l4.25,4.25c-0.67,0.52 -1.42,0.93 -2.25,1.18v2.06c1.38,-0.31 2.63,-0.95 3.69,-1.81L19.73,21 21,19.73l-9,-9L4.27,3zM12,4L9.91,6.09 12,8.18L12,4z"/>
</vector>
 
atox/src/main/res/layout/fragment_call.xml added: 54, removed: 9, total 45
@@ -23,13 +23,22 @@
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_alignParentStart="true"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_margin="16dp"
android:background="@null"
android:contentDescription="@string/microphone_control"
android:scaleType="fitCenter"
android:src="@drawable/ic_mic"/>
 
<ImageButton android:id="@+id/speakerphone"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_margin="16dp"
android:layout_toEndOf="@id/microphone_control"
android:background="@null"
android:contentDescription="@string/speakerphone_toggle"
android:scaleType="fitCenter"
android:src="@drawable/ic_speakerphone"/>
 
<com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/end_call"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
 
atox/src/main/res/values/strings.xml added: 54, removed: 9, total 45
@@ -176,4 +176,5 @@
<string name="pref_block_screenshots">Block screenshots of aTox</string>
<string name="pref_block_screenshots_description">This **only** blocks screenshots on **your** device, and provides no protection against your contacts taking screenshots or otherwise saving your conversations</string>
<string name="return_to_chat">Return to chat</string>
<string name="speakerphone_toggle">Toggle speakerphone</string>
</resources>
No newline at end of file
 
domain/src/main/kotlin/feature/CallManager.kt added: 54, removed: 9, total 45
@@ -85,6 +85,10 @@ class CallManager @Inject constructor(
_sendingAudio.value = false
}
 
var speakerphoneOn: Boolean
get() = audioManager?.isSpeakerphoneOn ?: false
set(value) { audioManager?.isSpeakerphoneOn = value }
 
private fun startAudioSender(recorder: AudioCapture, to: PublicKey) {
launch {
recorder.start()