From 893749fcab65135e28cc09093f34cbe9d08d1018 Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Tue, 19 Jan 2021 17:06:49 -0400 Subject: [PATCH] Prevent stripping of leading zeros in national numbers. --- .../fragments/EnterPhoneNumberFragment.java | 10 ++++----- .../fragments/WelcomeFragment.java | 21 +++++++++++++++++-- .../viewmodel/NumberViewState.java | 20 +++++++++--------- .../viewmodel/RegistrationViewModel.java | 4 ++-- 4 files changed, 36 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/EnterPhoneNumberFragment.java b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/EnterPhoneNumberFragment.java index 6795754194..a8ae24c6e0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/EnterPhoneNumberFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/EnterPhoneNumberFragment.java @@ -293,7 +293,7 @@ public final class EnterPhoneNumberFragment extends BaseRegistrationFragment { private void initNumber(@NonNull NumberViewState numberViewState) { int countryCode = numberViewState.getCountryCode(); - long number = numberViewState.getNationalNumber(); + String number = numberViewState.getNationalNumber(); String regionDisplayName = numberViewState.getCountryDisplayName(); this.countryCode.setText(String.valueOf(countryCode)); @@ -303,7 +303,7 @@ public final class EnterPhoneNumberFragment extends BaseRegistrationFragment { String regionCode = PhoneNumberUtil.getInstance().getRegionCodeForCountryCode(countryCode); setCountryFormatter(regionCode); - if (number != 0) { + if (!TextUtils.isEmpty(number)) { this.number.setText(String.valueOf(number)); } } @@ -357,7 +357,7 @@ public final class EnterPhoneNumberFragment extends BaseRegistrationFragment { @Override public void afterTextChanged(Editable s) { - Long number = reformatText(s); + String number = reformatText(s); if (number == null) return; @@ -378,7 +378,7 @@ public final class EnterPhoneNumberFragment extends BaseRegistrationFragment { } } - private Long reformatText(Editable s) { + private String reformatText(Editable s) { if (countryFormatter == null) { return null; } @@ -408,7 +408,7 @@ public final class EnterPhoneNumberFragment extends BaseRegistrationFragment { return null; } - return Long.parseLong(justDigits.toString()); + return justDigits.toString(); } private void setCountryFormatter(@Nullable String regionCode) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/WelcomeFragment.java b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/WelcomeFragment.java index f569e0b4b1..073319b180 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/WelcomeFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/WelcomeFragment.java @@ -34,6 +34,9 @@ import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.Util; import org.whispersystems.libsignal.util.guava.Optional; +import java.util.Arrays; +import java.util.Locale; + public final class WelcomeFragment extends BaseRegistrationFragment { private static final String TAG = Log.tag(WelcomeFragment.class); @@ -186,15 +189,29 @@ public final class WelcomeFragment extends BaseRegistrationFragment { if (Permissions.hasAll(requireContext(), Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_PHONE_NUMBERS)) { localNumber = Util.getDeviceNumber(requireContext()); + } else { + Log.i(TAG, "No phone permission"); } if (localNumber.isPresent()) { - getModel().onNumberDetected(localNumber.get().getCountryCode(), localNumber.get().getNationalNumber()); + Log.i(TAG, "Phone number detected"); + Phonenumber.PhoneNumber phoneNumber = localNumber.get(); + String nationalNumber = String.valueOf(phoneNumber.getNationalNumber()); + + if (phoneNumber.getNumberOfLeadingZeros() != 0) { + char[] value = new char[phoneNumber.getNumberOfLeadingZeros()]; + Arrays.fill(value, '0'); + nationalNumber = new String(value) + nationalNumber; + Log.i(TAG, String.format(Locale.US, "Padded national number with %d zeros", phoneNumber.getNumberOfLeadingZeros())); + } + + getModel().onNumberDetected(phoneNumber.getCountryCode(), nationalNumber); } else { + Log.i(TAG, "No number detected"); Optional simCountryIso = Util.getSimCountryIso(requireContext()); if (simCountryIso.isPresent() && !TextUtils.isEmpty(simCountryIso.get())) { - getModel().onNumberDetected(PhoneNumberUtil.getInstance().getCountryCodeForRegion(simCountryIso.get()), 0); + getModel().onNumberDetected(PhoneNumberUtil.getInstance().getCountryCodeForRegion(simCountryIso.get()), ""); } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/NumberViewState.java b/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/NumberViewState.java index df7667aee5..2f59fbcbda 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/NumberViewState.java +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/NumberViewState.java @@ -20,7 +20,7 @@ public final class NumberViewState implements Parcelable { private final String selectedCountryName; private final int countryCode; - private final long nationalNumber; + private final String nationalNumber; private NumberViewState(Builder builder) { this.selectedCountryName = builder.countryDisplayName; @@ -38,7 +38,7 @@ public final class NumberViewState implements Parcelable { return countryCode; } - public long getNationalNumber() { + public String getNationalNumber() { return nationalNumber; } @@ -87,7 +87,7 @@ public final class NumberViewState implements Parcelable { public int hashCode() { int hash = countryCode; hash *= 31; - hash += (int) (nationalNumber ^ (nationalNumber >>> 32)); + hash += nationalNumber != null ? nationalNumber.hashCode() : 0; hash *= 31; hash += selectedCountryName != null ? selectedCountryName.hashCode() : 0; return hash; @@ -101,7 +101,7 @@ public final class NumberViewState implements Parcelable { NumberViewState other = (NumberViewState) obj; return other.countryCode == countryCode && - other.nationalNumber == nationalNumber && + Objects.equals(other.nationalNumber, nationalNumber) && Objects.equals(other.selectedCountryName, selectedCountryName); } @@ -122,8 +122,8 @@ public final class NumberViewState implements Parcelable { } } - private static String getConfiguredE164Number(int countryCode, long number) { - return PhoneNumberFormatter.formatE164(String.valueOf(countryCode), String.valueOf(number)); + private static String getConfiguredE164Number(int countryCode, String number) { + return PhoneNumberFormatter.formatE164(String.valueOf(countryCode), number); } private static Phonenumber.PhoneNumber getPhoneNumber(@NonNull PhoneNumberUtil util, @NonNull String e164Number) @@ -135,7 +135,7 @@ public final class NumberViewState implements Parcelable { public static class Builder { private String countryDisplayName; private int countryCode; - private long nationalNumber; + private String nationalNumber; public Builder countryCode(int countryCode) { this.countryCode = countryCode; @@ -147,7 +147,7 @@ public final class NumberViewState implements Parcelable { return this; } - public Builder nationalNumber(long nationalNumber) { + public Builder nationalNumber(String nationalNumber) { this.nationalNumber = nationalNumber; return this; } @@ -166,7 +166,7 @@ public final class NumberViewState implements Parcelable { public void writeToParcel(Parcel parcel, int i) { parcel.writeString(selectedCountryName); parcel.writeInt(countryCode); - parcel.writeLong(nationalNumber); + parcel.writeString(nationalNumber); } public static final Creator CREATOR = new Creator() { @@ -174,7 +174,7 @@ public final class NumberViewState implements Parcelable { public NumberViewState createFromParcel(Parcel in) { return new Builder().selectedCountryDisplayName(in.readString()) .countryCode(in.readInt()) - .nationalNumber(in.readLong()) + .nationalNumber(in.readString()) .build(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/RegistrationViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/RegistrationViewModel.java index e832574f75..ccaec3a340 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/RegistrationViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/RegistrationViewModel.java @@ -95,7 +95,7 @@ public final class RegistrationViewModel extends ViewModel { .countryCode(countryCode).build()); } - public void setNationalNumber(long number) { + public void setNationalNumber(String number) { NumberViewState numberViewState = getNumber().toBuilder().nationalNumber(number).build(); setViewState(numberViewState); } @@ -111,7 +111,7 @@ public final class RegistrationViewModel extends ViewModel { textCodeEntered.setValue(code); } - public void onNumberDetected(int countryCode, long nationalNumber) { + public void onNumberDetected(int countryCode, String nationalNumber) { setViewState(getNumber().toBuilder() .countryCode(countryCode) .nationalNumber(nationalNumber)