From ee8c36f70b0b124d4f46ecb43aaa10aeb56503a2 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 10 Jan 2024 17:21:10 +0100 Subject: [PATCH] Getting rid of two TODOs regarding asking permissions during call --- .../java/org/linphone/ui/call/CallActivity.kt | 38 +++++++++++++++++++ .../ui/call/viewmodel/CurrentCallViewModel.kt | 31 +++++++++++++-- 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/call/CallActivity.kt b/app/src/main/java/org/linphone/ui/call/CallActivity.kt index 441649c3e..d027fdbda 100644 --- a/app/src/main/java/org/linphone/ui/call/CallActivity.kt +++ b/app/src/main/java/org/linphone/ui/call/CallActivity.kt @@ -19,10 +19,12 @@ */ package org.linphone.ui.call +import android.Manifest import android.app.PictureInPictureParams import android.content.pm.PackageManager import android.os.Bundle import android.view.ViewGroup +import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.DrawableRes import androidx.annotation.UiThread import androidx.core.view.WindowCompat @@ -72,6 +74,28 @@ class CallActivity : GenericActivity() { private var bottomSheetDialog: BottomSheetDialogFragment? = null + private val requestCameraPermissionLauncher = registerForActivityResult( + ActivityResultContracts.RequestPermission() + ) { isGranted -> + if (isGranted) { + Log.i("$TAG CAMERA permission has been granted, enabling video") + callViewModel.toggleVideo() + } else { + Log.e("$TAG CAMERA permission has been denied") + } + } + + private val requestRecordAudioPermissionLauncher = registerForActivityResult( + ActivityResultContracts.RequestPermission() + ) { isGranted -> + if (isGranted) { + Log.i("$TAG RECORD_AUDIO permission has been granted, un-muting microphone") + callViewModel.toggleMuteMicrophone() + } else { + Log.e("$TAG RECORD_AUDIO permission has been denied") + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -178,6 +202,20 @@ class CallActivity : GenericActivity() { } } + callViewModel.requestRecordAudioPermission.observe(this) { + it.consume { + Log.w("$TAG Asking for RECORD_AUDIO permission") + requestRecordAudioPermissionLauncher.launch(Manifest.permission.RECORD_AUDIO) + } + } + + callViewModel.requestCameraPermission.observe(this) { + it.consume { + Log.w("$TAG Asking for CAMERA permission") + requestCameraPermissionLauncher.launch(Manifest.permission.CAMERA) + } + } + callsViewModel.showIncomingCallEvent.observe(this) { it.consume { val action = IncomingCallFragmentDirections.actionGlobalIncomingCallFragment() diff --git a/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt b/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt index e10050bbb..0a4b65ed7 100644 --- a/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt +++ b/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt @@ -117,6 +117,14 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { MutableLiveData>() } + val requestRecordAudioPermission: MutableLiveData> by lazy { + MutableLiveData>() + } + + val requestCameraPermission: MutableLiveData> by lazy { + MutableLiveData>() + } + // To synchronize chronometers in UI val callDuration = MutableLiveData() @@ -391,8 +399,11 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { } isVideoEnabled.value = false - isMicrophoneMuted.value = false fullScreenMode.value = false + isMicrophoneMuted.value = ActivityCompat.checkSelfPermission( + coreContext.context, + Manifest.permission.RECORD_AUDIO + ) != PackageManager.PERMISSION_GRANTED numpadModel = NumpadModel( { digit -> // onDigitClicked @@ -463,7 +474,7 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { Manifest.permission.RECORD_AUDIO ) != PackageManager.PERMISSION_GRANTED ) { - // TODO: request record audio permission + requestRecordAudioPermission.postValue(Event(true)) return } @@ -564,7 +575,7 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { Manifest.permission.CAMERA ) != PackageManager.PERMISSION_GRANTED ) { - // TODO: request video permission + requestCameraPermission.postValue(Event(true)) return } @@ -808,7 +819,19 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { isVideoEnabled.postValue(call.currentParams.isVideoEnabled) } - isMicrophoneMuted.postValue(call.microphoneMuted) + if (ActivityCompat.checkSelfPermission( + coreContext.context, + Manifest.permission.RECORD_AUDIO + ) != PackageManager.PERMISSION_GRANTED + ) { + Log.w( + "$TAG RECORD_AUDIO permission wasn't granted yet, considering microphone as muted!" + ) + isMicrophoneMuted.postValue(false) + } else { + isMicrophoneMuted.postValue(call.microphoneMuted) + } + val audioDevice = call.outputAudioDevice updateOutputAudioDevice(audioDevice)