diff --git a/app/src/main/java/org/linphone/ui/main/recordings/fragment/RecordingsListFragment.kt b/app/src/main/java/org/linphone/ui/main/recordings/fragment/RecordingsListFragment.kt index 9d766ec10..44119d693 100644 --- a/app/src/main/java/org/linphone/ui/main/recordings/fragment/RecordingsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/recordings/fragment/RecordingsListFragment.kt @@ -19,21 +19,30 @@ */ package org.linphone.ui.main.recordings.fragment +import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread +import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import java.io.File +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.RecordingsListFragmentBinding +import org.linphone.ui.GenericActivity import org.linphone.ui.main.fragment.GenericMainFragment import org.linphone.ui.main.recordings.adapter.RecordingsListAdapter import org.linphone.ui.main.recordings.viewmodel.RecordingsListViewModel +import org.linphone.utils.AppUtils +import org.linphone.utils.FileUtils import org.linphone.utils.RecyclerViewHeaderDecoration import org.linphone.utils.hideKeyboard import org.linphone.utils.showKeyboard @@ -117,13 +126,17 @@ class RecordingsListFragment : GenericMainFragment() { adapter.resetSelection() }, { // onShare + Log.i("$TAG Sharing call recording [${model.filePath}]") + shareFile(model.filePath, model.fileName) adapter.resetSelection() }, { // onExport + Log.i("$TAG Saving call recording [${model.filePath}]") + exportFile(model.filePath) adapter.resetSelection() }, { // onDelete - Log.i("$TAG Deleting meeting [${model.filePath}]") + Log.i("$TAG Deleting call recording [${model.filePath}]") lifecycleScope.launch { model.delete() } @@ -142,4 +155,63 @@ class RecordingsListFragment : GenericMainFragment() { bottomSheetDialog?.dismiss() bottomSheetDialog = null } + + private fun exportFile(filePath: String) { + lifecycleScope.launch { + withContext(Dispatchers.IO) { + Log.i( + "$TAG Export file [$filePath] to Android's MediaStore" + ) + val mediaStorePath = FileUtils.addContentToMediaStore(filePath) + if (mediaStorePath.isNotEmpty()) { + Log.i( + "$TAG File [$filePath] has been successfully exported to MediaStore" + ) + val message = AppUtils.getString( + R.string.toast_file_successfully_exported_to_media_store + ) + (requireActivity() as GenericActivity).showGreenToast( + message, + R.drawable.check + ) + } else { + Log.e( + "$TAG Failed to export file [$filePath] to MediaStore!" + ) + val message = AppUtils.getString( + R.string.toast_export_file_to_media_store_error + ) + (requireActivity() as GenericActivity).showRedToast( + message, + R.drawable.warning_circle + ) + } + } + } + } + + private fun shareFile(filePath: String, fileName: String) { + lifecycleScope.launch { + val publicUri = FileProvider.getUriForFile( + requireContext(), + getString(R.string.file_provider), + File(filePath) + ) + Log.i( + "$TAG Public URI for file is [$publicUri], starting intent chooser" + ) + + val sendIntent: Intent = Intent().apply { + action = Intent.ACTION_SEND + putExtra(Intent.EXTRA_STREAM, publicUri) + putExtra(Intent.EXTRA_SUBJECT, fileName) + type = FileUtils.getMimeTypeFromExtension( + FileUtils.getExtensionFromFileName(fileName) + ) + } + + val shareIntent = Intent.createChooser(sendIntent, null) + startActivity(shareIntent) + } + } } diff --git a/app/src/main/java/org/linphone/ui/main/recordings/fragment/RecordingsMenuDialogFragment.kt b/app/src/main/java/org/linphone/ui/main/recordings/fragment/RecordingsMenuDialogFragment.kt index f358d687f..2d215338f 100644 --- a/app/src/main/java/org/linphone/ui/main/recordings/fragment/RecordingsMenuDialogFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/recordings/fragment/RecordingsMenuDialogFragment.kt @@ -72,6 +72,16 @@ class RecordingsMenuDialogFragment( dismiss() } + view.setExportClickListener { + onExport?.invoke() + dismiss() + } + + view.setShareClickListener { + onShare?.invoke() + dismiss() + } + return view.root } } diff --git a/app/src/main/res/layout-land/call_conference_actions_bottom_sheet.xml b/app/src/main/res/layout-land/call_conference_actions_bottom_sheet.xml index ca18fb65e..77e4e6e41 100644 --- a/app/src/main/res/layout-land/call_conference_actions_bottom_sheet.xml +++ b/app/src/main/res/layout-land/call_conference_actions_bottom_sheet.xml @@ -157,12 +157,12 @@ android:layout_height="@dimen/call_button_size" android:layout_marginTop="@dimen/call_extra_button_top_margin" android:padding="@dimen/call_button_icon_padding" - android:enabled="@{viewModel.isRecordingEnabled}" + android:enabled="false" android:src="@drawable/record_fill" android:contentDescription="@string/call_action_record_call" android:selected="@{viewModel.isRecording()}" - android:background="@drawable/in_call_button_background_red" - app:tint="@color/in_call_button_tint_color" + android:background="@drawable/shape_round_in_call_disabled_button_background" + app:tint="?attr/color_grey_500" app:layout_constraintDimensionRatio="1:1" app:layout_constraintTop_toBottomOf="@id/main_actions" app:layout_constraintStart_toStartOf="@id/record_call_label" @@ -246,7 +246,7 @@ android:layout_height="wrap_content" android:paddingBottom="15dp" android:text="@string/call_action_record_call" - android:enabled="@{viewModel.isRecordingEnabled}" + android:enabled="false" app:layout_constraintTop_toBottomOf="@id/record_call" app:layout_constraintStart_toEndOf="@id/pause_call_label" app:layout_constraintEnd_toEndOf="parent" /> diff --git a/app/src/main/res/layout/call_conference_actions_bottom_sheet.xml b/app/src/main/res/layout/call_conference_actions_bottom_sheet.xml index cd8161ffd..80940dd60 100644 --- a/app/src/main/res/layout/call_conference_actions_bottom_sheet.xml +++ b/app/src/main/res/layout/call_conference_actions_bottom_sheet.xml @@ -157,12 +157,12 @@ android:layout_height="@dimen/call_button_size" android:layout_marginTop="@dimen/call_extra_button_top_margin" android:padding="@dimen/call_button_icon_padding" - android:enabled="@{viewModel.isRecordingEnabled}" + android:enabled="false" android:src="@drawable/record_fill" android:contentDescription="@string/call_action_record_call" android:selected="@{viewModel.isRecording()}" - android:background="@drawable/in_call_button_background_red" - app:tint="@color/in_call_button_tint_color" + android:background="@drawable/shape_round_in_call_disabled_button_background" + app:tint="?attr/color_grey_500" app:layout_constraintDimensionRatio="1:1" app:layout_constraintTop_toBottomOf="@id/calls_list_label" app:layout_constraintStart_toStartOf="@id/calls_list" @@ -242,7 +242,7 @@ android:layout_height="wrap_content" android:paddingBottom="15dp" android:text="@string/call_action_record_call" - android:enabled="@{viewModel.isRecordingEnabled}" + android:enabled="false" app:layout_constraintTop_toBottomOf="@id/record_call" app:layout_constraintStart_toStartOf="@id/calls_list_label" app:layout_constraintEnd_toEndOf="@id/calls_list_label" /> diff --git a/app/src/main/res/layout/recordings_list_long_press_menu.xml b/app/src/main/res/layout/recordings_list_long_press_menu.xml index 931b4cf63..fcae5f56b 100644 --- a/app/src/main/res/layout/recordings_list_long_press_menu.xml +++ b/app/src/main/res/layout/recordings_list_long_press_menu.xml @@ -4,6 +4,12 @@ + + @@ -15,12 +21,40 @@ android:background="?attr/color_main2_200"> + + + + Répondre Transférer Copier le texte + Télécharger + Partager Orange diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index df9459c5c..d5ad324c4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -694,6 +694,8 @@ Reply Forward Copy + Download + Share Orange