diff --git a/CHANGELOG.md b/CHANGELOG.md index 63d2480c3..29c82e60a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ Group changes to describe their impact on the project, as follows: - Image & Video in-app viewers allow for full-screen display - Display name can be set during assistant when creating / logging in a sip.linphone.org account - Android 13 support, using new post notifications & media permissions +- Call recordings can be exported ### Changed - In-call views have been re-designed diff --git a/app/src/main/java/org/linphone/activities/main/recordings/data/RecordingData.kt b/app/src/main/java/org/linphone/activities/main/recordings/data/RecordingData.kt index 09d62c6a8..3eabad85c 100644 --- a/app/src/main/java/org/linphone/activities/main/recordings/data/RecordingData.kt +++ b/app/src/main/java/org/linphone/activities/main/recordings/data/RecordingData.kt @@ -163,6 +163,10 @@ class RecordingData(val path: String, private val recordingListener: RecordingLi } } + fun export() { + recordingListener.onExportClicked(path) + } + private fun initPlayer() { // In case no headphones/headset is connected, use speaker sound card to play recordings, otherwise use earpiece // If none are available, default one will be used @@ -218,5 +222,6 @@ class RecordingData(val path: String, private val recordingListener: RecordingLi interface RecordingListener { fun onPlayingStarted(videoAvailable: Boolean) fun onPlayingEnded() + fun onExportClicked(path: String) } } diff --git a/app/src/main/java/org/linphone/activities/main/recordings/fragments/RecordingsFragment.kt b/app/src/main/java/org/linphone/activities/main/recordings/fragments/RecordingsFragment.kt index 5576ad069..22068d705 100644 --- a/app/src/main/java/org/linphone/activities/main/recordings/fragments/RecordingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/recordings/fragments/RecordingsFragment.kt @@ -19,6 +19,8 @@ */ package org.linphone.activities.main.recordings.fragments +import android.content.ActivityNotFoundException +import android.content.Intent import android.os.Bundle import android.view.MotionEvent import android.view.View @@ -32,6 +34,7 @@ import org.linphone.activities.main.recordings.viewmodels.RecordingsViewModel import org.linphone.core.tools.Log import org.linphone.databinding.RecordingsFragmentBinding import org.linphone.utils.AppUtils +import org.linphone.utils.FileUtils import org.linphone.utils.RecyclerViewHeaderDecoration class RecordingsFragment : MasterFragment() { @@ -75,6 +78,25 @@ class RecordingsFragment : MasterFragment + val publicFilePath = FileUtils.getPublicFilePath(requireContext(), "file://$path") + Log.i("[Recordings] Exporting file [$path] with public URI [$publicFilePath]") + val intent = Intent(Intent.ACTION_SEND) + intent.type = " video/x-matroska" + intent.putExtra(Intent.EXTRA_STREAM, publicFilePath) + intent.putExtra(Intent.EXTRA_TEXT, getString(R.string.recordings_export)) + + try { + requireActivity().startActivity(Intent.createChooser(intent, getString(R.string.recordings_export))) + } catch (anfe: ActivityNotFoundException) { + Log.e(anfe) + } + } + } + binding.setBackClickListener { goBack() } binding.setEditClickListener { listSelectionViewModel.isEditionEnabled.value = true } diff --git a/app/src/main/java/org/linphone/activities/main/recordings/viewmodels/RecordingsViewModel.kt b/app/src/main/java/org/linphone/activities/main/recordings/viewmodels/RecordingsViewModel.kt index b3a404b5b..cc12b4442 100644 --- a/app/src/main/java/org/linphone/activities/main/recordings/viewmodels/RecordingsViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/recordings/viewmodels/RecordingsViewModel.kt @@ -27,6 +27,7 @@ import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.activities.main.recordings.data.RecordingData import org.linphone.core.tools.Log import org.linphone.utils.AppUtils +import org.linphone.utils.Event import org.linphone.utils.FileUtils class RecordingsViewModel : ViewModel() { @@ -34,6 +35,10 @@ class RecordingsViewModel : ViewModel() { val isVideoVisible = MutableLiveData() + val exportRecordingEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + private var recordingPlayingAudioFocusRequest: AudioFocusRequestCompat? = null private val recordingListener = object : RecordingData.RecordingListener { @@ -56,6 +61,10 @@ class RecordingsViewModel : ViewModel() { isVideoVisible.value = false } + + override fun onExportClicked(path: String) { + exportRecordingEvent.value = Event(path) + } } init { @@ -93,7 +102,7 @@ class RecordingsViewModel : ViewModel() { val list = arrayListOf() for (f in FileUtils.getFileStorageDir().listFiles().orEmpty()) { - Log.i("[Recordings] Found file ${f.path}") + Log.d("[Recordings] Found file ${f.path}") if (RecordingData.RECORD_PATTERN.matcher(f.path).matches()) { list.add( RecordingData( diff --git a/app/src/main/res/layout/recording_list_cell.xml b/app/src/main/res/layout/recording_list_cell.xml index 31afbee6e..877f1f9bd 100644 --- a/app/src/main/res/layout/recording_list_cell.xml +++ b/app/src/main/res/layout/recording_list_cell.xml @@ -58,7 +58,7 @@ android:layout_centerVertical="true" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" - android:layout_toLeftOf="@id/delete" + android:layout_toLeftOf="@id/export" android:layout_toRightOf="@id/record_play_pause"> + android:layout_height="wrap_content" + android:text="@{data.name}" /> + android:layout_height="wrap_content" + android:text="@{data.formattedDate}" /> @@ -96,10 +96,10 @@ android:orientation="horizontal"> + android:layout_gravity="center" + android:text="@{data.formattedPosition}" /> + android:layout_height="wrap_content" + android:text="@{data.formattedDuration}" /> + + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 407806118..25f52e6b2 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -731,4 +731,6 @@ Activer les notifications Les notifications sont désactivées pour cette conversation Voir le contact + Exporter l\'enregistrement avec… + Exporter l\'enregistrement \ 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 8c61db21f..fdb2d9535 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -234,6 +234,7 @@ No recordings + Export recording using… Meeting @@ -861,4 +862,5 @@ Participant has momentarily left the group call Toggle meeting information details visibility Group call participants + Export recording diff --git a/app/src/main/res/xml/provider_paths.xml b/app/src/main/res/xml/provider_paths.xml index 07009997a..a40f5cad7 100644 --- a/app/src/main/res/xml/provider_paths.xml +++ b/app/src/main/res/xml/provider_paths.xml @@ -1,6 +1,7 @@ +