diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0a6d84862..0a381a18c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,9 +37,6 @@ - { private static final Class[] CLASSES = new Class[]{ AuthUiActivity.class, - AnonymousUpgradeActivity.class, FirestoreChatActivity.class, FirestorePagingActivity.class, RealtimeDbChatActivity.class, @@ -63,7 +61,6 @@ private static class ActivityChooserAdapter extends RecyclerView.Adapter() { - @Override - public void onComplete(@NonNull Task 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 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() { - @Override - public void onComplete(@NonNull Task 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() { - @Override - public void onComplete(@NonNull Task 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"; - } - } -} diff --git a/app/src/main/java/com/firebase/uidemo/auth/AuthUiActivity.java b/app/src/main/java/com/firebase/uidemo/auth/AuthUiActivity.java index c1aeb0632..b16984c25 100644 --- a/app/src/main/java/com/firebase/uidemo/auth/AuthUiActivity.java +++ b/app/src/main/java/com/firebase/uidemo/auth/AuthUiActivity.java @@ -38,7 +38,6 @@ 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.common.Scopes; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; @@ -46,6 +45,7 @@ import com.google.firebase.auth.FirebaseAuth; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import butterknife.BindView; @@ -61,6 +61,7 @@ public class AuthUiActivity extends AppCompatActivity { private static final String FIREBASE_PRIVACY_POLICY_URL = "https://firebase.google.com/terms/analytics/#7_privacy"; private static final int RC_SIGN_IN = 100; + private static final String OVERRIDE_LOGIN_CHECKS_EXTRA = "override_login_checks"; @BindView(R.id.root) View mRootView; @@ -70,6 +71,7 @@ public class AuthUiActivity extends AppCompatActivity { @BindView(R.id.github_provider) CheckBox mUseGitHubProvider; @BindView(R.id.email_provider) CheckBox mUseEmailProvider; @BindView(R.id.phone_provider) CheckBox mUsePhoneProvider; + @BindView(R.id.anonymous_provider) CheckBox mUseAnonymousProvider; @BindView(R.id.default_theme) RadioButton mDefaultTheme; @BindView(R.id.green_theme) RadioButton mGreenTheme; @@ -103,8 +105,9 @@ public class AuthUiActivity extends AppCompatActivity { @BindView(R.id.allow_new_email_accounts) CheckBox mAllowNewEmailAccounts; @BindView(R.id.require_name) CheckBox mRequireName; - public static Intent createIntent(Context context) { - return new Intent(context, AuthUiActivity.class); + public static Intent createIntent(Context context, boolean overrideLoginChecks) { + return new Intent(context, AuthUiActivity.class) + .putExtra(OVERRIDE_LOGIN_CHECKS_EXTRA, overrideLoginChecks); } @Override @@ -113,7 +116,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) { setContentView(R.layout.auth_ui_layout); ButterKnife.bind(this); - if (ConfigurationUtils.isGoogleMisconfigured(this)) { + if (isGoogleMisconfigured()) { mUseGoogleProvider.setChecked(false); mUseGoogleProvider.setEnabled(false); mUseGoogleProvider.setText(R.string.google_label_missing_config); @@ -128,7 +131,7 @@ public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { }); } - if (ConfigurationUtils.isFacebookMisconfigured(this)) { + if (isFacebookMisconfigured()) { mUseFacebookProvider.setChecked(false); mUseFacebookProvider.setEnabled(false); mUseFacebookProvider.setText(R.string.facebook_label_missing_config); @@ -143,13 +146,13 @@ public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { }); } - if (ConfigurationUtils.isTwitterMisconfigured(this)) { + if (isTwitterMisconfigured()) { mUseTwitterProvider.setChecked(false); mUseTwitterProvider.setEnabled(false); mUseTwitterProvider.setText(R.string.twitter_label_missing_config); } - if (ConfigurationUtils.isGitHubMisconfigured(this)) { + if (isGitHubMisconfigured()) { mUseGitHubProvider.setChecked(false); mUseGitHubProvider.setEnabled(false); mUseGitHubProvider.setText(R.string.github_label_missing_config); @@ -164,10 +167,8 @@ public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { }); } - if (ConfigurationUtils.isGoogleMisconfigured(this) - || ConfigurationUtils.isFacebookMisconfigured(this) - || ConfigurationUtils.isTwitterMisconfigured(this) - || ConfigurationUtils.isGitHubMisconfigured(this)) { + if (isGoogleMisconfigured() || isFacebookMisconfigured() + || isTwitterMisconfigured() || isGitHubMisconfigured()) { showSnackbar(R.string.configuration_required); } @@ -187,6 +188,7 @@ public void signIn(View view) { getSelectedPrivacyPolicyUrl()) .setIsSmartLockEnabled(mEnableCredentialSelector.isChecked(), mEnableHintSelector.isChecked()) + .setIsAccountLinkingEnabled(true, null) .build(), RC_SIGN_IN); } @@ -217,19 +219,20 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { @Override protected void onResume() { super.onResume(); - FirebaseAuth auth = FirebaseAuth.getInstance(); - if (auth.getCurrentUser() != null) { + if (FirebaseAuth.getInstance().getCurrentUser() != null + && !getIntent().getBooleanExtra(OVERRIDE_LOGIN_CHECKS_EXTRA, false)) { startSignedInActivity(null); finish(); } } private void handleSignInResponse(int resultCode, Intent data) { - final IdpResponse response = IdpResponse.fromResultIntent(data); + IdpResponse response = IdpResponse.fromResultIntent(data); // Successfully signed in if (resultCode == RESULT_OK) { startSignedInActivity(response); + setResult(RESULT_OK); finish(); } else { // Sign in failed @@ -319,6 +322,10 @@ private List getSelectedProviders() { selectedProviders.add(new IdpConfig.PhoneBuilder().build()); } + if (mUseAnonymousProvider.isChecked()) { + selectedProviders.add(new IdpConfig.AnonymousBuilder().build()); + } + return selectedProviders; } @@ -338,6 +345,33 @@ private String getSelectedPrivacyPolicyUrl() { return FIREBASE_PRIVACY_POLICY_URL; } + private boolean isGoogleMisconfigured() { + return AuthUI.UNCONFIGURED_CONFIG_VALUE.equals(getString(R.string.default_web_client_id)); + } + + private boolean isFacebookMisconfigured() { + return AuthUI.UNCONFIGURED_CONFIG_VALUE.equals(getString(R.string.facebook_application_id)); + } + + private boolean isTwitterMisconfigured() { + List twitterConfigs = Arrays.asList( + getString(R.string.twitter_consumer_key), + getString(R.string.twitter_consumer_secret) + ); + + return twitterConfigs.contains(AuthUI.UNCONFIGURED_CONFIG_VALUE); + } + + private boolean isGitHubMisconfigured() { + List gitHubConfigs = Arrays.asList( + getString(R.string.firebase_web_host), + getString(R.string.github_client_id), + getString(R.string.github_client_secret) + ); + + return gitHubConfigs.contains(AuthUI.UNCONFIGURED_CONFIG_VALUE); + } + private void setGoogleScopesEnabled(boolean enabled) { mGoogleScopesHeader.setEnabled(enabled); mGoogleScopeDriveFile.setEnabled(enabled); diff --git a/app/src/main/java/com/firebase/uidemo/auth/SignedInActivity.java b/app/src/main/java/com/firebase/uidemo/auth/SignedInActivity.java index f921f310c..dd5b4cbd3 100644 --- a/app/src/main/java/com/firebase/uidemo/auth/SignedInActivity.java +++ b/app/src/main/java/com/firebase/uidemo/auth/SignedInActivity.java @@ -58,6 +58,8 @@ public class SignedInActivity extends AppCompatActivity { private static final String TAG = "SignedInActivity"; + private static final int RC_LINK_ACCOUNT = 4433; + @BindView(android.R.id.content) View mRootView; @BindView(R.id.user_profile_picture) ImageView mUserProfilePicture; @@ -78,7 +80,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) { FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser(); if (currentUser == null) { - startActivity(AuthUiActivity.createIntent(this)); + startActivity(AuthUiActivity.createIntent(this, false)); finish(); return; } @@ -89,6 +91,15 @@ public void onCreate(@Nullable Bundle savedInstanceState) { ButterKnife.bind(this); populateProfile(response); populateIdpToken(response); + populatePrevUid(response); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == RC_LINK_ACCOUNT && resultCode == RESULT_OK) { + finish(); + } } @OnClick(R.id.sign_out) @@ -99,7 +110,7 @@ public void signOut() { @Override public void onComplete(@NonNull Task task) { if (task.isSuccessful()) { - startActivity(AuthUiActivity.createIntent(SignedInActivity.this)); + startActivity(AuthUiActivity.createIntent(SignedInActivity.this, false)); finish(); } else { Log.w(TAG, "signOut:failure", task.getException()); @@ -109,6 +120,11 @@ public void onComplete(@NonNull Task task) { }); } + @OnClick(R.id.link_account) + public void linkAccount() { + startActivityForResult(AuthUiActivity.createIntent(this, true), RC_LINK_ACCOUNT); + } + @OnClick(R.id.delete_account) public void deleteAccountClicked() { new AlertDialog.Builder(this) @@ -119,7 +135,7 @@ public void onClick(DialogInterface dialogInterface, int i) { deleteAccount(); } }) - .setNegativeButton("No", null) + .setNegativeButton(android.R.string.no, null) .show(); } @@ -130,7 +146,7 @@ private void deleteAccount() { @Override public void onComplete(@NonNull Task task) { if (task.isSuccessful()) { - startActivity(AuthUiActivity.createIntent(SignedInActivity.this)); + startActivity(AuthUiActivity.createIntent(SignedInActivity.this, false)); finish(); } else { showSnackbar(R.string.delete_account_failed); @@ -164,7 +180,7 @@ private void populateProfile(@Nullable IdpResponse response) { List providers = new ArrayList<>(); if (user.getProviderData().isEmpty()) { - providers.add("Anonymous"); + providers.add(getString(R.string.providers_anonymous)); } else { for (UserInfo info : user.getProviderData()) { switch (info.getProviderId()) { @@ -224,6 +240,16 @@ private void populateIdpToken(@Nullable IdpResponse response) { } } + private void populatePrevUid(IdpResponse response) { + String prevUid = response == null ? null : response.getPrevUid(); + + if (prevUid == null) { + findViewById(R.id.prev_uid_layout).setVisibility(View.GONE); + } else { + ((TextView) findViewById(R.id.prev_uid)).setText(prevUid); + } + } + private void showSnackbar(@StringRes int errorMessageRes) { Snackbar.make(mRootView, errorMessageRes, Snackbar.LENGTH_LONG).show(); } diff --git a/app/src/main/java/com/firebase/uidemo/util/ConfigurationUtils.java b/app/src/main/java/com/firebase/uidemo/util/ConfigurationUtils.java deleted file mode 100644 index 18f3f7d0b..000000000 --- a/app/src/main/java/com/firebase/uidemo/util/ConfigurationUtils.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.firebase.uidemo.util; - - -import android.content.Context; -import android.content.res.Resources; - -import com.firebase.ui.auth.AuthUI; -import com.firebase.uidemo.R; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class ConfigurationUtils { - - public static boolean isGoogleMisconfigured(Context context) { - return AuthUI.UNCONFIGURED_CONFIG_VALUE.equals( - context.getString(R.string.default_web_client_id)); - } - - public static boolean isFacebookMisconfigured(Context context) { - return AuthUI.UNCONFIGURED_CONFIG_VALUE.equals( - context.getString(R.string.facebook_application_id)); - } - - public static boolean isTwitterMisconfigured(Context context) { - List twitterConfigs = Arrays.asList( - context.getString(R.string.twitter_consumer_key), - context.getString(R.string.twitter_consumer_secret) - ); - - return twitterConfigs.contains(AuthUI.UNCONFIGURED_CONFIG_VALUE); - } - - public static boolean isGitHubMisconfigured(Context context) { - List gitHubConfigs = Arrays.asList( - context.getString(R.string.firebase_web_host), - context.getString(R.string.github_client_id), - context.getString(R.string.github_client_secret) - ); - - return gitHubConfigs.contains(AuthUI.UNCONFIGURED_CONFIG_VALUE); - } - - public static List getConfiguredProviders(Context context) { - List providers = new ArrayList<>(); - providers.add(new AuthUI.IdpConfig.EmailBuilder().build()); - providers.add(new AuthUI.IdpConfig.PhoneBuilder().build()); - - if (!isGoogleMisconfigured(context)) { - providers.add(new AuthUI.IdpConfig.GoogleBuilder().build()); - } - - if (!isFacebookMisconfigured(context)) { - providers.add(new AuthUI.IdpConfig.FacebookBuilder().build()); - } - - if (!isTwitterMisconfigured(context)) { - providers.add(new AuthUI.IdpConfig.TwitterBuilder().build()); - } - - if (!isGitHubMisconfigured(context)) { - providers.add(new AuthUI.IdpConfig.GitHubBuilder().build()); - } - - return providers; - } -} diff --git a/app/src/main/res/layout/activity_anonymous_upgrade.xml b/app/src/main/res/layout/activity_anonymous_upgrade.xml deleted file mode 100644 index 6ac9537e0..000000000 --- a/app/src/main/res/layout/activity_anonymous_upgrade.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - -