Skip to content

Commit 6a32081

Browse files
Jacob Stimessamtstern
authored andcommitted
Allowing default country code and national phone number (#919)
1 parent e4ece3a commit 6a32081

File tree

10 files changed

+121
-21
lines changed

10 files changed

+121
-21
lines changed

auth/README.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,13 +263,27 @@ country code and phone number input fields. The user is still able to edit the n
263263
```java
264264
// Use a Bundle to hold the default number, and pass it to the Builder via setParams:
265265
Bundle params = new Bundle();
266-
params.putString(AuthUI.EXTRA_DEFAULT_PHONE, "+12345678901");
266+
params.putString(AuthUI.EXTRA_DEFAULT_PHONE_NUMBER, "+123456789");
267267
IdpConfig phoneConfigWithDefaultNumber =
268268
new IdpConfig.Builder(AuthUI.PHONE_VERIFICATION_PROVIDER)
269269
.setParams(params)
270270
.build();
271271
```
272272

273+
It is also possible to set a default country code along with a national number if a specific country
274+
is your app's target audience. This will take precedence over the full default phone number if both
275+
are provided.
276+
277+
```java
278+
Bundle params = new Bundle();
279+
params.putString(AuthUI.EXTRA_DEFAULT_COUNTRY_CODE, "ca");
280+
params.putString(AuthUI.EXTRA_DEFAULT_NATIONAL_NUMBER, "23456789");
281+
IdpConfig phoneConfigWithDefaultCountryAndNationalNumber =
282+
new IdpConfig.Builder(AuthUI.PHONE_VERIFICATION_PROVIDER)
283+
.setParams(params)
284+
.build();
285+
```
286+
273287
#### Handling the sign-in response
274288

275289
##### Response codes

auth/src/main/java/com/firebase/ui/auth/AuthUI.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,19 @@ public class AuthUI {
107107
public static final String PHONE_VERIFICATION_PROVIDER = PhoneAuthProvider.PROVIDER_ID;
108108

109109
/**
110-
* Bundle key for the default phone number parameter
110+
* Bundle key for the default full phone number parameter.
111111
*/
112-
public static final String EXTRA_DEFAULT_PHONE = ExtraConstants.EXTRA_PHONE;
112+
public static final String EXTRA_DEFAULT_PHONE_NUMBER = ExtraConstants.EXTRA_PHONE;
113+
114+
/**
115+
* Bundle key for the default phone country code parameter.
116+
*/
117+
public static final String EXTRA_DEFAULT_COUNTRY_CODE = ExtraConstants.EXTRA_COUNTRY_CODE;
118+
119+
/**
120+
* Bundle key for the default national phone number parameter.
121+
*/
122+
public static final String EXTRA_DEFAULT_NATIONAL_NUMBER = ExtraConstants.EXTRA_NATIONAL_NUMBER;
113123

114124
/**
115125
* Default value for logo resource, omits the logo from the {@link AuthMethodPickerActivity}.

auth/src/main/java/com/firebase/ui/auth/provider/PhoneProvider.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import android.app.Activity;
44
import android.content.Context;
55
import android.content.Intent;
6+
import android.os.Bundle;
67
import android.support.annotation.LayoutRes;
78

89
import com.firebase.ui.auth.AuthUI;
@@ -36,15 +37,15 @@ public int getButtonLayout() {
3637
@Override
3738
public void startLogin(Activity activity) {
3839

39-
String phone = null;
40+
Bundle params = null;
4041
for (AuthUI.IdpConfig idpConfig : mFlowParameters.providerInfo) {
4142
if (idpConfig.getProviderId().equals(AuthUI.PHONE_VERIFICATION_PROVIDER)) {
42-
phone = idpConfig.getParams().getString(AuthUI.EXTRA_DEFAULT_PHONE);
43+
params = idpConfig.getParams();
4344
}
4445
}
4546

4647
activity.startActivityForResult(
47-
PhoneVerificationActivity.createIntent(activity, mFlowParameters, phone),
48+
PhoneVerificationActivity.createIntent(activity, mFlowParameters, params),
4849
RC_PHONE_FLOW);
4950
}
5051

auth/src/main/java/com/firebase/ui/auth/ui/ExtraConstants.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,8 @@ public class ExtraConstants {
2626
public static final String EXTRA_USER = "extra_user";
2727
public static final String EXTRA_EMAIL = "extra_email";
2828
public static final String EXTRA_PHONE = "extra_phone_number";
29+
public static final String EXTRA_COUNTRY_CODE = "extra_country_code";
30+
public static final String EXTRA_NATIONAL_NUMBER = "extra_national_number";
2931
public static final String HAS_EXISTING_INSTANCE = "has_existing_instance";
32+
public static final String EXTRA_PARAMS = "extra_params";
3033
}

auth/src/main/java/com/firebase/ui/auth/ui/phone/PhoneNumberUtils.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,22 @@ protected static PhoneNumber getPhoneNumber(@NonNull String providedPhoneNumber)
138138
return new PhoneNumber(phoneNumber, countryIso, countryCode);
139139
}
140140

141+
static PhoneNumber getPhoneNumber(
142+
@NonNull String providedCountryIso, @NonNull String providedNationalNumber) {
143+
Integer countryCode = getCountryCode(providedCountryIso);
144+
if (countryCode == null) {
145+
// Invalid ISO supplied:
146+
countryCode = DEFAULT_COUNTRY_CODE_INT;
147+
providedCountryIso = DEFAULT_COUNTRY_CODE;
148+
}
149+
150+
// National number shouldn't include '+', but just in case:
151+
providedNationalNumber = stripPlusSign(providedNationalNumber);
152+
153+
return new PhoneNumber(
154+
providedNationalNumber, providedCountryIso, String.valueOf(countryCode));
155+
}
156+
141157
private static String countryIsoForCountryCode(String countryCode) {
142158
final List<String> countries = CountryCodeToRegionCodeMap.get(Integer.valueOf(countryCode));
143159
if (countries != null) {
@@ -1337,6 +1353,10 @@ private static String stripCountryCode(String phoneNumber, String countryCode) {
13371353
return phoneNumber.replaceFirst("^\\+?" + countryCode, "");
13381354
}
13391355

1356+
private static String stripPlusSign(String phoneNumber) {
1357+
return phoneNumber.replaceFirst("^\\+?", "");
1358+
}
1359+
13401360
private static Locale getSimBasedLocale(@NonNull Context context) {
13411361
final TelephonyManager tm =
13421362
(TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

auth/src/main/java/com/firebase/ui/auth/ui/phone/PhoneVerificationActivity.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,10 @@ private enum VerificationState {
7474
private PhoneAuthProvider.ForceResendingToken mForceResendingToken;
7575
private VerificationState mVerificationState;
7676

77-
public static Intent createIntent(Context context, FlowParameters flowParams, String phone) {
78-
return HelperActivityBase.createBaseIntent(context, PhoneVerificationActivity.class, flowParams)
79-
.putExtra(ExtraConstants.EXTRA_PHONE, phone);
77+
public static Intent createIntent(Context context, FlowParameters flowParams, Bundle params) {
78+
return HelperActivityBase.createBaseIntent(
79+
context, PhoneVerificationActivity.class, flowParams)
80+
.putExtra(ExtraConstants.EXTRA_PARAMS, params);
8081
}
8182

8283
@Override
@@ -94,9 +95,9 @@ protected void onCreate(final Bundle savedInstance) {
9495
return;
9596
}
9697

97-
String phone = getIntent().getExtras().getString(ExtraConstants.EXTRA_PHONE);
98+
Bundle params = getIntent().getExtras().getBundle(ExtraConstants.EXTRA_PARAMS);
9899
VerifyPhoneNumberFragment fragment = VerifyPhoneNumberFragment.newInstance
99-
(getFlowParams(), phone);
100+
(getFlowParams(), params);
100101
getSupportFragmentManager().beginTransaction()
101102
.replace(R.id.fragment_verify_phone, fragment, VerifyPhoneNumberFragment.TAG)
102103
.disallowAddToBackStack()

auth/src/main/java/com/firebase/ui/auth/ui/phone/VerifyPhoneNumberFragment.java

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import android.widget.EditText;
3333
import android.widget.TextView;
3434

35+
import com.firebase.ui.auth.AuthUI;
3536
import com.firebase.ui.auth.R;
3637
import com.firebase.ui.auth.ui.ExtraConstants;
3738
import com.firebase.ui.auth.ui.FlowParameters;
@@ -64,13 +65,13 @@ public class VerifyPhoneNumberFragment extends FragmentBase implements View.OnCl
6465
private PhoneVerificationActivity mVerifier;
6566
private TextView mSmsTermsText;
6667

67-
public static VerifyPhoneNumberFragment newInstance(FlowParameters flowParameters,
68-
String phone) {
68+
public static VerifyPhoneNumberFragment newInstance(
69+
FlowParameters flowParameters, Bundle params) {
6970
VerifyPhoneNumberFragment fragment = new VerifyPhoneNumberFragment();
7071

7172
Bundle args = new Bundle();
7273
args.putParcelable(ExtraConstants.EXTRA_FLOW_PARAMS, flowParameters);
73-
args.putString(ExtraConstants.EXTRA_PHONE, phone);
74+
args.putBundle(ExtraConstants.EXTRA_PARAMS, params);
7475

7576
fragment.setArguments(args);
7677
return fragment;
@@ -133,9 +134,22 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
133134
// Check for phone
134135
// It is assumed that the phone number that are being wired in via Credential Selector
135136
// are e164 since we store it.
136-
String phone = getArguments().getString(ExtraConstants.EXTRA_PHONE);
137-
if (!TextUtils.isEmpty(phone)) {
138-
// Use phone passed in
137+
Bundle params = getArguments().getBundle(ExtraConstants.EXTRA_PARAMS);
138+
String phone = null;
139+
String countryCode = null;
140+
String nationalNumber = null;
141+
if (params != null) {
142+
phone = params.getString(AuthUI.EXTRA_DEFAULT_PHONE_NUMBER);
143+
countryCode = params.getString(AuthUI.EXTRA_DEFAULT_COUNTRY_CODE);
144+
nationalNumber = params.getString(AuthUI.EXTRA_DEFAULT_NATIONAL_NUMBER);
145+
}
146+
if (!TextUtils.isEmpty(countryCode) && !TextUtils.isEmpty(nationalNumber)) {
147+
// User supplied country code & national number
148+
PhoneNumber phoneNumber = PhoneNumberUtils.getPhoneNumber(countryCode, nationalNumber);
149+
setPhoneNumber(phoneNumber);
150+
setCountryCode(phoneNumber);
151+
} else if (!TextUtils.isEmpty(phone)) {
152+
// User supplied full phone number
139153
PhoneNumber phoneNumber = PhoneNumberUtils.getPhoneNumber(phone);
140154
setPhoneNumber(phoneNumber);
141155
setCountryCode(phoneNumber);

auth/src/main/java/com/firebase/ui/auth/util/signincontainer/SignInDelegate.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,9 +249,11 @@ private void startAuthMethodChoice() {
249249
break;
250250
case PhoneAuthProvider.PROVIDER_ID:
251251
// Go directly to phone flow
252-
String phone = firstIdpConfig.getParams().getString(AuthUI.EXTRA_DEFAULT_PHONE);
252+
Bundle params = firstIdpConfig.getParams();
253+
Intent phoneActivityIntent = PhoneVerificationActivity
254+
.createIntent(getContext(), flowParams, params);
253255
startActivityForResult(
254-
PhoneVerificationActivity.createIntent(getContext(), flowParams, phone),
256+
phoneActivityIntent,
255257
RC_PHONE_FLOW);
256258
break;
257259
default:

auth/src/test/java/com/firebase/ui/auth/ui/phone/PhoneTestConstants.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ public class PhoneTestConstants {
2424
public static final String PHONE_NO_COUNTRY_CODE = "23456789";
2525
public static final String US_COUNTRY_CODE = "1";
2626
public static final String US_ISO2 = "US";
27+
public static final String CA_ISO2 = "CA";
28+
public static final String CA_COUNTRY_CODE = "1";
2729
public static final String YE_COUNTRY_CODE = "967";
2830
public static final String YE_ISO2 = "YE";
2931
}

auth/src/test/java/com/firebase/ui/auth/ui/phone/PhoneVerificationActivityTest.java

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,14 @@
4949
import org.robolectric.shadows.ShadowLooper;
5050

5151
import java.util.Collections;
52+
import java.util.Locale;
5253
import java.util.concurrent.TimeUnit;
5354

55+
import static com.firebase.ui.auth.ui.phone.PhoneTestConstants.CA_COUNTRY_CODE;
5456
import static com.firebase.ui.auth.ui.phone.PhoneTestConstants.PHONE;
5557
import static com.firebase.ui.auth.ui.phone.PhoneTestConstants.PHONE_NO_COUNTRY_CODE;
5658
import static com.firebase.ui.auth.ui.phone.PhoneTestConstants.YE_COUNTRY_CODE;
59+
import static com.firebase.ui.auth.ui.phone.PhoneTestConstants.CA_ISO2;
5760
import static com.firebase.ui.auth.ui.phone.PhoneTestConstants.YE_RAW_PHONE;
5861
import static com.firebase.ui.auth.ui.phone.PhoneVerificationActivity.AUTO_RETRIEVAL_TIMEOUT_MILLIS;
5962
import static junit.framework.Assert.assertEquals;
@@ -107,12 +110,14 @@ public void setUp() {
107110
}
108111

109112
@Test
110-
public void testPhoneNumberFromSmartlock_prePopulatesPhoneNumberInBundle() {
113+
public void testDefaultFullPhoneNumber_prePopulatesPhoneNumberInBundle() {
114+
Bundle fullPhoneParams = new Bundle();
115+
fullPhoneParams.putString(AuthUI.EXTRA_DEFAULT_PHONE_NUMBER, YE_RAW_PHONE);
111116
Intent startIntent = PhoneVerificationActivity.createIntent(
112117
RuntimeEnvironment.application,
113118
TestHelper.getFlowParameters(
114119
Collections.singletonList(AuthUI.PHONE_VERIFICATION_PROVIDER)),
115-
YE_RAW_PHONE);
120+
fullPhoneParams);
116121

117122
mActivity = Robolectric.buildActivity(PhoneVerificationActivity.class, startIntent)
118123
.create(new Bundle()).start().visible().get();
@@ -129,6 +134,34 @@ public void testPhoneNumberFromSmartlock_prePopulatesPhoneNumberInBundle() {
129134
String.valueOf(((CountryInfo) mCountryListSpinner.getTag()).countryCode));
130135
}
131136

137+
@Test
138+
public void testDefaultCountryCodeAndNationalNumber_prePopulatesPhoneNumberInBundle() {
139+
Bundle phoneParams = new Bundle();
140+
phoneParams.putString(AuthUI.EXTRA_DEFAULT_COUNTRY_CODE, CA_ISO2);
141+
phoneParams.putString(AuthUI.EXTRA_DEFAULT_NATIONAL_NUMBER, PHONE_NO_COUNTRY_CODE);
142+
Intent startIntent = PhoneVerificationActivity.createIntent(
143+
RuntimeEnvironment.application,
144+
TestHelper.getFlowParameters(
145+
Collections.singletonList(AuthUI.PHONE_VERIFICATION_PROVIDER)),
146+
phoneParams);
147+
148+
mActivity = Robolectric.buildActivity(PhoneVerificationActivity.class, startIntent)
149+
.create(new Bundle()).start().visible().get();
150+
151+
VerifyPhoneNumberFragment verifyPhoneNumberFragment = (VerifyPhoneNumberFragment)
152+
mActivity.getSupportFragmentManager()
153+
.findFragmentByTag(VerifyPhoneNumberFragment.TAG);
154+
assertNotNull(verifyPhoneNumberFragment);
155+
mPhoneEditText = mActivity.findViewById(R.id.phone_number);
156+
mCountryListSpinner = mActivity.findViewById(R.id.country_list);
157+
158+
assertEquals(PHONE_NO_COUNTRY_CODE, mPhoneEditText.getText().toString());
159+
assertEquals(CA_COUNTRY_CODE,
160+
String.valueOf(((CountryInfo) mCountryListSpinner.getTag()).countryCode));
161+
assertEquals(new Locale("", CA_ISO2),
162+
((CountryInfo) mCountryListSpinner.getTag()).locale);
163+
}
164+
132165
@Test
133166
public void testBadPhoneNumber_showsInlineError() {
134167
VerifyPhoneNumberFragment verifyPhoneNumberFragment = (VerifyPhoneNumberFragment)

0 commit comments

Comments
 (0)