From 5aaa174b20b2eb47afbf4c34ab57f8a275f9b027 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 23 Nov 2023 15:15:22 +0100 Subject: [PATCH] Improved conference call notification + new conference call log details layout --- app/src/main/assets/linphonerc_default | 5 +- app/src/main/assets/linphonerc_factory | 4 -- .../notifications/NotificationsManager.kt | 40 +++++++++------ .../fragment/HistoryContactFragment.kt | 10 +++- .../history/fragment/HistoryListFragment.kt | 17 ++++++- .../viewmodel/ContactHistoryViewModel.kt | 17 +++++++ .../res/layout/history_contact_fragment.xml | 49 +++++++++++++++++-- .../res/layout/history_contact_popup_menu.xml | 5 +- .../main/res/navigation/main_nav_graph.xml | 6 +++ 9 files changed, 126 insertions(+), 27 deletions(-) diff --git a/app/src/main/assets/linphonerc_default b/app/src/main/assets/linphonerc_default index 0905eca1d..a54b1b67a 100644 --- a/app/src/main/assets/linphonerc_default +++ b/app/src/main/assets/linphonerc_default @@ -24,6 +24,8 @@ size=vga tunnel=disabled auto_start=1 record_aware=1 +auto_download_incoming_voice_recordings=1 +auto_download_incoming_icalendars=1 [tunnel] host= @@ -34,6 +36,7 @@ log_collection_upload_server_url=https://www.linphone.org:444/lft.php file_transfer_server_url=https://www.linphone.org:444/lft.php version_check_url_root=https://www.linphone.org/releases max_calls=10 -conference_layout=1 +conference_layout=0 +hide_empty_chat_rooms=0 ## End of default rc diff --git a/app/src/main/assets/linphonerc_factory b/app/src/main/assets/linphonerc_factory index 0caf76dd7..1e6e02d4f 100644 --- a/app/src/main/assets/linphonerc_factory +++ b/app/src/main/assets/linphonerc_factory @@ -42,15 +42,11 @@ enable_simple_group_chat_message_state=0 aggregate_imdn=1 notify_each_friend_individually_when_presence_received=0 store_friends=0 -hide_empty_chat_rooms=0 [app] activation_code_length=4 prefer_basic_chat_room=1 record_aware=1 -auto_download_incoming_files_max_size=0 -auto_download_incoming_voice_recordings=1 -auto_download_incoming_icalendars=1 [account_creator] backend=1 diff --git a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt index cffd8e450..1697ed1d2 100644 --- a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt +++ b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt @@ -741,26 +741,38 @@ class NotificationsManager @MainThread constructor(private val context: Context) val declineIntent = getCallDeclinePendingIntent(notifiable) val answerIntent = getCallAnswerPendingIntent(notifiable) - val contact = - coreContext.contactsManager.findContactByAddress(call.remoteAddress) - val displayName = contact?.name ?: LinphoneUtils.getDisplayName(call.remoteAddress) + val remoteAddress = call.remoteAddress + val conference = call.conference + val isConference = conference != null - val person = getPerson(contact, displayName) - val caller = Person.Builder() - .setName(person.name) - .setIcon(person.icon) - .setUri(person.uri) - .setKey(person.key) - .setImportant(person.isImportant) - .build() + val caller = if (conference != null) { + val subject = conference.subject ?: LinphoneUtils.getDisplayName(remoteAddress) + Person.Builder() + .setName(subject) + .setIcon( + AvatarGenerator(context).setInitials(AppUtils.getInitials(subject)).buildIcon() + ) + .setImportant(false) + .build() + } else { + val contact = + coreContext.contactsManager.findContactByAddress(remoteAddress) + val displayName = contact?.name ?: LinphoneUtils.getDisplayName(remoteAddress) - val isVideo = if (isIncoming) { + getPerson(contact, displayName) + } + + val isVideo = if (isConference) { + true + } else if (isIncoming) { call.remoteParams?.isVideoEnabled ?: false } else { call.currentParams.isVideoEnabled } - val smallIcon = if (isVideo) { + val smallIcon = if (isConference) { + R.drawable.meeting + } else if (isVideo) { R.drawable.video_camera } else { R.drawable.phone @@ -789,7 +801,7 @@ class NotificationsManager @MainThread constructor(private val context: Context) } Log.i( - "Creating notification for ${if (isIncoming) "incoming" else "outgoing"} call with video ${if (isVideo) "enabled" else "disabled"} on channel [$channel]" + "Creating notification for ${if (isIncoming) "incoming" else "outgoing"} ${if (isConference) "conference" else "call"} with video ${if (isVideo) "enabled" else "disabled"} on channel [$channel]" ) val builder = NotificationCompat.Builder( diff --git a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryContactFragment.kt b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryContactFragment.kt index 6db0335b4..42c9e7e2f 100644 --- a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryContactFragment.kt @@ -154,6 +154,13 @@ class HistoryContactFragment : GenericFragment() { } } + viewModel.conferenceToJoinEvent.observe(viewLifecycleOwner) { + it.consume { conferenceUri -> + Log.i("$TAG Requesting to go to waiting room for conference URI [$conferenceUri]") + sharedViewModel.goToMeetingWaitingRoomEvent.value = Event(conferenceUri) + } + } + binding.setBackClickListener { goBack() } @@ -190,6 +197,7 @@ class HistoryContactFragment : GenericFragment() { ) popupView.contactExists = viewModel.callLogModel.value?.friendExists == true + popupView.isConferenceCallLog = viewModel.isConferenceCallLog.value == true popupView.setAddToContactsListener { sharedViewModel.sipAddressToAddToNewContact = viewModel.callLogModel.value?.displayedAddress.orEmpty() @@ -214,7 +222,7 @@ class HistoryContactFragment : GenericFragment() { popupView.setCopyNumberClickListener { popupWindow.dismiss() - copyNumberOrAddressToClipboard(viewModel.callLogModel.value?.displayedAddress.orEmpty()) + copyNumberOrAddressToClipboard(viewModel.callLogModel.value?.sipUri.orEmpty()) } // Elevation is for showing a shadow around the popup diff --git a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt index 34701b577..b6c2e1355 100644 --- a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt @@ -70,7 +70,9 @@ class HistoryListFragment : AbstractTopBarFragment() { } override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? { - if (findNavController().currentDestination?.id == R.id.startCallFragment) { + if (findNavController().currentDestination?.id == R.id.startCallFragment || + findNavController().currentDestination?.id == R.id.meetingWaitingRoomFragment + ) { // Holds fragment in place while new contact fragment slides over it return AnimationUtils.loadAnimation(activity, R.anim.hold) } @@ -206,6 +208,19 @@ class HistoryListFragment : AbstractTopBarFragment() { } } + sharedViewModel.goToMeetingWaitingRoomEvent.observe(viewLifecycleOwner) { + it.consume { uri -> + if (findNavController().currentDestination?.id == R.id.historyListFragment) { + Log.i("$TAG Navigating to meeting waiting room fragment with URI [$uri]") + val action = + HistoryListFragmentDirections.actionHistoryListFragmentToMeetingWaitingRoomFragment( + uri + ) + findNavController().navigate(action) + } + } + } + binding.setMenuClickListener { showPopupMenu() } diff --git a/app/src/main/java/org/linphone/ui/main/history/viewmodel/ContactHistoryViewModel.kt b/app/src/main/java/org/linphone/ui/main/history/viewmodel/ContactHistoryViewModel.kt index e9d2af23e..fa48b3efc 100644 --- a/app/src/main/java/org/linphone/ui/main/history/viewmodel/ContactHistoryViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/history/viewmodel/ContactHistoryViewModel.kt @@ -37,6 +37,8 @@ class ContactHistoryViewModel @UiThread constructor() : ViewModel() { val operationInProgress = MutableLiveData() + val isConferenceCallLog = MutableLiveData() + val callLogFoundEvent = MutableLiveData>() val chatRoomCreationErrorEvent: MutableLiveData> by lazy { @@ -47,6 +49,10 @@ class ContactHistoryViewModel @UiThread constructor() : ViewModel() { MutableLiveData>>() } + val conferenceToJoinEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + val historyDeletedEvent: MutableLiveData> by lazy { MutableLiveData>() } @@ -97,6 +103,8 @@ class ContactHistoryViewModel @UiThread constructor() : ViewModel() { address = model.address callLogModel.postValue(model) + isConferenceCallLog.postValue(callLog.wasConference()) + val peerAddress = if (callLog.dir == Call.Dir.Outgoing) callLog.toAddress else callLog.fromAddress val history = arrayListOf() val account = LinphoneUtils.getDefaultAccount() @@ -252,4 +260,13 @@ class ContactHistoryViewModel @UiThread constructor() : ViewModel() { } } } + + @UiThread + fun goToMeetingWaitingRoom() { + coreContext.postOnCoreThread { + if (::address.isInitialized) { + conferenceToJoinEvent.postValue(Event(address.asStringUriOnly())) + } + } + } } diff --git a/app/src/main/res/layout/history_contact_fragment.xml b/app/src/main/res/layout/history_contact_fragment.xml index 8cc2eaac2..bfeceb40f 100644 --- a/app/src/main/res/layout/history_contact_fragment.xml +++ b/app/src/main/res/layout/history_contact_fragment.xml @@ -81,6 +81,13 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> + + @@ -168,6 +176,7 @@ android:background="@drawable/circle_light_blue_button_background" android:padding="16dp" android:src="@drawable/phone" + android:visibility="@{viewModel.isConferenceCallLog ? View.GONE : View.VISIBLE}" app:tint="@color/gray_main2_500" app:layout_constraintEnd_toStartOf="@id/chat" app:layout_constraintStart_toStartOf="parent" @@ -182,6 +191,7 @@ android:layout_marginTop="8dp" android:text="@string/friend_call_action" android:textSize="14sp" + android:visibility="@{viewModel.isConferenceCallLog ? View.GONE : View.VISIBLE}" app:layout_constraintTop_toBottomOf="@id/call" app:layout_constraintStart_toStartOf="@id/call" app:layout_constraintEnd_toEndOf="@id/call"/> @@ -189,13 +199,13 @@ @@ -218,13 +228,13 @@ + + + + diff --git a/app/src/main/res/layout/history_contact_popup_menu.xml b/app/src/main/res/layout/history_contact_popup_menu.xml index f189e0ae2..fbebd2b52 100644 --- a/app/src/main/res/layout/history_contact_popup_menu.xml +++ b/app/src/main/res/layout/history_contact_popup_menu.xml @@ -21,6 +21,9 @@ + +