From 6d2ae8007a8fd9dc1e962dc0674eb25d800faeba Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 6 Dec 2022 11:14:20 +0100 Subject: [PATCH] Reworked a bit & improved video call take snapshot process --- .../linphone/activities/voip/CallActivity.kt | 18 ++++------------- .../linphone/activities/voip/data/CallData.kt | 8 ++++++-- .../voip/viewmodels/CallsViewModel.kt | 19 ------------------ .../voip/viewmodels/ControlsViewModel.kt | 20 ++++++++++++++++--- .../res/layout/voip_single_call_fragment.xml | 2 +- app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 7 files changed, 30 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/voip/CallActivity.kt b/app/src/main/java/org/linphone/activities/voip/CallActivity.kt index 98bfe59d9..89dd7bf07 100644 --- a/app/src/main/java/org/linphone/activities/voip/CallActivity.kt +++ b/app/src/main/java/org/linphone/activities/voip/CallActivity.kt @@ -129,15 +129,6 @@ class CallActivity : ProximitySensorActivity() { } } - callsViewModel.askWriteExternalStoragePermissionEvent.observe( - this - ) { - it.consume { - Log.i("[Call Activity] Asking for WRITE_EXTERNAL_STORAGE permission to take snapshot") - requestPermissions(arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 1) - } - } - callsViewModel.currentCallData.observe( this ) { callData -> @@ -302,13 +293,12 @@ class CallActivity : ProximitySensorActivity() { Compatibility.BLUETOOTH_CONNECT -> if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { Log.i("[Call Activity] BLUETOOTH_CONNECT permission has been granted") } + Manifest.permission.WRITE_EXTERNAL_STORAGE -> if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { + Log.i("[Call Activity] WRITE_EXTERNAL_STORAGE permission has been granted, taking snapshot") + controlsViewModel.takeSnapshot() + } } } - } else if (requestCode == 1) { - if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - Log.i("[Call Activity] WRITE_EXTERNAL_STORAGE permission has been granted, taking snapshot") - callsViewModel.takeSnapshot() - } } super.onRequestPermissionsResult(requestCode, permissions, grantResults) } diff --git a/app/src/main/java/org/linphone/activities/voip/data/CallData.kt b/app/src/main/java/org/linphone/activities/voip/data/CallData.kt index 0300876b4..25050638e 100644 --- a/app/src/main/java/org/linphone/activities/voip/data/CallData.kt +++ b/app/src/main/java/org/linphone/activities/voip/data/CallData.kt @@ -20,6 +20,7 @@ package org.linphone.activities.voip.data import android.view.View +import android.widget.Toast import androidx.lifecycle.MediatorLiveData import androidx.lifecycle.MutableLiveData import java.util.* @@ -30,6 +31,7 @@ import org.linphone.compatibility.Compatibility import org.linphone.contact.GenericContactData import org.linphone.core.* import org.linphone.core.tools.Log +import org.linphone.utils.AppUtils import org.linphone.utils.LinphoneUtils open class CallData(val call: Call) : GenericContactData(call.remoteAddress) { @@ -94,11 +96,13 @@ open class CallData(val call: Call) : GenericContactData(call.remoteAddress) { content.filePath = filePath content.type = "image" content.subtype = "jpeg" - content.name = filePath.substring(filePath.indexOf("/") + 1) + content.name = filePath.substring(filePath.lastIndexOf("/") + 1) scope.launch { if (Compatibility.addImageToMediaStore(coreContext.context, content)) { - Log.i("[Call] Adding snapshot ${content.name} to Media Store terminated") + Log.i("[Call] Added snapshot ${content.name} to Media Store") + val message = String.format(AppUtils.getString(R.string.call_screenshot_taken), content.name) + Toast.makeText(coreContext.context, message, Toast.LENGTH_SHORT).show() } else { Log.e("[Call] Something went wrong while copying file to Media Store...") } diff --git a/app/src/main/java/org/linphone/activities/voip/viewmodels/CallsViewModel.kt b/app/src/main/java/org/linphone/activities/voip/viewmodels/CallsViewModel.kt index cebb81413..711a7ca73 100644 --- a/app/src/main/java/org/linphone/activities/voip/viewmodels/CallsViewModel.kt +++ b/app/src/main/java/org/linphone/activities/voip/viewmodels/CallsViewModel.kt @@ -30,7 +30,6 @@ import org.linphone.core.* import org.linphone.core.tools.Log import org.linphone.utils.AppUtils import org.linphone.utils.Event -import org.linphone.utils.FileUtils import org.linphone.utils.PermissionHelper class CallsViewModel : ViewModel() { @@ -48,10 +47,6 @@ class CallsViewModel : ViewModel() { val isMuteMicrophoneEnabled = MutableLiveData() - val askWriteExternalStoragePermissionEvent: MutableLiveData> by lazy { - MutableLiveData>() - } - val callConnectedEvent: MutableLiveData> by lazy { MutableLiveData>() } @@ -196,20 +191,6 @@ class CallsViewModel : ViewModel() { conference?.addParticipants(core.calls) } - fun takeSnapshot() { - if (!PermissionHelper.get().hasWriteExternalStoragePermission()) { - askWriteExternalStoragePermissionEvent.value = Event(true) - } else { - if (currentCallData.value?.call?.currentParams?.isVideoEnabled == true) { - val fileName = System.currentTimeMillis().toString() + ".jpeg" - Log.i("[Calls] Snapshot will be save under $fileName") - currentCallData.value?.call?.takeVideoSnapshot(FileUtils.getFileStoragePath(fileName).absolutePath) - } else { - Log.e("[Calls] Current call doesn't have video, can't take snapshot") - } - } - } - private fun initCallList() { val calls = arrayListOf() diff --git a/app/src/main/java/org/linphone/activities/voip/viewmodels/ControlsViewModel.kt b/app/src/main/java/org/linphone/activities/voip/viewmodels/ControlsViewModel.kt index 4af7a906b..d239e9b95 100644 --- a/app/src/main/java/org/linphone/activities/voip/viewmodels/ControlsViewModel.kt +++ b/app/src/main/java/org/linphone/activities/voip/viewmodels/ControlsViewModel.kt @@ -31,10 +31,8 @@ import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R import org.linphone.core.* import org.linphone.core.tools.Log -import org.linphone.utils.AppUtils -import org.linphone.utils.AudioRouteUtils +import org.linphone.utils.* import org.linphone.utils.Event -import org.linphone.utils.PermissionHelper class ControlsViewModel : ViewModel() { val isSpeakerSelected = MutableLiveData() @@ -327,6 +325,22 @@ class ControlsViewModel : ViewModel() { coreContext.switchCamera() } + fun takeSnapshot() { + if (!PermissionHelper.get().hasWriteExternalStoragePermission()) { + askPermissionEvent.value = Event(Manifest.permission.WRITE_EXTERNAL_STORAGE) + } else { + val currentCall = coreContext.core.currentCall + if (currentCall != null && currentCall.currentParams.isVideoEnabled) { + val fileName = System.currentTimeMillis().toString() + ".jpeg" + val fullPath = FileUtils.getFileStoragePath(fileName).absolutePath + Log.i("[Call Controls] Snapshot will be save under $fullPath") + currentCall.takeVideoSnapshot(fullPath) + } else { + Log.e("[Call Controls] Current call doesn't have video, can't take snapshot") + } + } + } + fun showExtraButtons() { extraButtonsMenuAnimator.start() showExtras.value = true diff --git a/app/src/main/res/layout/voip_single_call_fragment.xml b/app/src/main/res/layout/voip_single_call_fragment.xml index 024155502..e5d2e4f97 100644 --- a/app/src/main/res/layout/voip_single_call_fragment.xml +++ b/app/src/main/res/layout/voip_single_call_fragment.xml @@ -197,7 +197,7 @@ android:layout_margin="10dp" android:background="@drawable/button_toggle_background" android:contentDescription="@string/content_description_take_screenshot" - android:onClick="@{() -> callsViewModel.takeSnapshot()}" + android:onClick="@{() -> controlsViewModel.takeSnapshot()}" android:enabled="@{!callsViewModel.currentCallData.isPaused && !callsViewModel.currentCallData.isRemotelyPaused}" android:src="@drawable/icon_call_screenshot" android:visibility="@{!controlsViewModel.showTakeSnapshotButton || controlsViewModel.fullScreenMode || controlsViewModel.pipMode ? View.GONE : View.VISIBLE}" diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index d5bf3b31a..dbb01b960 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -755,4 +755,5 @@ Vous avez annulé la conférence Envoyer la mise à jour par &appName; Envoyer la mise à jour par courriel + Capture sauvegardée : %s \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1f8d0f501..e16cd3e76 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -351,6 +351,7 @@ Call has been paused by remote. You have paused the call. Click on play button to resume it. + Snapshot taken: %s Audio