Skip to content

Commit 5fb0fc1

Browse files
authored
Version 6.3.0
Version 6.3.0
2 parents 6d41fb2 + 47cb77d commit 5fb0fc1

File tree

113 files changed

+451
-557
lines changed

Some content is hidden

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

113 files changed

+451
-557
lines changed

Diff for: CHANGELOG.md

Whitespace-only changes.

Diff for: README.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,16 @@ libraries.
4848
```groovy
4949
dependencies {
5050
// FirebaseUI for Firebase Realtime Database
51-
implementation 'com.firebaseui:firebase-ui-database:6.2.1'
51+
implementation 'com.firebaseui:firebase-ui-database:6.3.0'
5252
5353
// FirebaseUI for Cloud Firestore
54-
implementation 'com.firebaseui:firebase-ui-firestore:6.2.1'
54+
implementation 'com.firebaseui:firebase-ui-firestore:6.3.0'
5555
5656
// FirebaseUI for Firebase Auth
57-
implementation 'com.firebaseui:firebase-ui-auth:6.2.1'
57+
implementation 'com.firebaseui:firebase-ui-auth:6.3.0'
5858
5959
// FirebaseUI for Cloud Storage
60-
implementation 'com.firebaseui:firebase-ui-storage:6.2.1'
60+
implementation 'com.firebaseui:firebase-ui-storage:6.3.0'
6161
}
6262
```
6363

@@ -113,7 +113,7 @@ you want to use. Here are some examples listing all of the critical dependencies
113113
implementation "com.google.firebase:firebase-auth:$X.Y.Z"
114114
implementation "com.google.android.gms:play-services-auth:$X.Y.Z"
115115
116-
implementation "android.arch.lifecycle:extensions:$X.Y.Z"
116+
implementation "androidx.lifecycle:lifecycle-extensions:$X.Y.Z"
117117
implementation "androidx.browser:browser:$X.Y.Z"
118118
implementation "androidx.cardview:cardview:$X.Y.Z"
119119
implementation "androidx.constraintlayout:constraintlayout:$X.Y.Z"

Diff for: app/src/main/java/com/firebase/uidemo/database/firestore/FirestoreChatActivity.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.firebase.uidemo.database.firestore;
22

3+
import android.annotation.SuppressLint;
34
import android.os.Bundle;
45
import android.util.Log;
56
import android.view.LayoutInflater;
@@ -39,6 +40,7 @@
3940
* For a general intro to the RecyclerView, see <a href="https://developer.android.com/training/material/lists-cards.html">Creating
4041
* Lists</a>.
4142
*/
43+
@SuppressLint("RestrictedApi")
4244
public class FirestoreChatActivity extends AppCompatActivity
4345
implements FirebaseAuth.AuthStateListener {
4446
private static final String TAG = "FirestoreChatActivity";
@@ -104,7 +106,9 @@ public void onDonePressed() {
104106
@Override
105107
public void onStart() {
106108
super.onStart();
107-
if (isSignedIn()) { attachRecyclerViewAdapter(); }
109+
if (isSignedIn()) {
110+
attachRecyclerViewAdapter();
111+
}
108112
FirebaseAuth.getInstance().addAuthStateListener(this);
109113
}
110114

Diff for: app/src/main/java/com/firebase/uidemo/database/realtime/FirebaseDbPagingActivity.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232

3333
public class FirebaseDbPagingActivity extends AppCompatActivity {
3434

35-
private final String TAG = "PagingActivity";
35+
private static final String TAG = "PagingActivity";
3636

3737
@BindView(R.id.paging_recycler)
3838
RecyclerView mRecycler;

Diff for: app/src/main/java/com/firebase/uidemo/database/realtime/RealtimeDbChatActivity.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.firebase.uidemo.database.realtime;
22

3+
import android.annotation.SuppressLint;
34
import android.os.Bundle;
45
import android.util.Log;
56
import android.view.LayoutInflater;
@@ -39,6 +40,7 @@
3940
* For a general intro to the RecyclerView, see <a href="https://developer.android.com/training/material/lists-cards.html">Creating
4041
* Lists</a>.
4142
*/
43+
@SuppressLint("RestrictedApi")
4244
public class RealtimeDbChatActivity extends AppCompatActivity
4345
implements FirebaseAuth.AuthStateListener {
4446
private static final String TAG = "RealtimeDatabaseDemo";
@@ -47,7 +49,7 @@ public class RealtimeDbChatActivity extends AppCompatActivity
4749
* Get the last 50 chat messages.
4850
*/
4951
@NonNull
50-
protected static final Query sChatQuery =
52+
protected final Query sChatQuery =
5153
FirebaseDatabase.getInstance().getReference().child("chats").limitToLast(50);
5254

5355
@BindView(R.id.messagesList)
@@ -82,7 +84,9 @@ public void onDonePressed() {
8284
@Override
8385
public void onStart() {
8486
super.onStart();
85-
if (isSignedIn()) { attachRecyclerViewAdapter(); }
87+
if (isSignedIn()) {
88+
attachRecyclerViewAdapter();
89+
}
8690
FirebaseAuth.getInstance().addAuthStateListener(this);
8791
}
8892

Diff for: app/src/main/java/com/firebase/uidemo/util/ConfigurationUtils.java

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.firebase.uidemo.util;
22

3+
import android.annotation.SuppressLint;
34
import android.content.Context;
45

56
import com.firebase.ui.auth.AuthUI;
@@ -12,6 +13,7 @@
1213

1314
import androidx.annotation.NonNull;
1415

16+
@SuppressLint("RestrictedApi")
1517
public final class ConfigurationUtils {
1618

1719
private ConfigurationUtils() {

Diff for: auth/README.md

+14-14
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ Gradle, add the dependency:
6565
```groovy
6666
dependencies {
6767
// ...
68-
implementation 'com.firebaseui:firebase-ui-auth:6.2.1'
68+
implementation 'com.firebaseui:firebase-ui-auth:6.3.0'
6969
7070
// Required only if Facebook login support is required
7171
// Find the latest Facebook SDK releases here: https://github.com/facebook/facebook-android-sdk/blob/master/CHANGELOG.md
@@ -273,19 +273,19 @@ pass it to us via `setEmailLink`.
273273

274274
```java
275275
if (AuthUI.canHandleIntent(getIntent())) {
276-
if (getIntent().getExtras() != null) {
277-
return;
278-
}
279-
String link = getIntent().getExtras().getString(ExtraConstants.EMAIL_LINK_SIGN_IN);
280-
if (link != null) {
281-
startActivityForResult(
282-
AuthUI.getInstance()
283-
.createSignInIntentBuilder()
284-
.setEmailLink(link)
285-
.setAvailableProviders(getAvailableProviders())
286-
.build(),
287-
RC_SIGN_IN);
288-
}
276+
if (getIntent().getExtras() == null) {
277+
return;
278+
}
279+
String link = getIntent().getData().toString();
280+
if (link != null) {
281+
startActivityForResult(
282+
AuthUI.getInstance()
283+
.createSignInIntentBuilder()
284+
.setEmailLink(link)
285+
.setAvailableProviders(getAvailableProviders())
286+
.build(),
287+
RC_SIGN_IN);
288+
}
289289
}
290290
```
291291

Diff for: auth/src/main/java/com/firebase/ui/auth/AuthMethodPickerLayout.java

+7
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import com.google.firebase.auth.EmailAuthProvider;
88
import com.google.firebase.auth.FacebookAuthProvider;
9+
import com.google.firebase.auth.GithubAuthProvider;
910
import com.google.firebase.auth.GoogleAuthProvider;
1011
import com.google.firebase.auth.PhoneAuthProvider;
1112
import com.google.firebase.auth.TwitterAuthProvider;
@@ -158,6 +159,12 @@ public AuthMethodPickerLayout.Builder setAnonymousButtonId(@IdRes int anonymousB
158159
return this;
159160
}
160161

162+
public AuthMethodPickerLayout.Builder setGithubButtonId(
163+
@IdRes int githubButtonId) {
164+
providersMapping.put(GithubAuthProvider.PROVIDER_ID, githubButtonId);
165+
return this;
166+
}
167+
161168
public AuthMethodPickerLayout.Builder setMicrosoftButtonId(
162169
@IdRes int microsoftButtonId) {
163170
providersMapping.put(AuthUI.MICROSOFT_PROVIDER, microsoftButtonId);

Diff for: auth/src/main/java/com/firebase/ui/auth/AuthUI.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,7 @@ public final class AuthUI {
149149
public static final Set<String> SOCIAL_PROVIDERS =
150150
Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
151151
GoogleAuthProvider.PROVIDER_ID,
152-
FacebookAuthProvider.PROVIDER_ID,
153-
GithubAuthProvider.PROVIDER_ID)));
152+
FacebookAuthProvider.PROVIDER_ID)));
154153

155154
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
156155
public static final String UNCONFIGURED_CONFIG_VALUE = "CHANGE-ME";

Diff for: auth/src/main/java/com/firebase/ui/auth/data/remote/GenericIdpSignInHandler.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import com.google.firebase.auth.OAuthCredential;
4040
import com.google.firebase.auth.OAuthProvider;
4141

42+
import java.util.HashMap;
4243
import java.util.List;
4344
import java.util.Map;
4445

@@ -200,9 +201,12 @@ protected OAuthProvider buildOAuthProvider(String providerId) {
200201

201202
List<String> scopes =
202203
getArguments().getParams().getStringArrayList(ExtraConstants.GENERIC_OAUTH_SCOPES);
203-
Map<String, String> customParams =
204-
getArguments().getParams()
205-
.getParcelable(ExtraConstants.GENERIC_OAUTH_CUSTOM_PARAMETERS);
204+
205+
// This unchecked cast is safe, this extra is put in as a serializable
206+
// in AuthUI.setCustomParameters
207+
HashMap<String, String> customParams =
208+
(HashMap<String, String>) getArguments().getParams()
209+
.getSerializable(ExtraConstants.GENERIC_OAUTH_CUSTOM_PARAMETERS);
206210

207211
if (scopes != null) {
208212
providerBuilder.setScopes(scopes);

Diff for: auth/src/main/java/com/firebase/ui/auth/ui/email/CheckEmailFragment.java

+7
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
import com.firebase.ui.auth.util.ui.ImeHelper;
2424
import com.firebase.ui.auth.util.ui.fieldvalidators.EmailFieldValidator;
2525
import com.firebase.ui.auth.viewmodel.ResourceObserver;
26+
import com.google.android.material.snackbar.Snackbar;
2627
import com.google.android.material.textfield.TextInputLayout;
28+
import com.google.firebase.FirebaseNetworkException;
2729
import com.google.firebase.auth.EmailAuthProvider;
2830

2931
import androidx.annotation.NonNull;
@@ -150,6 +152,11 @@ protected void onFailure(@NonNull Exception e) {
150152
&& ((FirebaseUiException) e).getErrorCode() == ErrorCodes.DEVELOPER_ERROR) {
151153
mListener.onDeveloperFailure(e);
152154
}
155+
156+
if (e instanceof FirebaseNetworkException) {
157+
Snackbar.make(getView(), getString(R.string.fui_no_internet), Snackbar.LENGTH_SHORT).show();
158+
}
159+
153160
// Otherwise just let the user enter their data
154161
}
155162
});

Diff for: auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java

+26-4
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,11 @@
4747
import com.firebase.ui.auth.viewmodel.ProviderSignInBase;
4848
import com.firebase.ui.auth.viewmodel.ResourceObserver;
4949
import com.firebase.ui.auth.viewmodel.idp.SocialProviderResponseHandler;
50+
import com.google.android.material.snackbar.Snackbar;
5051
import com.google.firebase.FirebaseApp;
5152
import com.google.firebase.auth.EmailAuthProvider;
5253
import com.google.firebase.auth.FacebookAuthProvider;
5354
import com.google.firebase.auth.FirebaseAuth;
54-
import com.google.firebase.auth.GithubAuthProvider;
5555
import com.google.firebase.auth.GoogleAuthProvider;
5656
import com.google.firebase.auth.PhoneAuthProvider;
5757

@@ -229,14 +229,36 @@ private void populateIdpListCustomLayout(List<IdpConfig> providerConfigs) {
229229
for (IdpConfig idpConfig : providerConfigs) {
230230
final String providerId = providerOrEmailLinkProvider(idpConfig.getProviderId());
231231

232-
if (!providerButtonIds.containsKey(providerId)) {
232+
Integer buttonResId = providerButtonIds.get(providerId);
233+
if (buttonResId == null) {
233234
throw new IllegalStateException("No button found for auth provider: " + idpConfig.getProviderId());
234235
}
235236

236-
@IdRes int buttonId = providerButtonIds.get(providerId);
237+
@IdRes int buttonId = buttonResId;
237238
View loginButton = findViewById(buttonId);
238239
handleSignInOperation(idpConfig, loginButton);
239240
}
241+
//hide custom layout buttons that don't have their identity provider set
242+
for (String providerBtnId : providerButtonIds.keySet()) {
243+
if (providerBtnId == null) {
244+
continue;
245+
}
246+
boolean hasProvider = false;
247+
for (IdpConfig idpConfig : providerConfigs) {
248+
if (providerBtnId.equals(idpConfig.getProviderId())) {
249+
hasProvider = true;
250+
break;
251+
}
252+
}
253+
if (!hasProvider) {
254+
Integer resId = providerButtonIds.get(providerBtnId);
255+
if (resId == null) {
256+
continue;
257+
}
258+
@IdRes int buttonId = resId;
259+
findViewById(buttonId).setVisibility(View.GONE);
260+
}
261+
}
240262
}
241263

242264
@NonNull
@@ -341,7 +363,7 @@ private void handleResponse(@NonNull IdpResponse response) {
341363
@Override
342364
public void onClick(View view) {
343365
if (isOffline()) {
344-
Toast.makeText(AuthMethodPickerActivity.this, getString(R.string.fui_no_internet), Toast.LENGTH_SHORT).show();
366+
Snackbar.make(findViewById(android.R.id.content), getString(R.string.fui_no_internet), Snackbar.LENGTH_SHORT).show();
345367
return;
346368
}
347369

Diff for: auth/src/main/java/com/firebase/ui/auth/util/data/ProviderUtils.java

+11
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,17 @@ public Task<List<String>> then(@NonNull Task<SignInMethodQueryResult> task) {
212212
}
213213
}
214214

215+
// In this case the developer has configured EMAIL_LINK sign in but the
216+
// user is a password user. The valid use case here is that the developer
217+
// is using admin-created accounts and combining email-link sign in with
218+
// setAllowNewAccounts(false). So we manually enable EMAIL_LINK. See:
219+
// https://github.com/firebase/FirebaseUI-Android/issues/1762#issuecomment-661115293
220+
if (allowedProviders.contains(EMAIL_LINK_PROVIDER)
221+
&& methods.contains(EmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD)
222+
&& !methods.contains(EMAIL_LINK_PROVIDER)) {
223+
lastSignedInProviders.add(0, signInMethodToProviderId(EMAIL_LINK_PROVIDER));
224+
}
225+
215226
if (task.isSuccessful() && lastSignedInProviders.isEmpty()
216227
&& !methods.isEmpty()) {
217228
// There is an existing user who only has unsupported sign in methods

Diff for: auth/src/main/java/com/firebase/ui/auth/viewmodel/email/EmailProviderResponseHandler.java

+13-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.firebase.ui.auth.viewmodel.email;
22

33
import android.app.Application;
4+
import android.util.Log;
45

6+
import com.firebase.ui.auth.ErrorCodes;
7+
import com.firebase.ui.auth.FirebaseUiException;
58
import com.firebase.ui.auth.IdpResponse;
69
import com.firebase.ui.auth.data.model.IntentRequiredException;
710
import com.firebase.ui.auth.data.model.Resource;
@@ -23,6 +26,7 @@
2326
import com.google.firebase.auth.FirebaseAuthUserCollisionException;
2427

2528
import androidx.annotation.NonNull;
29+
import androidx.annotation.Nullable;
2630
import androidx.annotation.RestrictTo;
2731

2832
import static com.firebase.ui.auth.AuthUI.EMAIL_LINK_PROVIDER;
@@ -70,6 +74,8 @@ public void onFailure(@NonNull Exception e) {
7074
password);
7175
handleMergeFailure(credential);
7276
} else {
77+
Log.w(TAG, "Got a collision error during a non-upgrade flow", e);
78+
7379
// Collision with existing user email without anonymous upgrade
7480
// it should be very hard for the user to even get to this error
7581
// due to CheckEmailFragment.
@@ -97,10 +103,14 @@ public StartWelcomeBackFlow(String email) {
97103
}
98104

99105
@Override
100-
public void onSuccess(String provider) {
106+
public void onSuccess(@Nullable String provider) {
101107
if (provider == null) {
102-
throw new IllegalStateException(
103-
"User has no providers even though we got a collision.");
108+
Log.w(TAG, "No providers known for user ("
109+
+ mEmail
110+
+ ") this email address may be reserved.");
111+
setResult(Resource.<IdpResponse>forFailure(
112+
new FirebaseUiException(ErrorCodes.UNKNOWN_ERROR)));
113+
return;
104114
}
105115

106116
if (EmailAuthProvider.PROVIDER_ID.equalsIgnoreCase(provider)) {

Diff for: auth/src/main/res/layout/fui_register_email_layout.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959

6060
<com.google.android.material.textfield.TextInputLayout
6161
android:id="@+id/password_layout"
62-
style="@style/FirebaseUI.TextInputLayout.PasswordField"
62+
style="@style/FirebaseUI.TextInputLayout.NewPasswordField"
6363
android:layout_width="match_parent"
6464
android:layout_height="wrap_content"
6565
android:layout_marginTop="@dimen/fui_field_padding_vert"

0 commit comments

Comments
 (0)