Skip to content

Version 4.1.0 #1373

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 32 commits into from
Jun 26, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
8dfe398
Begin development on Version 4.1.0
samtstern May 24, 2018
204f65f
Merge branch 'master' into version-4.1.0-dev
samtstern May 29, 2018
fd99883
Include/exclude countries from the country selector list in phone aut…
lsirac May 30, 2018
a385dfa
Force ToS & Pp to be added to align with FirebaseUI Web & iOS (#1325)
lsirac May 30, 2018
afe6c2d
Rewrite phone auth with new architecture and finalize progress revamp…
SUPERCILEX May 31, 2018
fc9e46a
Merge branch 'version-4.0.1-dev' into version-4.1.0-dev
samtstern May 31, 2018
95f928c
Remove unused strings, update the baseline
samtstern May 31, 2018
8832dbd
Remove testing hacks
SUPERCILEX Jun 2, 2018
3e1ad5f
Merge branch 'master' into version-4.1.0-dev
samtstern Jun 6, 2018
e683a7b
Merge branch 'version-4.1.0-dev' into fix-4.1.0-lint
samtstern Jun 6, 2018
65a1a37
Unused translation
samtstern Jun 6, 2018
0d36631
Make lambda parameter last
samtstern Jun 6, 2018
44b1a4f
Fix 4.1.0 lint (#1329)
samtstern Jun 6, 2018
6f5f8c5
Adds documentation for limiting countries in phone auth's country sel…
lsirac Jun 6, 2018
5c78b88
Merge remote-tracking branch 'upstream/version-4.1.0-dev' into tests
SUPERCILEX Jun 6, 2018
5fac07e
Upgrade to Gradle 4.8 (#1350)
SUPERCILEX Jun 12, 2018
d460977
Firestore adapter lifecycle lint checks (#1340)
pavlospt Jun 12, 2018
2fb28a1
Fix overlapping view and padding issues (#1324)
SUPERCILEX Jun 12, 2018
076b865
Merge remote-tracking branch 'upstream/version-4.1.0-dev' into tests
SUPERCILEX Jun 12, 2018
519f887
Remove all hacks
SUPERCILEX Jun 12, 2018
8c514ad
Tidy
SUPERCILEX Jun 12, 2018
36b118f
Remove testing hacks (#1337)
samtstern Jun 12, 2018
a346bf2
Country selector fixes (#1345)
lsirac Jun 12, 2018
915846d
Add new user information (#1355)
SUPERCILEX Jun 13, 2018
dcdb3b5
Improve logo to picker sign-in methods ratio (#1354)
SUPERCILEX Jun 14, 2018
45c12b1
Add support for GitHub IDP (#1199)
SUPERCILEX Jun 19, 2018
3579b41
AGP 3.2.0-beta01 (#1367)
samtstern Jun 22, 2018
c228ef1
Translations for fui_auto_verified (#1369)
samtstern Jun 22, 2018
a97133b
Upgrading anonymous accounts (#1368)
lsirac Jun 22, 2018
58a4865
Add GitHub strings
samtstern Jun 26, 2018
5121a35
Add GitHub strings (#1372)
samtstern Jun 26, 2018
32f67f4
Version 4.1.0
samtstern Jun 26, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,16 +47,16 @@ libraries.
```groovy
dependencies {
// FirebaseUI for Firebase Realtime Database
implementation 'com.firebaseui:firebase-ui-database:4.0.1'
implementation 'com.firebaseui:firebase-ui-database:4.1.0'

// FirebaseUI for Cloud Firestore
implementation 'com.firebaseui:firebase-ui-firestore:4.0.1'
implementation 'com.firebaseui:firebase-ui-firestore:4.1.0'

// FirebaseUI for Firebase Auth
implementation 'com.firebaseui:firebase-ui-auth:4.0.1'
implementation 'com.firebaseui:firebase-ui-auth:4.1.0'

// FirebaseUI for Cloud Storage
implementation 'com.firebaseui:firebase-ui-storage:4.0.1'
implementation 'com.firebaseui:firebase-ui-storage:4.1.0'
}
```

Expand Down Expand Up @@ -99,7 +99,7 @@ versions. This means that FirebaseUI has independent dependencies on each of the
For best results, your app should depend on a version of each dependency with the same major
version number as the version used by FirebaseUI.

As of version `4.0.0`, FirebaseUI has the following dependency versions:
As of version `4.1.0`, FirebaseUI has the following dependency versions:

| Library | Version |
|----------------------|--------------------------------|
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@
<activity
android:name=".auth.SignedInActivity"
android:label="@string/title_auth_activity" />
<activity
android:name=".auth.AnonymousUpgradeActivity"
android:label="@string/title_anonymous_upgrade"/>

<!-- Firestore demo -->
<activity
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/java/com/firebase/uidemo/ChooserActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import android.view.ViewGroup;
import android.widget.TextView;

import com.firebase.uidemo.auth.AnonymousUpgradeActivity;
import com.firebase.uidemo.auth.AuthUiActivity;
import com.firebase.uidemo.database.firestore.FirestoreChatActivity;
import com.firebase.uidemo.database.firestore.FirestorePagingActivity;
Expand Down Expand Up @@ -53,6 +54,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
private static class ActivityChooserAdapter extends RecyclerView.Adapter<ActivityStarterHolder> {
private static final Class[] CLASSES = new Class[]{
AuthUiActivity.class,
AnonymousUpgradeActivity.class,
FirestoreChatActivity.class,
FirestorePagingActivity.class,
RealtimeDbChatActivity.class,
Expand All @@ -61,6 +63,7 @@ private static class ActivityChooserAdapter extends RecyclerView.Adapter<Activit

private static final int[] DESCRIPTION_NAMES = new int[]{
R.string.title_auth_activity,
R.string.title_anonymous_upgrade,
R.string.title_firestore_activity,
R.string.title_firestore_paging_activity,
R.string.title_realtime_database_activity,
Expand All @@ -69,6 +72,7 @@ private static class ActivityChooserAdapter extends RecyclerView.Adapter<Activit

private static final int[] DESCRIPTION_IDS = new int[]{
R.string.desc_auth,
R.string.desc_anonymous_upgrade,
R.string.desc_firestore,
R.string.desc_firestore_paging,
R.string.desc_realtime_database,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
package com.firebase.uidemo.auth;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.firebase.ui.auth.AuthUI;
import com.firebase.ui.auth.ErrorCodes;
import com.firebase.ui.auth.IdpResponse;
import com.firebase.uidemo.R;
import com.firebase.uidemo.util.ConfigurationUtils;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthCredential;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class AnonymousUpgradeActivity extends AppCompatActivity {

private static final String TAG = "AccountLink";

private static final int RC_SIGN_IN = 123;

@BindView(R.id.status_text)
TextView mStatus;

@BindView(R.id.anon_sign_in)
Button mAnonSignInButton;

@BindView(R.id.begin_flow)
Button mLaunchUIButton;

@BindView(R.id.resolve_merge)
Button mResolveMergeButton;

@BindView(R.id.sign_out)
Button mSignOutButton;

private AuthCredential mPendingCredential;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_anonymous_upgrade);
ButterKnife.bind(this);
}

@OnClick(R.id.anon_sign_in)
public void signInAnonymously() {
FirebaseAuth.getInstance().signInAnonymously()
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
updateUI();

if (task.isSuccessful()) {
setStatus("Signed in anonymously as user "
+ getUserIdentifier(task.getResult().getUser()));
} else {
setStatus("Anonymous sign in failed.");
}
}
});
}

@OnClick(R.id.begin_flow)
public void startAuthUI() {
List<AuthUI.IdpConfig> providers = ConfigurationUtils.getConfiguredProviders(this);
Intent intent = AuthUI.getInstance().createSignInIntentBuilder()
.setLogo(R.drawable.firebase_auth_120dp)
.setAvailableProviders(providers)
.setIsSmartLockEnabled(false)
.enableAnonymousUsersAutoUpgrade()
.build();
startActivityForResult(intent, RC_SIGN_IN);
}

@OnClick(R.id.resolve_merge)
public void resolveMerge() {
if (mPendingCredential == null) {
Toast.makeText(this, "Nothing to resolve.", Toast.LENGTH_SHORT).show();
return;
}

// TODO: Show how to do good data moving

FirebaseAuth.getInstance().signInWithCredential(mPendingCredential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
mPendingCredential = null;
updateUI();

if (task.isSuccessful()) {
setStatus("Signed in as " + getUserIdentifier(task.getResult().getUser()));
} else {
Log.w(TAG, "Merge failed", task.getException());
setStatus("Failed to resolve merge conflict, see logs.");
}
}
});
}

@OnClick(R.id.sign_out)
public void signOut() {
AuthUI.getInstance().signOut(this)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
setStatus(null);
updateUI();
}
});
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
IdpResponse response = IdpResponse.fromResultIntent(data);
if (response == null) {
// User pressed back button
return;
}
if (resultCode == RESULT_OK) {
setStatus("Signed in as " + getUserIdentifier(FirebaseAuth.getInstance().getCurrentUser()));
} else {
if (response.getError().getErrorCode() == ErrorCodes.ANONYMOUS_UPGRADE_MERGE_CONFLICT) {
setStatus("Merge conflict: user already exists.");
mResolveMergeButton.setEnabled(true);
mPendingCredential = response.getCredentialForLinking();
}
}

updateUI();
}
}

private void updateUI() {
FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();

if (currentUser == null) {
// Not signed in
mAnonSignInButton.setEnabled(true);
mLaunchUIButton.setEnabled(false);
mResolveMergeButton.setEnabled(false);
mSignOutButton.setEnabled(false);
} else if (mPendingCredential == null && currentUser.isAnonymous()) {
// Anonymous user, waiting for linking
mAnonSignInButton.setEnabled(false);
mLaunchUIButton.setEnabled(true);
mResolveMergeButton.setEnabled(false);
mSignOutButton.setEnabled(true);
} else if (mPendingCredential == null && !currentUser.isAnonymous()) {
// Fully signed in
mAnonSignInButton.setEnabled(false);
mLaunchUIButton.setEnabled(false);
mResolveMergeButton.setEnabled(false);
mSignOutButton.setEnabled(true);
} else if (mPendingCredential != null) {
// Signed in anonymous, awaiting merge conflict
mAnonSignInButton.setEnabled(false);
mLaunchUIButton.setEnabled(false);
mResolveMergeButton.setEnabled(true);
mSignOutButton.setEnabled(true);
}
}

private void setStatus(String message) {
mStatus.setText(message);
}

private String getUserIdentifier(FirebaseUser user) {
if (user.isAnonymous()) {
return user.getUid();
} else if (!TextUtils.isEmpty(user.getEmail())) {
return user.getEmail();
} else if (!TextUtils.isEmpty(user.getPhoneNumber())) {
return user.getPhoneNumber();
} else {
return "unknown";
}
}
}
Loading