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 5100400ac..7c64b2e6d 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 @@ -4,6 +4,8 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.ArrayAdapter import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.UiThread @@ -55,6 +57,19 @@ class AccountProfileFragment : GenericFragment() { } } + private val dropdownListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { + val dialPlan = viewModel.dialPlansList[position] + Log.i( + "$TAG Selected dialplan updated [+${dialPlan.countryCallingCode}] / [${dialPlan.country}]" + ) + viewModel.setDialPlan(dialPlan) + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + } + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -87,6 +102,10 @@ class AccountProfileFragment : GenericFragment() { viewModel.setNewPicturePath("") } + binding.setPrefixTooltipClickListener { + // TODO + } + binding.setChangeModeClickListener { val action = AccountProfileFragmentDirections.actionAccountProfileFragmentToAccountProfileModeFragment() findNavController().navigate(action) @@ -135,6 +154,8 @@ class AccountProfileFragment : GenericFragment() { if (found) { (view.parent as? ViewGroup)?.doOnPreDraw { startPostponedEnterTransition() + + setupDialPlanPicker() } } else { Log.e( @@ -158,4 +179,20 @@ class AccountProfileFragment : GenericFragment() { private fun pickImage() { pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) } + + private fun setupDialPlanPicker() { + val dialPlanIndex = viewModel.selectedDialPlan.value ?: 0 + Log.i("$TAG Setting default dial plan at index [$dialPlanIndex]") + val adapter = ArrayAdapter( + requireContext(), + R.layout.drop_down_item, + viewModel.dialPlansLabelList + ) + adapter.setDropDownViewResource( + R.layout.assistant_country_picker_dropdown_cell + ) + binding.prefix.adapter = adapter + binding.prefix.onItemSelectedListener = dropdownListener + binding.prefix.setSelection(dialPlanIndex) + } } diff --git a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt index 1ced18665..7d3ad593d 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt @@ -6,6 +6,8 @@ import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.core.Account +import org.linphone.core.DialPlan +import org.linphone.core.Factory import org.linphone.core.tools.Log import org.linphone.ui.main.model.AccountModel import org.linphone.ui.main.settings.model.AccountDeviceModel @@ -23,6 +25,12 @@ class AccountProfileViewModel @UiThread constructor() : ViewModel() { val displayName = MutableLiveData() + val dialPlansLabelList = arrayListOf() + + val dialPlansList = arrayListOf() + + val selectedDialPlan = MutableLiveData() + val registerEnabled = MutableLiveData() val currentMode = MutableLiveData() @@ -44,6 +52,16 @@ class AccountProfileViewModel @UiThread constructor() : ViewModel() { init { expandDetails.value = true expandDevices.value = false // TODO: set to true when feature will be available + + coreContext.postOnCoreThread { + val dialPlans = Factory.instance().dialPlans.toList() + for (dialPlan in dialPlans) { + dialPlansList.add(dialPlan) + dialPlansLabelList.add( + "${dialPlan.flag} ${dialPlan.country} | +${dialPlan.countryCallingCode}" + ) + } + } } @UiThread @@ -97,6 +115,23 @@ class AccountProfileViewModel @UiThread constructor() : ViewModel() { ) devices.postValue(devicesList) + val prefix = account.params.internationalPrefix + if (!prefix.isNullOrEmpty()) { + Log.i( + "$TAG Account [${account.params?.identityAddress?.asStringUriOnly()}] prefix is [$prefix]" + ) + val dialPlan = Factory.instance().dialPlans.find { + it.countryCallingCode == prefix + } + if (dialPlan != null) { + val index = dialPlansList.indexOf(dialPlan) + Log.i( + "$TAG Found matching dial plan [${dialPlan.country}] at index [$index]" + ) + selectedDialPlan.postValue(index) + } + } + accountFoundEvent.postValue(Event(true)) } else { accountFoundEvent.postValue(Event(false)) @@ -186,8 +221,24 @@ class AccountProfileViewModel @UiThread constructor() : ViewModel() { val params = account.params val copy = params.clone() copy.isRegisterEnabled = !params.isRegisterEnabled + Log.i( + "$TAG Account registration is now [${if (copy.isRegisterEnabled) "enabled" else "disabled"}] for account [${account.params.identityAddress?.asStringUriOnly()}]" + ) account.params = copy registerEnabled.postValue(account.params.isRegisterEnabled) } } + + @UiThread + fun setDialPlan(dialPlan: DialPlan) { + coreContext.postOnCoreThread { + val params = account.params + val copy = params.clone() + copy.internationalPrefix = dialPlan.countryCallingCode + account.params = copy + Log.i( + "$TAG Updated internation prefix for account [${account.params.identityAddress?.asStringUriOnly()}] to [${copy.internationalPrefix}]" + ) + } + } } diff --git a/app/src/main/res/layout/account_profile_fragment.xml b/app/src/main/res/layout/account_profile_fragment.xml index 5425c8334..370d11b46 100644 --- a/app/src/main/res/layout/account_profile_fragment.xml +++ b/app/src/main/res/layout/account_profile_fragment.xml @@ -14,6 +14,9 @@ + @@ -232,7 +235,8 @@ android:id="@+id/display_name_label" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="17dp" + android:layout_marginStart="16dp" + android:layout_marginTop="16dp" android:paddingTop="8dp" android:paddingBottom="8dp" android:text="@string/sip_address_display_name" @@ -260,13 +264,69 @@ app:layout_constraintStart_toStartOf="@id/display_name_label" app:layout_constraintEnd_toEndOf="@id/details_background"/> + + + + + + + + + app:layout_constraintTop_toBottomOf="@id/prefix"/> Call is being transferred to %s Call has been transferred to %s Call transfer to %s failed! - %i calls - %i paused calls + %s calls + %s paused calls Skip