Added internation prefix picker in account profile

This commit is contained in:
Sylvain Berfini 2023-10-02 17:07:45 +02:00
parent 860371e698
commit c4fe71c59f
4 changed files with 152 additions and 4 deletions

View file

@ -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)
}
}

View file

@ -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<String>()
val dialPlansLabelList = arrayListOf<String>()
val dialPlansList = arrayListOf<DialPlan>()
val selectedDialPlan = MutableLiveData<Int>()
val registerEnabled = MutableLiveData<Boolean>()
val currentMode = MutableLiveData<String>()
@ -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}]"
)
}
}
}

View file

@ -14,6 +14,9 @@
<variable
name="deleteImageClickListener"
type="View.OnClickListener" />
<variable
name="prefixTooltipClickListener"
type="View.OnClickListener" />
<variable
name="changeModeClickListener"
type="View.OnClickListener" />
@ -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"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/header_style"
android:id="@+id/prefix_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:text="@string/manage_account_international_prefix"
app:layout_constraintStart_toStartOf="@id/details_background"
app:layout_constraintTop_toBottomOf="@id/display_name"/>
<ImageView
android:id="@+id/prefix_label_tooltip"
android:onClick="@{prefixTooltipClickListener}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:src="@drawable/info"
app:tint="@color/black"
app:layout_constraintTop_toTopOf="@id/prefix_label"
app:layout_constraintBottom_toBottomOf="@id/prefix_label"
app:layout_constraintStart_toEndOf="@id/prefix_label" />
<androidx.appcompat.widget.AppCompatSpinner
style="@style/default_text_style"
android:id="@+id/prefix"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_marginEnd="16dp"
android:layout_marginTop="5dp"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:textSize="14sp"
android:textColor="@color/gray_main2_600"
android:gravity="center_vertical"
android:overlapAnchor="false"
android:dropDownVerticalOffset="25dp"
android:spinnerMode="dropdown"
android:popupBackground="@drawable/shape_squircle_white_background"
android:background="@drawable/edit_text_background"
app:layout_constraintTop_toBottomOf="@id/prefix_label"
app:layout_constraintStart_toStartOf="@id/prefix_label"
app:layout_constraintEnd_toEndOf="@id/details_background" />
<ImageView
android:id="@+id/prefix_caret"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:src="@drawable/caret_down"
app:layout_constraintTop_toTopOf="@id/prefix"
app:layout_constraintBottom_toBottomOf="@id/prefix"
app:layout_constraintEnd_toEndOf="@id/prefix"/>
<View
android:id="@+id/details_bottom_anchor"
android:layout_width="1dp"
android:layout_height="1dp"
android:layout_marginTop="21dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/display_name"/>
app:layout_constraintTop_toBottomOf="@id/prefix"/>
<ImageView
android:id="@+id/connection_background"

View file

@ -319,8 +319,8 @@
<string name="toast_call_transfer_in_progress">Call is being transferred to %s</string>
<string name="toast_call_transfer_successful">Call has been transferred to %s</string>
<string name="toast_call_transfer_failed">Call transfer to %s failed!</string>
<string name="calls_count_label">%i calls</string>
<string name="calls_paused_count_label">%i paused calls</string>
<string name="calls_count_label">%s calls</string>
<string name="calls_paused_count_label">%s paused calls</string>
<!-- Keep <u></u> in following strings translations! -->
<string name="welcome_carousel_skip"><u>Skip</u></string>