diff --git a/app/src/main/java/org/linphone/contacts/ContactsManager.kt b/app/src/main/java/org/linphone/contacts/ContactsManager.kt index 0e7e46618..1c45e9513 100644 --- a/app/src/main/java/org/linphone/contacts/ContactsManager.kt +++ b/app/src/main/java/org/linphone/contacts/ContactsManager.kt @@ -106,6 +106,7 @@ class ContactsManager @UiThread constructor(context: Context) { try { listeners.add(listener) } catch (cme: ConcurrentModificationException) { + Log.e("$TAG Can't add listener: $cme") } } } @@ -118,6 +119,7 @@ class ContactsManager @UiThread constructor(context: Context) { try { listeners.remove(listener) } catch (cme: ConcurrentModificationException) { + Log.e("$TAG Can't remove listener: $cme") } } } @@ -157,16 +159,30 @@ class ContactsManager @UiThread constructor(context: Context) { clonedAddress.clean() val sipUri = clonedAddress.asStringUriOnly() - Log.d("$TAG Looking for friend with address [$sipUri]") + Log.d("$TAG Looking for friend with SIP URI [$sipUri]") val username = clonedAddress.username val found = coreContext.core.findFriend(clonedAddress) - return found ?: if (!username.isNullOrEmpty() && username.startsWith("+")) { + return if (found != null) { + Log.i("$TAG Friend [${found.name}] was found using SIP URI [$sipUri]") + found + } else if (!username.isNullOrEmpty() && username.startsWith("+")) { Log.i("$TAG Looking for friend with phone number [$username]") - val foundUsingPhoneNumber = coreContext.core.findFriendByPhoneNumber( - username - ) - foundUsingPhoneNumber ?: findNativeContact(sipUri, true, username) + val foundUsingPhoneNumber = coreContext.core.findFriendByPhoneNumber(username) + if (foundUsingPhoneNumber != null) { + Log.i( + "$TAG Friend [${foundUsingPhoneNumber.name}] was found using phone number [$username]" + ) + foundUsingPhoneNumber + } else { + Log.i( + "$TAG Friend wasn't found using phone number [$username], looking in native address book directly" + ) + findNativeContact(sipUri, true, username) + } } else { + Log.i( + "$TAG Friend wasn't found using SIP URI [$sipUri] and username [$username] isn't a phone number, looking in native address book directly" + ) findNativeContact(sipUri, false) } } 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 c40fd5c86..a37cedb42 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 @@ -42,6 +42,7 @@ import org.linphone.ui.main.chat.model.ParticipantModel import org.linphone.ui.main.chat.viewmodel.ConversationInfoViewModel import org.linphone.ui.main.fragment.GenericFragment import org.linphone.utils.DialogUtils +import org.linphone.utils.Event @UiThread class ConversationInfoFragment : GenericFragment() { @@ -212,6 +213,9 @@ class ConversationInfoFragment : GenericFragment() { val address = participantModel.sipUri val isAdmin = participantModel.isParticipantAdmin popupView.isParticipantAdmin = isAdmin + popupView.isMeAdmin = participantModel.isMyselfAdmin + val friendRefKey = participantModel.avatarModel.friend.refKey + popupView.isParticipantContact = !friendRefKey.isNullOrEmpty() popupView.setRemoveParticipantClickListener { Log.w("$TAG Trying to remove participant [$address]") @@ -231,6 +235,26 @@ class ConversationInfoFragment : GenericFragment() { popupWindow.dismiss() } + popupView.setSeeContactProfileClickListener { + Log.w("$TAG Trying to display participant [$address] contact page") + if (!friendRefKey.isNullOrEmpty()) { + sharedViewModel.navigateToContactsEvent.value = Event(true) + sharedViewModel.showContactEvent.value = Event(friendRefKey) + } else { + Log.e("$TAG Can't go to contact page, friend ref key is null or empty!") + // TODO: show toast + } + popupWindow.dismiss() + } + + popupView.setAddToContactsClickListener { + Log.w("$TAG Trying to add participant [${participantModel.sipUri}] to contacts") + sharedViewModel.sipAddressToAddToNewContact = participantModel.sipUri + sharedViewModel.navigateToContactsEvent.value = Event(true) + sharedViewModel.showNewContactEvent.value = Event(true) + popupWindow.dismiss() + } + // Elevation is for showing a shadow around the popup popupWindow.elevation = 20f popupWindow.showAsDropDown(view, 0, 0, Gravity.BOTTOM) diff --git a/app/src/main/res/layout/chat_participant_admin_popup_menu.xml b/app/src/main/res/layout/chat_participant_admin_popup_menu.xml index 7e2c92958..fd73c9fb7 100644 --- a/app/src/main/res/layout/chat_participant_admin_popup_menu.xml +++ b/app/src/main/res/layout/chat_participant_admin_popup_menu.xml @@ -9,15 +9,27 @@ + + + + + + + + @@ -73,7 +141,7 @@ android:layout_marginEnd="20dp" android:layout_marginTop="16dp" android:background="@color/gray_main2_400" - android:visibility="gone" + android:visibility="@{isMeAdmin ? View.VISIBLE : View.GONE}" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/unset_admin" @@ -83,21 +151,35 @@ style="@style/default_text_style" android:id="@+id/remove_participant" android:onClick="@{removeParticipantClickListener}" - android:layout_width="wrap_content" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="16dp" - android:layout_marginBottom="16dp" - android:paddingEnd="20dp" - android:paddingStart="20dp" + android:layout_marginStart="20dp" + android:layout_marginEnd="20dp" android:text="@string/conversation_info_admin_menu_remove_participant" android:textSize="14sp" android:textColor="@color/red_danger_500" + android:maxLines="1" + android:ellipsize="end" + android:visibility="@{isMeAdmin ? View.VISIBLE : View.GONE}" android:drawableStart="@drawable/trash_simple" android:drawablePadding="5dp" app:drawableTint="@color/red_danger_500" + app:layout_constraintHorizontal_bias="0" app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/separator" - app:layout_constraintBottom_toBottomOf="parent"/> + app:layout_constraintBottom_toTopOf="@id/bottom_anchor"/> + + diff --git a/app/src/main/res/layout/chat_participant_list_cell.xml b/app/src/main/res/layout/chat_participant_list_cell.xml index 3437a2e47..4a5bd4385 100644 --- a/app/src/main/res/layout/chat_participant_list_cell.xml +++ b/app/src/main/res/layout/chat_participant_list_cell.xml @@ -16,7 +16,7 @@ android:onClick="@{() -> model.onClicked()}" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@drawable/primary_cell_background" + android:background="@color/white" android:layout_marginStart="16dp" android:layout_marginEnd="16dp"> @@ -87,7 +87,6 @@ android:layout_width="@dimen/icon_size" android:layout_height="@dimen/icon_size" android:src="@drawable/dots_three_vertical" - android:visibility="@{model.isMyselfAdmin ? View.VISIBLE : View.GONE}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/name" app:layout_constraintTop_toTopOf="parent" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 03afe2024..784d14fc1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -370,6 +370,8 @@ Remove from the group Give admin rights Remove admin rights + See contact profile + Add to contacts You have joined the group You have left the group