From aa0255bcfdac6f798d77e2d8131e1c62335c5772 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 30 Jun 2025 13:40:50 +0200 Subject: [PATCH] Use read-only information from FriendList if any to hide edit/delete/mark as favortie buttons in contact details & contacts list long press menu --- .../contacts/fragment/ContactsListFragment.kt | 1 + .../ContactsListMenuDialogFragment.kt | 2 ++ .../main/contacts/model/ContactAvatarModel.kt | 2 ++ .../viewmodel/ContactNewOrEditViewModel.kt | 14 ++++++------- .../contacts/viewmodel/ContactViewModel.kt | 4 ++++ .../settings/viewmodel/CardDavViewModel.kt | 21 ++++++++++++------- app/src/main/res/layout/contact_fragment.xml | 16 +++++++------- .../layout/contacts_list_long_press_menu.xml | 7 +++++-- 8 files changed, 43 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt index 858fb1456..c0c6ca942 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt @@ -243,6 +243,7 @@ class ContactsListFragment : AbstractMainFragment() { val modalBottomSheet = ContactsListMenuDialogFragment( model.isFavourite.value == true, model.isStored, + isReadOnly = model.isReadOnly, { // onDismiss adapter.resetSelection() }, diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListMenuDialogFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListMenuDialogFragment.kt index 15ab357c3..497dbc9ca 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListMenuDialogFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListMenuDialogFragment.kt @@ -35,6 +35,7 @@ import org.linphone.databinding.ContactsListLongPressMenuBinding class ContactsListMenuDialogFragment( private val isFavourite: Boolean, private val isStored: Boolean, + private val isReadOnly: Boolean, private val onDismiss: (() -> Unit)? = null, private val onFavourite: (() -> Unit)? = null, private val onShare: (() -> Unit)? = null, @@ -70,6 +71,7 @@ class ContactsListMenuDialogFragment( val view = ContactsListLongPressMenuBinding.inflate(layoutInflater) view.isFavourite = isFavourite view.isStored = isStored + view.isReadOnly = isReadOnly view.setFavoriteClickListener { onFavourite?.invoke() diff --git a/app/src/main/java/org/linphone/ui/main/contacts/model/ContactAvatarModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/model/ContactAvatarModel.kt index 70edd275f..065d9a29a 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/model/ContactAvatarModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/model/ContactAvatarModel.kt @@ -51,6 +51,8 @@ class ContactAvatarModel val isStored = friend.inList() + val isReadOnly = friend.isReadOnly + val isFavourite = MutableLiveData() val lastPresenceInfo = MutableLiveData() diff --git a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt index 72aa17114..4f7d61800 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt @@ -152,14 +152,14 @@ class ContactNewOrEditViewModel } val name = if (fn.isNotEmpty() && ln.isNotEmpty()) { "$fn $ln" - } else if (fn.isNotEmpty()) { - fn - } else if (ln.isNotEmpty()) { - ln - } else if (organization.isNotEmpty()) { - organization } else { - "" + fn.ifEmpty { + ln.ifEmpty { + organization.ifEmpty { + "" + } + } + } } friend.edit() diff --git a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt index 5a16246b2..71c0c3154 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt @@ -91,6 +91,8 @@ class ContactViewModel val isStored = MutableLiveData() + val isReadOnly = MutableLiveData() + val chatDisabled = MutableLiveData() val videoCallDisabled = MutableLiveData() @@ -237,6 +239,7 @@ class ContactViewModel init { isStored.value = false + isReadOnly.value = false expandNumbersAndAddresses.value = true trustedDevicesPercentage.value = 0 @@ -312,6 +315,7 @@ class ContactViewModel // Do not show edit contact button for contacts not stored in a FriendList or // if they are in a temporary one (for example if they are from a remote directory such as LDAP or CardDAV) isStored.postValue(!coreContext.contactsManager.isContactTemporary(friend)) + isReadOnly.postValue(friend.isReadOnly) contact.value?.destroy() contact.postValue(ContactAvatarModel(friend)) diff --git a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/CardDavViewModel.kt b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/CardDavViewModel.kt index c4c26bdd8..46613f873 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/CardDavViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/CardDavViewModel.kt @@ -83,6 +83,19 @@ class CardDavViewModel syncInProgress.postValue(false) showGreenToast(R.string.settings_contacts_carddav_sync_successful_toast, R.drawable.check) + val name = displayName.value.orEmpty().trim() + if (storeNewContactsInIt.value == true) { + val previous = corePreferences.friendListInWhichStoreNewlyCreatedFriends + if (friendList.isReadOnly) { + Log.w("$TAG User asked to add newly created contacts in this friend list but it is read only, keep currently default friend list [$previous]") + } else { + Log.i( + "$TAG Updating default friend list to store newly created contacts from [$previous] to [$name]" + ) + corePreferences.friendListInWhichStoreNewlyCreatedFriends = name + } + } + Log.i("$TAG Notifying contacts manager that contacts have changed") coreContext.contactsManager.notifyContactsListChanged() @@ -231,13 +244,7 @@ class CardDavViewModel ) } - if (storeNewContactsInIt.value == true) { - val previous = corePreferences.friendListInWhichStoreNewlyCreatedFriends - Log.i( - "$TAG Updating default friend list to store newly created contacts from [$previous] to [$name]" - ) - corePreferences.friendListInWhichStoreNewlyCreatedFriends = name - } else if (storeNewContactsInIt.value == false) { + if (storeNewContactsInIt.value == false && corePreferences.friendListInWhichStoreNewlyCreatedFriends == name) { Log.i( "$TAG No longer using friend list [$name] as default friend list, switching back to [$LINPHONE_ADDRESS_BOOK_FRIEND_LIST]" ) diff --git a/app/src/main/res/layout/contact_fragment.xml b/app/src/main/res/layout/contact_fragment.xml index 797de7965..f8c9df179 100644 --- a/app/src/main/res/layout/contact_fragment.xml +++ b/app/src/main/res/layout/contact_fragment.xml @@ -64,7 +64,7 @@ android:layout_height="0dp" android:src="@drawable/pencil_simple" android:contentDescription="@string/content_description_contact_edit" - android:visibility="@{viewModel.isStored ? View.VISIBLE : View.GONE}" + android:visibility="@{viewModel.isStored && !viewModel.isReadOnly ? View.VISIBLE : View.GONE}" app:tint="?attr/color_main2_500" app:layout_constraintBottom_toBottomOf="@id/invisible_title" app:layout_constraintEnd_toEndOf="parent" @@ -510,7 +510,7 @@ android:text="@string/contact_details_edit" android:drawableStart="@drawable/pencil_simple" android:background="@drawable/action_background_top" - android:visibility="@{viewModel.isStored ? View.VISIBLE : View.GONE}" + android:visibility="@{viewModel.isStored && !viewModel.isReadOnly ? View.VISIBLE : View.GONE}" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/actions"/> @@ -524,7 +524,7 @@ android:layout_marginStart="16dp" android:layout_marginEnd="16dp" android:background="@drawable/action_background_middle" - android:visibility="@{viewModel.isStored ? View.VISIBLE : View.GONE}" + android:visibility="@{viewModel.isStored && !viewModel.isReadOnly ? View.VISIBLE : View.GONE}" android:text="@{viewModel.isFavourite ? @string/contact_details_remove_from_favourites : @string/contact_details_add_to_favourites, default=@string/contact_details_add_to_favourites}" android:drawableStart="@{viewModel.isFavourite ? @drawable/heart_fill : @drawable/heart, default=@drawable/heart_fill}" android:drawableTint="@{viewModel.isFavourite ? @color/danger_500 : @color/main2_500, default=@color/main2_500}" @@ -540,7 +540,7 @@ android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" - android:background="@{viewModel.isStored ? @drawable/action_background_middle : @drawable/action_background_full, default=@drawable/action_background_middle}" + android:background="@{viewModel.isStored && !viewModel.isReadOnly ? @drawable/action_background_middle : @drawable/action_background_full, default=@drawable/action_background_middle}" android:text="@string/contact_details_share" android:drawableStart="@drawable/share_network" app:layout_constraintStart_toStartOf="parent" @@ -558,7 +558,7 @@ android:background="@drawable/action_background_bottom" android:text="@string/contact_details_delete" android:drawableStart="@drawable/trash_simple" - android:visibility="@{viewModel.isStored ? View.VISIBLE : View.GONE}" + android:visibility="@{viewModel.isStored && !viewModel.isReadOnly ? View.VISIBLE : View.GONE}" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/action_share"/> @@ -569,7 +569,7 @@ android:layout_marginStart="16dp" android:layout_marginEnd="16dp" android:background="?attr/color_separator" - android:visibility="@{viewModel.isStored ? View.VISIBLE : View.GONE}" + android:visibility="@{viewModel.isStored && !viewModel.isReadOnly ? View.VISIBLE : View.GONE}" app:layout_constraintEnd_toEndOf="@id/action_edit" app:layout_constraintStart_toStartOf="@id/action_edit" app:layout_constraintTop_toBottomOf="@+id/action_edit"/> @@ -580,7 +580,7 @@ android:layout_marginStart="16dp" android:layout_marginEnd="16dp" android:background="?attr/color_separator" - android:visibility="@{viewModel.isStored ? View.VISIBLE : View.GONE}" + android:visibility="@{viewModel.isStored && !viewModel.isReadOnly ? View.VISIBLE : View.GONE}" app:layout_constraintEnd_toEndOf="@id/action_favorite" app:layout_constraintStart_toStartOf="@id/action_favorite" app:layout_constraintTop_toBottomOf="@+id/action_favorite"/> @@ -591,7 +591,7 @@ android:layout_marginStart="16dp" android:layout_marginEnd="16dp" android:background="?attr/color_separator" - android:visibility="@{viewModel.isStored ? View.VISIBLE : View.GONE}" + android:visibility="@{viewModel.isStored && !viewModel.isReadOnly ? View.VISIBLE : View.GONE}" app:layout_constraintEnd_toEndOf="@id/action_share" app:layout_constraintStart_toStartOf="@id/action_share" app:layout_constraintTop_toBottomOf="@+id/action_share"/> diff --git a/app/src/main/res/layout/contacts_list_long_press_menu.xml b/app/src/main/res/layout/contacts_list_long_press_menu.xml index 415527034..152a60981 100644 --- a/app/src/main/res/layout/contacts_list_long_press_menu.xml +++ b/app/src/main/res/layout/contacts_list_long_press_menu.xml @@ -22,6 +22,9 @@ +