Fixed issue with byNavGraphViewModel

This commit is contained in:
Sylvain Berfini 2023-09-08 16:16:52 +02:00
parent 594bcffd7c
commit 619ab8a6ed
21 changed files with 244 additions and 186 deletions

View file

@ -52,7 +52,7 @@ class LoginFragment : Fragment() {
private lateinit var binding: AssistantLoginFragmentBinding
private val viewModel: AccountLoginViewModel by navGraphViewModels(
R.id.loginFragment
R.id.assistant_nav_graph
)
override fun onCreateView(

View file

@ -47,7 +47,7 @@ class QrCodeScannerFragment : Fragment() {
private lateinit var binding: AssistantQrCodeScannerFragmentBinding
private val viewModel: QrCodeViewModel by navGraphViewModels(
R.id.qrCodeScannerFragment
R.id.assistant_nav_graph
)
private val requestPermissionLauncher = registerForActivityResult(
@ -84,11 +84,13 @@ class QrCodeScannerFragment : Fragment() {
viewModel.qrCodeFoundEvent.observe(viewLifecycleOwner) {
it.consume { isValid ->
if (isValid) {
// TODO FIXME: show translated string
(requireActivity() as AssistantActivity).showGreenToast(
"QR code validated!",
R.drawable.check_fat_fill
)
} else {
// TODO FIXME: show translated string
(requireActivity() as AssistantActivity).showRedToast(
"Invalid QR code!",
R.drawable.warning_circle

View file

@ -43,7 +43,7 @@ class RegisterCodeConfirmationFragment : Fragment() {
private lateinit var binding: AssistantRegisterConfirmSmsCodeFragmentBinding
private val viewModel: AccountCreationViewModel by navGraphViewModels(
R.id.registerCodeConfirmationFragment
R.id.assistant_nav_graph
)
override fun onCreateView(

View file

@ -52,7 +52,7 @@ class RegisterFragment : Fragment() {
private lateinit var binding: AssistantRegisterFragmentBinding
private val viewModel: AccountCreationViewModel by navGraphViewModels(
R.id.registerFragment
R.id.assistant_nav_graph
)
override fun onCreateView(

View file

@ -49,7 +49,7 @@ class ThirdPartySipAccountLoginFragment : Fragment() {
private lateinit var binding: AssistantThirdPartySipAccountLoginFragmentBinding
private val viewModel: ThirdPartySipAccountLoginViewModel by navGraphViewModels(
R.id.thirdPartySipAccountLoginFragment
R.id.assistant_nav_graph
)
private val dropdownListener = object : AdapterView.OnItemSelectedListener {

View file

@ -64,6 +64,8 @@ class AccountCreationViewModel @UiThread constructor() : ViewModel(), CountryPic
val createEnabled = MediatorLiveData<Boolean>()
val confirmationMessage = MutableLiveData<String>()
val smsCodeFirstDigit = MutableLiveData<String>()
val smsCodeSecondDigit = MutableLiveData<String>()
val smsCodeThirdDigit = MutableLiveData<String>()
@ -95,6 +97,7 @@ class AccountCreationViewModel @UiThread constructor() : ViewModel(), CountryPic
AccountCreator.Status.AccountExist, AccountCreator.Status.AccountExistWithAlias -> {
operationInProgress.postValue(false)
createEnabled.postValue(false)
// TODO FIXME: use translated string
usernameError.postValue("Account already exists")
}
AccountCreator.Status.AccountNotExist -> {
@ -102,8 +105,10 @@ class AccountCreationViewModel @UiThread constructor() : ViewModel(), CountryPic
checkPhoneNumber()
}
else -> {
Log.e("$TAG An unexpected error occurred!")
operationInProgress.postValue(false)
createEnabled.postValue(false)
// TODO FIXME: use translated string
phoneNumberError.postValue(status.name)
}
}
@ -120,6 +125,7 @@ class AccountCreationViewModel @UiThread constructor() : ViewModel(), CountryPic
AccountCreator.Status.AliasExist, AccountCreator.Status.AliasIsAccount -> {
operationInProgress.postValue(false)
createEnabled.postValue(false)
// TODO FIXME: use translated string
phoneNumberError.postValue("Phone number already used")
}
AccountCreator.Status.AliasNotExist -> {
@ -127,8 +133,10 @@ class AccountCreationViewModel @UiThread constructor() : ViewModel(), CountryPic
createAccount()
}
else -> {
Log.e("$TAG An unexpected error occurred!")
operationInProgress.postValue(false)
createEnabled.postValue(false)
// TODO FIXME: use translated string
phoneNumberError.postValue(status.name)
}
}
@ -149,7 +157,8 @@ class AccountCreationViewModel @UiThread constructor() : ViewModel(), CountryPic
goToSmsCodeConfirmationViewEvent.postValue(Event(true))
}
else -> {
// TODO
Log.e("$TAG Account couldn't be created, an unexpected error occurred!")
// TODO: show error message to user
}
}
}
@ -167,7 +176,8 @@ class AccountCreationViewModel @UiThread constructor() : ViewModel(), CountryPic
Log.i("$TAG Account has been successfully activated, going to login page")
goToLoginPageEvent.postValue(Event(true))
} else {
// TODO
Log.e("$TAG Account couldn't be activated, an unexpected error occurred!")
// TODO: show error message to user
}
}
}
@ -273,20 +283,42 @@ class AccountCreationViewModel @UiThread constructor() : ViewModel(), CountryPic
prefix
}
val number = phoneNumber.value.orEmpty().trim()
accountCreator.setPhoneNumber(number, digitsPrefix)
val normalizedPhoneNumber = accountCreator.phoneNumber
if (!normalizedPhoneNumber.isNullOrEmpty()) {
normalizedPhoneNumberEvent.postValue(Event(normalizedPhoneNumber))
val status = accountCreator.setPhoneNumber(number, digitsPrefix)
if (status == AccountCreator.PhoneNumberStatus.Ok.toInt()) {
val normalizedPhoneNumber = accountCreator.phoneNumber
// TODO FIXME: use translated string
val message = "We have sent a verification code on your phone number “$normalizedPhoneNumber”.\n\nPlease enter the verification code below:"
confirmationMessage.postValue(message)
Log.i(
"$TAG Normalized phone number from [$number] and prefix [$digitsPrefix] is [$normalizedPhoneNumber]"
)
if (!normalizedPhoneNumber.isNullOrEmpty()) {
normalizedPhoneNumberEvent.postValue(Event(normalizedPhoneNumber))
} else {
Log.e(
"$TAG Failed to compute phone number using international prefix [$digitsPrefix] and number [$number]"
)
operationInProgress.postValue(false)
// TODO FIXME: use translated string
phoneNumberError.postValue(
"Wrong international prefix / local phone number"
)
}
} else {
Log.e(
"$TAG Failed to compute phone number using international prefix [$digitsPrefix] and number [$number]"
"$TAG Failed to set phone number [$number] and prefix [$digitsPrefix] into account creator!"
)
// TODO FIXME: use translated string
phoneNumberError.postValue(
"Failed to configure phone number and prefix in account creator!"
)
operationInProgress.postValue(false)
phoneNumberError.postValue("Wrong international prefix / local phone number")
}
} else {
Log.e("$TAG Account creator hasn't been initialized!")
// TODO: show error message to user
}
}
}
@ -330,6 +362,7 @@ class AccountCreationViewModel @UiThread constructor() : ViewModel(), CountryPic
if (status != AccountCreator.Status.RequestOk) {
Log.e("$TAG Can't activate account [$status]")
operationInProgress.postValue(false)
// TODO: show error message to user
}
}
}
@ -347,6 +380,7 @@ class AccountCreationViewModel @UiThread constructor() : ViewModel(), CountryPic
if (status != AccountCreator.Status.RequestOk) {
Log.e("$TAG Can't check if account already exists [$status]")
operationInProgress.postValue(false)
// TODO: show error message to user
}
}
@ -359,6 +393,7 @@ class AccountCreationViewModel @UiThread constructor() : ViewModel(), CountryPic
if (status != AccountCreator.Status.RequestOk) {
Log.e("$TAG Can't check if phone number is already used [$status]")
operationInProgress.postValue(false)
// TODO: show error message to user
}
}
@ -373,6 +408,7 @@ class AccountCreationViewModel @UiThread constructor() : ViewModel(), CountryPic
if (status != AccountCreator.Status.RequestOk) {
Log.e("$TAG Can't create account [$status]")
operationInProgress.postValue(false)
// TODO: show error message to user
} else {
Log.i("$TAG createAccount consumed our token, setting it to null")
accountCreator.token = null
@ -434,5 +470,6 @@ class AccountCreationViewModel @UiThread constructor() : ViewModel(), CountryPic
private fun onFlexiApiTokenRequestError() {
Log.e("$TAG Flexi API token request by push error!")
operationInProgress.postValue(false)
// TODO: show error message to user
}
}

View file

@ -82,6 +82,7 @@ class AccountLoginViewModel @UiThread constructor() : ViewModel() {
} else if (state == RegistrationState.Failed) {
registrationInProgress.postValue(false)
core.removeListener(this)
// TODO: show translated string
accountLoginErrorEvent.postValue(Event(message))
Log.e("$TAG Account failed to REGISTER, removing it")

View file

@ -93,6 +93,7 @@ class ThirdPartySipAccountLoginViewModel @UiThread constructor() : ViewModel() {
} else if (state == RegistrationState.Failed) {
registrationInProgress.postValue(false)
core.removeListener(this)
// TODO: show translated string
accountLoginErrorEvent.postValue(Event(message))
Log.e("$TAG Account failed to REGISTER, removing it")

View file

@ -118,6 +118,7 @@ class CallFragment : GenericFragment() {
it.consume {
sharedViewModel.forceRefreshCallLogsListEvent.value = Event(true)
// TODO FIXME: show translated string
(requireActivity() as MainActivity).showGreenToast(
"Historique supprimé",
R.drawable.check_fat_fill
@ -132,6 +133,7 @@ class CallFragment : GenericFragment() {
val label = "SIP address"
clipboard.setPrimaryClip(ClipData.newPlainText(label, value))
// TODO FIXME: show translated string
(requireActivity() as MainActivity).showGreenToast(
"Numéro copié dans le presse-papier",
R.drawable.check_fat_fill

View file

@ -158,6 +158,7 @@ class CallsListFragment : GenericFragment() {
listViewModel.historyDeletedEvent.observe(viewLifecycleOwner) {
it.consume {
// TODO FIXME: show translated string
(requireActivity() as MainActivity).showGreenToast(
"Historique supprimé",
R.drawable.check_fat_fill
@ -227,6 +228,7 @@ class CallsListFragment : GenericFragment() {
val label = "SIP address"
clipboard.setPrimaryClip(ClipData.newPlainText(label, value))
// TODO FIXME: show translated string
(requireActivity() as MainActivity).showGreenToast(
"Numéro copié dans le presse-papier",
R.drawable.check_fat_fill

View file

@ -58,11 +58,11 @@ class StartCallFragment : GenericFragment() {
private lateinit var binding: CallStartFragmentBinding
private val viewModel: StartCallViewModel by navGraphViewModels(
R.id.startCallFragment
R.id.voip_nav_graph
)
private val contactsListViewModel: ContactsListViewModel by navGraphViewModels(
R.id.startCallFragment
R.id.voip_nav_graph
)
private lateinit var contactsAdapter: ContactsListAdapter

View file

@ -212,6 +212,7 @@ class ContactFragment : GenericFragment() {
val label = if (isSip) "SIP address" else "Phone number"
clipboard.setPrimaryClip(ClipData.newPlainText(label, value))
// TODO FIXME: show translated string
(requireActivity() as MainActivity).showGreenToast(
"Numéro copié dans le presse-papier",
R.drawable.check_fat_fill

View file

@ -56,7 +56,7 @@ class EditContactFragment : GenericFragment() {
private lateinit var binding: ContactNewOrEditFragmentBinding
private val viewModel: ContactNewOrEditViewModel by navGraphViewModels(
R.id.editContactFragment
R.id.main_nav_graph
)
private val args: EditContactFragmentArgs by navArgs()

View file

@ -57,7 +57,7 @@ class NewContactFragment : GenericFragment() {
private lateinit var binding: ContactNewOrEditFragmentBinding
private val viewModel: ContactNewOrEditViewModel by navGraphViewModels(
R.id.newContactFragment
R.id.main_nav_graph
)
private val backPressedCallback = object : OnBackPressedCallback(true) {

View file

@ -35,7 +35,7 @@ import org.linphone.ui.main.conversations.viewmodel.ConversationViewModel
class ConversationFragment : Fragment() {
private lateinit var binding: ConversationFragmentBinding
private val viewModel: ConversationViewModel by navGraphViewModels(
R.id.conversationFragment
R.id.main_nav_graph
)
private lateinit var adapter: ChatEventLogsListAdapter

View file

@ -41,7 +41,7 @@ import org.linphone.ui.main.conversations.viewmodel.ConversationsListViewModel
class ConversationsFragment : Fragment() {
private lateinit var binding: ConversationsFragmentBinding
private val listViewModel: ConversationsListViewModel by navGraphViewModels(
R.id.conversationsFragment
R.id.main_nav_graph
)
private lateinit var adapter: ConversationsListAdapter

View file

@ -40,7 +40,7 @@ class NewConversationFragment : Fragment() {
private lateinit var binding: ConversationStartFragmentBinding
private lateinit var adapter: ContactsSelectionAdapter
private val viewModel: NewConversationViewModel by navGraphViewModels(
R.id.conversationsFragment
R.id.main_nav_graph
)
override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? {

View file

@ -30,7 +30,7 @@ class AccountProfileFragment : GenericFragment() {
private lateinit var binding: AccountProfileFragmentBinding
private val viewModel: AccountProfileViewModel by navGraphViewModels(
R.id.accountProfileFragment
R.id.main_nav_graph
)
private val args: AccountProfileFragmentArgs by navArgs()

View file

@ -136,9 +136,11 @@ class VoipActivity : AppCompatActivity() {
callsViewModel.showLowSignalEvent.observe(this) {
it.consume { show ->
if (show) {
// TODO FIXME: show translated string
showRedToast("Low Wi-Fi signal!", R.drawable.wifi_low)
} else {
hideRedToast()
// TODO FIXME: show translated string
showGreenToast("Wi-Fi signal no longer low", R.drawable.wifi_high)
}
}

View file

@ -120,7 +120,7 @@
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="16dp"
android:src="@drawable/plus_circle"
android:src="@drawable/phone_plus"
app:tint="@color/gray_8"
app:backgroundTint="@color/white"
app:layout_constraintEnd_toEndOf="parent"

View file

@ -14,181 +14,191 @@
type="org.linphone.ui.assistant.viewmodel.AccountCreationViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:onClick="@{backClickListener}"
android:id="@+id/back"
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_marginTop="7dp"
android:layout_marginStart="15dp"
android:src="@drawable/caret_left"
app:tint="@color/gray_1"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:src="@drawable/header"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/back"
app:layout_constraintBottom_toBottomOf="@id/title"/>
<ImageView
android:onClick="@{backClickListener}"
android:id="@+id/back"
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_marginTop="7dp"
android:layout_marginStart="15dp"
android:src="@drawable/caret_left"
app:tint="@color/gray_1"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_800"
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
android:paddingBottom="30dp"
android:text="Register"
android:textSize="20sp"
android:textColor="@color/white"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:src="@drawable/header"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/back"
app:layout_constraintBottom_toBottomOf="@id/title"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/message"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="We have sent a verification code on your phone number “06945345435”.\n\nPlease enter the verification code below:"
android:textSize="14sp"
android:textColor="@color/gray_9"
android:gravity="center_horizontal"
app:layout_constraintTop_toBottomOf="@id/title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_800"
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
android:paddingBottom="30dp"
android:text="Register"
android:textSize="20sp"
android:textColor="@color/white"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<ImageView
android:id="@+id/illu"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="100dp"
android:adjustViewBounds="true"
android:src="@drawable/confirm_sms_code_illu"
app:layout_constraintTop_toBottomOf="@id/wrong_number"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/message"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@{viewModel.confirmationMessage, default=`We have sent a verification code on your phone number.\n\nPlease enter the verification code below:`}"
android:textSize="14sp"
android:textColor="@color/gray_9"
android:gravity="center_horizontal"
app:layout_constraintTop_toBottomOf="@id/title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<androidx.appcompat.widget.AppCompatEditText
focusNextOnInput="@{true}"
style="@style/default_text_style_300"
android:id="@+id/code_first_digit"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="32dp"
android:background="@drawable/shape_assistant_sms_code_confirmation"
android:text="@={viewModel.smsCodeFirstDigit, default=`1`}"
android:maxLength="1"
android:textColor="@color/assistant_sms_confirmation_code_color"
android:textSize="50sp"
android:textCursorDrawable="@color/transparent_color"
android:gravity="center"
android:inputType="number"
android:imeOptions="actionNext"
android:nextFocusDown="@id/code_second_digit"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintTop_toBottomOf="@id/message"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/code_second_digit" />
<ImageView
android:id="@+id/illu"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="100dp"
android:adjustViewBounds="true"
android:src="@drawable/confirm_sms_code_illu"
app:layout_constraintTop_toBottomOf="@id/wrong_number"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<androidx.appcompat.widget.AppCompatEditText
focusNextOnInput="@{true}"
style="@style/default_text_style_300"
android:id="@+id/code_second_digit"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="32dp"
android:background="@drawable/shape_assistant_sms_code_confirmation"
android:text="@={viewModel.smsCodeSecondDigit, default=`2`}"
android:maxLength="1"
android:textColor="@color/assistant_sms_confirmation_code_color"
android:textSize="50sp"
android:textCursorDrawable="@color/transparent_color"
android:gravity="center"
android:inputType="number"
android:imeOptions="actionNext"
android:nextFocusDown="@id/code_third_digit"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintTop_toBottomOf="@id/message"
app:layout_constraintStart_toEndOf="@id/code_first_digit"
app:layout_constraintEnd_toStartOf="@id/code_third_digit" />
<androidx.appcompat.widget.AppCompatEditText
focusNextOnInput="@{true}"
style="@style/default_text_style_300"
android:id="@+id/code_first_digit"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="32dp"
android:background="@drawable/shape_assistant_sms_code_confirmation"
android:text="@={viewModel.smsCodeFirstDigit, default=`1`}"
android:maxLength="1"
android:textColor="@color/assistant_sms_confirmation_code_color"
android:textSize="50sp"
android:textCursorDrawable="@color/transparent_color"
android:gravity="center"
android:inputType="number"
android:imeOptions="actionNext"
android:nextFocusDown="@id/code_second_digit"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintTop_toBottomOf="@id/message"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/code_second_digit" />
<androidx.appcompat.widget.AppCompatEditText
focusNextOnInput="@{true}"
style="@style/default_text_style_300"
android:id="@+id/code_third_digit"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="32dp"
android:background="@drawable/shape_assistant_sms_code_confirmation"
android:text="@={viewModel.smsCodeThirdDigit, default=`3`}"
android:maxLength="1"
android:textColor="@color/assistant_sms_confirmation_code_color"
android:textSize="50sp"
android:textCursorDrawable="@color/transparent_color"
android:gravity="center"
android:inputType="number"
android:imeOptions="actionNext"
android:nextFocusDown="@id/code_last_digit"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintTop_toBottomOf="@id/message"
app:layout_constraintStart_toEndOf="@id/code_second_digit"
app:layout_constraintEnd_toStartOf="@id/code_last_digit" />
<androidx.appcompat.widget.AppCompatEditText
focusNextOnInput="@{true}"
style="@style/default_text_style_300"
android:id="@+id/code_second_digit"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="32dp"
android:background="@drawable/shape_assistant_sms_code_confirmation"
android:text="@={viewModel.smsCodeSecondDigit, default=`2`}"
android:maxLength="1"
android:textColor="@color/assistant_sms_confirmation_code_color"
android:textSize="50sp"
android:textCursorDrawable="@color/transparent_color"
android:gravity="center"
android:inputType="number"
android:imeOptions="actionNext"
android:nextFocusDown="@id/code_third_digit"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintTop_toBottomOf="@id/message"
app:layout_constraintStart_toEndOf="@id/code_first_digit"
app:layout_constraintEnd_toStartOf="@id/code_third_digit" />
<androidx.appcompat.widget.AppCompatEditText
validateOnInput="@{() -> viewModel.validateCode()}"
style="@style/default_text_style_300"
android:id="@+id/code_last_digit"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="32dp"
android:background="@drawable/shape_assistant_sms_code_confirmation"
android:text="@={viewModel.smsCodeLastDigit, default=`4`}"
android:maxLength="1"
android:textColor="@color/assistant_sms_confirmation_code_color"
android:textSize="50sp"
android:textCursorDrawable="@color/transparent_color"
android:gravity="center"
android:inputType="number"
android:imeOptions="actionDone"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintTop_toBottomOf="@id/message"
app:layout_constraintStart_toEndOf="@id/code_third_digit"
app:layout_constraintEnd_toEndOf="parent" />
<androidx.appcompat.widget.AppCompatEditText
focusNextOnInput="@{true}"
style="@style/default_text_style_300"
android:id="@+id/code_third_digit"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="32dp"
android:background="@drawable/shape_assistant_sms_code_confirmation"
android:text="@={viewModel.smsCodeThirdDigit, default=`3`}"
android:maxLength="1"
android:textColor="@color/assistant_sms_confirmation_code_color"
android:textSize="50sp"
android:textCursorDrawable="@color/transparent_color"
android:gravity="center"
android:inputType="number"
android:imeOptions="actionNext"
android:nextFocusDown="@id/code_last_digit"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintTop_toBottomOf="@id/message"
app:layout_constraintStart_toEndOf="@id/code_second_digit"
app:layout_constraintEnd_toStartOf="@id/code_last_digit" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_600"
android:id="@+id/wrong_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="51dp"
android:paddingTop="6dp"
android:paddingBottom="6dp"
android:paddingStart="12dp"
android:paddingEnd="12dp"
android:text="Wrong number?"
android:textSize="13sp"
android:textColor="@color/secondary_button_label_color"
android:gravity="center"
android:background="@drawable/secondary_button_background"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/code_first_digit" />
<androidx.appcompat.widget.AppCompatEditText
validateOnInput="@{() -> viewModel.validateCode()}"
style="@style/default_text_style_300"
android:id="@+id/code_last_digit"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="32dp"
android:background="@drawable/shape_assistant_sms_code_confirmation"
android:text="@={viewModel.smsCodeLastDigit, default=`4`}"
android:maxLength="1"
android:textColor="@color/assistant_sms_confirmation_code_color"
android:textSize="50sp"
android:textCursorDrawable="@color/transparent_color"
android:gravity="center"
android:inputType="number"
android:imeOptions="actionDone"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintTop_toBottomOf="@id/message"
app:layout_constraintStart_toEndOf="@id/code_third_digit"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_600"
android:id="@+id/wrong_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="51dp"
android:paddingTop="6dp"
android:paddingBottom="6dp"
android:paddingStart="12dp"
android:paddingEnd="12dp"
android:text="Wrong number?"
android:textSize="13sp"
android:textColor="@color/secondary_button_label_color"
android:gravity="center"
android:background="@drawable/secondary_button_background"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/code_first_digit" />
</androidx.constraintlayout.widget.ConstraintLayout>
<include
layout="@layout/operation_in_progress"
bind:visibility="@{viewModel.operationInProgress}" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</layout>