From 2f4b8ae76044f1d9adac9016f25865067a8205c9 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 27 Jul 2020 12:45:34 +0200 Subject: [PATCH] Display video in recordings --- .../adapters/RecordingsListAdapter.kt | 27 ++++- .../fragments/RecordingsFragment.kt | 29 +++++ .../viewmodels/RecordingViewModel.kt | 101 ++++++++++++------ .../viewmodels/RecordingsViewModel.kt | 3 + .../main/res/layout/recordings_fragment.xml | 12 +++ 5 files changed, 138 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/main/recordings/adapters/RecordingsListAdapter.kt b/app/src/main/java/org/linphone/activities/main/recordings/adapters/RecordingsListAdapter.kt index ddf47cf20..f5582da7b 100644 --- a/app/src/main/java/org/linphone/activities/main/recordings/adapters/RecordingsListAdapter.kt +++ b/app/src/main/java/org/linphone/activities/main/recordings/adapters/RecordingsListAdapter.kt @@ -21,9 +21,11 @@ package org.linphone.activities.main.recordings.adapters import android.content.Context import android.view.LayoutInflater +import android.view.TextureView import android.view.View import android.view.ViewGroup import androidx.databinding.DataBindingUtil +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.Observer import androidx.recyclerview.widget.DiffUtil import org.linphone.R @@ -31,14 +33,22 @@ import org.linphone.activities.main.recordings.viewmodels.RecordingViewModel import org.linphone.activities.main.viewmodels.ListTopBarViewModel import org.linphone.databinding.GenericListHeaderBinding import org.linphone.databinding.RecordingListCellBinding -import org.linphone.utils.HeaderAdapter -import org.linphone.utils.LifecycleListAdapter -import org.linphone.utils.LifecycleViewHolder -import org.linphone.utils.TimestampUtils +import org.linphone.utils.* class RecordingsListAdapter(val selectionViewModel: ListTopBarViewModel) : LifecycleListAdapter( RecordingDiffCallback() ), HeaderAdapter { + + val isVideoRecordingPlayingEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + + private lateinit var videoSurface: TextureView + + fun setVideoTextureView(textureView: TextureView) { + videoSurface = textureView + } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val binding: RecordingListCellBinding = DataBindingUtil.inflate( LayoutInflater.from(parent.context), @@ -72,6 +82,15 @@ class RecordingsListAdapter(val selectionViewModel: ListTopBarViewModel) : Lifec } } + recording.isVideoRecordingPlayingEvent.observe(this@ViewHolder, Observer { + it.consume { value -> + if (value) { + recording.setTextureView(videoSurface) + } + isVideoRecordingPlayingEvent.value = Event(value) + } + }) + executePendingBindings() } } 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 31d5af55c..d6b2c6d7e 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 @@ -21,6 +21,7 @@ package org.linphone.activities.main.recordings.fragments import android.os.Bundle import android.view.LayoutInflater +import android.view.MotionEvent import android.view.View import android.view.ViewGroup import androidx.lifecycle.Observer @@ -41,6 +42,9 @@ class RecordingsFragment : MasterFragment() { private lateinit var viewModel: RecordingsViewModel private lateinit var adapter: RecordingsListAdapter + private var videoX: Float = 0f + private var videoY: Float = 0f + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -83,6 +87,31 @@ class RecordingsFragment : MasterFragment() { binding.setBackClickListener { findNavController().popBackStack() } binding.setEditClickListener { listSelectionViewModel.isEditionEnabled.value = true } + + binding.setVideoTouchListener { v, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> { + videoX = v.x - event.rawX + videoY = v.y - event.rawY + } + MotionEvent.ACTION_MOVE -> { + v.animate().x(event.rawX + videoX).y(event.rawY + videoY).setDuration(0).start() + } + else -> { + v.performClick() + false + } + } + true + } + + adapter.isVideoRecordingPlayingEvent.observe(viewLifecycleOwner, Observer { + it.consume { value -> + viewModel.isVideoVisible.value = value + } + }) + + adapter.setVideoTextureView(binding.recordingVideoSurface) } override fun getItemCount(): Int { diff --git a/app/src/main/java/org/linphone/activities/main/recordings/viewmodels/RecordingViewModel.kt b/app/src/main/java/org/linphone/activities/main/recordings/viewmodels/RecordingViewModel.kt index 023d34bfc..c5c33fdaf 100644 --- a/app/src/main/java/org/linphone/activities/main/recordings/viewmodels/RecordingViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/recordings/viewmodels/RecordingViewModel.kt @@ -19,6 +19,8 @@ */ package org.linphone.activities.main.recordings.viewmodels +import android.graphics.SurfaceTexture +import android.view.TextureView import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -35,6 +37,7 @@ import org.linphone.core.AudioDevice import org.linphone.core.Player import org.linphone.core.PlayerListener import org.linphone.core.tools.Log +import org.linphone.utils.Event import org.linphone.utils.LinphoneUtils class RecordingViewModel(val path: String) : ViewModel(), Comparable { @@ -46,23 +49,17 @@ class RecordingViewModel(val path: String) : ViewModel(), Comparable() + val formattedDuration = MutableLiveData() + val formattedDate = MutableLiveData() val position = MutableLiveData() val formattedPosition = MutableLiveData() - val isPlaying = MutableLiveData() + val isVideoRecordingPlayingEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + private val tickerChannel = ticker(1000, 1000) private lateinit var player: Player @@ -82,23 +79,7 @@ class RecordingViewModel(val path: String) : ViewModel(), Comparable>() + val isVideoVisible = MutableLiveData() + init { getRecordings() + isVideoVisible.value = false } fun deleteRecordings(list: ArrayList) { diff --git a/app/src/main/res/layout/recordings_fragment.xml b/app/src/main/res/layout/recordings_fragment.xml index 0d866b964..9efd717e6 100644 --- a/app/src/main/res/layout/recordings_fragment.xml +++ b/app/src/main/res/layout/recordings_fragment.xml @@ -10,6 +10,9 @@ + @@ -85,6 +88,15 @@ android:gravity="center" android:text="@string/recordings_empty_list" /> + + \ No newline at end of file