Check for valid phone number.

This commit is contained in:
Michelle Tang
2026-04-16 13:45:44 -04:00
committed by jeffrey-signal
parent dd52d78ee0
commit 1c77c9d3fb
2 changed files with 15 additions and 3 deletions
@@ -59,7 +59,6 @@ import org.signal.core.ui.compose.DropdownMenus
import org.signal.core.ui.compose.IconButtons.IconButton
import org.signal.core.ui.compose.Previews
import org.signal.core.ui.rememberWindowBreakpoint
import org.signal.core.util.E164Util
import org.signal.registration.R
import org.signal.registration.screens.RegistrationScreen
import org.signal.registration.screens.phonenumber.PhoneNumberEntryState.OneTimeEvent
@@ -81,7 +80,7 @@ fun PhoneNumberScreen(
if (state.showDialog) {
Dialogs.SimpleAlertDialog(
title = stringResource(R.string.RegistrationActivity_is_the_phone_number),
body = "${E164Util.formatAsE164WithCountryCodeForDisplay(state.countryCode, state.nationalNumber)}\n\n${stringResource(R.string.RegistrationActivity_a_verification_code)}",
body = "+${state.countryCode} ${state.formattedNumber}\n\n${stringResource(R.string.RegistrationActivity_a_verification_code)}",
confirm = stringResource(id = android.R.string.ok),
dismiss = stringResource(R.string.RegistrationActivity_edit_number),
onConfirm = { onEvent(PhoneNumberEntryScreenEvents.PhoneNumberSubmitted) },
@@ -397,7 +396,7 @@ private fun NextButton(
} else {
Buttons.LargeTonal(
onClick = { onEvent(PhoneNumberEntryScreenEvents.PhoneNumberEntered) },
enabled = state.countryCode.isNotEmpty() && state.nationalNumber.isNotEmpty(),
enabled = state.isNumberPossible,
modifier = Modifier.testTag(TestTags.PHONE_NUMBER_NEXT_BUTTON)
) {
Text(stringResource(R.string.RegistrationActivity_next))
@@ -5,6 +5,8 @@
package org.signal.registration.screens.phonenumber
import com.google.i18n.phonenumbers.NumberParseException
import com.google.i18n.phonenumbers.PhoneNumberUtil
import org.signal.registration.NetworkController
import org.signal.registration.NetworkController.SessionMetadata
import org.signal.registration.PendingRestoreOption
@@ -36,4 +38,15 @@ data class PhoneNumberEntryState(
data object UnableToSendSms : OneTimeEvent
data object CouldNotRequestCodeWithSelectedTransport : OneTimeEvent
}
val isNumberPossible: Boolean
get() {
if (countryCode.isEmpty() || nationalNumber.isEmpty()) return false
return try {
val number = PhoneNumberUtil.getInstance().parse("+$countryCode$nationalNumber", null)
PhoneNumberUtil.getInstance().isPossibleNumber(number)
} catch (_: NumberParseException) {
false
}
}
}