srctree

Robin Linden parent b893d302 4138650d
Handle the remote ending the call

inlinesplit
atox/src/main/kotlin/tox/EventListenerCallbacks.kt added: 38, removed: 18, total 20
@@ -28,6 +28,7 @@ import ltd.evilcorp.core.vo.FriendRequest
import ltd.evilcorp.core.vo.Message
import ltd.evilcorp.core.vo.Sender
import ltd.evilcorp.domain.av.AudioPlayer
import ltd.evilcorp.domain.feature.CallManager
import ltd.evilcorp.domain.feature.ChatManager
import ltd.evilcorp.domain.feature.FileTransferManager
import ltd.evilcorp.domain.tox.PublicKey
@@ -52,6 +53,7 @@ class EventListenerCallbacks @Inject constructor(
private val friendRequestRepository: FriendRequestRepository,
private val messageRepository: MessageRepository,
private val userRepository: UserRepository,
private val callManager: CallManager,
private val chatManager: ChatManager,
private val fileTransferManager: FileTransferManager,
private val notificationHelper: NotificationHelper,
@@ -172,6 +174,8 @@ class EventListenerCallbacks @Inject constructor(
if (callState.contains(ToxavFriendCallState.FINISHED) || callState.contains(ToxavFriendCallState.ERROR)) {
audioPlayer?.stop()
audioPlayer = null
notificationHelper.dismissCallNotification(contactByPublicKey(pk))
callManager.endCall(PublicKey(pk))
}
}
 
 
atox/src/main/kotlin/ui/call/CallFragment.kt added: 38, removed: 18, total 20
@@ -9,6 +9,7 @@ import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updatePadding
import androidx.fragment.app.viewModels
import androidx.lifecycle.asLiveData
import androidx.navigation.fragment.findNavController
import ltd.evilcorp.atox.databinding.FragmentCallBinding
import ltd.evilcorp.atox.requireStringArg
@@ -41,12 +42,12 @@ class CallFragment : BaseFragment<FragmentCallBinding>(FragmentCallBinding::infl
findNavController().popBackStack()
}
 
if (vm.inCall()) {
if (vm.inCall.value) {
return
}
 
if (ContextCompat.checkSelfPermission(requireContext(), PERMISSIONS[0]) == PackageManager.PERMISSION_GRANTED) {
vm.startCall()
startCall()
return
}
 
@@ -65,7 +66,16 @@ class CallFragment : BaseFragment<FragmentCallBinding>(FragmentCallBinding::infl
if (!granted) {
findNavController().popBackStack()
} else {
vm.startCall()
startCall()
}
}
 
private fun startCall() {
vm.startCall()
vm.inCall.asLiveData().observe(viewLifecycleOwner) { inCall ->
if (!inCall) {
findNavController().popBackStack()
}
}
}
}
 
atox/src/main/kotlin/ui/call/CallViewModel.kt added: 38, removed: 18, total 20
@@ -43,5 +43,5 @@ class CallViewModel @Inject constructor(
notificationHelper.dismissCallNotification(contactManager.get(publicKey).first())
}
 
fun inCall() = callManager.isInCall()
val inCall = callManager.inCall
}
 
atox/src/main/kotlin/ui/chat/ChatFragment.kt added: 38, removed: 18, total 20
@@ -23,6 +23,7 @@ import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updatePadding
import androidx.core.widget.doAfterTextChanged
import androidx.fragment.app.viewModels
import androidx.lifecycle.asLiveData
import androidx.navigation.fragment.findNavController
import java.io.File
import java.net.URLConnection
@@ -124,11 +125,15 @@ class ChatFragment : BaseFragment<FragmentChatBinding>(FragmentChatBinding::infl
viewModel.clearDraft()
}
 
toolbar.menu.findItem(R.id.call).isEnabled = viewModel.contactOnline && !viewModel.inCall()
toolbar.menu.findItem(R.id.call).isEnabled = viewModel.contactOnline && !viewModel.inCall.value
 
updateActions()
}
 
viewModel.inCall.asLiveData().observe(viewLifecycleOwner) { inCall ->
toolbar.menu.findItem(R.id.call).isEnabled = viewModel.contactOnline && !inCall
}
 
val adapter = ChatAdapter(layoutInflater, resources)
messages.adapter = adapter
registerForContextMenu(messages)
 
atox/src/main/kotlin/ui/chat/ChatViewModel.kt added: 38, removed: 18, total 20
@@ -122,5 +122,5 @@ class ChatViewModel @Inject constructor(
fun setDraft(draft: String) = contactManager.setDraft(publicKey, draft)
fun clearDraft() = setDraft("")
 
fun inCall() = callManager.isInCall()
val inCall = callManager.inCall
}
 
domain/src/main/kotlin/feature/CallManager.kt added: 38, removed: 18, total 20
@@ -7,6 +7,8 @@ import javax.inject.Singleton
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import ltd.evilcorp.domain.av.AudioCapture
import ltd.evilcorp.domain.tox.PublicKey
@@ -18,13 +20,12 @@ private const val TAG = "CallManager"
class CallManager @Inject constructor(
private val tox: Tox,
) : CoroutineScope by GlobalScope {
private var inCall = false
 
fun isInCall() = inCall
private val _inCall = MutableStateFlow(false)
val inCall: StateFlow<Boolean> get() = _inCall
 
fun startCall(publicKey: PublicKey): Boolean {
tox.startCall(publicKey)
inCall = true
_inCall.value = true
 
val recorder = AudioCapture(48_000, 1)
if (!recorder.isOk()) {
@@ -33,7 +34,7 @@ class CallManager @Inject constructor(
 
launch {
recorder.start()
while (inCall) {
while (inCall.value) {
val start = System.currentTimeMillis()
val audioFrame = recorder.read()
try {
@@ -52,7 +53,7 @@ class CallManager @Inject constructor(
}
 
fun endCall(publicKey: PublicKey) {
inCall = false
_inCall.value = false
try {
tox.endCall(publicKey)
} catch (e: ToxavCallControlException) {