mirror of
https://gitlab.linphone.org/BC/public/linphone-android.git
synced 2026-01-17 11:28:06 +00:00
Added internation prefix picker in account profile
This commit is contained in:
parent
860371e698
commit
c4fe71c59f
4 changed files with 152 additions and 4 deletions
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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}]"
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue