From e0c58c0ac50f695e468d32b9a64d723bcdf5dd83 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 10 Dec 2024 13:56:32 +0100 Subject: [PATCH] Added menu to go to shared media/documents from conversation details, only startPostponedEnterTransition() in doOnPreDraw for RecyclerView fragments --- .../model/ConferenceParticipantDeviceModel.kt | 4 +- .../viewmodel/ConferenceViewModel.kt | 2 +- .../ConversationDocumentsListFragment.kt | 5 +- .../chat/fragment/ConversationInfoFragment.kt | 39 ++++++--- .../fragment/ConversationMediaListFragment.kt | 5 +- .../main/contacts/fragment/ContactFragment.kt | 7 +- .../contacts/fragment/EditContactFragment.kt | 6 +- .../main/history/fragment/HistoryFragment.kt | 13 +-- .../main/meetings/fragment/MeetingFragment.kt | 9 +- .../fragment/MeetingWaitingRoomFragment.kt | 9 +- .../fragment/AccountProfileFragment.kt | 7 +- .../viewmodel/AddressSelectionViewModel.kt | 2 +- .../main/res/layout/chat_info_fragment.xml | 84 +++++++++++++++++-- .../main/res/navigation/chat_nav_graph.xml | 16 ++++ app/src/main/res/values/strings.xml | 3 +- 15 files changed, 141 insertions(+), 70 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/call/conference/model/ConferenceParticipantDeviceModel.kt b/app/src/main/java/org/linphone/ui/call/conference/model/ConferenceParticipantDeviceModel.kt index dfd7a6a44..18cb90ceb 100644 --- a/app/src/main/java/org/linphone/ui/call/conference/model/ConferenceParticipantDeviceModel.kt +++ b/app/src/main/java/org/linphone/ui/call/conference/model/ConferenceParticipantDeviceModel.kt @@ -136,7 +136,7 @@ class ConferenceParticipantDeviceModel screenSharing: Boolean ) { Log.i( - "$TAG Participant device [${participantDevice.address.asStringUriOnly()}] is ${if (screenSharing) "sharing it's screen" else "no longer sharing it's screen"}" + "$TAG Participant device [${participantDevice.address.asStringUriOnly()}] is ${if (screenSharing) "sharing its screen" else "no longer sharing its screen"}" ) isScreenSharing.postValue(screenSharing) } @@ -193,7 +193,7 @@ class ConferenceParticipantDeviceModel val screenSharing = device.isScreenSharingEnabled isScreenSharing.postValue(screenSharing) if (screenSharing) { - Log.i("$TAG Participant [${device.address.asStringUriOnly()}] is sharing it's screen") + Log.i("$TAG Participant [${device.address.asStringUriOnly()}] is sharing its screen") } isVideoAvailable.postValue(device.getStreamAvailability(StreamType.Video)) diff --git a/app/src/main/java/org/linphone/ui/call/conference/viewmodel/ConferenceViewModel.kt b/app/src/main/java/org/linphone/ui/call/conference/viewmodel/ConferenceViewModel.kt index c904141bf..dd6bf072d 100644 --- a/app/src/main/java/org/linphone/ui/call/conference/viewmodel/ConferenceViewModel.kt +++ b/app/src/main/java/org/linphone/ui/call/conference/viewmodel/ConferenceViewModel.kt @@ -316,7 +316,7 @@ class ConferenceViewModel conferenceLayout.postValue(currentLayout) if (currentLayout == GRID_LAYOUT && screenSharing) { Log.w( - "$TAG Conference has a participant sharing it's screen, changing layout from mosaic to active speaker" + "$TAG Conference has a participant sharing its screen, changing layout from mosaic to active speaker" ) setNewLayout(ACTIVE_SPEAKER_LAYOUT) } diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationDocumentsListFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationDocumentsListFragment.kt index 3454cc767..bf6b4cc96 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationDocumentsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationDocumentsListFragment.kt @@ -27,7 +27,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread -import androidx.core.view.doOnPreDraw import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs @@ -117,9 +116,7 @@ class ConversationDocumentsListFragment : SlidingPaneChildFragment() { viewModel.chatRoomFoundEvent.observe(viewLifecycleOwner) { it.consume { - (view.parent as? ViewGroup)?.doOnPreDraw { - startPostponedEnterTransition() - } + startPostponedEnterTransition() } } diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt index 44044353d..966ae0f57 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt @@ -29,7 +29,6 @@ import android.view.View import android.view.ViewGroup import android.widget.PopupWindow import androidx.annotation.UiThread -import androidx.core.view.doOnPreDraw import androidx.databinding.DataBindingUtil import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController @@ -119,19 +118,15 @@ class ConversationInfoFragment : SlidingPaneChildFragment() { Log.i( "$TAG Found matching conversation for local SIP URI [$localSipUri] and remote SIP URI [$remoteSipUri]" ) - (view.parent as? ViewGroup)?.doOnPreDraw { - startPostponedEnterTransition() - } + startPostponedEnterTransition() } else { - (view.parent as? ViewGroup)?.doOnPreDraw { - Log.e("$TAG Failed to find conversation, going back") - goBack() - val message = getString(R.string.conversation_to_display_no_found_toast) - (requireActivity() as GenericActivity).showRedToast( - message, - R.drawable.warning_circle - ) - } + Log.e("$TAG Failed to find conversation, going back") + goBack() + val message = getString(R.string.conversation_to_display_no_found_toast) + (requireActivity() as GenericActivity).showRedToast( + message, + R.drawable.warning_circle + ) } } } @@ -333,6 +328,24 @@ class ConversationInfoFragment : SlidingPaneChildFragment() { binding.setCopyPeerSipUriClickListener { copyAddressToClipboard(viewModel.peerSipUri.value.orEmpty()) } + + binding.setGoToSharedMediaClickListener { + if (findNavController().currentDestination?.id == R.id.conversationInfoFragment) { + Log.i("$TAG Going to shared media fragment") + val action = + ConversationInfoFragmentDirections.actionConversationInfoFragmentToConversationMediaListFragment(localSipUri, remoteSipUri) + findNavController().navigate(action) + } + } + + binding.setGoToSharedDocumentsClickListener { + if (findNavController().currentDestination?.id == R.id.conversationInfoFragment) { + Log.i("$TAG Going to shared documents fragment") + val action = + ConversationInfoFragmentDirections.actionConversationInfoFragmentToConversationDocumentsListFragment(localSipUri, remoteSipUri) + findNavController().navigate(action) + } + } } private fun showParticipantAdminPopupMenu(view: View, participantModel: ParticipantModel) { diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationMediaListFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationMediaListFragment.kt index 3370ccb6f..4ae642f08 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationMediaListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationMediaListFragment.kt @@ -27,7 +27,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread -import androidx.core.view.doOnPreDraw import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs @@ -146,9 +145,7 @@ class ConversationMediaListFragment : SlidingPaneChildFragment() { viewModel.chatRoomFoundEvent.observe(viewLifecycleOwner) { it.consume { - (view.parent as? ViewGroup)?.doOnPreDraw { - startPostponedEnterTransition() - } + startPostponedEnterTransition() } } diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt index 64918e7f3..c75728cf0 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt @@ -32,7 +32,6 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread import androidx.core.content.FileProvider -import androidx.core.view.doOnPreDraw import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs @@ -125,10 +124,8 @@ class ContactFragment : SlidingPaneChildFragment() { viewModel.contactFoundEvent.observe(viewLifecycleOwner) { it.consume { Log.i("$TAG Contact has been found, start postponed enter transition") - (view.parent as? ViewGroup)?.doOnPreDraw { - startPostponedEnterTransition() - sharedViewModel.openSlidingPaneEvent.value = Event(true) - } + startPostponedEnterTransition() + sharedViewModel.openSlidingPaneEvent.value = Event(true) } } diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt index 4ce286347..de681b115 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt @@ -28,7 +28,6 @@ import androidx.activity.OnBackPressedCallback import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.UiThread -import androidx.core.view.doOnPreDraw import androidx.databinding.DataBindingUtil import androidx.databinding.ViewDataBinding import androidx.lifecycle.lifecycleScope @@ -164,10 +163,7 @@ class EditContactFragment : SlidingPaneChildFragment() { for (items in viewModel.phoneNumbers) { addCell(items) } - - (view.parent as? ViewGroup)?.doOnPreDraw { - startPostponedEnterTransition() - } + startPostponedEnterTransition() } } } diff --git a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryFragment.kt b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryFragment.kt index 395ea84c4..6a77a4533 100644 --- a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryFragment.kt @@ -29,7 +29,6 @@ import android.view.View import android.view.ViewGroup import android.widget.PopupWindow import androidx.annotation.UiThread -import androidx.core.view.doOnPreDraw import androidx.databinding.DataBindingUtil import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController @@ -112,15 +111,11 @@ class HistoryFragment : SlidingPaneChildFragment() { Log.i( "$TAG Found matching call log for call ID [$callId]" ) - (view.parent as? ViewGroup)?.doOnPreDraw { - startPostponedEnterTransition() - sharedViewModel.openSlidingPaneEvent.value = Event(true) - } + startPostponedEnterTransition() + sharedViewModel.openSlidingPaneEvent.value = Event(true) } else { - (view.parent as? ViewGroup)?.doOnPreDraw { - Log.e("$TAG Failed to find call log, going back") - goBack() - } + Log.e("$TAG Failed to find call log, going back") + goBack() } } } diff --git a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingFragment.kt index cf7000753..1e6fec22f 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingFragment.kt @@ -32,7 +32,6 @@ import android.view.View import android.view.ViewGroup import android.widget.PopupWindow import androidx.annotation.UiThread -import androidx.core.view.doOnPreDraw import androidx.databinding.DataBindingUtil import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController @@ -165,14 +164,10 @@ class MeetingFragment : SlidingPaneChildFragment() { viewModel.conferenceInfoFoundEvent.observe(viewLifecycleOwner) { it.consume { found -> if (found) { - (view.parent as? ViewGroup)?.doOnPreDraw { - startPostponedEnterTransition() - } + startPostponedEnterTransition() } else { Log.e("$TAG Failed to find meeting with URI [$uri], going back") - (view.parent as? ViewGroup)?.doOnPreDraw { - goBack() - } + goBack() } } } diff --git a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingWaitingRoomFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingWaitingRoomFragment.kt index 41832d3bf..acdeff2c7 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingWaitingRoomFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingWaitingRoomFragment.kt @@ -28,7 +28,6 @@ import android.view.ViewGroup import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.UiThread import androidx.core.content.ContextCompat -import androidx.core.view.doOnPreDraw import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs @@ -116,14 +115,10 @@ class MeetingWaitingRoomFragment : GenericMainFragment() { viewModel.conferenceInfoFoundEvent.observe(viewLifecycleOwner) { it.consume { found -> if (found) { - (view.parent as? ViewGroup)?.doOnPreDraw { - startPostponedEnterTransition() - } + startPostponedEnterTransition() } else { Log.e("$TAG Failed to find meeting with URI [$uri], going back") - (view.parent as? ViewGroup)?.doOnPreDraw { - goBack() - } + goBack() } } } diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt index 3d5822ea0..012943494 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt @@ -31,7 +31,6 @@ import android.widget.ArrayAdapter import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.UiThread -import androidx.core.view.doOnPreDraw import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs @@ -194,10 +193,8 @@ class AccountProfileFragment : GenericMainFragment() { viewModel.accountFoundEvent.observe(viewLifecycleOwner) { it.consume { found -> if (found) { - (view.parent as? ViewGroup)?.doOnPreDraw { - startPostponedEnterTransition() - setupDialPlanPicker() - } + startPostponedEnterTransition() + setupDialPlanPicker() } else { Log.e( "$TAG Failed to find an account matching this identity address [$identity]" diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/AddressSelectionViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/AddressSelectionViewModel.kt index ed2efc56e..9cfbdc00a 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/AddressSelectionViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/AddressSelectionViewModel.kt @@ -129,7 +129,7 @@ abstract class AddressSelectionViewModel @UiThread fun switchToMultipleSelectionMode() { - Log.i("$$TAG Multiple selection mode ON") + Log.i("$TAG Multiple selection mode ON") multipleSelectionMode.value = true selectionCount.postValue( diff --git a/app/src/main/res/layout/chat_info_fragment.xml b/app/src/main/res/layout/chat_info_fragment.xml index d998bbd6b..68a6eab6b 100644 --- a/app/src/main/res/layout/chat_info_fragment.xml +++ b/app/src/main/res/layout/chat_info_fragment.xml @@ -33,6 +33,12 @@ + + @@ -340,6 +346,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" + android:layout_marginBottom="10dp" android:background="@drawable/tertiary_button_background" android:drawableStart="@drawable/plus_circle" android:drawablePadding="8dp" @@ -354,11 +361,79 @@ android:text="@string/conversation_info_add_participants_label" android:visibility="@{!viewModel.expandParticipants || !viewModel.isMyselfAdmin || !viewModel.isGroup || viewModel.isReadOnly ? View.GONE : View.VISIBLE, default=gone}" app:drawableTint="?attr/color_main1_500" - app:layout_constraintBottom_toTopOf="@id/actions" + app:layout_constraintBottom_toTopOf="@id/media_actions" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/participants" /> + + + + + + + + + + + app:layout_constraintTop_toBottomOf="@id/media_actions_background" /> + app:layout_constraintTop_toBottomOf="@id/action_leave_group" /> diff --git a/app/src/main/res/navigation/chat_nav_graph.xml b/app/src/main/res/navigation/chat_nav_graph.xml index dcf50e0ae..0d5b0acb8 100644 --- a/app/src/main/res/navigation/chat_nav_graph.xml +++ b/app/src/main/res/navigation/chat_nav_graph.xml @@ -101,6 +101,22 @@ app:exitAnim="@anim/slide_out_left" app:popEnterAnim="@anim/slide_in_left" app:popExitAnim="@anim/slide_out_right" /> + + Trust No device found… Number of trusted devices: + Media & documents Other actions Edit Add to favourites @@ -726,7 +727,7 @@ Participant was kicked out of conference Joining… Paused - is sharing it\'s screen + is sharing its screen Invalid SIP address, can\'t be added to conference Mosaic