Skip to content

Commit 3a24b1d

Browse files
authored
Version 4.3.2
2 parents 610d9f3 + ca22ae6 commit 3a24b1d

File tree

99 files changed

+500
-469
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

99 files changed

+500
-469
lines changed

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,19 +50,19 @@ libraries.
5050
```groovy
5151
dependencies {
5252
// FirebaseUI for Firebase Realtime Database
53-
implementation 'com.firebaseui:firebase-ui-database:4.3.1'
53+
implementation 'com.firebaseui:firebase-ui-database:4.3.2'
5454
5555
// FirebaseUI for Cloud Firestore
56-
implementation 'com.firebaseui:firebase-ui-firestore:4.3.1'
56+
implementation 'com.firebaseui:firebase-ui-firestore:4.3.2'
5757
5858
// FirebaseUI for Firebase Auth
59-
implementation 'com.firebaseui:firebase-ui-auth:4.3.1'
59+
implementation 'com.firebaseui:firebase-ui-auth:4.3.2'
6060
6161
// FirebaseUI for Firebase Auth (GitHub provider)
62-
implementation 'com.firebaseui:firebase-ui-auth-github:4.3.1'
62+
implementation 'com.firebaseui:firebase-ui-auth-github:4.3.2'
6363
6464
// FirebaseUI for Cloud Storage
65-
implementation 'com.firebaseui:firebase-ui-storage:4.3.1'
65+
implementation 'com.firebaseui:firebase-ui-storage:4.3.2'
6666
}
6767
```
6868

auth/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,10 @@ Gradle, add the dependency:
6666
```groovy
6767
dependencies {
6868
// ...
69-
implementation 'com.firebaseui:firebase-ui-auth:4.3.1'
69+
implementation 'com.firebaseui:firebase-ui-auth:4.3.2'
7070
7171
// Required only if GitHub OAuth support is required
72-
implementation 'com.firebaseui:firebase-ui-auth-github:4.3.1'
72+
implementation 'com.firebaseui:firebase-ui-auth-github:4.3.2'
7373
7474
// Required only if Facebook login support is required
7575
// Find the latest Facebook SDK releases here: https://goo.gl/Ce5L94

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

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import android.arch.lifecycle.ViewModelProviders;
44
import android.content.Context;
55
import android.content.Intent;
6-
import android.net.ConnectivityManager;
76
import android.os.Bundle;
87
import android.support.annotation.NonNull;
98
import android.support.annotation.Nullable;
@@ -62,12 +61,7 @@ public void onSuccess(Void aVoid) {
6261
return;
6362
}
6463

65-
if (isOffline()) {
66-
finish(RESULT_CANCELED, IdpResponse.getErrorIntent(
67-
new FirebaseUiException(ErrorCodes.NO_NETWORK)));
68-
} else {
69-
mKickstarter.start();
70-
}
64+
mKickstarter.start();
7165
}
7266
})
7367
.addOnFailureListener(this, new OnFailureListener() {
@@ -98,18 +92,4 @@ public void invalidateEmailLink() {
9892
setIntent(getIntent().putExtra(ExtraConstants.FLOW_PARAMS,
9993
flowParameters));
10094
}
101-
102-
/**
103-
* Check if there is an active or soon-to-be-active network connection.
104-
*
105-
* @return true if there is no network connection, false otherwise.
106-
*/
107-
private boolean isOffline() {
108-
ConnectivityManager manager = (ConnectivityManager) getApplicationContext()
109-
.getSystemService(Context.CONNECTIVITY_SERVICE);
110-
111-
return !(manager != null
112-
&& manager.getActiveNetworkInfo() != null
113-
&& manager.getActiveNetworkInfo().isConnectedOrConnecting());
114-
}
11595
}

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

Lines changed: 15 additions & 0 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.net.ConnectivityManager;
67
import android.support.annotation.NonNull;
78
import android.support.annotation.Nullable;
89
import android.support.annotation.RestrictTo;
@@ -75,4 +76,18 @@ public void startSaveCredentials(
7576
this, getFlowParams(), credential, response);
7677
startActivityForResult(intent, RequestCodes.CRED_SAVE_FLOW);
7778
}
79+
80+
/**
81+
* Check if there is an active or soon-to-be-active network connection.
82+
*
83+
* @return true if there is no network connection, false otherwise.
84+
*/
85+
protected boolean isOffline() {
86+
ConnectivityManager manager = (ConnectivityManager) getApplicationContext()
87+
.getSystemService(Context.CONNECTIVITY_SERVICE);
88+
89+
return !(manager != null
90+
&& manager.getActiveNetworkInfo() != null
91+
&& manager.getActiveNetworkInfo().isConnectedOrConnecting());
92+
}
7893
}

auth/src/main/java/com/firebase/ui/auth/ui/email/RecoverPasswordActivity.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,15 +109,16 @@ protected void onFailure(@NonNull Exception e) {
109109

110110
@Override
111111
public void onClick(View view) {
112-
if (view.getId() == R.id.button_done
113-
&& mEmailFieldValidator.validate(mEmailEditText.getText())) {
112+
if (view.getId() == R.id.button_done) {
114113
onDonePressed();
115114
}
116115
}
117116

118117
@Override
119118
public void onDonePressed() {
120-
mHandler.startReset(mEmailEditText.getText().toString());
119+
if (mEmailFieldValidator.validate(mEmailEditText.getText())) {
120+
mHandler.startReset(mEmailEditText.getText().toString());
121+
}
121122
}
122123

123124
private void showEmailSentDialog(String email) {

auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,11 @@ private void handleResponse(@NonNull IdpResponse response) {
307307
view.setOnClickListener(new View.OnClickListener() {
308308
@Override
309309
public void onClick(View view) {
310+
if (isOffline()) {
311+
Toast.makeText(AuthMethodPickerActivity.this, getString(R.string.fui_no_internet), Toast.LENGTH_SHORT).show();
312+
return;
313+
}
314+
310315
provider.startSignIn(AuthMethodPickerActivity.this);
311316
}
312317
});

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) {
6262
super.onCreate(savedInstanceState);
6363
mVerificationHandler = ViewModelProviders.of(requireActivity())
6464
.get(PhoneNumberVerificationHandler.class);
65-
mCheckPhoneHandler = ViewModelProviders.of(requireActivity())
65+
mCheckPhoneHandler = ViewModelProviders.of(this)
6666
.get(CheckPhoneHandler.class);
6767
}
6868

@@ -124,6 +124,9 @@ protected void onFailure(@NonNull Exception e) {
124124
// Fragment back stacks are the stuff of nightmares (what's new?): the fragment isn't
125125
// destroyed so its state isn't saved and we have to rely on an instance field. Sigh.
126126
mCalled = true;
127+
128+
// DON'T REMOVE
129+
setDefaultCountryForSpinner();
127130
}
128131

129132
@Override
@@ -202,8 +205,6 @@ private void setupCountrySpinner() {
202205
Bundle params = getArguments().getBundle(ExtraConstants.PARAMS);
203206
mCountryListSpinner.init(params);
204207

205-
setDefaultCountryForSpinner();
206-
207208
// Clear error when spinner is clicked on
208209
mCountryListSpinner.setOnClickListener(new View.OnClickListener() {
209210
@Override

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import android.support.annotation.Nullable;
2323
import android.support.annotation.RestrictTo;
2424
import android.support.design.widget.TextInputLayout;
25+
import android.support.v4.app.FragmentManager;
2526
import android.widget.Toast;
2627

2728
import com.firebase.ui.auth.ErrorCodes;
@@ -83,7 +84,18 @@ protected void onFailure(@NonNull Exception e) {
8384
protected void onSuccess(@NonNull PhoneVerification verification) {
8485
if (verification.isAutoVerified()) {
8586
Toast.makeText(
86-
PhoneActivity.this, R.string.fui_auto_verified, Toast.LENGTH_LONG).show();
87+
PhoneActivity.this,
88+
R.string.fui_auto_verified,
89+
Toast.LENGTH_LONG
90+
).show();
91+
92+
FragmentManager manager = getSupportFragmentManager();
93+
if (manager.findFragmentByTag(SubmitConfirmationCodeFragment.TAG) != null) {
94+
// Ensure the submit code screen isn't visible if there's no code to submit.
95+
// It's possible to get into this state when an SMS is sent, but then
96+
// automatically retrieved.
97+
manager.popBackStack();
98+
}
8799
}
88100

89101
handler.startSignIn(verification.getCredential(), new IdpResponse.Builder(

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

Lines changed: 58 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -14,38 +14,45 @@
1414

1515
package com.firebase.ui.auth.ui.phone;
1616

17+
import android.arch.lifecycle.Observer;
1718
import android.arch.lifecycle.ViewModelProviders;
19+
import android.content.ClipData;
20+
import android.content.ClipboardManager;
1821
import android.content.Context;
1922
import android.os.Bundle;
2023
import android.os.Handler;
2124
import android.support.annotation.NonNull;
2225
import android.support.annotation.Nullable;
2326
import android.support.annotation.RestrictTo;
27+
import android.support.v4.content.ContextCompat;
2428
import android.view.LayoutInflater;
2529
import android.view.View;
2630
import android.view.ViewGroup;
2731
import android.view.inputmethod.InputMethodManager;
28-
import android.widget.Button;
2932
import android.widget.ProgressBar;
3033
import android.widget.TextView;
3134

35+
import com.firebase.ui.auth.IdpResponse;
3236
import com.firebase.ui.auth.R;
37+
import com.firebase.ui.auth.data.model.Resource;
38+
import com.firebase.ui.auth.data.model.State;
3339
import com.firebase.ui.auth.ui.FragmentBase;
3440
import com.firebase.ui.auth.util.ExtraConstants;
3541
import com.firebase.ui.auth.util.data.PrivacyDisclosureUtils;
3642
import com.firebase.ui.auth.util.ui.BucketedTextChangeListener;
37-
import com.firebase.ui.auth.util.ui.ImeHelper;
43+
import com.firebase.ui.auth.viewmodel.phone.PhoneProviderResponseHandler;
3844

3945
import java.util.concurrent.TimeUnit;
4046

4147
/**
42-
* Display confirmation code to verify phone numbers input in {{@link CheckPhoneNumberFragment}}
48+
* Display confirmation code to verify phone numbers input in {@link CheckPhoneNumberFragment}
4349
*/
4450
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
4551
public class SubmitConfirmationCodeFragment extends FragmentBase {
4652

4753
public static final String TAG = "SubmitConfirmationCodeFragment";
4854

55+
private static final int VERIFICATION_CODE_LENGTH = 6;
4956
private static final long RESEND_WAIT_MILLIS = 15000;
5057
private static final long TICK_INTERVAL_MILLIS = 500;
5158
private static final String EXTRA_MILLIS_UNTIL_FINISHED = "millis_until_finished";
@@ -66,9 +73,10 @@ public void run() {
6673
private TextView mResendCodeTextView;
6774
private TextView mCountDownTextView;
6875
private SpacedEditText mConfirmationCodeEditText;
69-
private Button mSubmitConfirmationButton;
7076
private long mMillisUntilFinished = RESEND_WAIT_MILLIS;
7177

78+
private boolean mHasResumed;
79+
7280
public static SubmitConfirmationCodeFragment newInstance(String phoneNumber) {
7381
SubmitConfirmationCodeFragment fragment = new SubmitConfirmationCodeFragment();
7482
Bundle args = new Bundle();
@@ -103,11 +111,9 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
103111
mCountDownTextView = view.findViewById(R.id.ticker);
104112
mResendCodeTextView = view.findViewById(R.id.resend_code);
105113
mConfirmationCodeEditText = view.findViewById(R.id.confirmation_code);
106-
mSubmitConfirmationButton = view.findViewById(R.id.submit_confirmation_code);
107114

108115
requireActivity().setTitle(getString(R.string.fui_verify_your_phone_title));
109116
processCountdownTick();
110-
setupSubmitConfirmationButton();
111117
setupConfirmationCodeEditText();
112118
setupEditPhoneNumberTextView();
113119
setupResendConfirmationCodeTextView();
@@ -117,6 +123,22 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
117123
view.<TextView>findViewById(R.id.email_footer_tos_and_pp_text));
118124
}
119125

126+
@Override
127+
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
128+
super.onActivityCreated(savedInstanceState);
129+
ViewModelProviders.of(requireActivity())
130+
.get(PhoneProviderResponseHandler.class)
131+
.getOperation()
132+
.observe(this, new Observer<Resource<IdpResponse>>() {
133+
@Override
134+
public void onChanged(@Nullable Resource<IdpResponse> resource) {
135+
if (resource.getState() == State.FAILURE) {
136+
mConfirmationCodeEditText.setText("");
137+
}
138+
}
139+
});
140+
}
141+
120142
@Override
121143
public void onStart() {
122144
super.onStart();
@@ -125,6 +147,32 @@ public void onStart() {
125147
.showSoftInput(mConfirmationCodeEditText, 0);
126148
}
127149

150+
@Override
151+
public void onResume() {
152+
super.onResume();
153+
if (!mHasResumed) {
154+
// Don't check for codes before we've even had the chance to send one.
155+
mHasResumed = true;
156+
return;
157+
}
158+
159+
ClipData clip = ContextCompat.getSystemService(requireContext(), ClipboardManager.class)
160+
.getPrimaryClip();
161+
if (clip != null && clip.getItemCount() == 1) {
162+
CharSequence candidate = clip.getItemAt(0).getText();
163+
if (candidate != null && candidate.length() == VERIFICATION_CODE_LENGTH) {
164+
try {
165+
Integer.parseInt(candidate.toString());
166+
167+
// We have a number! Try to submit it.
168+
mConfirmationCodeEditText.setText(candidate);
169+
} catch (NumberFormatException ignored) {
170+
// Turns out it wasn't a number
171+
}
172+
}
173+
}
174+
}
175+
128176
@Override
129177
public void onSaveInstanceState(@NonNull Bundle outState) {
130178
mLooper.removeCallbacks(mCountdown);
@@ -139,41 +187,19 @@ public void onDestroy() {
139187
mLooper.removeCallbacks(mCountdown);
140188
}
141189

142-
private void setupSubmitConfirmationButton() {
143-
mSubmitConfirmationButton.setEnabled(false);
144-
mSubmitConfirmationButton.setOnClickListener(new View.OnClickListener() {
145-
@Override
146-
public void onClick(View v) {
147-
submitCode();
148-
}
149-
});
150-
}
151-
152190
private void setupConfirmationCodeEditText() {
153191
mConfirmationCodeEditText.setText("------");
154192
mConfirmationCodeEditText.addTextChangedListener(new BucketedTextChangeListener(
155-
mConfirmationCodeEditText, 6, "-",
193+
mConfirmationCodeEditText, VERIFICATION_CODE_LENGTH, "-",
156194
new BucketedTextChangeListener.ContentChangeCallback() {
157195
@Override
158-
public void whileComplete() {
159-
mSubmitConfirmationButton.setEnabled(true);
196+
public void whenComplete() {
197+
submitCode();
160198
}
161199

162200
@Override
163-
public void whileIncomplete() {
164-
mSubmitConfirmationButton.setEnabled(false);
165-
}
201+
public void whileIncomplete() {}
166202
}));
167-
168-
ImeHelper.setImeOnDoneListener(mConfirmationCodeEditText,
169-
new ImeHelper.DonePressedListener() {
170-
@Override
171-
public void onDonePressed() {
172-
if (mSubmitConfirmationButton.isEnabled()) {
173-
submitCode();
174-
}
175-
}
176-
});
177203
}
178204

179205
private void setupEditPhoneNumberTextView() {
@@ -222,13 +248,11 @@ private void submitCode() {
222248

223249
@Override
224250
public void showProgress(int message) {
225-
mSubmitConfirmationButton.setEnabled(false);
226251
mProgressBar.setVisibility(View.VISIBLE);
227252
}
228253

229254
@Override
230255
public void hideProgress() {
231-
mSubmitConfirmationButton.setEnabled(true);
232256
mProgressBar.setVisibility(View.INVISIBLE);
233257
}
234258
}

0 commit comments

Comments
 (0)