1414
1515package com .firebase .ui .auth .ui .email ;
1616
17+ import android .app .Activity ;
18+ import android .arch .lifecycle .Observer ;
19+ import android .arch .lifecycle .ViewModelProviders ;
1720import android .content .Context ;
21+ import android .content .DialogInterface ;
1822import android .content .Intent ;
1923import android .os .Bundle ;
20- import android .support .annotation .NonNull ;
2124import android .support .annotation .RestrictTo ;
2225import android .support .design .widget .TextInputLayout ;
26+ import android .support .v7 .app .AlertDialog ;
2327import android .view .View ;
2428import android .widget .EditText ;
2529
2630import com .firebase .ui .auth .R ;
2731import com .firebase .ui .auth .data .model .FlowParameters ;
32+ import com .firebase .ui .auth .data .model .Resource ;
33+ import com .firebase .ui .auth .data .model .State ;
2834import com .firebase .ui .auth .ui .AppCompatBase ;
2935import com .firebase .ui .auth .ui .HelperActivityBase ;
30- import com .firebase .ui .auth .ui .TaskFailureLogger ;
3136import com .firebase .ui .auth .util .ExtraConstants ;
37+ import com .firebase .ui .auth .util .ui .ImeHelper ;
3238import com .firebase .ui .auth .util .ui .fieldvalidators .EmailFieldValidator ;
33- import com .google .android .gms .tasks .OnFailureListener ;
34- import com .google .android .gms .tasks .OnSuccessListener ;
39+ import com .google .firebase .auth .FirebaseAuthInvalidCredentialsException ;
3540import com .google .firebase .auth .FirebaseAuthInvalidUserException ;
3641
3742/**
3843 * Activity to initiate the "forgot password" flow by asking for the user's email.
3944 */
4045@ RestrictTo (RestrictTo .Scope .LIBRARY_GROUP )
41- public class RecoverPasswordActivity extends AppCompatBase implements View .OnClickListener {
42- private static final String TAG = "RecoverPasswordActivity" ;
46+ public class RecoverPasswordActivity extends AppCompatBase implements View .OnClickListener ,
47+ ImeHelper .DonePressedListener {
48+ private RecoverPasswordHandler mHandler ;
4349
50+ private TextInputLayout mEmailInputLayout ;
4451 private EditText mEmailEditText ;
4552 private EmailFieldValidator mEmailFieldValidator ;
4653
47- public static Intent createIntent (Context context , FlowParameters flowParams , String email ) {
48- return HelperActivityBase .createBaseIntent (context , RecoverPasswordActivity .class , flowParams )
54+ public static Intent createIntent (Context context , FlowParameters params , String email ) {
55+ return HelperActivityBase .createBaseIntent (context , RecoverPasswordActivity .class , params )
4956 .putExtra (ExtraConstants .EXTRA_EMAIL , email );
5057 }
5158
@@ -54,51 +61,67 @@ protected void onCreate(Bundle savedInstanceState) {
5461 super .onCreate (savedInstanceState );
5562 setContentView (R .layout .fui_forgot_password_layout );
5663
57- mEmailFieldValidator =
58- new EmailFieldValidator ((TextInputLayout ) findViewById (R .id .email_layout ));
64+ mHandler = ViewModelProviders .of (this ).get (RecoverPasswordHandler .class );
65+ mHandler .init (getFlowHolder ().getArguments ());
66+ mHandler .getProgressLiveData ().observe (this , new Observer <Resource <String >>() {
67+ @ Override
68+ public void onChanged (Resource <String > resource ) {
69+ if (resource .getState () == State .LOADING ) {
70+ getDialogHolder ().showLoadingDialog (R .string .fui_progress_dialog_sending );
71+ return ;
72+ }
73+
74+ getDialogHolder ().dismissDialog ();
75+ if (resource .getState () == State .SUCCESS ) {
76+ mEmailInputLayout .setError (null );
77+ showEmailSentDialog (resource .getValue ());
78+ } else if (resource .getException () instanceof FirebaseAuthInvalidUserException
79+ || resource .getException () instanceof FirebaseAuthInvalidCredentialsException ) {
80+ // No FirebaseUser exists with this email address, show error.
81+ mEmailInputLayout .setError (getString (R .string .fui_error_email_does_not_exist ));
82+ } else {
83+ mEmailInputLayout .setError (resource .getException ().getLocalizedMessage ());
84+ }
85+ }
86+ });
87+
88+ mEmailInputLayout = findViewById (R .id .email_layout );
5989 mEmailEditText = findViewById (R .id .email );
90+ mEmailFieldValidator = new EmailFieldValidator (mEmailInputLayout );
6091
6192 String email = getIntent ().getStringExtra (ExtraConstants .EXTRA_EMAIL );
6293 if (email != null ) {
6394 mEmailEditText .setText (email );
6495 }
6596
97+ ImeHelper .setImeOnDoneListener (mEmailEditText , this );
6698 findViewById (R .id .button_done ).setOnClickListener (this );
6799 }
68100
69- private void next (final String email ) {
70- getAuthHelper ().getFirebaseAuth ()
71- .sendPasswordResetEmail (email )
72- .addOnFailureListener (
73- new TaskFailureLogger (TAG , "Error sending password reset email" ))
74- .addOnSuccessListener (new OnSuccessListener <Void >() {
75- @ Override
76- public void onSuccess (Void aVoid ) {
77- getDialogHolder ().dismissDialog ();
78- RecoveryEmailSentDialog .show (
79- email , getSupportFragmentManager ());
80- }
81- })
82- .addOnFailureListener (this , new OnFailureListener () {
83- @ Override
84- public void onFailure (@ NonNull Exception e ) {
85- getDialogHolder ().dismissDialog ();
86-
87- if (e instanceof FirebaseAuthInvalidUserException ) {
88- // No FirebaseUser exists with this email address, show error.
89- mEmailEditText .setError (getString (R .string .fui_error_email_does_not_exist ));
90- }
91- }
92- });
93- }
94-
95101 @ Override
96102 public void onClick (View view ) {
97- if (view .getId () == R .id .button_done ) {
98- if (mEmailFieldValidator .validate (mEmailEditText .getText ())) {
99- getDialogHolder ().showLoadingDialog (R .string .fui_progress_dialog_sending );
100- next (mEmailEditText .getText ().toString ());
101- }
103+ if (view .getId () == R .id .button_done
104+ && mEmailFieldValidator .validate (mEmailEditText .getText ())) {
105+ onDonePressed ();
102106 }
103107 }
108+
109+ @ Override
110+ public void onDonePressed () {
111+ mHandler .startReset (mEmailEditText .getText ().toString ());
112+ }
113+
114+ private void showEmailSentDialog (String email ) {
115+ new AlertDialog .Builder (this )
116+ .setTitle (R .string .fui_title_confirm_recover_password )
117+ .setMessage (getString (R .string .fui_confirm_recovery_body , email ))
118+ .setOnDismissListener (new DialogInterface .OnDismissListener () {
119+ @ Override
120+ public void onDismiss (DialogInterface dialog ) {
121+ finish (Activity .RESULT_OK , new Intent ());
122+ }
123+ })
124+ .setPositiveButton (android .R .string .ok , null )
125+ .show ();
126+ }
104127}
0 commit comments