Show screen sharing permission dialog.
This commit is contained in:
parent
00bbb94b3b
commit
99cab794c4
|
@ -66,6 +66,11 @@ class CallControlsBottomSheet : VectorBaseBottomSheetDialogFragment<BottomSheetC
|
||||||
callViewModel.handle(VectorCallViewActions.InitiateCallTransfer)
|
callViewModel.handle(VectorCallViewActions.InitiateCallTransfer)
|
||||||
dismiss()
|
dismiss()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
views.callControlsShareScreen.views.bottomSheetActionClickableZone.debouncedClicks {
|
||||||
|
callViewModel.handle(VectorCallViewActions.InitiateScreenSharing)
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun renderState(state: VectorCallViewState) {
|
private fun renderState(state: VectorCallViewState) {
|
||||||
|
|
|
@ -24,6 +24,7 @@ import android.content.Intent
|
||||||
import android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP
|
import android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP
|
||||||
import android.content.res.Configuration
|
import android.content.res.Configuration
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
|
import android.media.projection.MediaProjectionManager
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Parcelable
|
import android.os.Parcelable
|
||||||
|
@ -512,20 +513,21 @@ class VectorCallActivity : VectorBaseActivity<ActivityCallBinding>(), CallContro
|
||||||
private fun handleViewEvents(event: VectorCallViewEvents?) {
|
private fun handleViewEvents(event: VectorCallViewEvents?) {
|
||||||
Timber.tag(loggerTag.value).v("handleViewEvents $event")
|
Timber.tag(loggerTag.value).v("handleViewEvents $event")
|
||||||
when (event) {
|
when (event) {
|
||||||
is VectorCallViewEvents.ConnectionTimeout -> {
|
is VectorCallViewEvents.ConnectionTimeout -> {
|
||||||
onErrorTimoutConnect(event.turn)
|
onErrorTimoutConnect(event.turn)
|
||||||
}
|
}
|
||||||
is VectorCallViewEvents.ShowDialPad -> {
|
is VectorCallViewEvents.ShowDialPad -> {
|
||||||
CallDialPadBottomSheet.newInstance(false).apply {
|
CallDialPadBottomSheet.newInstance(false).apply {
|
||||||
callback = dialPadCallback
|
callback = dialPadCallback
|
||||||
}.show(supportFragmentManager, FRAGMENT_DIAL_PAD_TAG)
|
}.show(supportFragmentManager, FRAGMENT_DIAL_PAD_TAG)
|
||||||
}
|
}
|
||||||
is VectorCallViewEvents.ShowCallTransferScreen -> {
|
is VectorCallViewEvents.ShowCallTransferScreen -> {
|
||||||
val callId = withState(callViewModel) { it.callId }
|
val callId = withState(callViewModel) { it.callId }
|
||||||
navigator.openCallTransfer(this, callTransferActivityResultLauncher, callId)
|
navigator.openCallTransfer(this, callTransferActivityResultLauncher, callId)
|
||||||
}
|
}
|
||||||
is VectorCallViewEvents.FailToTransfer -> showSnackbar(getString(R.string.call_transfer_failure))
|
is VectorCallViewEvents.FailToTransfer -> showSnackbar(getString(R.string.call_transfer_failure))
|
||||||
else -> Unit
|
is VectorCallViewEvents.ShowScreenSharingPermissionDialog -> handleShowScreenSharingPermissionDialog()
|
||||||
|
else -> Unit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -628,6 +630,18 @@ class VectorCallActivity : VectorBaseActivity<ActivityCallBinding>(), CallContro
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val screenSharingPermissionActivityResultLauncher = registerStartForActivityResult { activityResult ->
|
||||||
|
if (activityResult.resultCode == Activity.RESULT_OK) {
|
||||||
|
callViewModel.handle(VectorCallViewActions.StartScreenSharing)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleShowScreenSharingPermissionDialog() {
|
||||||
|
getSystemService<MediaProjectionManager>()?.let {
|
||||||
|
navigator.openScreenSharingPermissionDialog(it.createScreenCaptureIntent(), screenSharingPermissionActivityResultLauncher)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val EXTRA_MODE = "EXTRA_MODE"
|
private const val EXTRA_MODE = "EXTRA_MODE"
|
||||||
private const val FRAGMENT_DIAL_PAD_TAG = "FRAGMENT_DIAL_PAD_TAG"
|
private const val FRAGMENT_DIAL_PAD_TAG = "FRAGMENT_DIAL_PAD_TAG"
|
||||||
|
|
|
@ -40,4 +40,6 @@ sealed class VectorCallViewActions : VectorViewModelAction {
|
||||||
object CallTransferSelectionCancelled : VectorCallViewActions()
|
object CallTransferSelectionCancelled : VectorCallViewActions()
|
||||||
data class CallTransferSelectionResult(val callTransferResult: CallTransferResult) : VectorCallViewActions()
|
data class CallTransferSelectionResult(val callTransferResult: CallTransferResult) : VectorCallViewActions()
|
||||||
object TransferCall : VectorCallViewActions()
|
object TransferCall : VectorCallViewActions()
|
||||||
|
object InitiateScreenSharing : VectorCallViewActions()
|
||||||
|
object StartScreenSharing : VectorCallViewActions()
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,7 @@ sealed class VectorCallViewEvents : VectorViewEvents {
|
||||||
object ShowDialPad : VectorCallViewEvents()
|
object ShowDialPad : VectorCallViewEvents()
|
||||||
object ShowCallTransferScreen : VectorCallViewEvents()
|
object ShowCallTransferScreen : VectorCallViewEvents()
|
||||||
object FailToTransfer : VectorCallViewEvents()
|
object FailToTransfer : VectorCallViewEvents()
|
||||||
|
object ShowScreenSharingPermissionDialog : VectorCallViewEvents()
|
||||||
// data class CallAnswered(val content: CallAnswerContent) : VectorCallViewEvents()
|
// data class CallAnswered(val content: CallAnswerContent) : VectorCallViewEvents()
|
||||||
// data class CallHangup(val content: CallHangupContent) : VectorCallViewEvents()
|
// data class CallHangup(val content: CallHangupContent) : VectorCallViewEvents()
|
||||||
// object CallAccepted : VectorCallViewEvents()
|
// object CallAccepted : VectorCallViewEvents()
|
||||||
|
|
|
@ -256,27 +256,27 @@ class VectorCallViewModel @AssistedInject constructor(
|
||||||
|
|
||||||
override fun handle(action: VectorCallViewActions) = withState { state ->
|
override fun handle(action: VectorCallViewActions) = withState { state ->
|
||||||
when (action) {
|
when (action) {
|
||||||
VectorCallViewActions.EndCall -> call?.endCall()
|
VectorCallViewActions.EndCall -> call?.endCall()
|
||||||
VectorCallViewActions.AcceptCall -> {
|
VectorCallViewActions.AcceptCall -> {
|
||||||
setState {
|
setState {
|
||||||
copy(callState = Loading())
|
copy(callState = Loading())
|
||||||
}
|
}
|
||||||
call?.acceptIncomingCall()
|
call?.acceptIncomingCall()
|
||||||
}
|
}
|
||||||
VectorCallViewActions.DeclineCall -> {
|
VectorCallViewActions.DeclineCall -> {
|
||||||
setState {
|
setState {
|
||||||
copy(callState = Loading())
|
copy(callState = Loading())
|
||||||
}
|
}
|
||||||
call?.endCall()
|
call?.endCall()
|
||||||
}
|
}
|
||||||
VectorCallViewActions.ToggleMute -> {
|
VectorCallViewActions.ToggleMute -> {
|
||||||
val muted = state.isAudioMuted
|
val muted = state.isAudioMuted
|
||||||
call?.muteCall(!muted)
|
call?.muteCall(!muted)
|
||||||
setState {
|
setState {
|
||||||
copy(isAudioMuted = !muted)
|
copy(isAudioMuted = !muted)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
VectorCallViewActions.ToggleVideo -> {
|
VectorCallViewActions.ToggleVideo -> {
|
||||||
if (state.isVideoCall) {
|
if (state.isVideoCall) {
|
||||||
val videoEnabled = state.isVideoEnabled
|
val videoEnabled = state.isVideoEnabled
|
||||||
call?.enableVideo(!videoEnabled)
|
call?.enableVideo(!videoEnabled)
|
||||||
|
@ -286,19 +286,19 @@ class VectorCallViewModel @AssistedInject constructor(
|
||||||
}
|
}
|
||||||
Unit
|
Unit
|
||||||
}
|
}
|
||||||
VectorCallViewActions.ToggleHoldResume -> {
|
VectorCallViewActions.ToggleHoldResume -> {
|
||||||
val isRemoteOnHold = state.isRemoteOnHold
|
val isRemoteOnHold = state.isRemoteOnHold
|
||||||
call?.updateRemoteOnHold(!isRemoteOnHold)
|
call?.updateRemoteOnHold(!isRemoteOnHold)
|
||||||
}
|
}
|
||||||
is VectorCallViewActions.ChangeAudioDevice -> {
|
is VectorCallViewActions.ChangeAudioDevice -> {
|
||||||
callManager.audioManager.setAudioDevice(action.device)
|
callManager.audioManager.setAudioDevice(action.device)
|
||||||
}
|
}
|
||||||
VectorCallViewActions.SwitchSoundDevice -> {
|
VectorCallViewActions.SwitchSoundDevice -> {
|
||||||
_viewEvents.post(
|
_viewEvents.post(
|
||||||
VectorCallViewEvents.ShowSoundDeviceChooser(state.availableDevices, state.device)
|
VectorCallViewEvents.ShowSoundDeviceChooser(state.availableDevices, state.device)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
VectorCallViewActions.HeadSetButtonPressed -> {
|
VectorCallViewActions.HeadSetButtonPressed -> {
|
||||||
if (state.callState.invoke() is CallState.LocalRinging) {
|
if (state.callState.invoke() is CallState.LocalRinging) {
|
||||||
// accept call
|
// accept call
|
||||||
call?.acceptIncomingCall()
|
call?.acceptIncomingCall()
|
||||||
|
@ -309,20 +309,20 @@ class VectorCallViewModel @AssistedInject constructor(
|
||||||
}
|
}
|
||||||
Unit
|
Unit
|
||||||
}
|
}
|
||||||
VectorCallViewActions.ToggleCamera -> {
|
VectorCallViewActions.ToggleCamera -> {
|
||||||
call?.switchCamera()
|
call?.switchCamera()
|
||||||
}
|
}
|
||||||
VectorCallViewActions.ToggleHDSD -> {
|
VectorCallViewActions.ToggleHDSD -> {
|
||||||
if (!state.isVideoCall) return@withState
|
if (!state.isVideoCall) return@withState
|
||||||
call?.setCaptureFormat(if (state.isHD) CaptureFormat.SD else CaptureFormat.HD)
|
call?.setCaptureFormat(if (state.isHD) CaptureFormat.SD else CaptureFormat.HD)
|
||||||
}
|
}
|
||||||
VectorCallViewActions.OpenDialPad -> {
|
VectorCallViewActions.OpenDialPad -> {
|
||||||
_viewEvents.post(VectorCallViewEvents.ShowDialPad)
|
_viewEvents.post(VectorCallViewEvents.ShowDialPad)
|
||||||
}
|
}
|
||||||
is VectorCallViewActions.SendDtmfDigit -> {
|
is VectorCallViewActions.SendDtmfDigit -> {
|
||||||
call?.sendDtmfDigit(action.digit)
|
call?.sendDtmfDigit(action.digit)
|
||||||
}
|
}
|
||||||
VectorCallViewActions.InitiateCallTransfer -> {
|
VectorCallViewActions.InitiateCallTransfer -> {
|
||||||
call?.updateRemoteOnHold(true)
|
call?.updateRemoteOnHold(true)
|
||||||
_viewEvents.post(
|
_viewEvents.post(
|
||||||
VectorCallViewEvents.ShowCallTransferScreen
|
VectorCallViewEvents.ShowCallTransferScreen
|
||||||
|
@ -334,13 +334,21 @@ class VectorCallViewModel @AssistedInject constructor(
|
||||||
is VectorCallViewActions.CallTransferSelectionResult -> {
|
is VectorCallViewActions.CallTransferSelectionResult -> {
|
||||||
handleCallTransferSelectionResult(action.callTransferResult)
|
handleCallTransferSelectionResult(action.callTransferResult)
|
||||||
}
|
}
|
||||||
VectorCallViewActions.TransferCall -> {
|
VectorCallViewActions.TransferCall -> {
|
||||||
handleCallTransfer()
|
handleCallTransfer()
|
||||||
}
|
}
|
||||||
is VectorCallViewActions.SwitchCall -> {
|
is VectorCallViewActions.SwitchCall -> {
|
||||||
setState { VectorCallViewState(action.callArgs) }
|
setState { VectorCallViewState(action.callArgs) }
|
||||||
setupCallWithCurrentState()
|
setupCallWithCurrentState()
|
||||||
}
|
}
|
||||||
|
is VectorCallViewActions.InitiateScreenSharing -> {
|
||||||
|
_viewEvents.post(
|
||||||
|
VectorCallViewEvents.ShowScreenSharingPermissionDialog
|
||||||
|
)
|
||||||
|
}
|
||||||
|
is VectorCallViewActions.StartScreenSharing -> {
|
||||||
|
call?.shareScreen()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -770,6 +770,10 @@ class WebRtcCall(
|
||||||
return currentCaptureFormat
|
return currentCaptureFormat
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun shareScreen() {
|
||||||
|
// TODO. Will be handled within the next PR.
|
||||||
|
}
|
||||||
|
|
||||||
private suspend fun release() {
|
private suspend fun release() {
|
||||||
listeners.clear()
|
listeners.clear()
|
||||||
mxCall.removeListener(this)
|
mxCall.removeListener(this)
|
||||||
|
|
|
@ -600,4 +600,9 @@ class DefaultNavigator @Inject constructor(
|
||||||
roomEncryptionTrustLevel = threadTimelineArgs.roomEncryptionTrustLevel
|
roomEncryptionTrustLevel = threadTimelineArgs.roomEncryptionTrustLevel
|
||||||
)))
|
)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun openScreenSharingPermissionDialog(screenCaptureIntent: Intent,
|
||||||
|
activityResultLauncher: ActivityResultLauncher<Intent>) {
|
||||||
|
activityResultLauncher.launch(screenCaptureIntent)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -168,4 +168,9 @@ interface Navigator {
|
||||||
fun openThread(context: Context, threadTimelineArgs: ThreadTimelineArgs, eventIdToNavigate: String? = null)
|
fun openThread(context: Context, threadTimelineArgs: ThreadTimelineArgs, eventIdToNavigate: String? = null)
|
||||||
|
|
||||||
fun openThreadList(context: Context, threadTimelineArgs: ThreadTimelineArgs)
|
fun openThreadList(context: Context, threadTimelineArgs: ThreadTimelineArgs)
|
||||||
|
|
||||||
|
fun openScreenSharingPermissionDialog(
|
||||||
|
screenCaptureIntent: Intent,
|
||||||
|
activityResultLauncher: ActivityResultLauncher<Intent>
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue