From 14d1726a7f876507a8eeb51b58ff44d5f011e171 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 22 Aug 2023 11:05:42 +0200 Subject: [PATCH] Disable save contact if no firstname or lastname is set + when adding contact from call history, pre-propulate SIP address --- .../assets/assistant_linphone_default_values | 4 ++++ app/src/main/assets/linphonerc_default | 1 - .../ui/main/calls/fragment/CallFragment.kt | 1 + .../contacts/fragment/NewContactFragment.kt | 9 +++++++++ .../viewmodel/ContactNewOrEditViewModel.kt | 20 ++++++++++++++++++- .../contacts/viewmodel/ContactViewModel.kt | 7 ++++++- .../ui/main/viewmodel/SharedMainViewModel.kt | 2 ++ .../org/linphone/utils/DataBindingUtils.kt | 3 ++- .../main/res/color/primary_color_selector.xml | 5 +++++ .../layout/contact_new_or_edit_fragment.xml | 3 ++- 10 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 app/src/main/res/color/primary_color_selector.xml diff --git a/app/src/main/assets/assistant_linphone_default_values b/app/src/main/assets/assistant_linphone_default_values index 7a72cd0c8..613e3109c 100644 --- a/app/src/main/assets/assistant_linphone_default_values +++ b/app/src/main/assets/assistant_linphone_default_values @@ -26,6 +26,10 @@ stun.linphone.org stun,ice +
+ zrtp + 1 +
1
diff --git a/app/src/main/assets/linphonerc_default b/app/src/main/assets/linphonerc_default index a130e00e2..0905eca1d 100644 --- a/app/src/main/assets/linphonerc_default +++ b/app/src/main/assets/linphonerc_default @@ -34,7 +34,6 @@ 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 -history_max_size=100 conference_layout=1 ## End of default rc diff --git a/app/src/main/java/org/linphone/ui/main/calls/fragment/CallFragment.kt b/app/src/main/java/org/linphone/ui/main/calls/fragment/CallFragment.kt index 69703d064..156547ee3 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/fragment/CallFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/fragment/CallFragment.kt @@ -139,6 +139,7 @@ class CallFragment : GenericFragment() { popupView.setAddToContactsListener { // TODO: go to new contact fragment + sharedViewModel.sipAddressToAddToNewContact = viewModel.callLogModel.value?.displayedAddress.orEmpty() sharedViewModel.navigateToContactsEvent.value = Event(true) sharedViewModel.showNewContactEvent.value = Event(true) popupWindow.dismiss() diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt index 59afbadd5..69245e7e9 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt @@ -34,6 +34,7 @@ import androidx.navigation.fragment.findNavController import androidx.navigation.navGraphViewModels import kotlinx.coroutines.launch import org.linphone.BR +import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.ContactNewOrEditFragmentBinding @@ -98,6 +99,14 @@ class NewContactFragment : GenericFragment() { viewModel.findFriendByRefKey("") + val addressToAdd = sharedViewModel.sipAddressToAddToNewContact + if (addressToAdd.isNotEmpty()) { + sharedViewModel.sipAddressToAddToNewContact = "" + coreContext.postOnCoreThread { + viewModel.addSipAddress(addressToAdd) + } + } + binding.setBackClickListener { val model = ConfirmationDialogModel() val dialog = DialogUtils.getCancelContactChangesConfirmationDialog( 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 c22eaef66..c91bc36be 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 @@ -21,6 +21,7 @@ package org.linphone.ui.main.contacts.viewmodel import androidx.annotation.UiThread import androidx.annotation.WorkerThread +import androidx.lifecycle.MediatorLiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext @@ -54,6 +55,8 @@ class ContactNewOrEditViewModel @UiThread constructor() : ViewModel() { val jobTitle = MutableLiveData() + val saveButtonEnabled = MediatorLiveData() + val saveChangesEvent: MutableLiveData> by lazy { MutableLiveData>() } @@ -64,6 +67,16 @@ class ContactNewOrEditViewModel @UiThread constructor() : ViewModel() { val removeNewNumberOrAddressFieldEvent = MutableLiveData>() + init { + saveButtonEnabled.value = isSaveButtonEnabled() + saveButtonEnabled.addSource(firstName) { + saveButtonEnabled.value = isSaveButtonEnabled() + } + saveButtonEnabled.addSource(lastName) { + saveButtonEnabled.value = isSaveButtonEnabled() + } + } + @UiThread fun findFriendByRefKey(refKey: String?) { coreContext.postOnCoreThread { core -> @@ -179,7 +192,7 @@ class ContactNewOrEditViewModel @UiThread constructor() : ViewModel() { } @WorkerThread - private fun addSipAddress(address: String = "", requestFieldToBeAddedInUi: Boolean = false) { + fun addSipAddress(address: String = "", requestFieldToBeAddedInUi: Boolean = false) { val newModel = NewOrEditNumberOrAddressModel(address, true, { if (address.isEmpty()) { addSipAddress(requestFieldToBeAddedInUi = true) @@ -219,4 +232,9 @@ class ContactNewOrEditViewModel @UiThread constructor() : ViewModel() { } removeNewNumberOrAddressFieldEvent.value = Event(model) } + + @UiThread + private fun isSaveButtonEnabled(): Boolean { + return firstName.value.orEmpty().isNotEmpty() || lastName.value.orEmpty().isNotEmpty() + } } 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 a0bbe659a..2c2232f4d 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 @@ -37,6 +37,7 @@ import org.linphone.ui.main.contacts.model.ContactNumberOrAddressModel import org.linphone.ui.main.model.isInSecureMode import org.linphone.utils.Event import org.linphone.utils.FileUtils +import org.linphone.utils.PhoneNumberUtils class ContactViewModel @UiThread constructor() : ViewModel() { companion object { @@ -165,13 +166,17 @@ class ContactViewModel @UiThread constructor() : ViewModel() { // phone numbers are disabled is secure mode val enablePhoneNumbers = core.defaultAccount?.isInSecureMode() != true val address = core.interpretUrl(number.phoneNumber, true) + val label = PhoneNumberUtils.vcardParamStringToAddressBookLabel( + coreContext.context.resources, + number.label ?: "" + ) val data = ContactNumberOrAddressModel( address, number.phoneNumber, enablePhoneNumbers, listener, false, - label = number.label.orEmpty() + label ) addressesAndNumbers.add(data) } diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt index 9384dd5df..0f1297adc 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt @@ -67,6 +67,8 @@ class SharedMainViewModel @UiThread constructor() : ViewModel() { MutableLiveData>() } + var sipAddressToAddToNewContact: String = "" + /* Call logs related */ val showCallLogEvent: MutableLiveData> by lazy { diff --git a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt index 90f76f375..8c8f59972 100644 --- a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt +++ b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt @@ -28,6 +28,7 @@ import android.view.ViewGroup import android.view.Window import android.view.inputmethod.InputMethodManager import android.widget.ImageView +import androidx.annotation.ColorInt import androidx.annotation.UiThread import androidx.appcompat.widget.AppCompatEditText import androidx.appcompat.widget.AppCompatTextView @@ -148,7 +149,7 @@ fun AppCompatTextView.setTypeface(typeface: Int) { @UiThread @BindingAdapter("android:drawableTint") -fun AppCompatTextView.setDrawableTint(color: Int) { +fun AppCompatTextView.setDrawableTint(@ColorInt color: Int) { for (drawable in compoundDrawablesRelative) { drawable?.setTint(color) } diff --git a/app/src/main/res/color/primary_color_selector.xml b/app/src/main/res/color/primary_color_selector.xml new file mode 100644 index 000000000..4dadd96c4 --- /dev/null +++ b/app/src/main/res/color/primary_color_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/contact_new_or_edit_fragment.xml b/app/src/main/res/layout/contact_new_or_edit_fragment.xml index 35a60926c..d419e4b62 100644 --- a/app/src/main/res/layout/contact_new_or_edit_fragment.xml +++ b/app/src/main/res/layout/contact_new_or_edit_fragment.xml @@ -58,7 +58,8 @@ android:layout_marginEnd="10dp" android:padding="5dp" android:src="@drawable/check" - app:tint="@color/primary_color" + android:enabled="@{viewModel.saveButtonEnabled}" + app:tint="@color/primary_color_selector" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="@id/title" app:layout_constraintTop_toTopOf="@id/title" />