From ab6c3004de65c4e4f72b951bbdbc8f4ff92176a7 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 7 Sep 2022 16:22:52 +0200 Subject: [PATCH] Reworked how lifecyle owner is set on view stubs after being inflated, fixes voice messages UI not being updated when playing --- .../chat/fragments/DetailChatRoomFragment.kt | 13 ------ .../voip/fragments/ConferenceCallFragment.kt | 45 ------------------- .../voip/fragments/OutgoingCallFragment.kt | 7 --- .../voip/fragments/SingleCallFragment.kt | 27 ----------- .../org/linphone/utils/DataBindingUtils.kt | 12 +++-- .../voip_conference_active_speaker.xml | 3 +- .../res/layout-land/voip_conference_grid.xml | 3 +- app/src/main/res/layout-land/voip_numpad.xml | 3 +- ...age_conference_invitation_content_cell.xml | 3 +- ...message_downloadable_file_content_cell.xml | 3 +- ...chat_message_generic_file_content_cell.xml | 3 +- .../chat_message_image_content_cell.xml | 3 +- .../main/res/layout/chat_message_reply.xml | 3 +- .../chat_message_video_content_cell.xml | 3 +- ...chat_message_voice_record_content_cell.xml | 3 +- .../layout/chat_message_voice_recording.xml | 3 +- app/src/main/res/layout/voip_call_paused.xml | 3 +- .../res/layout/voip_call_paused_by_remote.xml | 3 +- app/src/main/res/layout/voip_call_stats.xml | 3 +- .../layout/voip_conference_active_speaker.xml | 3 +- .../res/layout/voip_conference_audio_only.xml | 3 +- .../main/res/layout/voip_conference_grid.xml | 3 +- .../res/layout/voip_conference_paused.xml | 3 +- app/src/main/res/layout/voip_numpad.xml | 3 +- 24 files changed, 46 insertions(+), 115 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt index cf759d7d6..10761d406 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt @@ -33,7 +33,6 @@ import androidx.core.content.ContextCompat import androidx.core.content.FileProvider import androidx.core.view.doOnPreDraw import androidx.databinding.DataBindingUtil -import androidx.databinding.ViewDataBinding import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.ItemTouchHelper @@ -678,18 +677,6 @@ class DetailChatRoomFragment : MasterFragment - Log.i("[Chat Room] Replying to message layout inflated") - val binding = DataBindingUtil.bind(inflated) - binding?.lifecycleOwner = viewLifecycleOwner - } - - binding.stubbedVoiceRecording.setOnInflateListener { _, inflated -> - Log.i("[Chat Room] Voice recording layout inflated") - val binding = DataBindingUtil.bind(inflated) - binding?.lifecycleOwner = viewLifecycleOwner - } } override fun deleteItems(indexesOfItemToDelete: ArrayList) { diff --git a/app/src/main/java/org/linphone/activities/voip/fragments/ConferenceCallFragment.kt b/app/src/main/java/org/linphone/activities/voip/fragments/ConferenceCallFragment.kt index eff1aefc9..ead02248e 100644 --- a/app/src/main/java/org/linphone/activities/voip/fragments/ConferenceCallFragment.kt +++ b/app/src/main/java/org/linphone/activities/voip/fragments/ConferenceCallFragment.kt @@ -30,8 +30,6 @@ import android.widget.Chronometer import android.widget.Toast import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintSet -import androidx.databinding.DataBindingUtil -import androidx.databinding.ViewDataBinding import androidx.navigation.navGraphViewModels import androidx.transition.AutoTransition import androidx.transition.TransitionManager @@ -252,49 +250,6 @@ class ConferenceCallFragment : GenericFragment - Log.i("[Conference Call] Active speaker conference layout inflated") - val binding = DataBindingUtil.bind(inflated) - binding?.lifecycleOwner = viewLifecycleOwner - startTimer(R.id.active_conference_timer) - - adjustActiveSpeakerLayout() - } - - binding.stubbedConferenceGridLayout.setOnInflateListener { _, inflated -> - Log.i("[Conference Call] Mosaic conference layout inflated") - val binding = DataBindingUtil.bind(inflated) - binding?.lifecycleOwner = viewLifecycleOwner - startTimer(R.id.active_conference_timer) - } - - binding.stubbedConferenceAudioOnlyLayout.setOnInflateListener { _, inflated -> - Log.i("[Conference Call] Audio only conference layout inflated") - val binding = DataBindingUtil.bind(inflated) - binding?.lifecycleOwner = viewLifecycleOwner - startTimer(R.id.active_conference_timer) - } - - binding.stubbedAudioRoutes.setOnInflateListener { _, inflated -> - val binding = DataBindingUtil.bind(inflated) - binding?.lifecycleOwner = viewLifecycleOwner - } - - binding.stubbedNumpad.setOnInflateListener { _, inflated -> - val binding = DataBindingUtil.bind(inflated) - binding?.lifecycleOwner = viewLifecycleOwner - } - - binding.stubbedCallStats.setOnInflateListener { _, inflated -> - val binding = DataBindingUtil.bind(inflated) - binding?.lifecycleOwner = viewLifecycleOwner - } - - binding.stubbedPausedConference.setOnInflateListener { _, inflated -> - val binding = DataBindingUtil.bind(inflated) - binding?.lifecycleOwner = viewLifecycleOwner - } } override fun onPause() { diff --git a/app/src/main/java/org/linphone/activities/voip/fragments/OutgoingCallFragment.kt b/app/src/main/java/org/linphone/activities/voip/fragments/OutgoingCallFragment.kt index 143681754..3b3997c43 100644 --- a/app/src/main/java/org/linphone/activities/voip/fragments/OutgoingCallFragment.kt +++ b/app/src/main/java/org/linphone/activities/voip/fragments/OutgoingCallFragment.kt @@ -23,8 +23,6 @@ import android.os.Bundle import android.os.SystemClock import android.view.View import android.widget.Chronometer -import androidx.databinding.DataBindingUtil -import androidx.databinding.ViewDataBinding import androidx.navigation.navGraphViewModels import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R @@ -84,10 +82,5 @@ class OutgoingCallFragment : GenericVideoPreviewFragment - val binding = DataBindingUtil.bind(inflated) - binding?.lifecycleOwner = viewLifecycleOwner - } } } diff --git a/app/src/main/java/org/linphone/activities/voip/fragments/SingleCallFragment.kt b/app/src/main/java/org/linphone/activities/voip/fragments/SingleCallFragment.kt index 9cece251b..57ecad8c5 100644 --- a/app/src/main/java/org/linphone/activities/voip/fragments/SingleCallFragment.kt +++ b/app/src/main/java/org/linphone/activities/voip/fragments/SingleCallFragment.kt @@ -26,8 +26,6 @@ import android.os.SystemClock import android.view.View import android.widget.Chronometer import androidx.constraintlayout.widget.ConstraintSet -import androidx.databinding.DataBindingUtil -import androidx.databinding.ViewDataBinding import androidx.navigation.navGraphViewModels import androidx.window.layout.FoldingFeature import org.linphone.LinphoneApplication.Companion.coreContext @@ -162,31 +160,6 @@ class SingleCallFragment : GenericVideoPreviewFragment - val binding = DataBindingUtil.bind(inflated) - binding?.lifecycleOwner = viewLifecycleOwner - } - - binding.stubbedNumpad.setOnInflateListener { _, inflated -> - val binding = DataBindingUtil.bind(inflated) - binding?.lifecycleOwner = viewLifecycleOwner - } - - binding.stubbedCallStats.setOnInflateListener { _, inflated -> - val binding = DataBindingUtil.bind(inflated) - binding?.lifecycleOwner = viewLifecycleOwner - } - - binding.stubbedPausedCall.setOnInflateListener { _, inflated -> - val binding = DataBindingUtil.bind(inflated) - binding?.lifecycleOwner = viewLifecycleOwner - } - - binding.stubbedRemotelyPausedCall.setOnInflateListener { _, inflated -> - val binding = DataBindingUtil.bind(inflated) - binding?.lifecycleOwner = viewLifecycleOwner - } } override fun onPause() { diff --git a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt index 031b2031e..0f32a97af 100644 --- a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt +++ b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt @@ -25,10 +25,7 @@ import android.content.Context import android.text.Editable import android.text.TextWatcher import android.util.Patterns -import android.view.LayoutInflater -import android.view.TextureView -import android.view.View -import android.view.ViewGroup +import android.view.* import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputMethodManager import android.widget.* @@ -228,6 +225,13 @@ fun setListener(view: SeekBar, lambda: (Any) -> Unit) { }) } +@BindingAdapter("inflatedLifecycleOwner") +fun setInflatedViewStubLifecycleOwner(view: View, enable: Boolean) { + val binding = DataBindingUtil.bind(view) + // This is a bit hacky... + binding?.lifecycleOwner = view.context as GenericActivity +} + @BindingAdapter("entries") fun setEntries( viewGroup: ViewGroup, diff --git a/app/src/main/res/layout-land/voip_conference_active_speaker.xml b/app/src/main/res/layout-land/voip_conference_active_speaker.xml index 45325bde4..7f22c0dcb 100644 --- a/app/src/main/res/layout-land/voip_conference_active_speaker.xml +++ b/app/src/main/res/layout-land/voip_conference_active_speaker.xml @@ -25,7 +25,8 @@ android:layout_height="match_parent" android:layout_margin="@{controlsViewModel.fullScreenMode || controlsViewModel.pipMode ? @dimen/margin_0dp : @dimen/voip_remote_margin, default=@dimen/voip_remote_margin}" android:paddingBottom="@{controlsViewModel.fullScreenMode || controlsViewModel.pipMode ? @dimen/margin_0dp : @dimen/voip_buttons_fragment_margin_size}" - android:visibility="@{inflatedVisibility}"> + android:visibility="@{inflatedVisibility}" + inflatedLifecycleOwner="@{true}"> + android:visibility="@{inflatedVisibility}" + inflatedLifecycleOwner="@{true}"> + android:visibility="@{inflatedVisibility}" + inflatedLifecycleOwner="@{true}"> + android:visibility="@{inflatedVisibility}" + inflatedLifecycleOwner="@{true}"> + android:visibility="@{inflatedVisibility}" + inflatedLifecycleOwner="@{true}"> + android:visibility="@{inflatedVisibility}" + inflatedLifecycleOwner="@{true}"> + android:visibility="@{inflatedVisibility}" + inflatedLifecycleOwner="@{true}"> + android:visibility="@{inflatedVisibility}" + inflatedLifecycleOwner="@{true}"> + android:visibility="@{inflatedVisibility}" + inflatedLifecycleOwner="@{true}"> + android:visibility="@{inflatedVisibility}" + inflatedLifecycleOwner="@{true}"> + android:visibility="@{inflatedVisibility}" + inflatedLifecycleOwner="@{true}"> + android:visibility="@{inflatedVisibility}" + inflatedLifecycleOwner="@{true}"> + android:visibility="@{inflatedVisibility}" + inflatedLifecycleOwner="@{true}"> + android:visibility="@{inflatedVisibility}" + inflatedLifecycleOwner="@{true}"> + android:visibility="@{inflatedVisibility}" + inflatedLifecycleOwner="@{true}"> + android:visibility="@{inflatedVisibility}" + inflatedLifecycleOwner="@{true}"> + android:visibility="@{inflatedVisibility}" + inflatedLifecycleOwner="@{true}"> + android:visibility="@{inflatedVisibility}" + inflatedLifecycleOwner="@{true}"> + android:visibility="@{inflatedVisibility}" + inflatedLifecycleOwner="@{true}">