Skip to content

Commit 18baedf

Browse files
committed
Refactor email flow into fragments
Change-Id: Ibaf6e4fc280438c2d35f3d425370143d2c4e09db
1 parent ff427d6 commit 18baedf

19 files changed

+690
-352
lines changed

auth/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ dependencies {
5353
testCompile 'junit:junit:4.12'
5454
testCompile 'org.mockito:mockito-core:2.2.28'
5555
testCompile 'org.robolectric:robolectric:3.1.4'
56+
testCompile "org.robolectric:shadows-support-v4:3.1.4"
5657
// See https://github.com/robolectric/robolectric/issues/1932#issuecomment-219796474
5758
testCompile 'org.khronos:opengl-api:gl1.1-android-2.1_r1'
5859
}

auth/src/main/AndroidManifest.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333

3434
<activity
3535
android:name=".ui.email.RegisterEmailActivity"
36-
android:label="@string/title_register_email_activity"
3736
android:exported="false"
3837
android:theme="@style/FirebaseUI"/>
3938

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
@SuppressWarnings("Registered")
2222
public class AppCompatBase extends AppCompatActivity {
23+
2324
protected ActivityHelper mActivityHelper;
2425

2526
@Override

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
*/
2020
public class ExtraConstants {
2121
public static final String EXTRA_EMAIL = "extra_email";
22+
public static final String EXTRA_NAME = "extra_name";
2223
public static final String EXTRA_ERROR_MESSAGE = "extra_error_msg";
2324
public static final String EXTRA_FLOW_PARAMS = "extra_flow_params";
2425
public static final String EXTRA_IDP_RESPONSE = "extra_idp_response";
Lines changed: 220 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
1+
package com.firebase.ui.auth.ui.email;
2+
3+
import android.app.PendingIntent;
4+
import android.content.Intent;
5+
import android.content.IntentSender;
6+
import android.os.Bundle;
7+
import android.support.annotation.NonNull;
8+
import android.support.annotation.Nullable;
9+
import android.support.design.widget.TextInputLayout;
10+
import android.text.TextUtils;
11+
import android.util.Log;
12+
import android.view.LayoutInflater;
13+
import android.view.View;
14+
import android.view.ViewGroup;
15+
import android.widget.EditText;
16+
17+
import com.firebase.ui.auth.R;
18+
import com.firebase.ui.auth.ui.BaseFragment;
19+
import com.firebase.ui.auth.ui.ExtraConstants;
20+
import com.firebase.ui.auth.ui.FlowParameters;
21+
import com.firebase.ui.auth.ui.TaskFailureLogger;
22+
import com.firebase.ui.auth.ui.email.fieldvalidators.EmailFieldValidator;
23+
import com.firebase.ui.auth.util.FirebaseAuthWrapperFactory;
24+
import com.google.android.gms.auth.api.credentials.Credential;
25+
import com.google.android.gms.tasks.OnCompleteListener;
26+
import com.google.android.gms.tasks.OnSuccessListener;
27+
import com.google.android.gms.tasks.Task;
28+
import com.google.firebase.auth.EmailAuthProvider;
29+
import com.google.firebase.auth.ProviderQueryResult;
30+
31+
import java.util.List;
32+
33+
/**
34+
* Fragment that shows a form with an email field and checks for existing accounts with that
35+
* email.
36+
*
37+
* Host Activities should implement {@link CheckEmailListener}.
38+
*/
39+
public class CheckEmailFragment extends BaseFragment implements
40+
View.OnClickListener {
41+
42+
/**
43+
* Interface to be implemented by Activities hosting this Fragment.
44+
*/
45+
interface CheckEmailListener {
46+
47+
/**
48+
* Email entered belongs to an existing email user.
49+
*/
50+
void onExistingEmailUser(@NonNull String email);
51+
52+
/**
53+
* Email entered belongs to an existing IDP user.
54+
*/
55+
void onExistingIdpUser(@NonNull String email, @NonNull String provider);
56+
57+
/**
58+
* Email entered does not beling to an existing user.
59+
*/
60+
void onNewUser(@NonNull String email, @Nullable String name);
61+
62+
}
63+
64+
public static final String TAG = "CheckEmailFragment";
65+
66+
private static final int RC_HINT = 13;
67+
private static final int RC_WELCOME_BACK_IDP = 15;
68+
private static final int RC_SIGN_IN = 16;
69+
70+
private EditText mEmailEditText;
71+
72+
private EmailFieldValidator mEmailFieldValidator;
73+
private CheckEmailListener mListener;
74+
75+
private Credential mLastCredential;
76+
77+
public static CheckEmailFragment getInstance(@NonNull FlowParameters flowParameters,
78+
@Nullable String email) {
79+
CheckEmailFragment fragment = new CheckEmailFragment();
80+
Bundle args = new Bundle();
81+
args.putParcelable(ExtraConstants.EXTRA_FLOW_PARAMS, flowParameters);
82+
args.putString(ExtraConstants.EXTRA_EMAIL, email);
83+
84+
fragment.setArguments(args);
85+
return fragment;
86+
}
87+
88+
@Nullable
89+
@Override
90+
public View onCreateView(LayoutInflater inflater,
91+
@Nullable ViewGroup container,
92+
@Nullable Bundle savedInstanceState) {
93+
94+
View v = inflater.inflate(R.layout.check_email_layout, container, false);
95+
96+
// Email field and validator
97+
mEmailEditText = (EditText) v.findViewById(R.id.email);
98+
mEmailFieldValidator = new EmailFieldValidator(
99+
(TextInputLayout) v.findViewById(R.id.email_layout));
100+
101+
// "Next" button
102+
v.findViewById(R.id.button_next).setOnClickListener(this);
103+
104+
return v;
105+
}
106+
107+
@Override
108+
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
109+
super.onActivityCreated(savedInstanceState);
110+
111+
// Set title
112+
if (getActivity().getActionBar() != null) {
113+
getActivity().getActionBar().setTitle(R.string.title_check_email);
114+
}
115+
116+
// Set listener
117+
if (!(getActivity() instanceof CheckEmailListener)) {
118+
throw new IllegalStateException("Activity must implement CheckEmailListener");
119+
}
120+
this.mListener = (CheckEmailListener) getActivity();
121+
122+
// Check for email
123+
String email = getArguments().getString(ExtraConstants.EXTRA_EMAIL);
124+
if (!TextUtils.isEmpty(email)) {
125+
mEmailEditText.setText(email);
126+
validateAndProceed();
127+
} if (mHelper.getFlowParams().smartLockEnabled) {
128+
// Try SmartLock email autocomplete hint
129+
showEmailAutoCompleteHint();
130+
}
131+
}
132+
133+
@Override
134+
public void onActivityResult(int requestCode, int resultCode, Intent data) {
135+
super.onActivityResult(requestCode, resultCode, data);
136+
switch (requestCode) {
137+
case RC_HINT:
138+
if (data != null) {
139+
mLastCredential = data.getParcelableExtra(Credential.EXTRA_KEY);
140+
if (mLastCredential != null) {
141+
// Get the email from the credential
142+
mEmailEditText.setText(mLastCredential.getId());
143+
144+
// Attempt to proceed
145+
validateAndProceed();
146+
}
147+
}
148+
break;
149+
case RC_SIGN_IN:
150+
case RC_WELCOME_BACK_IDP:
151+
finish(resultCode, data);
152+
break;
153+
}
154+
}
155+
156+
public void validateAndProceed() {
157+
String email = mEmailEditText.getText().toString();
158+
if (mEmailFieldValidator.validate(email)) {
159+
checkAccountExists(email);
160+
}
161+
}
162+
163+
public void checkAccountExists(@NonNull final String email) {
164+
mHelper.showLoadingDialog(R.string.progress_dialog_checking_accounts);
165+
166+
if (!TextUtils.isEmpty(email)) {
167+
mHelper.getFirebaseAuth()
168+
.fetchProvidersForEmail(email)
169+
.addOnFailureListener(
170+
new TaskFailureLogger(TAG, "Error fetching providers for email"))
171+
.addOnCompleteListener(getActivity(), new OnCompleteListener<ProviderQueryResult>() {
172+
@Override
173+
public void onComplete(@NonNull Task<ProviderQueryResult> task) {
174+
mHelper.dismissDialog();
175+
}
176+
})
177+
.addOnSuccessListener(getActivity(), new OnSuccessListener<ProviderQueryResult>() {
178+
@Override
179+
public void onSuccess(ProviderQueryResult result) {
180+
List<String> providers = result.getProviders();
181+
if (providers == null || providers.isEmpty()) {
182+
// Get name from SmartLock, if possible
183+
String name = null;
184+
if (mLastCredential != null && mLastCredential.getId().equals(email)) {
185+
name = mLastCredential.getName();
186+
}
187+
188+
mListener.onNewUser(email, name);
189+
} else if (EmailAuthProvider.PROVIDER_ID.equalsIgnoreCase(providers.get(0))) {
190+
mListener.onExistingEmailUser(email);
191+
} else {
192+
mListener.onExistingIdpUser(email, providers.get(0));
193+
}
194+
}
195+
});
196+
}
197+
}
198+
199+
private void showEmailAutoCompleteHint() {
200+
PendingIntent hintIntent = FirebaseAuthWrapperFactory
201+
.getFirebaseAuthWrapper(mHelper.getAppName())
202+
.getEmailHintIntent(getActivity());
203+
if (hintIntent != null) {
204+
try {
205+
startIntentSenderForResult(hintIntent.getIntentSender(), RC_HINT, null, 0, 0, 0, null);
206+
} catch (IntentSender.SendIntentException e) {
207+
Log.e(TAG, "Unable to start hint intent", e);
208+
}
209+
}
210+
}
211+
212+
@Override
213+
public void onClick(View view) {
214+
int id = view.getId();
215+
216+
if (id == R.id.button_next) {
217+
validateAndProceed();
218+
}
219+
}
220+
}

0 commit comments

Comments
 (0)