From 05ce3b528b90dbfe92031094332d8b6fcec53f87 Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Thu, 6 Oct 2016 21:36:46 -0700 Subject: [PATCH 01/79] temporary: saving to work on another computer won't compile --- auth/src/main/AndroidManifest.xml | 2 +- .../java/com/firebase/ui/auth/AuthUI.java | 4 +- .../firebase/ui/auth/ui/AppCompatBase.java | 1 - .../ui/auth/ui/ChooseAccountActivity.java | 2 +- .../WelcomeBackPasswordPrompt.java | 14 +- .../auth/ui/email/RegisterEmailActivity.java | 13 +- .../ui/auth/ui/email/SignInActivity.java | 18 +-- .../auth/ui/idp/AuthMethodPickerActivity.java | 13 +- .../auth/ui/idp/CredentialSignInHandler.java | 40 ++--- .../ui/auth/ui/idp/IDPBaseActivity.java | 1 - .../firebase/ui/auth/util/CredentialsAPI.java | 4 +- .../ui/auth/util/CredentialsApiHelper.java | 2 +- .../SmartLock.java} | 149 +++++++++++------- .../firebase/ui/auth/util/SmartlockUtil.java | 56 ------- .../ui/email/RegisterEmailActivityTest.java | 4 +- .../ui/auth/ui/email/SignInActivityTest.java | 4 +- .../ui/idp/AuthMethodPickerActivityTest.java | 4 +- .../ui/idp/CredentialSignInHandlerTest.java | 4 +- 18 files changed, 151 insertions(+), 184 deletions(-) rename auth/src/main/java/com/firebase/ui/auth/{ui/account_link/SaveCredentialsActivity.java => util/SmartLock.java} (57%) delete mode 100644 auth/src/main/java/com/firebase/ui/auth/util/SmartlockUtil.java diff --git a/auth/src/main/AndroidManifest.xml b/auth/src/main/AndroidManifest.xml index 35e39c171..35f4c93cb 100644 --- a/auth/src/main/AndroidManifest.xml +++ b/auth/src/main/AndroidManifest.xml @@ -33,7 +33,7 @@ android:label="@string/title_sign_in_activity" android:theme="@style/FirebaseUI" /> signOut(@NonNull Activity activity) { - // Get helper for Google Sign In and Credentials API + // Get helper for Google Sign In and SmartLock API GoogleApiClientTaskHelper taskHelper = GoogleApiClientTaskHelper.getInstance(activity); taskHelper.getBuilder() .addApi(Auth.CREDENTIALS_API) .addApi(Auth.GOOGLE_SIGN_IN_API, GoogleSignInOptions.DEFAULT_SIGN_IN); - // Get Credentials Helper + // Get SmartLock Helper CredentialsApiHelper credentialsHelper = CredentialsApiHelper.getInstance(taskHelper); // Firebase Sign out diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/AppCompatBase.java b/auth/src/main/java/com/firebase/ui/auth/ui/AppCompatBase.java index 7d2c8eeb5..adb3ce168 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/AppCompatBase.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/AppCompatBase.java @@ -36,5 +36,4 @@ protected void onDestroy() { public void finish(int resultCode, Intent intent) { mActivityHelper.finish(resultCode, intent); } - } diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/ChooseAccountActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/ChooseAccountActivity.java index d062e4df3..3187df39a 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/ChooseAccountActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/ChooseAccountActivity.java @@ -113,7 +113,7 @@ protected void onStop() { } /** - * Called when the Credentials API connects. + * Called when the SmartLock API connects. */ public void onCredentialsApiConnected( CredentialsAPI credentialsApi, diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java b/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java index e9574f33d..94c6143f9 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java @@ -37,7 +37,7 @@ import com.firebase.ui.auth.ui.TaskFailureLogger; import com.firebase.ui.auth.ui.email.PasswordToggler; import com.firebase.ui.auth.ui.email.RecoverPasswordActivity; -import com.firebase.ui.auth.util.SmartlockUtil; +import com.firebase.ui.auth.util.SmartLock; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; import com.google.firebase.auth.AuthCredential; @@ -49,11 +49,11 @@ * the password before initiating a link. */ public class WelcomeBackPasswordPrompt extends AppCompatBase implements View.OnClickListener { - - private static final int RC_CREDENTIAL_SAVE = 3; private static final String TAG = "WelcomeBackPassword"; private static final StyleSpan BOLD = new StyleSpan(Typeface.BOLD); + private SmartLock mSmartLock; + private String mEmail; private TextInputLayout mPasswordLayout; private EditText mPasswordField; @@ -107,8 +107,8 @@ public void onClick(View view) { @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); - if (requestCode == RC_CREDENTIAL_SAVE) { - finish(RESULT_OK, new Intent()); + if (mSmartLock != null) { + mSmartLock.onActivityResult(requestCode, resultCode); } } @@ -137,10 +137,8 @@ public void onSuccess(AuthResult authResult) { new OnSuccessListener() { @Override public void onSuccess(AuthResult authResult) { - mActivityHelper.dismissDialog(); - SmartlockUtil.saveCredentialOrFinish( + mSmartLock = SmartLock.saveCredentialOrFinish( WelcomeBackPasswordPrompt.this, - RC_CREDENTIAL_SAVE, mActivityHelper.getFlowParams(), authResult.getUser(), password, diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java index 129740161..51d0af108 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java @@ -39,7 +39,7 @@ import com.firebase.ui.auth.ui.email.field_validators.EmailFieldValidator; import com.firebase.ui.auth.ui.email.field_validators.PasswordFieldValidator; import com.firebase.ui.auth.ui.email.field_validators.RequiredFieldValidator; -import com.firebase.ui.auth.util.SmartlockUtil; +import com.firebase.ui.auth.util.SmartLock; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; @@ -56,10 +56,10 @@ * Activity displaying a form to create a new email/password account. */ public class RegisterEmailActivity extends AppCompatBase implements View.OnClickListener { - - private static final int RC_SAVE_CREDENTIAL = 3; private static final String TAG = "RegisterEmailActivity"; + private SmartLock mSmartLock; + private EditText mEmailEditText; private EditText mPasswordEditText; private EditText mNameEditText; @@ -160,9 +160,8 @@ public void onComplete(@NonNull Task task) { // This executes even if the name change fails, since // the account creation succeeded and we want to save // the credential to SmartLock (if enabled). - SmartlockUtil.saveCredentialOrFinish( + mSmartLock = SmartLock.saveCredentialOrFinish( RegisterEmailActivity.this, - RC_SAVE_CREDENTIAL, mActivityHelper.getFlowParams(), firebaseUser, password, @@ -202,8 +201,8 @@ public void onFailure(@NonNull Exception e) { @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); - if (requestCode == RC_SAVE_CREDENTIAL) { - finish(RESULT_OK, new Intent()); + if (mSmartLock != null) { + mSmartLock.onActivityResult(requestCode, resultCode); } } diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java index cade6f3e8..8bad120aa 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java @@ -34,7 +34,7 @@ import com.firebase.ui.auth.ui.TaskFailureLogger; import com.firebase.ui.auth.ui.email.field_validators.EmailFieldValidator; import com.firebase.ui.auth.ui.email.field_validators.RequiredFieldValidator; -import com.firebase.ui.auth.util.SmartlockUtil; +import com.firebase.ui.auth.util.SmartLock; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; import com.google.firebase.auth.AuthResult; @@ -44,7 +44,8 @@ */ public class SignInActivity extends AppCompatBase implements View.OnClickListener { private static final String TAG = "SignInActivity"; - private static final int RC_CREDENTIAL_SAVE = 101; + + private SmartLock mSmartLock; private EditText mEmailEditText; private EditText mPasswordEditText; @@ -82,7 +83,7 @@ protected void onCreate(Bundle savedInstanceState) { mPasswordValidator = new RequiredFieldValidator((TextInputLayout) findViewById(R.id .password_layout)); Button signInButton = (Button) findViewById(R.id.button_done); - TextView recoveryButton = (TextView) findViewById(R.id.trouble_signing_in); + TextView recoveryButton = (TextView) findViewById(R.id.trouble_signing_in); if (email != null) { mEmailEditText.setText(email); @@ -93,7 +94,7 @@ protected void onCreate(Bundle savedInstanceState) { } @Override - public void onBackPressed () { + public void onBackPressed() { super.onBackPressed(); } @@ -105,12 +106,9 @@ private void signIn(String email, final String password) { .addOnSuccessListener(new OnSuccessListener() { @Override public void onSuccess(AuthResult authResult) { - mActivityHelper.dismissDialog(); - // Save credential in SmartLock (if enabled) - SmartlockUtil.saveCredentialOrFinish( + mSmartLock = SmartLock.saveCredentialOrFinish( SignInActivity.this, - RC_CREDENTIAL_SAVE, mActivityHelper.getFlowParams(), authResult.getUser(), password, @@ -134,8 +132,8 @@ public void onFailure(@NonNull Exception e) { @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); - if (requestCode == RC_CREDENTIAL_SAVE) { - finish(RESULT_OK, new Intent()); + if (mSmartLock != null) { + mSmartLock.onActivityResult(requestCode, resultCode); } } diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java index 879198f4a..afd290050 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java @@ -35,6 +35,7 @@ import com.firebase.ui.auth.ui.TaskFailureLogger; import com.firebase.ui.auth.ui.email.EmailHintContainerActivity; import com.firebase.ui.auth.util.EmailFlowUtil; +import com.firebase.ui.auth.util.SmartLock; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.EmailAuthProvider; import com.google.firebase.auth.FacebookAuthProvider; @@ -57,12 +58,12 @@ public class AuthMethodPickerActivity extends IDPBaseActivity implements IDPProvider.IDPCallback, View.OnClickListener { - private static final int RC_EMAIL_FLOW = 2; private static final int RC_ACCOUNT_LINK = 3; - private static final int RC_SAVE_CREDENTIAL = 4; private static final String TAG = "AuthMethodPicker"; + private ArrayList mIdpProviders; + private SmartLock mSmartLock; @Override protected void onCreate(Bundle savedInstanceState) { @@ -139,8 +140,8 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { finish(RESULT_OK, new Intent()); } - } else if (requestCode == RC_SAVE_CREDENTIAL) { - finish(RESULT_OK, new Intent()); + } else if (mSmartLock != null) { + mSmartLock.onActivityResult(requestCode, resultCode); } else if (requestCode == RC_ACCOUNT_LINK) { finish(resultCode, new Intent()); } else { @@ -163,8 +164,8 @@ public void onSuccess(final IDPResponse response) { AuthMethodPickerActivity.this, mActivityHelper, RC_ACCOUNT_LINK, - RC_SAVE_CREDENTIAL, - response)); + response, + mSmartLock)); } @Override diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java index 8800a73ab..bd8bbee15 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java @@ -14,16 +14,16 @@ package com.firebase.ui.auth.ui.idp; -import android.app.Activity; import android.support.annotation.NonNull; import android.util.Log; import com.firebase.ui.auth.provider.IDPResponse; import com.firebase.ui.auth.ui.ActivityHelper; +import com.firebase.ui.auth.ui.AppCompatBase; import com.firebase.ui.auth.ui.TaskFailureLogger; import com.firebase.ui.auth.ui.account_link.WelcomeBackIDPPrompt; import com.firebase.ui.auth.ui.account_link.WelcomeBackPasswordPrompt; -import com.firebase.ui.auth.util.SmartlockUtil; +import com.firebase.ui.auth.util.SmartLock; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; @@ -38,27 +38,36 @@ public class CredentialSignInHandler implements OnCompleteListener { private final static String TAG = "CredentialSignInHandler"; private int mAccountLinkResultCode; - private int mSaveCredentialsResultCode; - private Activity mActivity; + private AppCompatBase mActivity; private ActivityHelper mActivityHelper; private IDPResponse mResponse; + private SmartLock mSmartLock; public CredentialSignInHandler( - Activity activity, + AppCompatBase activity, ActivityHelper activityHelper, int accountLinkResultCode, - int saveCredentialsResultCode, - IDPResponse response) { + IDPResponse response, + SmartLock smartLock) { mActivity = activity; mAccountLinkResultCode = accountLinkResultCode; - mSaveCredentialsResultCode = saveCredentialsResultCode; mActivityHelper = activityHelper; mResponse = response; + mSmartLock = smartLock; } @Override - public void onComplete(@NonNull Task task) { - if (!task.isSuccessful()) { + public void onComplete(@NonNull Task task) { + if (task.isSuccessful()) { + mActivityHelper.dismissDialog(); + + FirebaseUser firebaseUser = task.getResult().getUser(); + mSmartLock = SmartLock.saveCredentialOrFinish(mActivity, + mActivityHelper.getFlowParams(), + firebaseUser, + null /* password */, + mResponse.getProviderType()); + } else { if (task.getException() instanceof FirebaseAuthUserCollisionException) { final String email = mResponse.getEmail(); FirebaseAuth firebaseAuth = mActivityHelper.getFirebaseAuth(); @@ -77,15 +86,8 @@ public void onFailure(@NonNull Exception e) { } else { mActivityHelper.dismissDialog(); Log.e(TAG, "Unexpected exception when signing in with credential", - task.getException()); + task.getException()); } - } else { - mActivityHelper.dismissDialog(); - - FirebaseUser firebaseUser = task.getResult().getUser(); - SmartlockUtil.saveCredentialOrFinish(mActivity, mSaveCredentialsResultCode, - mActivityHelper.getFlowParams(), firebaseUser, - null /* password */, mResponse.getProviderType()); } } @@ -109,7 +111,6 @@ public void onSuccess(@NonNull ProviderQueryResult result) { mActivityHelper.getFlowParams(), mResponse ), mAccountLinkResultCode); - } else { // Start IDP welcome back flow mActivity.startActivityForResult( @@ -123,5 +124,4 @@ public void onSuccess(@NonNull ProviderQueryResult result) { } } } - } diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPBaseActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPBaseActivity.java index 6de1ffd9a..c5b8a3535 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPBaseActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPBaseActivity.java @@ -32,5 +32,4 @@ protected AuthCredential createCredential(IDPResponse idpSignInResponse) { } return null; } - } diff --git a/auth/src/main/java/com/firebase/ui/auth/util/CredentialsAPI.java b/auth/src/main/java/com/firebase/ui/auth/util/CredentialsAPI.java index 7f514c958..0675276c1 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/CredentialsAPI.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/CredentialsAPI.java @@ -71,7 +71,7 @@ public boolean isPlayServicesAvailable() { } public boolean isCredentialsAvailable() { - // TODO: (serikb) find the way to check if Credentials is available on top of play services + // TODO: (serikb) find the way to check if SmartLock is available on top of play services return true; } @@ -96,7 +96,7 @@ public void resolveSavedEmails(Activity activity) { try { status.startResolutionForResult(activity, RC_CREDENTIALS_READ); } catch (IntentSender.SendIntentException e) { - Log.e(TAG, "Failed to send Credentials intent.", e); + Log.e(TAG, "Failed to send SmartLock intent.", e); } } } diff --git a/auth/src/main/java/com/firebase/ui/auth/util/CredentialsApiHelper.java b/auth/src/main/java/com/firebase/ui/auth/util/CredentialsApiHelper.java index cd9a3e94b..0647b1a19 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/CredentialsApiHelper.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/CredentialsApiHelper.java @@ -144,7 +144,7 @@ public void onResult(@NonNull Status status) { } public static CredentialsApiHelper getInstance(Activity activity) { - // Get a task helper with the Credentials Api + // Get a task helper with the SmartLock Api GoogleApiClientTaskHelper taskHelper = GoogleApiClientTaskHelper.getInstance(activity); taskHelper.getBuilder() .addApi(Auth.CREDENTIALS_API); diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/account_link/SaveCredentialsActivity.java b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java similarity index 57% rename from auth/src/main/java/com/firebase/ui/auth/ui/account_link/SaveCredentialsActivity.java rename to auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java index 4adddf39a..8dd6e2f44 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/account_link/SaveCredentialsActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java @@ -12,10 +12,9 @@ * limitations under the License. */ -package com.firebase.ui.auth.ui.account_link; +package com.firebase.ui.auth.util; import android.app.PendingIntent; -import android.content.Context; import android.content.Intent; import android.content.IntentSender; import android.net.Uri; @@ -25,12 +24,8 @@ import android.util.Log; import com.firebase.ui.auth.BuildConfig; -import com.firebase.ui.auth.R; -import com.firebase.ui.auth.ui.ActivityHelper; import com.firebase.ui.auth.ui.AppCompatBase; -import com.firebase.ui.auth.ui.ExtraConstants; import com.firebase.ui.auth.ui.FlowParameters; -import com.firebase.ui.auth.util.FirebaseAuthWrapperFactory; import com.google.android.gms.auth.api.Auth; import com.google.android.gms.auth.api.credentials.Credential; import com.google.android.gms.auth.api.credentials.IdentityProviders; @@ -43,13 +38,15 @@ import com.google.firebase.auth.FirebaseUser; import com.google.firebase.auth.GoogleAuthProvider; -public class SaveCredentialsActivity extends AppCompatBase - implements GoogleApiClient.ConnectionCallbacks, ResultCallback, +import static android.app.Activity.RESULT_OK; + +public class SmartLock implements GoogleApiClient.ConnectionCallbacks, ResultCallback, GoogleApiClient.OnConnectionFailedListener { private static final String TAG = "CredentialsSaveBase"; private static final int RC_SAVE = 100; private static final int RC_UPDATE_SERVICE = 28; + private AppCompatBase mActivity; private String mName; private String mEmail; private String mPassword; @@ -57,29 +54,24 @@ public class SaveCredentialsActivity extends AppCompatBase private String mProfilePictureUri; private GoogleApiClient mCredentialsApiClient; - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.save_credentials_layout); - - if (!FirebaseAuthWrapperFactory.getFirebaseAuthWrapper(mActivityHelper.getAppName()) - .isPlayServicesAvailable(this)) { - finish(RESULT_FIRST_USER, getIntent()); - return; - } - - mName = getIntent().getStringExtra(ExtraConstants.EXTRA_NAME); - mEmail = getIntent().getStringExtra(ExtraConstants.EXTRA_EMAIL); - mPassword = getIntent().getStringExtra(ExtraConstants.EXTRA_PASSWORD); - mProvider = getIntent().getStringExtra(ExtraConstants.EXTRA_PROVIDER); - mProfilePictureUri = getIntent() - .getStringExtra(ExtraConstants.EXTRA_PROFILE_PICTURE_URI); - - mCredentialsApiClient = new GoogleApiClient.Builder(this) + public SmartLock(AppCompatBase activity, + String name, + String email, + String password, + String provider, + String profilePictureUri) { + mActivity = activity; + mName = name; + mEmail = email; + mPassword = password; + mProvider = provider; + mProfilePictureUri = profilePictureUri; + + mCredentialsApiClient = new GoogleApiClient.Builder(mActivity) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(Auth.CREDENTIALS_API) - .enableAutoManage(this, this) + .enableAutoManage(mActivity, this) .build(); } @@ -87,9 +79,10 @@ protected void onCreate(Bundle savedInstanceState) { public void onConnected(@Nullable Bundle bundle) { if (mEmail == null) { Log.e(TAG, "Unable to save null credential!"); - finish(RESULT_FIRST_USER, getIntent()); + mActivity.finish(RESULT_OK, mActivity.getIntent()); return; } + Credential.Builder builder = new Credential.Builder(mEmail); builder.setPassword(mPassword); if (mPassword == null) { @@ -107,13 +100,16 @@ public void onConnected(@Nullable Bundle bundle) { } } } + if (mName != null) { builder.setName(mName); } + if (mProfilePictureUri != null) { builder.setProfilePictureUri(Uri.parse(mProfilePictureUri)); } - mActivityHelper.getCredentialsApi() + + Auth.CredentialsApi .save(mCredentialsApiClient, builder.build()) .setResultCallback(this); } @@ -133,13 +129,20 @@ public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { + " and code: " + connectionResult.getErrorCode()); } PendingIntent resolution = - GoogleApiAvailability.getInstance().getErrorResolutionPendingIntent(this, - connectionResult.getErrorCode(), RC_UPDATE_SERVICE); + GoogleApiAvailability.getInstance().getErrorResolutionPendingIntent(mActivity, + connectionResult + .getErrorCode(), + RC_UPDATE_SERVICE); try { - startIntentSenderForResult(resolution.getIntentSender(), RC_UPDATE_SERVICE, null, 0, 0, 0); + mActivity.startIntentSenderForResult(resolution.getIntentSender(), + RC_UPDATE_SERVICE, + null, + 0, + 0, + 0); } catch (IntentSender.SendIntentException e) { e.printStackTrace(); - finish(RESULT_FIRST_USER, getIntent()); + mActivity.finish(RESULT_OK, mActivity.getIntent()); } } @@ -147,63 +150,89 @@ public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { @Override public void onResult(@NonNull Status status) { if (status.isSuccess()) { - finish(RESULT_OK, getIntent()); + mActivity.finish(RESULT_OK, mActivity.getIntent()); } else { if (status.hasResolution()) { // Try to resolve the save request. This will prompt the user if // the credential is new. try { - status.startResolutionForResult(this, RC_SAVE); + status.startResolutionForResult(mActivity, RC_SAVE); } catch (IntentSender.SendIntentException e) { // Could not resolve the request Log.e(TAG, "STATUS: Failed to send resolution.", e); - finish(RESULT_FIRST_USER, getIntent()); + mActivity.finish(RESULT_OK, mActivity.getIntent()); } } else { - finish(RESULT_FIRST_USER, getIntent()); + mActivity.finish(RESULT_OK, mActivity.getIntent()); } } } - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); + public void onActivityResult(int requestCode, int resultCode) { if (requestCode == RC_SAVE) { if (resultCode == RESULT_OK) { if (BuildConfig.DEBUG) { Log.d(TAG, "SAVE: OK"); } - finish(RESULT_OK, getIntent()); + mActivity.finish(RESULT_OK, new Intent()); } else { Log.e(TAG, "SAVE: Canceled by user"); - finish(RESULT_FIRST_USER, getIntent()); + mActivity.finish(RESULT_OK, new Intent()); } } else if (requestCode == RC_UPDATE_SERVICE) { if (resultCode == RESULT_OK) { - Credential credential = new Credential.Builder(mEmail).setPassword(mPassword).build(); - mActivityHelper.getCredentialsApi() + Credential credential = new Credential.Builder(mEmail).setPassword(mPassword) + .build(); + Auth.CredentialsApi .save(mCredentialsApiClient, credential) .setResultCallback(this); } else { Log.e(TAG, "SAVE: Canceled by user"); - finish(RESULT_FIRST_USER, getIntent()); + mActivity.finish(RESULT_OK, new Intent()); } } } - public static Intent createIntent( - Context context, - FlowParameters flowParams, - FirebaseUser user, - @Nullable String password, - @Nullable String provider) { - - String photoUrl = user.getPhotoUrl() != null ? user.getPhotoUrl().toString() : null; - return ActivityHelper.createBaseIntent(context, SaveCredentialsActivity.class, flowParams) - .putExtra(ExtraConstants.EXTRA_NAME, user.getDisplayName()) - .putExtra(ExtraConstants.EXTRA_EMAIL, user.getEmail()) - .putExtra(ExtraConstants.EXTRA_PASSWORD, password) - .putExtra(ExtraConstants.EXTRA_PROVIDER, provider) - .putExtra(ExtraConstants.EXTRA_PROFILE_PICTURE_URI, photoUrl); + /** + * If SmartLock is enabled and Google Play Services is available, save the credentials. + * Otherwise, finish the calling Activity with RESULT_OK. + * + * @param activity the calling Activity. + * @param parameters calling Activity flow parameters. + * @param firebaseUser Firebase user to save in Credential. + * @param password (optional) password for email credential. + * @param provider (optional) provider string for provider credential. + */ + public static SmartLock saveCredentialOrFinish(AppCompatBase activity, + FlowParameters parameters, + FirebaseUser firebaseUser, + @Nullable String password, + @Nullable String provider) { + // If SmartLock is disabled, finish the Activity + if (!parameters.smartLockEnabled) { + activity.finish(RESULT_OK, new Intent()); + return null; + } + + // If Play Services is not available, finish the Activity + if (!PlayServicesHelper.getInstance(activity).isPlayServicesAvailable()) { + activity.finish(RESULT_OK, new Intent()); + return null; + } + + if (!FirebaseAuthWrapperFactory.getFirebaseAuthWrapper(parameters.appName) + .isPlayServicesAvailable(activity)) { + activity.finish(RESULT_OK, activity.getIntent()); + return null; + } + + // Save credentials + return new SmartLock(activity, + firebaseUser.getDisplayName(), + firebaseUser.getEmail(), + password, + provider, + firebaseUser.getPhotoUrl() != null ? firebaseUser.getPhotoUrl() + .toString() : null); } } diff --git a/auth/src/main/java/com/firebase/ui/auth/util/SmartlockUtil.java b/auth/src/main/java/com/firebase/ui/auth/util/SmartlockUtil.java deleted file mode 100644 index 4e17d5446..000000000 --- a/auth/src/main/java/com/firebase/ui/auth/util/SmartlockUtil.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.firebase.ui.auth.util; - -import android.app.Activity; -import android.content.Intent; -import android.support.annotation.Nullable; - -import com.firebase.ui.auth.ui.FlowParameters; -import com.firebase.ui.auth.ui.account_link.SaveCredentialsActivity; -import com.google.firebase.auth.FirebaseUser; - -/** - * Helper class to deal with Smartlock Flows. - */ -public class SmartlockUtil { - - /** - * If SmartLock is enabled and Google Play Services is available, start the save credential - * Activity. Otherwise, finish the calling Activity with RESULT_OK. - * @param activity the calling Activity. - * @param requestCode request code to use when starting the save operation. - * @param parameters calling Activity flow parameters. - * @param firebaseUser Firebase user to save in Credential. - * @param password (optional) password for email credential. - * @param provider (optional) provider string for provider credential. - */ - public static void saveCredentialOrFinish(Activity activity, - int requestCode, - FlowParameters parameters, - FirebaseUser firebaseUser, - @Nullable String password, - @Nullable String provider) { - - // If SmartLock is disabled, finish the Activity - if (!parameters.smartLockEnabled) { - finishActivity(activity); - return; - } - - // If Play Services is not available, finish the Activity - if(!PlayServicesHelper.getInstance(activity).isPlayServicesAvailable()) { - finishActivity(activity); - return; - } - - // Launch save activity - Intent saveCredentialIntent = SaveCredentialsActivity.createIntent(activity, parameters, - firebaseUser, password, provider); - activity.startActivityForResult(saveCredentialIntent, requestCode); - } - - private static void finishActivity(Activity activity) { - activity.setResult(Activity.RESULT_OK, new Intent()); - activity.finish(); - } - -} diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java index d340f8a8a..9dfd20e39 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java @@ -30,7 +30,7 @@ import com.firebase.ui.auth.test_helpers.TestConstants; import com.firebase.ui.auth.test_helpers.TestHelper; import com.firebase.ui.auth.ui.ExtraConstants; -import com.firebase.ui.auth.ui.account_link.SaveCredentialsActivity; +import com.firebase.ui.auth.util.SmartLock; import com.firebase.ui.auth.util.PlayServicesHelper; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.auth.UserProfileChangeRequest; @@ -134,7 +134,7 @@ public void testSignupButton_successfulRegisterationShouldContinueToSaveCredenti assertNotNull(nextIntent); assertEquals( nextIntent.intent.getComponent().getClassName(), - SaveCredentialsActivity.class.getName()); + SmartLock.class.getName()); assertEquals( TestConstants.EMAIL, nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_EMAIL)); diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java index 455da58ea..db9c452e4 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java @@ -29,7 +29,7 @@ import com.firebase.ui.auth.test_helpers.TestConstants; import com.firebase.ui.auth.test_helpers.TestHelper; import com.firebase.ui.auth.ui.ExtraConstants; -import com.firebase.ui.auth.ui.account_link.SaveCredentialsActivity; +import com.firebase.ui.auth.util.SmartLock; import com.firebase.ui.auth.util.PlayServicesHelper; import com.google.firebase.auth.FirebaseUser; @@ -123,7 +123,7 @@ public void testSignInButton_signsInAndSavesCredentials() { ShadowActivity.IntentForResult nextIntent = Shadows.shadowOf(signInActivity).getNextStartedActivityForResult(); assertEquals( - SaveCredentialsActivity.class.getName(), + SmartLock.class.getName(), nextIntent.intent.getComponent().getClassName() ); assertEquals( diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java index 6e0dac7ea..042772eca 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java @@ -33,7 +33,7 @@ import com.firebase.ui.auth.test_helpers.TestConstants; import com.firebase.ui.auth.test_helpers.TestHelper; import com.firebase.ui.auth.ui.ExtraConstants; -import com.firebase.ui.auth.ui.account_link.SaveCredentialsActivity; +import com.firebase.ui.auth.util.SmartLock; import com.firebase.ui.auth.ui.email.EmailHintContainerActivity; import com.firebase.ui.auth.util.PlayServicesHelper; import com.google.firebase.auth.AuthCredential; @@ -181,7 +181,7 @@ private static void verifySaveCredentialIntent( ShadowActivity.IntentForResult nextIntent, String provider) { assertEquals( - SaveCredentialsActivity.class.getName(), + SmartLock.class.getName(), nextIntent.intent.getComponent().getClassName()); assertEquals( nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_EMAIL), diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java index 14af08ac6..7461bb949 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java @@ -32,7 +32,7 @@ import com.firebase.ui.auth.ui.ActivityHelper; import com.firebase.ui.auth.ui.ExtraConstants; import com.firebase.ui.auth.ui.FlowParameters; -import com.firebase.ui.auth.ui.account_link.SaveCredentialsActivity; +import com.firebase.ui.auth.util.SmartLock; import com.firebase.ui.auth.ui.account_link.WelcomeBackIDPPrompt; import com.firebase.ui.auth.ui.account_link.WelcomeBackPasswordPrompt; import com.firebase.ui.auth.util.CredentialsAPI; @@ -121,7 +121,7 @@ public void testSignInSucceeded() { Intent capturedIntent = intentCaptor.getValue(); assertEquals(RC_SAVE_CREDENTIALS, (int) intCaptor.getValue()); assertEquals( - SaveCredentialsActivity.class.getName(), + SmartLock.class.getName(), capturedIntent.getComponent().getClassName()); assertEquals( TestConstants.EMAIL, From 2c0eaf5f54e03b7f2a0bd6772dc23a95cc9fee54 Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Thu, 13 Oct 2016 23:20:09 -0700 Subject: [PATCH 02/79] Code compiles --- auth/src/main/AndroidManifest.xml | 4 - .../firebase/ui/auth/ui/AppCompatBase.java | 3 +- .../WelcomeBackPasswordPrompt.java | 31 ++-- .../ui/email/EmailHintContainerActivity.java | 1 - .../auth/ui/email/RegisterEmailActivity.java | 31 ++-- .../ui/auth/ui/email/SignInActivity.java | 40 ++--- .../auth/ui/idp/AuthMethodPickerActivity.java | 7 +- .../auth/ui/idp/CredentialSignInHandler.java | 24 +-- .../ui/idp/IDPSignInContainerActivity.java | 4 +- .../com/firebase/ui/auth/util/SmartLock.java | 143 +++++++++++------- 10 files changed, 160 insertions(+), 128 deletions(-) diff --git a/auth/src/main/AndroidManifest.xml b/auth/src/main/AndroidManifest.xml index 35f4c93cb..54b7f5b93 100644 --- a/auth/src/main/AndroidManifest.xml +++ b/auth/src/main/AndroidManifest.xml @@ -32,10 +32,6 @@ android:name="com.firebase.ui.auth.ui.email.SignInActivity" android:label="@string/title_sign_in_activity" android:theme="@style/FirebaseUI" /> - () { @Override public void onSuccess(AuthResult authResult) { - mSmartLock = SmartLock.saveCredentialOrFinish( - WelcomeBackPasswordPrompt.this, - mActivityHelper.getFlowParams(), - authResult.getUser(), - password, - null /* provider */); + getSupportFragmentManager() + .beginTransaction() + .add(SmartLock.getInstance( + WelcomeBackPasswordPrompt.this, + mActivityHelper.getFlowParams(), + authResult.getUser(), + password, + null /* provider */), "test") + .commit(); +// SmartLock.saveCredentialOrFinish( +// WelcomeBackPasswordPrompt.this, +// mActivityHelper.getFlowParams(), +// authResult.getUser(), +// password, +// null /* provider */); } }); } diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/email/EmailHintContainerActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/email/EmailHintContainerActivity.java index c30d13d9c..94b95344c 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/email/EmailHintContainerActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/email/EmailHintContainerActivity.java @@ -49,7 +49,6 @@ protected void onCreate(Bundle savedInstanceState) { } } finish(RESULT_CANCELED, new Intent()); - return; } @Override diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java index a2a9a9669..d82833b5d 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java @@ -58,8 +58,6 @@ public class RegisterEmailActivity extends AppCompatBase implements View.OnClickListener { private static final String TAG = "RegisterEmailActivity"; - private SmartLock mSmartLock; - private EditText mEmailEditText; private EditText mPasswordEditText; private EditText mNameEditText; @@ -160,12 +158,21 @@ public void onComplete(@NonNull Task task) { // This executes even if the name change fails, since // the account creation succeeded and we want to save // the credential to SmartLock (if enabled). - mSmartLock = SmartLock.saveCredentialOrFinish( - RegisterEmailActivity.this, - mActivityHelper.getFlowParams(), - firebaseUser, - password, - null /* provider */); + getSupportFragmentManager() + .beginTransaction() + .add(SmartLock.getInstance( + RegisterEmailActivity.this, + mActivityHelper.getFlowParams(), + firebaseUser, + password, + null /* provider */), "test") + .commit(); +// mSmartLock = SmartLock.saveCredentialOrFinish( +// RegisterEmailActivity.this, +// mActivityHelper.getFlowParams(), +// firebaseUser, +// password, +// null /* provider */); } }); } @@ -198,14 +205,6 @@ public void onFailure(@NonNull Exception e) { }); } - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (mSmartLock != null) { - mSmartLock.onActivityResult(requestCode, resultCode); - } - } - @Override public void onClick(View view) { if (view.getId() == R.id.button_create) { diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java index 9eb491531..2128cdc49 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java @@ -45,8 +45,6 @@ public class SignInActivity extends AppCompatBase implements View.OnClickListener { private static final String TAG = "SignInActivity"; - private SmartLock mSmartLock; - private EditText mEmailEditText; private EditText mPasswordEditText; private EmailFieldValidator mEmailValidator; @@ -68,7 +66,8 @@ protected void onCreate(Bundle savedInstanceState) { getResources().getValue(R.dimen.slightly_visible_icon, slightlyVisibleIcon, true); mPasswordEditText = (EditText) findViewById(R.id.password); - ((TextInputLayout) findViewById(R.id.password_layout)).setPasswordVisibilityToggleEnabled(false); + ((TextInputLayout) findViewById(R.id.password_layout)).setPasswordVisibilityToggleEnabled( + false); ImageView togglePasswordImage = (ImageView) findViewById(R.id.toggle_visibility); mPasswordEditText.setOnFocusChangeListener(new ImageFocusTransparencyChanger( @@ -79,9 +78,9 @@ protected void onCreate(Bundle savedInstanceState) { togglePasswordImage.setOnClickListener(new PasswordToggler(mPasswordEditText)); mEmailValidator = new EmailFieldValidator((TextInputLayout) findViewById(R.id - .email_layout)); + .email_layout)); mPasswordValidator = new RequiredFieldValidator((TextInputLayout) findViewById(R.id - .password_layout)); + .password_layout)); Button signInButton = (Button) findViewById(R.id.button_done); TextView recoveryButton = (TextView) findViewById(R.id.trouble_signing_in); @@ -107,12 +106,23 @@ private void signIn(String email, final String password) { @Override public void onSuccess(AuthResult authResult) { // Save credential in SmartLock (if enabled) - mSmartLock = SmartLock.saveCredentialOrFinish( - SignInActivity.this, - mActivityHelper.getFlowParams(), - authResult.getUser(), - password, - null /* provider */); + getSupportFragmentManager() + .beginTransaction() + .add(SmartLock.getInstance( + SignInActivity.this, + mActivityHelper.getFlowParams(), + authResult.getUser(), + password, + null /* provider */), "test") + .commit(); + + +// mSmartLock = SmartLock.saveCredentialOrFinish( +// SignInActivity.this, +// mActivityHelper.getFlowParams(), +// authResult.getUser(), +// password, +// null /* provider */); } }) .addOnFailureListener(new OnFailureListener() { @@ -129,14 +139,6 @@ public void onFailure(@NonNull Exception e) { }); } - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (mSmartLock != null) { - mSmartLock.onActivityResult(requestCode, resultCode); - } - } - @Override public void onClick(View view) { if (view.getId() == R.id.button_done) { diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java index afd290050..d9aa24fa1 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java @@ -35,7 +35,6 @@ import com.firebase.ui.auth.ui.TaskFailureLogger; import com.firebase.ui.auth.ui.email.EmailHintContainerActivity; import com.firebase.ui.auth.util.EmailFlowUtil; -import com.firebase.ui.auth.util.SmartLock; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.EmailAuthProvider; import com.google.firebase.auth.FacebookAuthProvider; @@ -63,7 +62,6 @@ public class AuthMethodPickerActivity private static final String TAG = "AuthMethodPicker"; private ArrayList mIdpProviders; - private SmartLock mSmartLock; @Override protected void onCreate(Bundle savedInstanceState) { @@ -140,8 +138,6 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { finish(RESULT_OK, new Intent()); } - } else if (mSmartLock != null) { - mSmartLock.onActivityResult(requestCode, resultCode); } else if (requestCode == RC_ACCOUNT_LINK) { finish(resultCode, new Intent()); } else { @@ -164,8 +160,7 @@ public void onSuccess(final IDPResponse response) { AuthMethodPickerActivity.this, mActivityHelper, RC_ACCOUNT_LINK, - response, - mSmartLock)); + response)); } @Override diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java index bd8bbee15..cbb0dd97b 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java @@ -41,19 +41,16 @@ public class CredentialSignInHandler implements OnCompleteListener { private AppCompatBase mActivity; private ActivityHelper mActivityHelper; private IDPResponse mResponse; - private SmartLock mSmartLock; public CredentialSignInHandler( AppCompatBase activity, ActivityHelper activityHelper, int accountLinkResultCode, - IDPResponse response, - SmartLock smartLock) { + IDPResponse response) { mActivity = activity; mAccountLinkResultCode = accountLinkResultCode; mActivityHelper = activityHelper; mResponse = response; - mSmartLock = smartLock; } @Override @@ -62,11 +59,20 @@ public void onComplete(@NonNull Task task) { mActivityHelper.dismissDialog(); FirebaseUser firebaseUser = task.getResult().getUser(); - mSmartLock = SmartLock.saveCredentialOrFinish(mActivity, - mActivityHelper.getFlowParams(), - firebaseUser, - null /* password */, - mResponse.getProviderType()); + mActivity.getSupportFragmentManager() + .beginTransaction() + .add(SmartLock.getInstance( + mActivity, + mActivityHelper.getFlowParams(), + firebaseUser, + null /* password */, + mResponse.getProviderType()), "test") + .commit(); +// SmartLock.saveCredentialOrFinish(mActivity, +// mActivityHelper.getFlowParams(), +// firebaseUser, +// null /* password */, +// mResponse.getProviderType()); } else { if (task.getException() instanceof FirebaseAuthUserCollisionException) { final String email = mResponse.getEmail(); diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java index 998a72f70..3441c10c7 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java @@ -78,12 +78,12 @@ public void onSuccess(final IDPResponse response) { authResultTask .addOnFailureListener( new TaskFailureLogger(TAG, "Failure authenticating with credential")) - .addOnCompleteListener(new CredentialSignInHandler( + /*.addOnCompleteListener(new CredentialSignInHandler( IDPSignInContainerActivity.this, mActivityHelper, RC_WELCOME_BACK_IDP, RC_SAVE_CREDENTIALS, - response)); + response))*/; } @Override diff --git a/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java index 8dd6e2f44..424192c51 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java @@ -21,6 +21,7 @@ import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; import android.util.Log; import com.firebase.ui.auth.BuildConfig; @@ -40,13 +41,14 @@ import static android.app.Activity.RESULT_OK; -public class SmartLock implements GoogleApiClient.ConnectionCallbacks, ResultCallback, +public class SmartLock extends Fragment implements GoogleApiClient.ConnectionCallbacks, ResultCallback, GoogleApiClient.OnConnectionFailedListener { private static final String TAG = "CredentialsSaveBase"; private static final int RC_SAVE = 100; private static final int RC_UPDATE_SERVICE = 28; private AppCompatBase mActivity; + private FlowParameters mFlowParameters; private String mName; private String mEmail; private String mPassword; @@ -54,18 +56,27 @@ public class SmartLock implements GoogleApiClient.ConnectionCallbacks, ResultCal private String mProfilePictureUri; private GoogleApiClient mCredentialsApiClient; - public SmartLock(AppCompatBase activity, - String name, - String email, - String password, - String provider, - String profilePictureUri) { - mActivity = activity; - mName = name; - mEmail = email; - mPassword = password; - mProvider = provider; - mProfilePictureUri = profilePictureUri; + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // If SmartLock is disabled, finish the Activity + if (!mFlowParameters.smartLockEnabled) { + mActivity.finish(RESULT_OK, mActivity.getIntent()); + return; + } + + // If Play Services is not available, finish the Activity + if (!PlayServicesHelper.getInstance(mActivity).isPlayServicesAvailable()) { + mActivity.finish(RESULT_OK, mActivity.getIntent()); + return; + } + + if (!FirebaseAuthWrapperFactory.getFirebaseAuthWrapper(mFlowParameters.appName) + .isPlayServicesAvailable(mActivity)) { + mActivity.finish(RESULT_OK, mActivity.getIntent()); + return; + } mCredentialsApiClient = new GoogleApiClient.Builder(mActivity) .addConnectionCallbacks(this) @@ -129,17 +140,19 @@ public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { + " and code: " + connectionResult.getErrorCode()); } PendingIntent resolution = - GoogleApiAvailability.getInstance().getErrorResolutionPendingIntent(mActivity, - connectionResult - .getErrorCode(), - RC_UPDATE_SERVICE); + GoogleApiAvailability + .getInstance() + .getErrorResolutionPendingIntent(mActivity, + connectionResult.getErrorCode(), + RC_UPDATE_SERVICE); try { - mActivity.startIntentSenderForResult(resolution.getIntentSender(), - RC_UPDATE_SERVICE, - null, - 0, - 0, - 0); + startIntentSenderForResult(resolution.getIntentSender(), + RC_UPDATE_SERVICE, + null, + 0, + 0, + 0, + null); } catch (IntentSender.SendIntentException e) { e.printStackTrace(); mActivity.finish(RESULT_OK, mActivity.getIntent()); @@ -168,7 +181,10 @@ public void onResult(@NonNull Status status) { } } - public void onActivityResult(int requestCode, int resultCode) { + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == RC_SAVE) { if (resultCode == RESULT_OK) { if (BuildConfig.DEBUG) { @@ -193,6 +209,40 @@ public void onActivityResult(int requestCode, int resultCode) { } } + +// public static void saveCredentialOrFinish(AppCompatBase activity, +// FlowParameters parameters, +// FirebaseUser firebaseUser, +// @Nullable String password, +// @Nullable String provider) { +// // If SmartLock is disabled, finish the Activity +// if (!parameters.smartLockEnabled) { +// activity.finish(RESULT_OK, activity.getIntent()); +// return; +// } +// +// // If Play Services is not available, finish the Activity +// if (!PlayServicesHelper.getInstance(activity).isPlayServicesAvailable()) { +// activity.finish(RESULT_OK, activity.getIntent()); +// return; +// } +// +// if (!FirebaseAuthWrapperFactory.getFirebaseAuthWrapper(parameters.appName) +// .isPlayServicesAvailable(activity)) { +// activity.finish(RESULT_OK, activity.getIntent()); +// return; +// } +// +// // Save credentials +// new SmartLock(activity, +// firebaseUser.getDisplayName(), +// firebaseUser.getEmail(), +// password, +// provider, +// firebaseUser.getPhotoUrl() != null ? firebaseUser.getPhotoUrl() +// .toString() : null); +// } + /** * If SmartLock is enabled and Google Play Services is available, save the credentials. * Otherwise, finish the calling Activity with RESULT_OK. @@ -203,36 +253,21 @@ public void onActivityResult(int requestCode, int resultCode) { * @param password (optional) password for email credential. * @param provider (optional) provider string for provider credential. */ - public static SmartLock saveCredentialOrFinish(AppCompatBase activity, - FlowParameters parameters, - FirebaseUser firebaseUser, - @Nullable String password, - @Nullable String provider) { - // If SmartLock is disabled, finish the Activity - if (!parameters.smartLockEnabled) { - activity.finish(RESULT_OK, new Intent()); - return null; - } - - // If Play Services is not available, finish the Activity - if (!PlayServicesHelper.getInstance(activity).isPlayServicesAvailable()) { - activity.finish(RESULT_OK, new Intent()); - return null; - } - - if (!FirebaseAuthWrapperFactory.getFirebaseAuthWrapper(parameters.appName) - .isPlayServicesAvailable(activity)) { - activity.finish(RESULT_OK, activity.getIntent()); - return null; - } + public static SmartLock getInstance(AppCompatBase activity, + FlowParameters parameters, + FirebaseUser firebaseUser, + @Nullable String password, + @Nullable String provider) { + SmartLock smartLock = new SmartLock(); + smartLock.mActivity = activity; + smartLock.mFlowParameters = parameters; + smartLock.mName = firebaseUser.getDisplayName(); + smartLock.mEmail = firebaseUser.getEmail(); + smartLock.mPassword = password; + smartLock.mProvider = provider; + smartLock.mProfilePictureUri = firebaseUser.getPhotoUrl() != null ? firebaseUser.getPhotoUrl() + .toString() : null; - // Save credentials - return new SmartLock(activity, - firebaseUser.getDisplayName(), - firebaseUser.getEmail(), - password, - provider, - firebaseUser.getPhotoUrl() != null ? firebaseUser.getPhotoUrl() - .toString() : null); + return smartLock; } } From 8adeee19ddc3e4d96fdfed99294d86ebad0ecf21 Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Thu, 13 Oct 2016 23:37:40 -0700 Subject: [PATCH 03/79] Cleanup --- .../WelcomeBackPasswordPrompt.java | 8 +---- .../auth/ui/email/RegisterEmailActivity.java | 8 +---- .../ui/auth/ui/email/SignInActivity.java | 17 ++-------- .../auth/ui/idp/CredentialSignInHandler.java | 8 ++--- .../ui/idp/IDPSignInContainerActivity.java | 7 ++-- .../com/firebase/ui/auth/util/SmartLock.java | 34 ------------------- .../ui/idp/CredentialSignInHandlerTest.java | 13 +++---- 7 files changed, 13 insertions(+), 82 deletions(-) diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java b/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java index 661909f67..2ab515000 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java @@ -136,14 +136,8 @@ public void onSuccess(AuthResult authResult) { mActivityHelper.getFlowParams(), authResult.getUser(), password, - null /* provider */), "test") + null /* provider */), TAG) .commit(); -// SmartLock.saveCredentialOrFinish( -// WelcomeBackPasswordPrompt.this, -// mActivityHelper.getFlowParams(), -// authResult.getUser(), -// password, -// null /* provider */); } }); } diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java index d82833b5d..f6243fb26 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java @@ -165,14 +165,8 @@ public void onComplete(@NonNull Task task) { mActivityHelper.getFlowParams(), firebaseUser, password, - null /* provider */), "test") + null /* provider */), TAG) .commit(); -// mSmartLock = SmartLock.saveCredentialOrFinish( -// RegisterEmailActivity.this, -// mActivityHelper.getFlowParams(), -// firebaseUser, -// password, -// null /* provider */); } }); } diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java index 2128cdc49..eeeac484c 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java @@ -89,7 +89,6 @@ protected void onCreate(Bundle savedInstanceState) { } signInButton.setOnClickListener(this); recoveryButton.setOnClickListener(this); - } @Override @@ -113,16 +112,8 @@ public void onSuccess(AuthResult authResult) { mActivityHelper.getFlowParams(), authResult.getUser(), password, - null /* provider */), "test") + null /* provider */), TAG) .commit(); - - -// mSmartLock = SmartLock.saveCredentialOrFinish( -// SignInActivity.this, -// mActivityHelper.getFlowParams(), -// authResult.getUser(), -// password, -// null /* provider */); } }) .addOnFailureListener(new OnFailureListener() { @@ -144,19 +135,15 @@ public void onClick(View view) { if (view.getId() == R.id.button_done) { boolean emailValid = mEmailValidator.validate(mEmailEditText.getText()); boolean passwordValid = mPasswordValidator.validate(mPasswordEditText.getText()); - if (!emailValid || !passwordValid) { - return; - } else { + if (emailValid && passwordValid) { mActivityHelper.showLoadingDialog(R.string.progress_dialog_signing_in); signIn(mEmailEditText.getText().toString(), mPasswordEditText.getText().toString()); - return; } } else if (view.getId() == R.id.trouble_signing_in) { startActivity(RecoverPasswordActivity.createIntent( this, mActivityHelper.getFlowParams(), mEmailEditText.getText().toString())); - return; } } diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java index cbb0dd97b..7d28181d6 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java @@ -37,6 +37,7 @@ public class CredentialSignInHandler implements OnCompleteListener { private final static String TAG = "CredentialSignInHandler"; + private int mAccountLinkResultCode; private AppCompatBase mActivity; private ActivityHelper mActivityHelper; @@ -66,13 +67,8 @@ public void onComplete(@NonNull Task task) { mActivityHelper.getFlowParams(), firebaseUser, null /* password */, - mResponse.getProviderType()), "test") + mResponse.getProviderType()), TAG) .commit(); -// SmartLock.saveCredentialOrFinish(mActivity, -// mActivityHelper.getFlowParams(), -// firebaseUser, -// null /* password */, -// mResponse.getProviderType()); } else { if (task.getException() instanceof FirebaseAuthUserCollisionException) { final String email = mResponse.getEmail(); diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java index 3441c10c7..61d30ab4e 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java @@ -78,12 +78,11 @@ public void onSuccess(final IDPResponse response) { authResultTask .addOnFailureListener( new TaskFailureLogger(TAG, "Failure authenticating with credential")) - /*.addOnCompleteListener(new CredentialSignInHandler( + .addOnCompleteListener(new CredentialSignInHandler( IDPSignInContainerActivity.this, mActivityHelper, RC_WELCOME_BACK_IDP, - RC_SAVE_CREDENTIALS, - response))*/; + response)); } @Override @@ -96,8 +95,6 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_WELCOME_BACK_IDP) { finish(resultCode, new Intent()); - } else if (requestCode == RC_SAVE_CREDENTIALS) { - finish(RESULT_OK, new Intent()); } else { mIDPProvider.onActivityResult(requestCode, resultCode, data); } diff --git a/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java index 424192c51..63184e8c0 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java @@ -209,40 +209,6 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { } } - -// public static void saveCredentialOrFinish(AppCompatBase activity, -// FlowParameters parameters, -// FirebaseUser firebaseUser, -// @Nullable String password, -// @Nullable String provider) { -// // If SmartLock is disabled, finish the Activity -// if (!parameters.smartLockEnabled) { -// activity.finish(RESULT_OK, activity.getIntent()); -// return; -// } -// -// // If Play Services is not available, finish the Activity -// if (!PlayServicesHelper.getInstance(activity).isPlayServicesAvailable()) { -// activity.finish(RESULT_OK, activity.getIntent()); -// return; -// } -// -// if (!FirebaseAuthWrapperFactory.getFirebaseAuthWrapper(parameters.appName) -// .isPlayServicesAvailable(activity)) { -// activity.finish(RESULT_OK, activity.getIntent()); -// return; -// } -// -// // Save credentials -// new SmartLock(activity, -// firebaseUser.getDisplayName(), -// firebaseUser.getEmail(), -// password, -// provider, -// firebaseUser.getPhotoUrl() != null ? firebaseUser.getPhotoUrl() -// .toString() : null); -// } - /** * If SmartLock is enabled and Google Play Services is available, save the credentials. * Otherwise, finish the calling Activity with RESULT_OK. diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java index cbced2a4a..248ca64bf 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java @@ -14,7 +14,6 @@ package com.firebase.ui.auth.ui.idp; -import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; @@ -30,13 +29,14 @@ import com.firebase.ui.auth.test_helpers.TestConstants; import com.firebase.ui.auth.test_helpers.TestHelper; import com.firebase.ui.auth.ui.ActivityHelper; +import com.firebase.ui.auth.ui.AppCompatBase; import com.firebase.ui.auth.ui.ExtraConstants; import com.firebase.ui.auth.ui.FlowParameters; -import com.firebase.ui.auth.util.SmartLock; import com.firebase.ui.auth.ui.account_link.WelcomeBackIDPPrompt; import com.firebase.ui.auth.ui.account_link.WelcomeBackPasswordPrompt; import com.firebase.ui.auth.util.CredentialsAPI; import com.firebase.ui.auth.util.PlayServicesHelper; +import com.firebase.ui.auth.util.SmartLock; import com.google.android.gms.tasks.Task; import com.google.android.gms.tasks.Tasks; import com.google.firebase.FirebaseApp; @@ -89,7 +89,7 @@ public void setUp() { @Test public void testSignInSucceeded() { - Activity mockActivity = mock(Activity.class); + AppCompatBase mockActivity = mock(AppCompatBase.class); ActivityHelper mockActivityHelper = mock(ActivityHelper.class); FirebaseUser mockFirebaseUser = TestHelper.makeMockFirebaseUser(); IDPResponse idpResponse = new IDPResponse( @@ -100,7 +100,6 @@ public void testSignInSucceeded() { mockActivity, mockActivityHelper, RC_ACCOUNT_LINK, - RC_SAVE_CREDENTIALS, idpResponse); Context mockContext = mock(Context.class); @@ -136,7 +135,7 @@ public void testSignInSucceeded() { @Test public void testSignInFailed_withFacebookAlreadyLinked() { - Activity mockActivity = mock(Activity.class); + AppCompatBase mockActivity = mock(AppCompatBase.class); ActivityHelper mockActivityHelper = mock(ActivityHelper.class); FirebaseAuth mockFirebaseAuth = mock(FirebaseAuth.class); IDPResponse idpResponse = new IDPResponse( @@ -147,7 +146,6 @@ public void testSignInFailed_withFacebookAlreadyLinked() { mockActivity, mockActivityHelper, RC_ACCOUNT_LINK, - RC_SAVE_CREDENTIALS, idpResponse); Context mockContext = mock(Context.class); @@ -186,7 +184,7 @@ public void testSignInFailed_withFacebookAlreadyLinked() { @Test public void testSignInFailed_withPasswordAccountAlreadyLinked() { - Activity mockActivity = mock(Activity.class); + AppCompatBase mockActivity = mock(AppCompatBase.class); ActivityHelper mockActivityHelper = mock(ActivityHelper.class); FirebaseAuth mockFirebaseAuth = mock(FirebaseAuth.class); IDPResponse idpResponse = new IDPResponse( @@ -197,7 +195,6 @@ public void testSignInFailed_withPasswordAccountAlreadyLinked() { mockActivity, mockActivityHelper, RC_ACCOUNT_LINK, - RC_SAVE_CREDENTIALS, idpResponse); Context mockContext = mock(Context.class); From 11f3c2b7b469629d7c7880e5ba5a7edc2f23ab6f Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Thu, 13 Oct 2016 23:41:22 -0700 Subject: [PATCH 04/79] Cleanup --- auth/src/main/res/values/styles.xml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/auth/src/main/res/values/styles.xml b/auth/src/main/res/values/styles.xml index d525e40ea..3fa8647bf 100644 --- a/auth/src/main/res/values/styles.xml +++ b/auth/src/main/res/values/styles.xml @@ -243,13 +243,4 @@ @drawable/idp_button_background_facebook @color/com_facebook_button_text_color - - - From cb826f4239c7ca3729f1fae73e6e2bc9bfb76cb6 Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Thu, 13 Oct 2016 23:51:12 -0700 Subject: [PATCH 05/79] Cleanup --- .../main/java/com/firebase/ui/auth/AuthUI.java | 4 ++-- .../ui/auth/ui/ChooseAccountActivity.java | 4 +--- .../account_link/WelcomeBackPasswordPrompt.java | 15 ++++++--------- .../ui/auth/ui/email/RegisterEmailActivity.java | 15 ++++++--------- .../firebase/ui/auth/ui/email/SignInActivity.java | 15 ++++++--------- .../ui/auth/ui/idp/CredentialSignInHandler.java | 15 ++++++--------- .../java/com/firebase/ui/auth/util/SmartLock.java | 7 +++++-- 7 files changed, 32 insertions(+), 43 deletions(-) diff --git a/auth/src/main/java/com/firebase/ui/auth/AuthUI.java b/auth/src/main/java/com/firebase/ui/auth/AuthUI.java index 31808da5c..c3650483b 100644 --- a/auth/src/main/java/com/firebase/ui/auth/AuthUI.java +++ b/auth/src/main/java/com/firebase/ui/auth/AuthUI.java @@ -265,13 +265,13 @@ private AuthUI(FirebaseApp app) { * ({@code !result.isSuccess()}). */ public Task signOut(@NonNull Activity activity) { - // Get helper for Google Sign In and SmartLock API + // Get helper for Google Sign In and Credentials API GoogleApiClientTaskHelper taskHelper = GoogleApiClientTaskHelper.getInstance(activity); taskHelper.getBuilder() .addApi(Auth.CREDENTIALS_API) .addApi(Auth.GOOGLE_SIGN_IN_API, GoogleSignInOptions.DEFAULT_SIGN_IN); - // Get SmartLock Helper + // Get Credentials Helper CredentialsApiHelper credentialsHelper = CredentialsApiHelper.getInstance(taskHelper); // Firebase Sign out diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/ChooseAccountActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/ChooseAccountActivity.java index 3187df39a..41e3ef5e0 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/ChooseAccountActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/ChooseAccountActivity.java @@ -113,12 +113,11 @@ protected void onStop() { } /** - * Called when the SmartLock API connects. + * Called when the Credentials API connects. */ public void onCredentialsApiConnected( CredentialsAPI credentialsApi, ActivityHelper activityHelper) { - String email = credentialsApi.getEmailFromCredential(); String password = credentialsApi.getPasswordFromCredential(); String accountType = credentialsApi.getAccountTypeFromCredential(); @@ -226,7 +225,6 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { finish(resultCode, new Intent()); } break; - } } diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java b/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java index 2ab515000..019d8e4f9 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java @@ -129,15 +129,12 @@ public void onSuccess(AuthResult authResult) { new OnSuccessListener() { @Override public void onSuccess(AuthResult authResult) { - getSupportFragmentManager() - .beginTransaction() - .add(SmartLock.getInstance( - WelcomeBackPasswordPrompt.this, - mActivityHelper.getFlowParams(), - authResult.getUser(), - password, - null /* provider */), TAG) - .commit(); + SmartLock.newInstance( + WelcomeBackPasswordPrompt.this, + mActivityHelper.getFlowParams(), + authResult.getUser(), + password, + null /* provider */); } }); } diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java index f6243fb26..fd9785573 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java @@ -158,15 +158,12 @@ public void onComplete(@NonNull Task task) { // This executes even if the name change fails, since // the account creation succeeded and we want to save // the credential to SmartLock (if enabled). - getSupportFragmentManager() - .beginTransaction() - .add(SmartLock.getInstance( - RegisterEmailActivity.this, - mActivityHelper.getFlowParams(), - firebaseUser, - password, - null /* provider */), TAG) - .commit(); + SmartLock.newInstance( + RegisterEmailActivity.this, + mActivityHelper.getFlowParams(), + firebaseUser, + password, + null /* provider */); } }); } diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java index eeeac484c..ad08d8387 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java @@ -105,15 +105,12 @@ private void signIn(String email, final String password) { @Override public void onSuccess(AuthResult authResult) { // Save credential in SmartLock (if enabled) - getSupportFragmentManager() - .beginTransaction() - .add(SmartLock.getInstance( - SignInActivity.this, - mActivityHelper.getFlowParams(), - authResult.getUser(), - password, - null /* provider */), TAG) - .commit(); + SmartLock.newInstance( + SignInActivity.this, + mActivityHelper.getFlowParams(), + authResult.getUser(), + password, + null /* provider */); } }) .addOnFailureListener(new OnFailureListener() { diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java index 7d28181d6..44588af5f 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java @@ -60,15 +60,12 @@ public void onComplete(@NonNull Task task) { mActivityHelper.dismissDialog(); FirebaseUser firebaseUser = task.getResult().getUser(); - mActivity.getSupportFragmentManager() - .beginTransaction() - .add(SmartLock.getInstance( - mActivity, - mActivityHelper.getFlowParams(), - firebaseUser, - null /* password */, - mResponse.getProviderType()), TAG) - .commit(); + SmartLock.newInstance( + mActivity, + mActivityHelper.getFlowParams(), + firebaseUser, + null /* password */, + mResponse.getProviderType()); } else { if (task.getException() instanceof FirebaseAuthUserCollisionException) { final String email = mResponse.getEmail(); diff --git a/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java index 63184e8c0..bc2ec11d5 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java @@ -219,7 +219,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { * @param password (optional) password for email credential. * @param provider (optional) provider string for provider credential. */ - public static SmartLock getInstance(AppCompatBase activity, + public static void newInstance(AppCompatBase activity, FlowParameters parameters, FirebaseUser firebaseUser, @Nullable String password, @@ -234,6 +234,9 @@ public static SmartLock getInstance(AppCompatBase activity, smartLock.mProfilePictureUri = firebaseUser.getPhotoUrl() != null ? firebaseUser.getPhotoUrl() .toString() : null; - return smartLock; + activity.getSupportFragmentManager() + .beginTransaction() + .add(smartLock, TAG) + .commit(); } } From 3b788f578d6c32281dfcdeeff1799714eb02c2ad Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Fri, 14 Oct 2016 12:50:24 -0700 Subject: [PATCH 06/79] Update SmartLock.java with new fragment logic --- .../WelcomeBackPasswordPrompt.java | 5 +- .../auth/ui/email/RegisterEmailActivity.java | 5 +- .../ui/auth/ui/email/SignInActivity.java | 5 +- .../auth/ui/idp/AuthMethodPickerActivity.java | 5 + .../auth/ui/idp/CredentialSignInHandler.java | 9 +- .../ui/idp/IDPSignInContainerActivity.java | 8 +- .../com/firebase/ui/auth/util/SmartLock.java | 105 +++++++++++------- .../ui/email/RegisterEmailActivityTest.java | 29 +++-- .../ui/auth/ui/email/SignInActivityTest.java | 37 +++--- .../ui/idp/AuthMethodPickerActivityTest.java | 21 ++-- .../ui/idp/CredentialSignInHandlerTest.java | 27 ++--- 11 files changed, 143 insertions(+), 113 deletions(-) diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java b/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java index 019d8e4f9..b8342a37f 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java @@ -56,12 +56,15 @@ public class WelcomeBackPasswordPrompt extends AppCompatBase implements View.OnC private TextInputLayout mPasswordLayout; private EditText mPasswordField; private IDPResponse mIdpResponse; + private SmartLock mSmartLock; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.welcome_back_password_prompt_layout); + mSmartLock = SmartLock.getInstance(this); + mPasswordLayout = (TextInputLayout) findViewById(R.id.password_layout); mPasswordField = (EditText) findViewById(R.id.password); @@ -129,7 +132,7 @@ public void onSuccess(AuthResult authResult) { new OnSuccessListener() { @Override public void onSuccess(AuthResult authResult) { - SmartLock.newInstance( + mSmartLock.saveCredentialsOrFinish( WelcomeBackPasswordPrompt.this, mActivityHelper.getFlowParams(), authResult.getUser(), diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java index fd9785573..4bceff927 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java @@ -58,6 +58,7 @@ public class RegisterEmailActivity extends AppCompatBase implements View.OnClickListener { private static final String TAG = "RegisterEmailActivity"; + private SmartLock mSmartLock; private EditText mEmailEditText; private EditText mPasswordEditText; private EditText mNameEditText; @@ -70,6 +71,8 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.register_email_layout); + mSmartLock = SmartLock.getInstance(this); + String email = getIntent().getStringExtra(ExtraConstants.EXTRA_EMAIL); mEmailEditText = (EditText) findViewById(R.id.email); @@ -158,7 +161,7 @@ public void onComplete(@NonNull Task task) { // This executes even if the name change fails, since // the account creation succeeded and we want to save // the credential to SmartLock (if enabled). - SmartLock.newInstance( + mSmartLock.saveCredentialsOrFinish( RegisterEmailActivity.this, mActivityHelper.getFlowParams(), firebaseUser, diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java index ad08d8387..cc633f3f8 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java @@ -45,6 +45,7 @@ public class SignInActivity extends AppCompatBase implements View.OnClickListener { private static final String TAG = "SignInActivity"; + private SmartLock mSmartLock; private EditText mEmailEditText; private EditText mPasswordEditText; private EmailFieldValidator mEmailValidator; @@ -55,6 +56,8 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sign_in_layout); + mSmartLock = SmartLock.getInstance(this); + String email = getIntent().getStringExtra(ExtraConstants.EXTRA_EMAIL); mEmailEditText = (EditText) findViewById(R.id.email); @@ -105,7 +108,7 @@ private void signIn(String email, final String password) { @Override public void onSuccess(AuthResult authResult) { // Save credential in SmartLock (if enabled) - SmartLock.newInstance( + mSmartLock.saveCredentialsOrFinish( SignInActivity.this, mActivityHelper.getFlowParams(), authResult.getUser(), diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java index d9aa24fa1..2de9c7d32 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java @@ -35,6 +35,7 @@ import com.firebase.ui.auth.ui.TaskFailureLogger; import com.firebase.ui.auth.ui.email.EmailHintContainerActivity; import com.firebase.ui.auth.util.EmailFlowUtil; +import com.firebase.ui.auth.util.SmartLock; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.EmailAuthProvider; import com.google.firebase.auth.FacebookAuthProvider; @@ -61,6 +62,7 @@ public class AuthMethodPickerActivity private static final int RC_ACCOUNT_LINK = 3; private static final String TAG = "AuthMethodPicker"; + private SmartLock mSmartLock; private ArrayList mIdpProviders; @Override @@ -68,6 +70,8 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.auth_method_picker_layout); + mSmartLock = SmartLock.getInstance(this); + findViewById(R.id.email_provider).setOnClickListener(this); populateIdpList(mActivityHelper.getFlowParams().providerInfo); @@ -159,6 +163,7 @@ public void onSuccess(final IDPResponse response) { .addOnCompleteListener(new CredentialSignInHandler( AuthMethodPickerActivity.this, mActivityHelper, + mSmartLock, RC_ACCOUNT_LINK, response)); } diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java index 44588af5f..46be6b86e 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java @@ -38,19 +38,22 @@ public class CredentialSignInHandler implements OnCompleteListener { private final static String TAG = "CredentialSignInHandler"; - private int mAccountLinkResultCode; private AppCompatBase mActivity; private ActivityHelper mActivityHelper; + private SmartLock mSmartLock; + private int mAccountLinkResultCode; private IDPResponse mResponse; public CredentialSignInHandler( AppCompatBase activity, ActivityHelper activityHelper, + SmartLock smartLock, int accountLinkResultCode, IDPResponse response) { mActivity = activity; - mAccountLinkResultCode = accountLinkResultCode; mActivityHelper = activityHelper; + mSmartLock = smartLock; + mAccountLinkResultCode = accountLinkResultCode; mResponse = response; } @@ -60,7 +63,7 @@ public void onComplete(@NonNull Task task) { mActivityHelper.dismissDialog(); FirebaseUser firebaseUser = task.getResult().getUser(); - SmartLock.newInstance( + mSmartLock.saveCredentialsOrFinish( mActivity, mActivityHelper.getFlowParams(), firebaseUser, diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java index 61d30ab4e..1e3360d19 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java @@ -27,6 +27,7 @@ import com.firebase.ui.auth.ui.ExtraConstants; import com.firebase.ui.auth.ui.FlowParameters; import com.firebase.ui.auth.ui.TaskFailureLogger; +import com.firebase.ui.auth.util.SmartLock; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.AuthResult; @@ -37,7 +38,8 @@ public class IDPSignInContainerActivity extends IDPBaseActivity implements IDPProvider.IDPCallback { private static final String TAG = "IDPSignInContainer"; private static final int RC_WELCOME_BACK_IDP = 4; - private static final int RC_SAVE_CREDENTIALS = 5; + + private SmartLock mSmartLock; private IDPProvider mIDPProvider; private String mProvider; private String mEmail; @@ -45,6 +47,9 @@ public class IDPSignInContainerActivity extends IDPBaseActivity implements IDPPr @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + + mSmartLock = SmartLock.getInstance(this); + mProvider = getIntent().getStringExtra(ExtraConstants.EXTRA_PROVIDER); mEmail = getIntent().getStringExtra(ExtraConstants.EXTRA_EMAIL); IDPProviderParcel providerParcel = null; @@ -81,6 +86,7 @@ public void onSuccess(final IDPResponse response) { .addOnCompleteListener(new CredentialSignInHandler( IDPSignInContainerActivity.this, mActivityHelper, + mSmartLock, RC_WELCOME_BACK_IDP, response)); } diff --git a/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java index bc2ec11d5..c32234686 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java @@ -22,10 +22,13 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; import android.util.Log; import com.firebase.ui.auth.BuildConfig; import com.firebase.ui.auth.ui.AppCompatBase; +import com.firebase.ui.auth.ui.ExtraConstants; import com.firebase.ui.auth.ui.FlowParameters; import com.google.android.gms.auth.api.Auth; import com.google.android.gms.auth.api.credentials.Credential; @@ -56,36 +59,6 @@ public class SmartLock extends Fragment implements GoogleApiClient.ConnectionCal private String mProfilePictureUri; private GoogleApiClient mCredentialsApiClient; - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - // If SmartLock is disabled, finish the Activity - if (!mFlowParameters.smartLockEnabled) { - mActivity.finish(RESULT_OK, mActivity.getIntent()); - return; - } - - // If Play Services is not available, finish the Activity - if (!PlayServicesHelper.getInstance(mActivity).isPlayServicesAvailable()) { - mActivity.finish(RESULT_OK, mActivity.getIntent()); - return; - } - - if (!FirebaseAuthWrapperFactory.getFirebaseAuthWrapper(mFlowParameters.appName) - .isPlayServicesAvailable(mActivity)) { - mActivity.finish(RESULT_OK, mActivity.getIntent()); - return; - } - - mCredentialsApiClient = new GoogleApiClient.Builder(mActivity) - .addConnectionCallbacks(this) - .addOnConnectionFailedListener(this) - .addApi(Auth.CREDENTIALS_API) - .enableAutoManage(mActivity, this) - .build(); - } - @Override public void onConnected(@Nullable Bundle bundle) { if (mEmail == null) { @@ -219,24 +192,70 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { * @param password (optional) password for email credential. * @param provider (optional) provider string for provider credential. */ - public static void newInstance(AppCompatBase activity, + public void saveCredentialsOrFinish(AppCompatBase activity, FlowParameters parameters, FirebaseUser firebaseUser, @Nullable String password, @Nullable String provider) { - SmartLock smartLock = new SmartLock(); - smartLock.mActivity = activity; - smartLock.mFlowParameters = parameters; - smartLock.mName = firebaseUser.getDisplayName(); - smartLock.mEmail = firebaseUser.getEmail(); - smartLock.mPassword = password; - smartLock.mProvider = provider; - smartLock.mProfilePictureUri = firebaseUser.getPhotoUrl() != null ? firebaseUser.getPhotoUrl() + // If SmartLock is disabled, finish the Activity + if (!mFlowParameters.smartLockEnabled) { + activity.finish(RESULT_OK, activity.getIntent()); + return; + } + + // If Play Services is not available, finish the Activity + if (!PlayServicesHelper.getInstance(activity).isPlayServicesAvailable()) { + activity.finish(RESULT_OK, activity.getIntent()); + return; + } + + if (!FirebaseAuthWrapperFactory.getFirebaseAuthWrapper(mFlowParameters.appName) + .isPlayServicesAvailable(activity)) { + activity.finish(RESULT_OK, activity.getIntent()); + return; + } + + mActivity = activity; + mFlowParameters = parameters; + mName = firebaseUser.getDisplayName(); + mEmail = firebaseUser.getEmail(); + mPassword = password; + mProvider = provider; + mProfilePictureUri = firebaseUser.getPhotoUrl() != null ? firebaseUser.getPhotoUrl() .toString() : null; - activity.getSupportFragmentManager() - .beginTransaction() - .add(smartLock, TAG) - .commit(); + mCredentialsApiClient = new GoogleApiClient.Builder(activity) + .addConnectionCallbacks(this) + .addOnConnectionFailedListener(this) + .addApi(Auth.CREDENTIALS_API) + .enableAutoManage(activity, this) + .build(); + } + + public Intent getIntentForTest() { + return mActivity.getIntent() + .putExtra(ExtraConstants.EXTRA_FLOW_PARAMS, mFlowParameters) + .putExtra(ExtraConstants.EXTRA_NAME, mName) + .putExtra(ExtraConstants.EXTRA_EMAIL, mEmail) + .putExtra(ExtraConstants.EXTRA_PASSWORD, mPassword) + .putExtra(ExtraConstants.EXTRA_PROVIDER, mProvider) + .putExtra(ExtraConstants.EXTRA_PROFILE_PICTURE_URI, mProfilePictureUri); + } + + public static SmartLock getInstance(AppCompatBase activity) { + SmartLock result; + + FragmentManager fm = activity.getSupportFragmentManager(); + FragmentTransaction ft = fm.beginTransaction(); + + Fragment fragment = fm.findFragmentByTag(TAG); + if (fragment == null || !(fragment instanceof SmartLock)) { + result = new SmartLock(); + ft.add(result, TAG).disallowAddToBackStack().commit(); + } else { + result = (SmartLock) fragment; + } + + return result; } } diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java index c1a0d2b6c..85bf29739 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java @@ -29,8 +29,6 @@ import com.firebase.ui.auth.test_helpers.FirebaseAuthWrapperImplShadow; import com.firebase.ui.auth.test_helpers.TestConstants; import com.firebase.ui.auth.test_helpers.TestHelper; -import com.firebase.ui.auth.ui.ExtraConstants; -import com.firebase.ui.auth.util.SmartLock; import com.firebase.ui.auth.util.PlayServicesHelper; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.auth.UserProfileChangeRequest; @@ -48,7 +46,6 @@ import java.util.Arrays; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.when; @@ -131,18 +128,18 @@ public void testSignupButton_successfulRegisterationShouldContinueToSaveCredenti ShadowActivity.IntentForResult nextIntent = shadowActivity.getNextStartedActivityForResult(); - assertNotNull(nextIntent); - assertEquals( - nextIntent.intent.getComponent().getClassName(), - SmartLock.class.getName()); - assertEquals( - TestConstants.EMAIL, - nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_EMAIL)); - assertEquals( - TestConstants.PASSWORD, - nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_PASSWORD)); - assertEquals( - TestConstants.NAME, - nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_NAME)); +// assertNotNull(nextIntent); +// assertEquals( +// nextIntent.intent.getComponent().getClassName(), +// SmartLock.class.getName()); +// assertEquals( +// TestConstants.EMAIL, +// nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_EMAIL)); +// assertEquals( +// TestConstants.PASSWORD, +// nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_PASSWORD)); +// assertEquals( +// TestConstants.NAME, +// nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_NAME)); } } diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java index 1890f0ae2..613ee6722 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java @@ -28,8 +28,6 @@ import com.firebase.ui.auth.test_helpers.FirebaseAuthWrapperImplShadow; import com.firebase.ui.auth.test_helpers.TestConstants; import com.firebase.ui.auth.test_helpers.TestHelper; -import com.firebase.ui.auth.ui.ExtraConstants; -import com.firebase.ui.auth.util.SmartLock; import com.firebase.ui.auth.util.PlayServicesHelper; import com.google.firebase.auth.FirebaseUser; @@ -120,23 +118,22 @@ public void testSignInButton_signsInAndSavesCredentials() { TestConstants.EMAIL, TestConstants.PASSWORD); - ShadowActivity.IntentForResult nextIntent = - Shadows.shadowOf(signInActivity).getNextStartedActivityForResult(); - assertEquals( - SmartLock.class.getName(), - nextIntent.intent.getComponent().getClassName() - ); - assertEquals( - TestConstants.EMAIL, - nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_EMAIL) - ); - assertEquals( - TestConstants.PASSWORD, - nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_PASSWORD) - ); - assertEquals( - TestConstants.NAME, - nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_NAME) - ); +// Intent intent = Shadows.shadowOf(signInActivity).getResultIntent(); +// assertEquals( +// SignInActivity.class.getName(), +// intent.getComponent().getClassName() +// ); +// assertEquals( +// TestConstants.EMAIL, +// intent.getExtras().getString(ExtraConstants.EXTRA_EMAIL) +// ); +// assertEquals( +// TestConstants.PASSWORD, +// intent.getExtras().getString(ExtraConstants.EXTRA_PASSWORD) +// ); +// assertEquals( +// TestConstants.NAME, +// intent.getExtras().getString(ExtraConstants.EXTRA_NAME) +// ); } } diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java index aa02edea9..b9fa64e3b 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java @@ -148,7 +148,7 @@ public void testFacebookLoginFlow() { ShadowActivity.IntentForResult nextIntent = Shadows.shadowOf(authMethodPickerActivity).getNextStartedActivityForResult(); - verifySaveCredentialIntent(nextIntent, FacebookAuthProvider.PROVIDER_ID); +// verifySaveCredentialIntent(nextIntent, FacebookAuthProvider.PROVIDER_ID); } @Test @@ -171,32 +171,31 @@ public void testGoogleLoginFlow() { assertNotNull(googleButton); googleButton.performClick(); - ShadowActivity.IntentForResult nextIntent = - Shadows.shadowOf(authMethodPickerActivity).getNextStartedActivityForResult(); + Intent smartLockIntent = SmartLock.getInstance(authMethodPickerActivity).getIntentForTest(); - verifySaveCredentialIntent(nextIntent, GoogleAuthProvider.PROVIDER_ID); + verifySaveCredentialIntent(smartLockIntent, GoogleAuthProvider.PROVIDER_ID); } private static void verifySaveCredentialIntent( - ShadowActivity.IntentForResult nextIntent, + Intent smartLockIntent, String provider) { assertEquals( SmartLock.class.getName(), - nextIntent.intent.getComponent().getClassName()); + smartLockIntent.getComponent().getClassName()); assertEquals( - nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_EMAIL), + smartLockIntent.getExtras().getString(ExtraConstants.EXTRA_EMAIL), TestConstants.EMAIL); assertEquals( - nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_NAME), + smartLockIntent.getExtras().getString(ExtraConstants.EXTRA_NAME), TestConstants.NAME); assertEquals( - nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_PROFILE_PICTURE_URI), + smartLockIntent.getExtras().getString(ExtraConstants.EXTRA_PROFILE_PICTURE_URI), TestConstants.PHOTO_URL); assertEquals( - nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_PROVIDER), + smartLockIntent.getExtras().getString(ExtraConstants.EXTRA_PROVIDER), provider); assertEquals( - nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_PASSWORD), + smartLockIntent.getExtras().getString(ExtraConstants.EXTRA_PASSWORD), null); } diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java index 248ca64bf..a7aa145a0 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java @@ -64,7 +64,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; - @RunWith(CustomRobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, sdk = 23, shadows = {ActivityHelperShadow.class}) public class CredentialSignInHandlerTest { @@ -96,9 +95,11 @@ public void testSignInSucceeded() { GoogleAuthProvider.PROVIDER_ID, TestConstants.EMAIL, new Bundle()); + SmartLock smartLock = new SmartLock(); CredentialSignInHandler credentialSignInHandler = new CredentialSignInHandler( mockActivity, mockActivityHelper, + smartLock, RC_ACCOUNT_LINK, idpResponse); Context mockContext = mock(Context.class); @@ -113,24 +114,19 @@ public void testSignInSucceeded() { when(mockActivityHelper.getFlowParams()).thenReturn(flowParams); credentialSignInHandler.onComplete(signInTask); - ArgumentCaptor intentCaptor = ArgumentCaptor.forClass(Intent.class); - ArgumentCaptor intCaptor = ArgumentCaptor.forClass(Integer.class); - verify(mockActivity).startActivityForResult(intentCaptor.capture(), intCaptor.capture()); - - Intent capturedIntent = intentCaptor.getValue(); - assertEquals(RC_SAVE_CREDENTIALS, (int) intCaptor.getValue()); + Intent smartLockIntent = smartLock.getIntentForTest(); assertEquals( SmartLock.class.getName(), - capturedIntent.getComponent().getClassName()); + smartLockIntent.getComponent().getClassName()); assertEquals( TestConstants.EMAIL, - capturedIntent.getExtras().getString(ExtraConstants.EXTRA_EMAIL)); + smartLockIntent.getExtras().getString(ExtraConstants.EXTRA_EMAIL)); assertEquals( TestConstants.NAME, - capturedIntent.getExtras().getString(ExtraConstants.EXTRA_NAME)); + smartLockIntent.getExtras().getString(ExtraConstants.EXTRA_NAME)); assertEquals( TestConstants.PHOTO_URL, - capturedIntent.getExtras().getString(ExtraConstants.EXTRA_PROFILE_PICTURE_URI)); + smartLockIntent.getExtras().getString(ExtraConstants.EXTRA_PROFILE_PICTURE_URI)); } @Test @@ -142,11 +138,11 @@ public void testSignInFailed_withFacebookAlreadyLinked() { GoogleAuthProvider.PROVIDER_ID, TestConstants.EMAIL, new Bundle()); - CredentialSignInHandler credentialSignInHandler = new CredentialSignInHandler( + CredentialSignInHandler credentialSignInHandler = null;/*new CredentialSignInHandler( mockActivity, mockActivityHelper, RC_ACCOUNT_LINK, - idpResponse); + idpResponse);*/ Context mockContext = mock(Context.class); FlowParameters mockFlowParams = mock(FlowParameters.class); @@ -181,7 +177,6 @@ public void testSignInFailed_withFacebookAlreadyLinked() { } - @Test public void testSignInFailed_withPasswordAccountAlreadyLinked() { AppCompatBase mockActivity = mock(AppCompatBase.class); @@ -191,11 +186,11 @@ public void testSignInFailed_withPasswordAccountAlreadyLinked() { GoogleAuthProvider.PROVIDER_ID, TestConstants.EMAIL, new Bundle()); - CredentialSignInHandler credentialSignInHandler = new CredentialSignInHandler( + CredentialSignInHandler credentialSignInHandler = null;/*new CredentialSignInHandler( mockActivity, mockActivityHelper, RC_ACCOUNT_LINK, - idpResponse); + idpResponse);*/ Context mockContext = mock(Context.class); Task mockTask = mock(Task.class); From 9eaa4cdf0cd05e691438ecc3b63831d27df0fcda Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Fri, 14 Oct 2016 13:04:23 -0700 Subject: [PATCH 07/79] Fix bug in SmartLock.java --- auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java index c32234686..38cebabac 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java @@ -198,7 +198,7 @@ public void saveCredentialsOrFinish(AppCompatBase activity, @Nullable String password, @Nullable String provider) { // If SmartLock is disabled, finish the Activity - if (!mFlowParameters.smartLockEnabled) { + if (!parameters.smartLockEnabled) { activity.finish(RESULT_OK, activity.getIntent()); return; } @@ -209,7 +209,7 @@ public void saveCredentialsOrFinish(AppCompatBase activity, return; } - if (!FirebaseAuthWrapperFactory.getFirebaseAuthWrapper(mFlowParameters.appName) + if (!FirebaseAuthWrapperFactory.getFirebaseAuthWrapper(parameters.appName) .isPlayServicesAvailable(activity)) { activity.finish(RESULT_OK, activity.getIntent()); return; From 3b76ac6f5d0bf4157905866413eb5f8b85ecef7d Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Fri, 14 Oct 2016 13:17:53 -0700 Subject: [PATCH 08/79] Cleanup --- .../ui/auth/ui/email/RegisterEmailActivity.java | 2 -- .../firebase/ui/auth/ui/email/SignInActivity.java | 14 +++----------- .../ui/auth/ui/idp/CredentialSignInHandler.java | 2 -- .../auth/ui/idp/AuthMethodPickerActivityTest.java | 3 +-- 4 files changed, 4 insertions(+), 17 deletions(-) diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java index 4bceff927..799cd8589 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java @@ -156,8 +156,6 @@ public void onSuccess(AuthResult authResult) { .addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { - mActivityHelper.dismissDialog(); - // This executes even if the name change fails, since // the account creation succeeded and we want to save // the credential to SmartLock (if enabled). diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java index cc633f3f8..108591a91 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java @@ -69,8 +69,7 @@ protected void onCreate(Bundle savedInstanceState) { getResources().getValue(R.dimen.slightly_visible_icon, slightlyVisibleIcon, true); mPasswordEditText = (EditText) findViewById(R.id.password); - ((TextInputLayout) findViewById(R.id.password_layout)).setPasswordVisibilityToggleEnabled( - false); + ((TextInputLayout) findViewById(R.id.password_layout)).setPasswordVisibilityToggleEnabled(false); ImageView togglePasswordImage = (ImageView) findViewById(R.id.toggle_visibility); mPasswordEditText.setOnFocusChangeListener(new ImageFocusTransparencyChanger( @@ -80,10 +79,8 @@ protected void onCreate(Bundle savedInstanceState) { togglePasswordImage.setOnClickListener(new PasswordToggler(mPasswordEditText)); - mEmailValidator = new EmailFieldValidator((TextInputLayout) findViewById(R.id - .email_layout)); - mPasswordValidator = new RequiredFieldValidator((TextInputLayout) findViewById(R.id - .password_layout)); + mEmailValidator = new EmailFieldValidator((TextInputLayout) findViewById(R.id.email_layout)); + mPasswordValidator = new RequiredFieldValidator((TextInputLayout) findViewById(R.id.password_layout)); Button signInButton = (Button) findViewById(R.id.button_done); TextView recoveryButton = (TextView) findViewById(R.id.trouble_signing_in); @@ -94,11 +91,6 @@ protected void onCreate(Bundle savedInstanceState) { recoveryButton.setOnClickListener(this); } - @Override - public void onBackPressed() { - super.onBackPressed(); - } - private void signIn(String email, final String password) { mActivityHelper.getFirebaseAuth() .signInWithEmailAndPassword(email, password) diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java index 46be6b86e..8b8aab090 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java @@ -60,8 +60,6 @@ public CredentialSignInHandler( @Override public void onComplete(@NonNull Task task) { if (task.isSuccessful()) { - mActivityHelper.dismissDialog(); - FirebaseUser firebaseUser = task.getResult().getUser(); mSmartLock.saveCredentialsOrFinish( mActivity, diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java index b9fa64e3b..bc3cbddb7 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java @@ -156,8 +156,7 @@ public void testFacebookLoginFlow() { public void testGoogleLoginFlow() { List providers = Arrays.asList(AuthUI.GOOGLE_PROVIDER); - AuthMethodPickerActivity authMethodPickerActivity = - createActivity(providers); + AuthMethodPickerActivity authMethodPickerActivity = createActivity(providers); FirebaseUser mockFirebaseUser = TestHelper.makeMockFirebaseUser(); when(mockFirebaseUser.getProviders()) From 86d58a99109ce13d5fc2cbc5449e6bdffbcb75a3 Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Fri, 14 Oct 2016 13:19:27 -0700 Subject: [PATCH 09/79] Cleanup --- .../main/java/com/firebase/ui/auth/util/CredentialsAPI.java | 4 ++-- .../java/com/firebase/ui/auth/util/CredentialsApiHelper.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/auth/src/main/java/com/firebase/ui/auth/util/CredentialsAPI.java b/auth/src/main/java/com/firebase/ui/auth/util/CredentialsAPI.java index 0675276c1..7f514c958 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/CredentialsAPI.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/CredentialsAPI.java @@ -71,7 +71,7 @@ public boolean isPlayServicesAvailable() { } public boolean isCredentialsAvailable() { - // TODO: (serikb) find the way to check if SmartLock is available on top of play services + // TODO: (serikb) find the way to check if Credentials is available on top of play services return true; } @@ -96,7 +96,7 @@ public void resolveSavedEmails(Activity activity) { try { status.startResolutionForResult(activity, RC_CREDENTIALS_READ); } catch (IntentSender.SendIntentException e) { - Log.e(TAG, "Failed to send SmartLock intent.", e); + Log.e(TAG, "Failed to send Credentials intent.", e); } } } diff --git a/auth/src/main/java/com/firebase/ui/auth/util/CredentialsApiHelper.java b/auth/src/main/java/com/firebase/ui/auth/util/CredentialsApiHelper.java index 0647b1a19..cd9a3e94b 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/CredentialsApiHelper.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/CredentialsApiHelper.java @@ -144,7 +144,7 @@ public void onResult(@NonNull Status status) { } public static CredentialsApiHelper getInstance(Activity activity) { - // Get a task helper with the SmartLock Api + // Get a task helper with the Credentials Api GoogleApiClientTaskHelper taskHelper = GoogleApiClientTaskHelper.getInstance(activity); taskHelper.getBuilder() .addApi(Auth.CREDENTIALS_API); From 6ad0021069b8df53e30c1b6fa1e678fd24ef21b7 Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Fri, 14 Oct 2016 14:43:34 -0700 Subject: [PATCH 10/79] Fix broken tests --- .../com/firebase/ui/auth/util/SmartLock.java | 18 +++---- .../ui/email/RegisterEmailActivityTest.java | 54 +++++++++---------- .../ui/auth/ui/email/SignInActivityTest.java | 33 ++++++------ .../ui/idp/AuthMethodPickerActivityTest.java | 3 -- .../ui/idp/CredentialSignInHandlerTest.java | 26 +++++---- 5 files changed, 64 insertions(+), 70 deletions(-) diff --git a/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java index 38cebabac..0e1cc166a 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java @@ -197,6 +197,14 @@ public void saveCredentialsOrFinish(AppCompatBase activity, FirebaseUser firebaseUser, @Nullable String password, @Nullable String provider) { + mFlowParameters = parameters; + mName = firebaseUser.getDisplayName(); + mEmail = firebaseUser.getEmail(); + mPassword = password; + mProvider = provider; + mProfilePictureUri = firebaseUser.getPhotoUrl() != null ? firebaseUser.getPhotoUrl() + .toString() : null; + // If SmartLock is disabled, finish the Activity if (!parameters.smartLockEnabled) { activity.finish(RESULT_OK, activity.getIntent()); @@ -216,14 +224,6 @@ public void saveCredentialsOrFinish(AppCompatBase activity, } mActivity = activity; - mFlowParameters = parameters; - mName = firebaseUser.getDisplayName(); - mEmail = firebaseUser.getEmail(); - mPassword = password; - mProvider = provider; - mProfilePictureUri = firebaseUser.getPhotoUrl() != null ? firebaseUser.getPhotoUrl() - .toString() : null; - mCredentialsApiClient = new GoogleApiClient.Builder(activity) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) @@ -233,7 +233,7 @@ public void saveCredentialsOrFinish(AppCompatBase activity, } public Intent getIntentForTest() { - return mActivity.getIntent() + return new Intent() .putExtra(ExtraConstants.EXTRA_FLOW_PARAMS, mFlowParameters) .putExtra(ExtraConstants.EXTRA_NAME, mName) .putExtra(ExtraConstants.EXTRA_EMAIL, mEmail) diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java index 85bf29739..7a3b9dcf9 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java @@ -29,7 +29,9 @@ import com.firebase.ui.auth.test_helpers.FirebaseAuthWrapperImplShadow; import com.firebase.ui.auth.test_helpers.TestConstants; import com.firebase.ui.auth.test_helpers.TestHelper; +import com.firebase.ui.auth.ui.ExtraConstants; import com.firebase.ui.auth.util.PlayServicesHelper; +import com.firebase.ui.auth.util.SmartLock; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.auth.UserProfileChangeRequest; @@ -39,13 +41,12 @@ import org.mockito.Mockito; import org.robolectric.Robolectric; import org.robolectric.RuntimeEnvironment; -import org.robolectric.Shadows; import org.robolectric.annotation.Config; -import org.robolectric.shadows.ShadowActivity; import java.util.Arrays; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.when; @@ -88,8 +89,8 @@ public void testSignUpButton_validatesFields() { assertEquals( passwordLayout.getError().toString(), String.format(registerEmailActivity.getString(R.string.password_length), - registerEmailActivity.getResources().getInteger( - R.integer.min_password_length))); + registerEmailActivity.getResources().getInteger( + R.integer.min_password_length))); } @Test @@ -110,36 +111,29 @@ public void testSignupButton_successfulRegisterationShouldContinueToSaveCredenti .thenReturn(new AutoCompleteTask(null, true, null)); when(ActivityHelperShadow.firebaseAuth - .createUserWithEmailAndPassword( - TestConstants.EMAIL, - TestConstants.PASSWORD)) - .thenReturn( - new AutoCompleteTask<>( - new FakeAuthResult(mockFirebaseUser), - true, - null)); + .createUserWithEmailAndPassword( + TestConstants.EMAIL, + TestConstants.PASSWORD)) + .thenReturn(new AutoCompleteTask<>( + new FakeAuthResult(mockFirebaseUser), + true, + null)); Button button = (Button) registerEmailActivity.findViewById(R.id.button_create); button.performClick(); - ShadowActivity shadowActivity = Shadows.shadowOf(registerEmailActivity); - - ShadowActivity.IntentForResult nextIntent = - shadowActivity.getNextStartedActivityForResult(); - -// assertNotNull(nextIntent); -// assertEquals( -// nextIntent.intent.getComponent().getClassName(), -// SmartLock.class.getName()); -// assertEquals( -// TestConstants.EMAIL, -// nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_EMAIL)); -// assertEquals( -// TestConstants.PASSWORD, -// nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_PASSWORD)); -// assertEquals( -// TestConstants.NAME, -// nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_NAME)); + Intent smartLockIntent = SmartLock.getInstance(registerEmailActivity).getIntentForTest(); + + assertNotNull(smartLockIntent); + assertEquals( + TestConstants.EMAIL, + smartLockIntent.getExtras().getString(ExtraConstants.EXTRA_EMAIL)); + assertEquals( + TestConstants.PASSWORD, + smartLockIntent.getExtras().getString(ExtraConstants.EXTRA_PASSWORD)); + assertEquals( + TestConstants.NAME, + smartLockIntent.getExtras().getString(ExtraConstants.EXTRA_NAME)); } } diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java index 613ee6722..b32e810fb 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java @@ -28,7 +28,9 @@ import com.firebase.ui.auth.test_helpers.FirebaseAuthWrapperImplShadow; import com.firebase.ui.auth.test_helpers.TestConstants; import com.firebase.ui.auth.test_helpers.TestHelper; +import com.firebase.ui.auth.ui.ExtraConstants; import com.firebase.ui.auth.util.PlayServicesHelper; +import com.firebase.ui.auth.util.SmartLock; import com.google.firebase.auth.FirebaseUser; import org.junit.Before; @@ -118,22 +120,19 @@ public void testSignInButton_signsInAndSavesCredentials() { TestConstants.EMAIL, TestConstants.PASSWORD); -// Intent intent = Shadows.shadowOf(signInActivity).getResultIntent(); -// assertEquals( -// SignInActivity.class.getName(), -// intent.getComponent().getClassName() -// ); -// assertEquals( -// TestConstants.EMAIL, -// intent.getExtras().getString(ExtraConstants.EXTRA_EMAIL) -// ); -// assertEquals( -// TestConstants.PASSWORD, -// intent.getExtras().getString(ExtraConstants.EXTRA_PASSWORD) -// ); -// assertEquals( -// TestConstants.NAME, -// intent.getExtras().getString(ExtraConstants.EXTRA_NAME) -// ); + Intent intent = SmartLock.getInstance(signInActivity).getIntentForTest(); + + assertEquals( + TestConstants.EMAIL, + intent.getExtras().getString(ExtraConstants.EXTRA_EMAIL) + ); + assertEquals( + TestConstants.PASSWORD, + intent.getExtras().getString(ExtraConstants.EXTRA_PASSWORD) + ); + assertEquals( + TestConstants.NAME, + intent.getExtras().getString(ExtraConstants.EXTRA_NAME) + ); } } diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java index bc3cbddb7..41821ddda 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java @@ -178,9 +178,6 @@ public void testGoogleLoginFlow() { private static void verifySaveCredentialIntent( Intent smartLockIntent, String provider) { - assertEquals( - SmartLock.class.getName(), - smartLockIntent.getComponent().getClassName()); assertEquals( smartLockIntent.getExtras().getString(ExtraConstants.EXTRA_EMAIL), TestConstants.EMAIL); diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java index a7aa145a0..36637e392 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java @@ -72,7 +72,8 @@ public class CredentialSignInHandlerTest { private static final String LINKING_ERROR = "ERROR_TEST_LINKING"; private static final String LINKING_EXPLANATION = "Test explanation"; - @Mock private CredentialsAPI mCredentialsAPI; + @Mock + private CredentialsAPI mCredentialsAPI; private FirebaseApp mFirebaseApp; @Before @@ -106,7 +107,9 @@ public void testSignInSucceeded() { // Build basic flow parameters FlowParameters flowParams = AuthUI.getInstance(mFirebaseApp) - .createSignInIntentBuilder().build() + .createSignInIntentBuilder() + .setIsSmartLockEnabled(false) + .build() .getParcelableExtra(ExtraConstants.EXTRA_FLOW_PARAMS); Task signInTask = Tasks.forResult(new FakeAuthResult(mockFirebaseUser)); @@ -115,9 +118,6 @@ public void testSignInSucceeded() { credentialSignInHandler.onComplete(signInTask); Intent smartLockIntent = smartLock.getIntentForTest(); - assertEquals( - SmartLock.class.getName(), - smartLockIntent.getComponent().getClassName()); assertEquals( TestConstants.EMAIL, smartLockIntent.getExtras().getString(ExtraConstants.EXTRA_EMAIL)); @@ -138,11 +138,12 @@ public void testSignInFailed_withFacebookAlreadyLinked() { GoogleAuthProvider.PROVIDER_ID, TestConstants.EMAIL, new Bundle()); - CredentialSignInHandler credentialSignInHandler = null;/*new CredentialSignInHandler( + CredentialSignInHandler credentialSignInHandler = new CredentialSignInHandler( mockActivity, mockActivityHelper, + new SmartLock(), RC_ACCOUNT_LINK, - idpResponse);*/ + idpResponse); Context mockContext = mock(Context.class); FlowParameters mockFlowParams = mock(FlowParameters.class); @@ -186,11 +187,12 @@ public void testSignInFailed_withPasswordAccountAlreadyLinked() { GoogleAuthProvider.PROVIDER_ID, TestConstants.EMAIL, new Bundle()); - CredentialSignInHandler credentialSignInHandler = null;/*new CredentialSignInHandler( + CredentialSignInHandler credentialSignInHandler = new CredentialSignInHandler( mockActivity, mockActivityHelper, + new SmartLock(), RC_ACCOUNT_LINK, - idpResponse);*/ + idpResponse); Context mockContext = mock(Context.class); Task mockTask = mock(Task.class); @@ -221,7 +223,9 @@ public void testSignInFailed_withPasswordAccountAlreadyLinked() { capturedIntent.getComponent().getClassName()); assertEquals( TestConstants.EMAIL, - ((IDPResponse) capturedIntent.getExtras().getParcelable(ExtraConstants - .EXTRA_IDP_RESPONSE)).getEmail()); + ((IDPResponse) capturedIntent + .getExtras() + .getParcelable(ExtraConstants.EXTRA_IDP_RESPONSE)) + .getEmail()); } } From 550acc93a57544496b44349a321f5d5538ce1788 Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Fri, 14 Oct 2016 14:59:48 -0700 Subject: [PATCH 11/79] Cleanup --- .../ui/auth/ui/email/RegisterEmailActivityTest.java | 11 ++++------- .../firebase/ui/auth/ui/email/SignInActivityTest.java | 1 - .../ui/auth/ui/idp/AuthMethodPickerActivityTest.java | 9 +++------ 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java index 7a3b9dcf9..e82cdd8db 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java @@ -89,8 +89,7 @@ public void testSignUpButton_validatesFields() { assertEquals( passwordLayout.getError().toString(), String.format(registerEmailActivity.getString(R.string.password_length), - registerEmailActivity.getResources().getInteger( - R.integer.min_password_length))); + registerEmailActivity.getResources().getInteger(R.integer.min_password_length))); } @Test @@ -114,17 +113,15 @@ public void testSignupButton_successfulRegisterationShouldContinueToSaveCredenti .createUserWithEmailAndPassword( TestConstants.EMAIL, TestConstants.PASSWORD)) - .thenReturn(new AutoCompleteTask<>( - new FakeAuthResult(mockFirebaseUser), - true, - null)); + .thenReturn(new AutoCompleteTask<>(new FakeAuthResult(mockFirebaseUser), + true, + null)); Button button = (Button) registerEmailActivity.findViewById(R.id.button_create); button.performClick(); Intent smartLockIntent = SmartLock.getInstance(registerEmailActivity).getIntentForTest(); - assertNotNull(smartLockIntent); assertEquals( TestConstants.EMAIL, diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java index b32e810fb..cb67becdd 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java @@ -121,7 +121,6 @@ public void testSignInButton_signsInAndSavesCredentials() { TestConstants.PASSWORD); Intent intent = SmartLock.getInstance(signInActivity).getIntentForTest(); - assertEquals( TestConstants.EMAIL, intent.getExtras().getString(ExtraConstants.EXTRA_EMAIL) diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java index 41821ddda..985523dfc 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java @@ -146,9 +146,8 @@ public void testFacebookLoginFlow() { assertNotNull(facebookButton); facebookButton.performClick(); - ShadowActivity.IntentForResult nextIntent = - Shadows.shadowOf(authMethodPickerActivity).getNextStartedActivityForResult(); -// verifySaveCredentialIntent(nextIntent, FacebookAuthProvider.PROVIDER_ID); + Intent smartLockIntent = SmartLock.getInstance(authMethodPickerActivity).getIntentForTest(); + verifySaveCredentialIntent(smartLockIntent, FacebookAuthProvider.PROVIDER_ID); } @Test @@ -175,9 +174,7 @@ public void testGoogleLoginFlow() { verifySaveCredentialIntent(smartLockIntent, GoogleAuthProvider.PROVIDER_ID); } - private static void verifySaveCredentialIntent( - Intent smartLockIntent, - String provider) { + private static void verifySaveCredentialIntent(Intent smartLockIntent, String provider) { assertEquals( smartLockIntent.getExtras().getString(ExtraConstants.EXTRA_EMAIL), TestConstants.EMAIL); From b9d3ca5f989cebce38800e95ea38589a48148a41 Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Sat, 15 Oct 2016 00:39:38 -0700 Subject: [PATCH 12/79] Cleanup --- .../com/firebase/ui/auth/util/SmartLock.java | 45 ++++++++----------- .../ui/idp/AuthMethodPickerActivityTest.java | 9 ++-- 2 files changed, 25 insertions(+), 29 deletions(-) diff --git a/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java index 0e1cc166a..a5b16ed3a 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java @@ -28,7 +28,6 @@ import com.firebase.ui.auth.BuildConfig; import com.firebase.ui.auth.ui.AppCompatBase; -import com.firebase.ui.auth.ui.ExtraConstants; import com.firebase.ui.auth.ui.FlowParameters; import com.google.android.gms.auth.api.Auth; import com.google.android.gms.auth.api.credentials.Credential; @@ -51,7 +50,6 @@ public class SmartLock extends Fragment implements GoogleApiClient.ConnectionCal private static final int RC_UPDATE_SERVICE = 28; private AppCompatBase mActivity; - private FlowParameters mFlowParameters; private String mName; private String mEmail; private String mPassword; @@ -63,7 +61,7 @@ public class SmartLock extends Fragment implements GoogleApiClient.ConnectionCal public void onConnected(@Nullable Bundle bundle) { if (mEmail == null) { Log.e(TAG, "Unable to save null credential!"); - mActivity.finish(RESULT_OK, mActivity.getIntent()); + finish(); return; } @@ -105,7 +103,6 @@ public void onConnectionSuspended(int i) { } } - @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { if (BuildConfig.DEBUG) { @@ -128,7 +125,7 @@ public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { null); } catch (IntentSender.SendIntentException e) { e.printStackTrace(); - mActivity.finish(RESULT_OK, mActivity.getIntent()); + finish(); } } @@ -136,7 +133,7 @@ public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { @Override public void onResult(@NonNull Status status) { if (status.isSuccess()) { - mActivity.finish(RESULT_OK, mActivity.getIntent()); + finish(); } else { if (status.hasResolution()) { // Try to resolve the save request. This will prompt the user if @@ -146,10 +143,10 @@ public void onResult(@NonNull Status status) { } catch (IntentSender.SendIntentException e) { // Could not resolve the request Log.e(TAG, "STATUS: Failed to send resolution.", e); - mActivity.finish(RESULT_OK, mActivity.getIntent()); + finish(); } } else { - mActivity.finish(RESULT_OK, mActivity.getIntent()); + finish(); } } } @@ -163,10 +160,10 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { if (BuildConfig.DEBUG) { Log.d(TAG, "SAVE: OK"); } - mActivity.finish(RESULT_OK, new Intent()); + finish(); } else { Log.e(TAG, "SAVE: Canceled by user"); - mActivity.finish(RESULT_OK, new Intent()); + finish(); } } else if (requestCode == RC_UPDATE_SERVICE) { if (resultCode == RESULT_OK) { @@ -177,11 +174,18 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { .setResultCallback(this); } else { Log.e(TAG, "SAVE: Canceled by user"); - mActivity.finish(RESULT_OK, new Intent()); + finish(); } } } + private void finish() { + // For tests + mActivity.setResult(RESULT_OK); + + mActivity.finish(RESULT_OK, mActivity.getIntent()); + } + /** * If SmartLock is enabled and Google Play Services is available, save the credentials. * Otherwise, finish the calling Activity with RESULT_OK. @@ -197,7 +201,7 @@ public void saveCredentialsOrFinish(AppCompatBase activity, FirebaseUser firebaseUser, @Nullable String password, @Nullable String provider) { - mFlowParameters = parameters; + mActivity = activity; mName = firebaseUser.getDisplayName(); mEmail = firebaseUser.getEmail(); mPassword = password; @@ -207,23 +211,22 @@ public void saveCredentialsOrFinish(AppCompatBase activity, // If SmartLock is disabled, finish the Activity if (!parameters.smartLockEnabled) { - activity.finish(RESULT_OK, activity.getIntent()); + finish(); return; } // If Play Services is not available, finish the Activity if (!PlayServicesHelper.getInstance(activity).isPlayServicesAvailable()) { - activity.finish(RESULT_OK, activity.getIntent()); + finish(); return; } if (!FirebaseAuthWrapperFactory.getFirebaseAuthWrapper(parameters.appName) .isPlayServicesAvailable(activity)) { - activity.finish(RESULT_OK, activity.getIntent()); + finish(); return; } - mActivity = activity; mCredentialsApiClient = new GoogleApiClient.Builder(activity) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) @@ -232,16 +235,6 @@ public void saveCredentialsOrFinish(AppCompatBase activity, .build(); } - public Intent getIntentForTest() { - return new Intent() - .putExtra(ExtraConstants.EXTRA_FLOW_PARAMS, mFlowParameters) - .putExtra(ExtraConstants.EXTRA_NAME, mName) - .putExtra(ExtraConstants.EXTRA_EMAIL, mEmail) - .putExtra(ExtraConstants.EXTRA_PASSWORD, mPassword) - .putExtra(ExtraConstants.EXTRA_PROVIDER, mProvider) - .putExtra(ExtraConstants.EXTRA_PROFILE_PICTURE_URI, mProfilePictureUri); - } - public static SmartLock getInstance(AppCompatBase activity) { SmartLock result; diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java index 985523dfc..70362e475 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java @@ -14,6 +14,7 @@ package com.firebase.ui.auth.ui.idp; +import android.app.Activity; import android.content.Intent; import android.view.View; import android.widget.Button; @@ -33,9 +34,9 @@ import com.firebase.ui.auth.test_helpers.TestConstants; import com.firebase.ui.auth.test_helpers.TestHelper; import com.firebase.ui.auth.ui.ExtraConstants; -import com.firebase.ui.auth.util.SmartLock; import com.firebase.ui.auth.ui.email.EmailHintContainerActivity; import com.firebase.ui.auth.util.PlayServicesHelper; +import com.firebase.ui.auth.util.SmartLock; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FacebookAuthProvider; @@ -156,6 +157,7 @@ public void testGoogleLoginFlow() { List providers = Arrays.asList(AuthUI.GOOGLE_PROVIDER); AuthMethodPickerActivity authMethodPickerActivity = createActivity(providers); + TestHelper.initializeApp(authMethodPickerActivity); FirebaseUser mockFirebaseUser = TestHelper.makeMockFirebaseUser(); when(mockFirebaseUser.getProviders()) @@ -169,9 +171,10 @@ public void testGoogleLoginFlow() { assertNotNull(googleButton); googleButton.performClick(); - Intent smartLockIntent = SmartLock.getInstance(authMethodPickerActivity).getIntentForTest(); - verifySaveCredentialIntent(smartLockIntent, GoogleAuthProvider.PROVIDER_ID); + assertEquals( + Shadows.shadowOf(authMethodPickerActivity).getResultCode(), + Activity.RESULT_OK); } private static void verifySaveCredentialIntent(Intent smartLockIntent, String provider) { From a8b5cf5ee7256689e8521f3cf9d639e3e0d506ce Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Sat, 15 Oct 2016 00:43:29 -0700 Subject: [PATCH 13/79] Cleanup --- .../main/java/com/firebase/ui/auth/util/SmartLock.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java index a5b16ed3a..4135a93b1 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java @@ -27,6 +27,7 @@ import android.util.Log; import com.firebase.ui.auth.BuildConfig; +import com.firebase.ui.auth.ui.ActivityHelper; import com.firebase.ui.auth.ui.AppCompatBase; import com.firebase.ui.auth.ui.FlowParameters; import com.google.android.gms.auth.api.Auth; @@ -50,6 +51,7 @@ public class SmartLock extends Fragment implements GoogleApiClient.ConnectionCal private static final int RC_UPDATE_SERVICE = 28; private AppCompatBase mActivity; + private ActivityHelper mActivityHelper; private String mName; private String mEmail; private String mPassword; @@ -91,7 +93,7 @@ public void onConnected(@Nullable Bundle bundle) { builder.setProfilePictureUri(Uri.parse(mProfilePictureUri)); } - Auth.CredentialsApi + mActivityHelper.getCredentialsApi() .save(mCredentialsApiClient, builder.build()) .setResultCallback(this); } @@ -169,7 +171,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { Credential credential = new Credential.Builder(mEmail).setPassword(mPassword) .build(); - Auth.CredentialsApi + mActivityHelper.getCredentialsApi() .save(mCredentialsApiClient, credential) .setResultCallback(this); } else { @@ -197,11 +199,13 @@ private void finish() { * @param provider (optional) provider string for provider credential. */ public void saveCredentialsOrFinish(AppCompatBase activity, + ActivityHelper helper, FlowParameters parameters, FirebaseUser firebaseUser, @Nullable String password, @Nullable String provider) { mActivity = activity; + mActivityHelper = helper; mName = firebaseUser.getDisplayName(); mEmail = firebaseUser.getEmail(); mPassword = password; From 83e13d83ec8a76cc292a955cead733622ee20fe4 Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Sat, 15 Oct 2016 13:12:06 -0700 Subject: [PATCH 14/79] Refactor SaveSmartLock.java --- .../com/firebase/ui/auth/ui/ActivityBase.java | 1 - .../WelcomeBackPasswordPrompt.java | 8 +- .../auth/ui/email/RegisterEmailActivity.java | 8 +- .../ui/auth/ui/email/SignInActivity.java | 8 +- .../auth/ui/idp/AuthMethodPickerActivity.java | 6 +- .../auth/ui/idp/CredentialSignInHandler.java | 8 +- .../ui/idp/IDPSignInContainerActivity.java | 6 +- .../util/smartlock/RetrieveSmartLock.java | 4 + .../SaveSmartLock.java} | 115 ++++-------------- .../ui/auth/util/smartlock/SmartLock.java | 101 +++++++++++++++ .../ui/email/RegisterEmailActivityTest.java | 2 +- .../ui/auth/ui/email/SignInActivityTest.java | 2 +- .../ui/idp/AuthMethodPickerActivityTest.java | 2 +- .../ui/idp/CredentialSignInHandlerTest.java | 2 +- 14 files changed, 155 insertions(+), 118 deletions(-) create mode 100644 auth/src/main/java/com/firebase/ui/auth/util/smartlock/RetrieveSmartLock.java rename auth/src/main/java/com/firebase/ui/auth/util/{SmartLock.java => smartlock/SaveSmartLock.java} (65%) create mode 100644 auth/src/main/java/com/firebase/ui/auth/util/smartlock/SmartLock.java diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/ActivityBase.java b/auth/src/main/java/com/firebase/ui/auth/ui/ActivityBase.java index b85c06bb5..ccad5f1a1 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/ActivityBase.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/ActivityBase.java @@ -31,5 +31,4 @@ protected void onCreate(Bundle savedInstance) { public void finish(int resultCode, Intent intent) { mActivityHelper.finish(resultCode, intent); } - } diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java b/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java index b8342a37f..27155f8ae 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java @@ -37,7 +37,7 @@ import com.firebase.ui.auth.ui.TaskFailureLogger; import com.firebase.ui.auth.ui.email.PasswordToggler; import com.firebase.ui.auth.ui.email.RecoverPasswordActivity; -import com.firebase.ui.auth.util.SmartLock; +import com.firebase.ui.auth.util.smartlock.SaveSmartLock; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; import com.google.firebase.auth.AuthCredential; @@ -56,14 +56,14 @@ public class WelcomeBackPasswordPrompt extends AppCompatBase implements View.OnC private TextInputLayout mPasswordLayout; private EditText mPasswordField; private IDPResponse mIdpResponse; - private SmartLock mSmartLock; + private SaveSmartLock mSmartLock; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.welcome_back_password_prompt_layout); - mSmartLock = SmartLock.getInstance(this); + mSmartLock = SaveSmartLock.getInstance(this); mPasswordLayout = (TextInputLayout) findViewById(R.id.password_layout); mPasswordField = (EditText) findViewById(R.id.password); @@ -134,7 +134,7 @@ public void onSuccess(AuthResult authResult) { public void onSuccess(AuthResult authResult) { mSmartLock.saveCredentialsOrFinish( WelcomeBackPasswordPrompt.this, - mActivityHelper.getFlowParams(), + mActivityHelper, authResult.getUser(), password, null /* provider */); diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java index 799cd8589..c697bd20c 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java @@ -39,7 +39,7 @@ import com.firebase.ui.auth.ui.email.field_validators.EmailFieldValidator; import com.firebase.ui.auth.ui.email.field_validators.PasswordFieldValidator; import com.firebase.ui.auth.ui.email.field_validators.RequiredFieldValidator; -import com.firebase.ui.auth.util.SmartLock; +import com.firebase.ui.auth.util.smartlock.SaveSmartLock; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; @@ -58,7 +58,7 @@ public class RegisterEmailActivity extends AppCompatBase implements View.OnClickListener { private static final String TAG = "RegisterEmailActivity"; - private SmartLock mSmartLock; + private SaveSmartLock mSmartLock; private EditText mEmailEditText; private EditText mPasswordEditText; private EditText mNameEditText; @@ -71,7 +71,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.register_email_layout); - mSmartLock = SmartLock.getInstance(this); + mSmartLock = SaveSmartLock.getInstance(this); String email = getIntent().getStringExtra(ExtraConstants.EXTRA_EMAIL); mEmailEditText = (EditText) findViewById(R.id.email); @@ -161,7 +161,7 @@ public void onComplete(@NonNull Task task) { // the credential to SmartLock (if enabled). mSmartLock.saveCredentialsOrFinish( RegisterEmailActivity.this, - mActivityHelper.getFlowParams(), + mActivityHelper, firebaseUser, password, null /* provider */); diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java index 108591a91..a94553a9e 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java @@ -34,7 +34,7 @@ import com.firebase.ui.auth.ui.TaskFailureLogger; import com.firebase.ui.auth.ui.email.field_validators.EmailFieldValidator; import com.firebase.ui.auth.ui.email.field_validators.RequiredFieldValidator; -import com.firebase.ui.auth.util.SmartLock; +import com.firebase.ui.auth.util.smartlock.SaveSmartLock; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; import com.google.firebase.auth.AuthResult; @@ -45,7 +45,7 @@ public class SignInActivity extends AppCompatBase implements View.OnClickListener { private static final String TAG = "SignInActivity"; - private SmartLock mSmartLock; + private SaveSmartLock mSmartLock; private EditText mEmailEditText; private EditText mPasswordEditText; private EmailFieldValidator mEmailValidator; @@ -56,7 +56,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sign_in_layout); - mSmartLock = SmartLock.getInstance(this); + mSmartLock = SaveSmartLock.getInstance(this); String email = getIntent().getStringExtra(ExtraConstants.EXTRA_EMAIL); @@ -102,7 +102,7 @@ public void onSuccess(AuthResult authResult) { // Save credential in SmartLock (if enabled) mSmartLock.saveCredentialsOrFinish( SignInActivity.this, - mActivityHelper.getFlowParams(), + mActivityHelper, authResult.getUser(), password, null /* provider */); diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java index 2de9c7d32..f62aa3590 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java @@ -35,7 +35,7 @@ import com.firebase.ui.auth.ui.TaskFailureLogger; import com.firebase.ui.auth.ui.email.EmailHintContainerActivity; import com.firebase.ui.auth.util.EmailFlowUtil; -import com.firebase.ui.auth.util.SmartLock; +import com.firebase.ui.auth.util.smartlock.SaveSmartLock; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.EmailAuthProvider; import com.google.firebase.auth.FacebookAuthProvider; @@ -62,7 +62,7 @@ public class AuthMethodPickerActivity private static final int RC_ACCOUNT_LINK = 3; private static final String TAG = "AuthMethodPicker"; - private SmartLock mSmartLock; + private SaveSmartLock mSmartLock; private ArrayList mIdpProviders; @Override @@ -70,7 +70,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.auth_method_picker_layout); - mSmartLock = SmartLock.getInstance(this); + mSmartLock = SaveSmartLock.getInstance(this); findViewById(R.id.email_provider).setOnClickListener(this); diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java index 8b8aab090..68a744420 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java @@ -23,7 +23,7 @@ import com.firebase.ui.auth.ui.TaskFailureLogger; import com.firebase.ui.auth.ui.account_link.WelcomeBackIDPPrompt; import com.firebase.ui.auth.ui.account_link.WelcomeBackPasswordPrompt; -import com.firebase.ui.auth.util.SmartLock; +import com.firebase.ui.auth.util.smartlock.SaveSmartLock; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; @@ -40,14 +40,14 @@ public class CredentialSignInHandler implements OnCompleteListener { private AppCompatBase mActivity; private ActivityHelper mActivityHelper; - private SmartLock mSmartLock; + private SaveSmartLock mSmartLock; private int mAccountLinkResultCode; private IDPResponse mResponse; public CredentialSignInHandler( AppCompatBase activity, ActivityHelper activityHelper, - SmartLock smartLock, + SaveSmartLock smartLock, int accountLinkResultCode, IDPResponse response) { mActivity = activity; @@ -63,7 +63,7 @@ public void onComplete(@NonNull Task task) { FirebaseUser firebaseUser = task.getResult().getUser(); mSmartLock.saveCredentialsOrFinish( mActivity, - mActivityHelper.getFlowParams(), + mActivityHelper, firebaseUser, null /* password */, mResponse.getProviderType()); diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java index 1e3360d19..c1f046f9c 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java @@ -27,7 +27,7 @@ import com.firebase.ui.auth.ui.ExtraConstants; import com.firebase.ui.auth.ui.FlowParameters; import com.firebase.ui.auth.ui.TaskFailureLogger; -import com.firebase.ui.auth.util.SmartLock; +import com.firebase.ui.auth.util.smartlock.SaveSmartLock; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.AuthResult; @@ -39,7 +39,7 @@ public class IDPSignInContainerActivity extends IDPBaseActivity implements IDPPr private static final String TAG = "IDPSignInContainer"; private static final int RC_WELCOME_BACK_IDP = 4; - private SmartLock mSmartLock; + private SaveSmartLock mSmartLock; private IDPProvider mIDPProvider; private String mProvider; private String mEmail; @@ -48,7 +48,7 @@ public class IDPSignInContainerActivity extends IDPBaseActivity implements IDPPr protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mSmartLock = SmartLock.getInstance(this); + mSmartLock = SaveSmartLock.getInstance(this); mProvider = getIntent().getStringExtra(ExtraConstants.EXTRA_PROVIDER); mEmail = getIntent().getStringExtra(ExtraConstants.EXTRA_EMAIL); diff --git a/auth/src/main/java/com/firebase/ui/auth/util/smartlock/RetrieveSmartLock.java b/auth/src/main/java/com/firebase/ui/auth/util/smartlock/RetrieveSmartLock.java new file mode 100644 index 000000000..75f7096a2 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/util/smartlock/RetrieveSmartLock.java @@ -0,0 +1,4 @@ +package com.firebase.ui.auth.util.smartlock; + +public class RetrieveSmartLock { +} diff --git a/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java b/auth/src/main/java/com/firebase/ui/auth/util/smartlock/SaveSmartLock.java similarity index 65% rename from auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java rename to auth/src/main/java/com/firebase/ui/auth/util/smartlock/SaveSmartLock.java index 4135a93b1..49fe798cc 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/smartlock/SaveSmartLock.java @@ -1,18 +1,4 @@ -/* - * Copyright 2016 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the - * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.firebase.ui.auth.util; +package com.firebase.ui.auth.util.smartlock; import android.app.PendingIntent; import android.content.Intent; @@ -29,14 +15,12 @@ import com.firebase.ui.auth.BuildConfig; import com.firebase.ui.auth.ui.ActivityHelper; import com.firebase.ui.auth.ui.AppCompatBase; -import com.firebase.ui.auth.ui.FlowParameters; import com.google.android.gms.auth.api.Auth; import com.google.android.gms.auth.api.credentials.Credential; import com.google.android.gms.auth.api.credentials.IdentityProviders; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GoogleApiAvailability; import com.google.android.gms.common.api.GoogleApiClient; -import com.google.android.gms.common.api.ResultCallback; import com.google.android.gms.common.api.Status; import com.google.firebase.auth.FacebookAuthProvider; import com.google.firebase.auth.FirebaseUser; @@ -44,26 +28,12 @@ import static android.app.Activity.RESULT_OK; -public class SmartLock extends Fragment implements GoogleApiClient.ConnectionCallbacks, ResultCallback, - GoogleApiClient.OnConnectionFailedListener { - private static final String TAG = "CredentialsSaveBase"; - private static final int RC_SAVE = 100; - private static final int RC_UPDATE_SERVICE = 28; - - private AppCompatBase mActivity; - private ActivityHelper mActivityHelper; - private String mName; - private String mEmail; - private String mPassword; - private String mProvider; - private String mProfilePictureUri; - private GoogleApiClient mCredentialsApiClient; - +public class SaveSmartLock extends SmartLock { @Override - public void onConnected(@Nullable Bundle bundle) { + public void onConnected(Bundle bundle) { if (mEmail == null) { Log.e(TAG, "Unable to save null credential!"); - finish(); + finishOk(); return; } @@ -98,19 +68,10 @@ public void onConnected(@Nullable Bundle bundle) { .setResultCallback(this); } - @Override - public void onConnectionSuspended(int i) { - if (BuildConfig.DEBUG) { - Log.d(TAG, "Connection suspended with code " + i); - } - } - @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { - if (BuildConfig.DEBUG) { - Log.d(TAG, "connection failed with " + connectionResult.getErrorMessage() - + " and code: " + connectionResult.getErrorCode()); - } + super.onConnectionFailed(connectionResult); + PendingIntent resolution = GoogleApiAvailability .getInstance() @@ -127,15 +88,14 @@ public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { null); } catch (IntentSender.SendIntentException e) { e.printStackTrace(); - finish(); + finishOk(); } } - @Override public void onResult(@NonNull Status status) { if (status.isSuccess()) { - finish(); + finishOk(); } else { if (status.hasResolution()) { // Try to resolve the save request. This will prompt the user if @@ -145,10 +105,10 @@ public void onResult(@NonNull Status status) { } catch (IntentSender.SendIntentException e) { // Could not resolve the request Log.e(TAG, "STATUS: Failed to send resolution.", e); - finish(); + finishOk(); } } else { - finish(); + finishOk(); } } } @@ -162,10 +122,10 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { if (BuildConfig.DEBUG) { Log.d(TAG, "SAVE: OK"); } - finish(); + finishOk(); } else { Log.e(TAG, "SAVE: Canceled by user"); - finish(); + finishOk(); } } else if (requestCode == RC_UPDATE_SERVICE) { if (resultCode == RESULT_OK) { @@ -176,58 +136,31 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { .setResultCallback(this); } else { Log.e(TAG, "SAVE: Canceled by user"); - finish(); + finishOk(); } } } - private void finish() { - // For tests - mActivity.setResult(RESULT_OK); - - mActivity.finish(RESULT_OK, mActivity.getIntent()); - } - /** * If SmartLock is enabled and Google Play Services is available, save the credentials. * Otherwise, finish the calling Activity with RESULT_OK. * * @param activity the calling Activity. - * @param parameters calling Activity flow parameters. + * @param helper activity helper. * @param firebaseUser Firebase user to save in Credential. * @param password (optional) password for email credential. * @param provider (optional) provider string for provider credential. */ public void saveCredentialsOrFinish(AppCompatBase activity, ActivityHelper helper, - FlowParameters parameters, FirebaseUser firebaseUser, @Nullable String password, @Nullable String provider) { - mActivity = activity; - mActivityHelper = helper; - mName = firebaseUser.getDisplayName(); - mEmail = firebaseUser.getEmail(); - mPassword = password; - mProvider = provider; - mProfilePictureUri = firebaseUser.getPhotoUrl() != null ? firebaseUser.getPhotoUrl() - .toString() : null; - - // If SmartLock is disabled, finish the Activity - if (!parameters.smartLockEnabled) { - finish(); - return; - } - - // If Play Services is not available, finish the Activity - if (!PlayServicesHelper.getInstance(activity).isPlayServicesAvailable()) { - finish(); - return; - } - - if (!FirebaseAuthWrapperFactory.getFirebaseAuthWrapper(parameters.appName) - .isPlayServicesAvailable(activity)) { - finish(); + if (!initializeAndContinue(activity, + helper, + firebaseUser, + password, + provider)) { return; } @@ -239,18 +172,18 @@ public void saveCredentialsOrFinish(AppCompatBase activity, .build(); } - public static SmartLock getInstance(AppCompatBase activity) { - SmartLock result; + public static SaveSmartLock getInstance(AppCompatBase activity) { + SaveSmartLock result; FragmentManager fm = activity.getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); Fragment fragment = fm.findFragmentByTag(TAG); - if (fragment == null || !(fragment instanceof SmartLock)) { - result = new SmartLock(); + if (fragment == null || !(fragment instanceof SaveSmartLock)) { + result = new SaveSmartLock(); ft.add(result, TAG).disallowAddToBackStack().commit(); } else { - result = (SmartLock) fragment; + result = (SaveSmartLock) fragment; } return result; diff --git a/auth/src/main/java/com/firebase/ui/auth/util/smartlock/SmartLock.java b/auth/src/main/java/com/firebase/ui/auth/util/smartlock/SmartLock.java new file mode 100644 index 000000000..85b7b54e5 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/util/smartlock/SmartLock.java @@ -0,0 +1,101 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.util.smartlock; + +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.util.Log; +import android.widget.Toast; + +import com.firebase.ui.auth.BuildConfig; +import com.firebase.ui.auth.ui.ActivityHelper; +import com.firebase.ui.auth.ui.AppCompatBase; +import com.firebase.ui.auth.util.FirebaseAuthWrapperFactory; +import com.firebase.ui.auth.util.PlayServicesHelper; +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.api.GoogleApiClient; +import com.google.android.gms.common.api.ResultCallback; +import com.google.android.gms.common.api.Status; +import com.google.firebase.auth.FirebaseUser; + +import static android.app.Activity.RESULT_OK; + +public abstract class SmartLock extends Fragment implements + GoogleApiClient.ConnectionCallbacks, + ResultCallback, + GoogleApiClient.OnConnectionFailedListener { + static final String TAG = "CredentialsSaveBase"; + static final int RC_SAVE = 100; + static final int RC_UPDATE_SERVICE = 28; + + AppCompatBase mActivity; + ActivityHelper mActivityHelper; + String mName; + String mEmail; + String mPassword; + String mProvider; + String mProfilePictureUri; + GoogleApiClient mCredentialsApiClient; + + @Override + public void onConnectionSuspended(int i) { + if (BuildConfig.DEBUG) { + Log.d(TAG, "Connection suspended with code " + i); + } + } + + @Override + public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { + if (BuildConfig.DEBUG) { + Log.d(TAG, "connection failed with " + connectionResult.getErrorMessage() + + " and code: " + connectionResult.getErrorCode()); + } + Toast.makeText(mActivity, "An error has occurred.", Toast.LENGTH_SHORT).show(); + } + + void finishOk() { + // For tests + mActivity.setResult(RESULT_OK); + + mActivity.finish(RESULT_OK, mActivity.getIntent()); + } + + boolean initializeAndContinue(AppCompatBase activity, + ActivityHelper helper, + FirebaseUser firebaseUser, + @Nullable String password, + @Nullable String provider) { + mActivity = activity; + mActivityHelper = helper; + mName = firebaseUser.getDisplayName(); + mEmail = firebaseUser.getEmail(); + mPassword = password; + mProvider = provider; + mProfilePictureUri = firebaseUser.getPhotoUrl() != null ? firebaseUser.getPhotoUrl() + .toString() : null; + + // If SmartLock is disabled or play services is not available, finish the Activity + if (!helper.getFlowParams().smartLockEnabled + || !PlayServicesHelper.getInstance(activity).isPlayServicesAvailable() + || !FirebaseAuthWrapperFactory.getFirebaseAuthWrapper(helper.getFlowParams().appName) + .isPlayServicesAvailable(activity)) { + finishOk(); + return false; + } else { + return true; + } + } +} diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java index e82cdd8db..d150527e4 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java @@ -31,7 +31,7 @@ import com.firebase.ui.auth.test_helpers.TestHelper; import com.firebase.ui.auth.ui.ExtraConstants; import com.firebase.ui.auth.util.PlayServicesHelper; -import com.firebase.ui.auth.util.SmartLock; +import com.firebase.ui.auth.util.smartlock.SmartLock; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.auth.UserProfileChangeRequest; diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java index cb67becdd..0e6512f4a 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java @@ -30,7 +30,7 @@ import com.firebase.ui.auth.test_helpers.TestHelper; import com.firebase.ui.auth.ui.ExtraConstants; import com.firebase.ui.auth.util.PlayServicesHelper; -import com.firebase.ui.auth.util.SmartLock; +import com.firebase.ui.auth.util.smartlock.SmartLock; import com.google.firebase.auth.FirebaseUser; import org.junit.Before; diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java index 70362e475..c57f98c10 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java @@ -36,7 +36,7 @@ import com.firebase.ui.auth.ui.ExtraConstants; import com.firebase.ui.auth.ui.email.EmailHintContainerActivity; import com.firebase.ui.auth.util.PlayServicesHelper; -import com.firebase.ui.auth.util.SmartLock; +import com.firebase.ui.auth.util.smartlock.SmartLock; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FacebookAuthProvider; diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java index 36637e392..8adb2c3c2 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java @@ -36,7 +36,7 @@ import com.firebase.ui.auth.ui.account_link.WelcomeBackPasswordPrompt; import com.firebase.ui.auth.util.CredentialsAPI; import com.firebase.ui.auth.util.PlayServicesHelper; -import com.firebase.ui.auth.util.SmartLock; +import com.firebase.ui.auth.util.smartlock.SmartLock; import com.google.android.gms.tasks.Task; import com.google.android.gms.tasks.Tasks; import com.google.firebase.FirebaseApp; From c5291717fe354c96cff99cb8fd7195ee4f743ebe Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Sat, 15 Oct 2016 19:58:15 -0700 Subject: [PATCH 15/79] Initial refactor --- .../firebase/uidemo/auth/AuthUiActivity.java | 21 +- auth/src/main/AndroidManifest.xml | 5 - .../java/com/firebase/ui/auth/AuthUI.java | 130 ++--- .../ui/auth/ui/ChooseAccountActivity.java | 318 ------------ .../WelcomeBackPasswordPrompt.java | 2 +- .../auth/ui/email/RegisterEmailActivity.java | 2 +- .../ui/auth/ui/email/SignInActivity.java | 2 +- .../auth/ui/idp/AuthMethodPickerActivity.java | 2 +- .../auth/ui/idp/CredentialSignInHandler.java | 2 +- .../ui/idp/IDPSignInContainerActivity.java | 2 +- .../firebase/ui/auth/util/CredentialsAPI.java | 267 ---------- .../util/{smartlock => }/SaveSmartLock.java | 98 +++- .../firebase/ui/auth/util/SignInDelegate.java | 455 ++++++++++++++++++ .../util/smartlock/RetrieveSmartLock.java | 4 - .../ui/auth/util/smartlock/SmartLock.java | 101 ---- .../CustomRobolectricGradleTestRunner.java | 1 - .../ui/auth/ui/ChooseAccountActivityTest.java | 1 - .../ui/email/RegisterEmailActivityTest.java | 1 - .../ui/auth/ui/email/SignInActivityTest.java | 1 - .../ui/idp/AuthMethodPickerActivityTest.java | 1 - .../ui/idp/CredentialSignInHandlerTest.java | 2 - 21 files changed, 617 insertions(+), 801 deletions(-) delete mode 100644 auth/src/main/java/com/firebase/ui/auth/ui/ChooseAccountActivity.java delete mode 100644 auth/src/main/java/com/firebase/ui/auth/util/CredentialsAPI.java rename auth/src/main/java/com/firebase/ui/auth/util/{smartlock => }/SaveSmartLock.java (69%) create mode 100644 auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java delete mode 100644 auth/src/main/java/com/firebase/ui/auth/util/smartlock/RetrieveSmartLock.java delete mode 100644 auth/src/main/java/com/firebase/ui/auth/util/smartlock/SmartLock.java 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 c5fab10b3..a8a6aabf2 100644 --- a/app/src/main/java/com/firebase/uidemo/auth/AuthUiActivity.java +++ b/app/src/main/java/com/firebase/uidemo/auth/AuthUiActivity.java @@ -125,15 +125,18 @@ public void onCreate(Bundle savedInstanceState) { @OnClick(R.id.sign_in) public void signIn(View view) { - startActivityForResult( - AuthUI.getInstance().createSignInIntentBuilder() - .setTheme(getSelectedTheme()) - .setLogo(getSelectedLogo()) - .setProviders(getSelectedProviders()) - .setTosUrl(getSelectedTosUrl()) - .setIsSmartLockEnabled(mEnableSmartLock.isChecked()) - .build(), - RC_SIGN_IN); + AuthUI.getInstance().createSignInIntentBuilder() + .setTheme(getSelectedTheme()) + .setLogo(getSelectedLogo()) + .setProviders(getSelectedProviders()) + .setTosUrl(getSelectedTosUrl()) + .setIsSmartLockEnabled(mEnableSmartLock.isChecked()) + .build(this, new AuthUI.AuthUIResult() { + @Override + public void onResult(int resultCode, Intent data) { + handleSignInResponse(resultCode, data); + } + }); } @Override diff --git a/auth/src/main/AndroidManifest.xml b/auth/src/main/AndroidManifest.xml index 54b7f5b93..bf15e30c8 100644 --- a/auth/src/main/AndroidManifest.xml +++ b/auth/src/main/AndroidManifest.xml @@ -48,11 +48,6 @@ android:name="com.firebase.ui.auth.ui.idp.IDPSignInContainerActivity" android:label="@string/default_toolbar_title" android:theme="@style/FirebaseUI.Translucent" /> - - *

Sign-in

- * + *

* If a user is not currently signed in (as can be determined by checking * {@code auth.getCurrentUser() != null}, where {@code auth} is the {@link FirebaseAuth} * associated with your {@link FirebaseApp}) then the sign-in process can be started by creating * a sign-in intent using {@link SignInIntentBuilder}. A builder instance can be retrieved by * calling {@link AuthUI#createSignInIntentBuilder()}. - * + *

*

The builder provides the following customization options for the authentication flow * implemented by this library: - * + *

*

    - *
  • The set of authentication methods desired can be specified.
  • - *
  • The terms of service URL for your app can be specified, which is included as a link - * in the small-print of the account creation step for new users. If no terms of service - * URL is provided, the associated small-print is omitted. - *
  • - *
  • A custom theme can specified for the flow, which is applied to all the activities in - * the flow for consistent customization of colors and typography. - *
  • + *
  • The set of authentication methods desired can be specified.
  • + *
  • The terms of service URL for your app can be specified, which is included as a link + * in the small-print of the account creation step for new users. If no terms of service + * URL is provided, the associated small-print is omitted. + *
  • + *
  • A custom theme can specified for the flow, which is applied to all the activities in + * the flow for consistent customization of colors and typography. + *
  • *
- * - * + *

+ *

*

Sign-in examples

- * + *

* If no customization is required, and only email authentication is required, the sign-in flow * can be started as follows: - * + *

*

  * {@code
  * startActivityForResult(
@@ -93,9 +92,9 @@
  *     RC_SIGN_IN);
  * }
  * 
- * + *

* If Google Sign-in and Facebook Sign-in are also required, then this can be replaced with: - * + *

*

  * {@code
  * startActivityForResult(
@@ -106,9 +105,9 @@
  *     RC_SIGN_IN);
  * }
  * 
- * + *

* Finally, if a terms of service URL and a custom theme are required: - * + *

*

  * {@code
  * startActivityForResult(
@@ -121,15 +120,15 @@
  *     RC_SIGN_IN);
  * }
  * 
- * + *

*

Handling the Sign-in response

- * + *

* The authentication flow provides only two response codes: {@link Activity#RESULT_OK RESULT_OK} * if a user is signed in, and {@link Activity#RESULT_CANCELED RESULT_CANCELLED} if sign in * failed. No further information on failure is provided as it is not typically useful; the only * recourse for most apps if sign in fails is to ask the user to sign in again later, or proceed * with an anonymous account if supported. - * + *

*

  * {@code
  * @Override
@@ -148,29 +147,29 @@
  *   }
  * }
  * 
- * + *

*

Sign-out

- * + *

* With the integrations provided by AuthUI, signing out a user is a multi-stage process: - * + *

*

    - *
  1. The user must be signed out of the {@link FirebaseAuth} instance.
  2. - *
  3. Smart Lock for Passwords must be instructed to disable automatic sign-in, in - * order to prevent an automatic sign-in loop that prevents the user from switching - * accounts. - *
  4. - *
  5. If the current user signed in using either Google or Facebook, the user must also be - * signed out using the associated API for that authentication method. This typically - * ensures that the user will not be automatically signed-in using the current account - * when using that authentication method again from the authentication method picker, which - * would also prevent the user from switching between accounts on the same provider. - *
  6. + *
  7. The user must be signed out of the {@link FirebaseAuth} instance.
  8. + *
  9. Smart Lock for Passwords must be instructed to disable automatic sign-in, in + * order to prevent an automatic sign-in loop that prevents the user from switching + * accounts. + *
  10. + *
  11. If the current user signed in using either Google or Facebook, the user must also be + * signed out using the associated API for that authentication method. This typically + * ensures that the user will not be automatically signed-in using the current account + * when using that authentication method again from the authentication method picker, which + * would also prevent the user from switching between accounts on the same provider. + *
  12. *
- * + *

* In order to make this process easier, AuthUI provides a simple * {@link AuthUI#signOut(Activity) signOut} method to encapsulate this behavior. The method returns * a {@link Task} which is marked completed once all necessary sign-out operations are completed: - * + *

*

  * {@code
  * public void onClick(View v) {
@@ -186,15 +185,15 @@
  *   }
  * }
  * 
- * + *

*

IDP Provider configuration

- * + *

* Interacting with identity providers typically requires some additional client configuration. * AuthUI currently supports Google Sign-in and Facebook Sign-in, and currently requires the * basic configuration for these providers to be specified via string properties: - * + *

*

*/ public class AuthUI { + public interface AuthUIResult { + void onResult(int resultCode, Intent data); + } /** * Provider identifier for email and password credentials, for use with @@ -312,6 +314,7 @@ public SignInIntentBuilder createSignInIntentBuilder() { /** * Retrieves the {@link AuthUI} instance associated with the default app, as returned by * {@code FirebaseApp.getInstance()}. + * * @throws IllegalStateException if the default app is not initialized. */ public static AuthUI getInstance() { @@ -337,7 +340,8 @@ public static AuthUI getInstance(FirebaseApp app) { * Default theme used by {@link SignInIntentBuilder#setTheme(int)} if no theme * customization is required. */ - public static @StyleRes int getDefaultTheme() { + @StyleRes + public static int getDefaultTheme() { // TODO(iainmgin): figure out why this works as a static method but not as a static // final variable. return R.style.FirebaseUI; @@ -353,8 +357,6 @@ public final class SignInIntentBuilder { private String mTosUrl; private boolean mIsSmartLockEnabled = true; - private SignInIntentBuilder() {} - /** * Specifies the theme to use for the application flow. If no theme is specified, * a default theme will be used. @@ -389,7 +391,7 @@ public SignInIntentBuilder setTosUrl(@Nullable String tosUrl) { * Specifies the set of supported authentication providers. At least one provider * must be specified, and the set of providers must be a subset of * {@link #SUPPORTED_PROVIDERS}. - * + *

*

If no providers are explicitly specified by calling this method, then * {@link #EMAIL_PROVIDER email} is the default supported provider. * @@ -409,7 +411,7 @@ public SignInIntentBuilder setProviders(@NonNull String... providers) { /** * Enables or disables the use of Smart Lock for Passwords in the sign in flow. - * + *

*

SmartLock is enabled by default */ public SignInIntentBuilder setIsSmartLockEnabled(boolean enabled) { @@ -417,24 +419,22 @@ public SignInIntentBuilder setIsSmartLockEnabled(boolean enabled) { return this; } - public Intent build() { + public void build(Activity activity, AuthUIResult result) { Context context = mApp.getApplicationContext(); - return build(context); + build(context, activity, result); } - @VisibleForTesting - public Intent build(Context context) { + private void build(Context context, Activity activity, AuthUIResult result) { List providerInfo = ProviderHelper.getProviderParcels(context, mProviders); - return ChooseAccountActivity.createIntent( - context, - new FlowParameters( - mApp.getName(), - providerInfo, - mTheme, - mLogo, - mTosUrl, - mIsSmartLockEnabled)); + SignInDelegate.newInstance(activity, result, + new FlowParameters( + mApp.getName(), + providerInfo, + mTheme, + mLogo, + mTosUrl, + mIsSmartLockEnabled)); } } } diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/ChooseAccountActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/ChooseAccountActivity.java deleted file mode 100644 index 41e3ef5e0..000000000 --- a/auth/src/main/java/com/firebase/ui/auth/ui/ChooseAccountActivity.java +++ /dev/null @@ -1,318 +0,0 @@ -/* - * Copyright 2016 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the - * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.firebase.ui.auth.ui; - -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.text.TextUtils; -import android.util.Log; - -import com.firebase.ui.auth.BuildConfig; -import com.firebase.ui.auth.provider.IDPProviderParcel; -import com.firebase.ui.auth.ui.idp.AuthMethodPickerActivity; -import com.firebase.ui.auth.ui.idp.IDPSignInContainerActivity; -import com.firebase.ui.auth.util.CredentialsAPI; -import com.firebase.ui.auth.util.CredentialsApiHelper; -import com.firebase.ui.auth.util.EmailFlowUtil; -import com.firebase.ui.auth.util.PlayServicesHelper; -import com.google.android.gms.auth.api.credentials.Credential; -import com.google.android.gms.auth.api.credentials.CredentialsApi; -import com.google.android.gms.auth.api.credentials.IdentityProviders; -import com.google.android.gms.common.api.Status; -import com.google.android.gms.tasks.OnCompleteListener; -import com.google.android.gms.tasks.OnFailureListener; -import com.google.android.gms.tasks.OnSuccessListener; -import com.google.android.gms.tasks.Task; -import com.google.firebase.auth.AuthResult; -import com.google.firebase.auth.EmailAuthProvider; -import com.google.firebase.auth.FacebookAuthProvider; -import com.google.firebase.auth.FirebaseAuthInvalidUserException; -import com.google.firebase.auth.GoogleAuthProvider; - -import java.util.List; - -/** - * Attempts to acquire a credential from Smart Lock for Passwords to sign in - * an existing account. If this succeeds, an attempt is made to sign the user in - * with this credential. If it does not, the - * {@link AuthMethodPickerActivity authentication method picker activity} - * is started, unless only email is supported, in which case the - * {@link com.firebase.ui.auth.ui.email.SignInNoPasswordActivity email sign-in flow} - * is started. - */ -public class ChooseAccountActivity extends ActivityBase { - private static final String TAG = "ChooseAccountActivity"; - private static final int RC_CREDENTIALS_READ = 2; - private static final int RC_IDP_SIGNIN = 3; - private static final int RC_AUTH_METHOD_PICKER = 4; - private static final int RC_EMAIL_FLOW = 5; - private static final int RC_PLAY_SERVICES = 6; - - private CredentialsAPI mCredentialsApi; - private PlayServicesHelper mPlayServicesHelper; - - @Override - protected void onCreate(Bundle savedInstance) { - super.onCreate(savedInstance); - - // Make Google Play Services available at the correct version, if possible - mPlayServicesHelper = PlayServicesHelper.getInstance(this); - boolean madeAvailable = mPlayServicesHelper - .makePlayServicesAvailable(this, RC_PLAY_SERVICES, - new DialogInterface.OnCancelListener() { - @Override - public void onCancel(DialogInterface dialogInterface) { - Log.w(TAG, "playServices:dialog.onCancel()"); - finish(RESULT_CANCELED, new Intent()); - } - }); - - if (!madeAvailable) { - Log.w(TAG, "playServices: could not make available."); - finish(RESULT_CANCELED, new Intent()); - return; - } - - mCredentialsApi = new CredentialsAPI(this, new CredentialsAPI.CallbackInterface() { - @Override - public void onAsyncTaskFinished() { - onCredentialsApiConnected(mCredentialsApi, mActivityHelper); - } - }); - } - - @Override - protected void onStart() { - super.onStart(); - if (mCredentialsApi != null) { - mCredentialsApi.onStart(); - } - } - - @Override - protected void onStop() { - super.onStop(); - if (mCredentialsApi != null) { - mCredentialsApi.onStop(); - } - } - - /** - * Called when the Credentials API connects. - */ - public void onCredentialsApiConnected( - CredentialsAPI credentialsApi, - ActivityHelper activityHelper) { - String email = credentialsApi.getEmailFromCredential(); - String password = credentialsApi.getPasswordFromCredential(); - String accountType = credentialsApi.getAccountTypeFromCredential(); - - FlowParameters flowParams = activityHelper.getFlowParams(); - - if (flowParams.smartLockEnabled - && mPlayServicesHelper.isPlayServicesAvailable() - && credentialsApi.isCredentialsAvailable()) { - - // Attempt auto-sign in using SmartLock - if (credentialsApi.isAutoSignInAvailable()) { - credentialsApi.googleSilentSignIn(); - if (!TextUtils.isEmpty(password)) { - // Sign in with the email/password retrieved from SmartLock - signInWithEmailAndPassword(activityHelper, email, password); - } else { - // log in with id/provider - redirectToIdpSignIn(email, accountType); - } - } else if (credentialsApi.isSignInResolutionNeeded()) { - // resolve credential - credentialsApi.resolveSavedEmails(this); - } else { - startAuthMethodChoice(activityHelper); - } - } else { - startAuthMethodChoice(activityHelper); - } - } - - private void startAuthMethodChoice(ActivityHelper activityHelper) { - List providers = activityHelper.getFlowParams().providerInfo; - - // If the only provider is Email, immediately launch the email flow. Otherwise, launch - // the auth method picker screen. - if (providers.size() == 1 - && providers.get(0).getProviderType().equals(EmailAuthProvider.PROVIDER_ID)) { - startActivityForResult( - EmailFlowUtil.createIntent( - this, - activityHelper.getFlowParams()), - RC_EMAIL_FLOW); - } else { - startActivityForResult( - AuthMethodPickerActivity.createIntent( - this, - activityHelper.getFlowParams()), - RC_AUTH_METHOD_PICKER); - } - } - - private void logInWithCredential( - final String email, - final String password, - final String accountType) { - - if (email != null - && mCredentialsApi.isCredentialsAvailable() - && !mCredentialsApi.isSignInResolutionNeeded()) { - if (password != null && !password.isEmpty()) { - // email/password combination - signInWithEmailAndPassword(mActivityHelper, email, password); - } else { - // identifier/provider combination - redirectToIdpSignIn(email, accountType); - } - } - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (BuildConfig.DEBUG) { - Log.d(TAG, "onActivityResult:" + requestCode + ":" + resultCode + ":" + data); - } - - switch (requestCode) { - case RC_CREDENTIALS_READ: - if (resultCode == RESULT_OK) { - // credential selected from SmartLock, log in with that credential - Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY); - mCredentialsApi.handleCredential(credential); - mCredentialsApi.resolveSignIn(); - logInWithCredential( - mCredentialsApi.getEmailFromCredential(), - mCredentialsApi.getPasswordFromCredential(), - mCredentialsApi.getAccountTypeFromCredential() - ); - } else if (resultCode == RESULT_CANCELED - || resultCode == CredentialsApi.ACTIVITY_RESULT_OTHER_ACCOUNT) { - // Smart lock selector cancelled, go to the AuthMethodPicker screen - startAuthMethodChoice(mActivityHelper); - } else if (resultCode == RESULT_FIRST_USER) { - // TODO: (serikb) figure out flow - } - break; - case RC_IDP_SIGNIN: - case RC_AUTH_METHOD_PICKER: - case RC_EMAIL_FLOW: - finish(resultCode, new Intent()); - break; - case RC_PLAY_SERVICES: - if (resultCode != RESULT_OK) { - finish(resultCode, new Intent()); - } - break; - } - } - - /** - * Begin sign in process with email and password from a SmartLock credential. - * On success, finish with {@link #RESULT_OK}. - * On failure, delete the credential from SmartLock (if applicable) and then launch the - * auth method picker flow. - */ - private void signInWithEmailAndPassword(ActivityHelper helper, String email, String password) { - helper.getFirebaseAuth() - .signInWithEmailAndPassword(email, password) - .addOnFailureListener(new TaskFailureLogger( - TAG, "Error signing in with email and password")) - .addOnSuccessListener(new OnSuccessListener() { - @Override - public void onSuccess(AuthResult authResult) { - finish(RESULT_OK, new Intent()); - } - }) - .addOnFailureListener(new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - if (e instanceof FirebaseAuthInvalidUserException) { - // In this case the credential saved in SmartLock was not - // a valid credential, we should delete it from SmartLock - // before continuing. - deleteCredentialAndRedirect(); - } else { - startAuthMethodChoice(mActivityHelper); - } - } - }); - } - - /** - * Delete the last credential retrieved from SmartLock and then redirect to the - * auth method choice flow. - */ - private void deleteCredentialAndRedirect() { - if (mCredentialsApi.getCredential() == null) { - Log.w(TAG, "deleteCredentialAndRedirect: null credential"); - startAuthMethodChoice(mActivityHelper); - return; - } - - CredentialsApiHelper credentialsApiHelper = CredentialsApiHelper.getInstance(this); - credentialsApiHelper.delete(mCredentialsApi.getCredential()) - .addOnCompleteListener(this, new OnCompleteListener() { - @Override - public void onComplete(@NonNull Task task) { - if (!task.isSuccessful()) { - Log.w(TAG, "deleteCredential:failure", task.getException()); - } - startAuthMethodChoice(mActivityHelper); - } - }); - } - - protected void redirectToIdpSignIn(String email, String accountType) { - Intent nextIntent; - switch (accountType) { - case IdentityProviders.GOOGLE: - nextIntent = IDPSignInContainerActivity.createIntent( - this, - mActivityHelper.getFlowParams(), - GoogleAuthProvider.PROVIDER_ID, - email); - break; - case IdentityProviders.FACEBOOK: - nextIntent = IDPSignInContainerActivity.createIntent( - this, - mActivityHelper.getFlowParams(), - FacebookAuthProvider.PROVIDER_ID, - email); - break; - default: - Log.w(TAG, "unknown provider: " + accountType); - nextIntent = AuthMethodPickerActivity.createIntent( - this, - mActivityHelper.getFlowParams()); - } - this.startActivityForResult(nextIntent, RC_IDP_SIGNIN); - } - - public static Intent createIntent( - Context context, - FlowParameters flowParams) { - return ActivityHelper.createBaseIntent(context, ChooseAccountActivity.class, flowParams); - } -} diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java b/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java index 27155f8ae..e5bb2549e 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java @@ -37,7 +37,7 @@ import com.firebase.ui.auth.ui.TaskFailureLogger; import com.firebase.ui.auth.ui.email.PasswordToggler; import com.firebase.ui.auth.ui.email.RecoverPasswordActivity; -import com.firebase.ui.auth.util.smartlock.SaveSmartLock; +import com.firebase.ui.auth.util.SaveSmartLock; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; import com.google.firebase.auth.AuthCredential; diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java index c697bd20c..a496ae9d3 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java @@ -39,7 +39,7 @@ import com.firebase.ui.auth.ui.email.field_validators.EmailFieldValidator; import com.firebase.ui.auth.ui.email.field_validators.PasswordFieldValidator; import com.firebase.ui.auth.ui.email.field_validators.RequiredFieldValidator; -import com.firebase.ui.auth.util.smartlock.SaveSmartLock; +import com.firebase.ui.auth.util.SaveSmartLock; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java index a94553a9e..075c931d3 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java @@ -34,7 +34,7 @@ import com.firebase.ui.auth.ui.TaskFailureLogger; import com.firebase.ui.auth.ui.email.field_validators.EmailFieldValidator; import com.firebase.ui.auth.ui.email.field_validators.RequiredFieldValidator; -import com.firebase.ui.auth.util.smartlock.SaveSmartLock; +import com.firebase.ui.auth.util.SaveSmartLock; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; import com.google.firebase.auth.AuthResult; diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java index f62aa3590..e07a1224f 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java @@ -35,7 +35,7 @@ import com.firebase.ui.auth.ui.TaskFailureLogger; import com.firebase.ui.auth.ui.email.EmailHintContainerActivity; import com.firebase.ui.auth.util.EmailFlowUtil; -import com.firebase.ui.auth.util.smartlock.SaveSmartLock; +import com.firebase.ui.auth.util.SaveSmartLock; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.EmailAuthProvider; import com.google.firebase.auth.FacebookAuthProvider; diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java index 68a744420..d2c26ef9d 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java @@ -23,7 +23,7 @@ import com.firebase.ui.auth.ui.TaskFailureLogger; import com.firebase.ui.auth.ui.account_link.WelcomeBackIDPPrompt; import com.firebase.ui.auth.ui.account_link.WelcomeBackPasswordPrompt; -import com.firebase.ui.auth.util.smartlock.SaveSmartLock; +import com.firebase.ui.auth.util.SaveSmartLock; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java index c1f046f9c..7f2fdb38a 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java @@ -27,7 +27,7 @@ import com.firebase.ui.auth.ui.ExtraConstants; import com.firebase.ui.auth.ui.FlowParameters; import com.firebase.ui.auth.ui.TaskFailureLogger; -import com.firebase.ui.auth.util.smartlock.SaveSmartLock; +import com.firebase.ui.auth.util.SaveSmartLock; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.AuthResult; diff --git a/auth/src/main/java/com/firebase/ui/auth/util/CredentialsAPI.java b/auth/src/main/java/com/firebase/ui/auth/util/CredentialsAPI.java deleted file mode 100644 index 7f514c958..000000000 --- a/auth/src/main/java/com/firebase/ui/auth/util/CredentialsAPI.java +++ /dev/null @@ -1,267 +0,0 @@ -/* - * Copyright 2016 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the - * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.firebase.ui.auth.util; - -import android.app.Activity; -import android.app.ProgressDialog; -import android.content.IntentSender; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.util.Log; -import android.widget.Toast; - -import com.google.android.gms.auth.api.Auth; -import com.google.android.gms.auth.api.credentials.Credential; -import com.google.android.gms.auth.api.credentials.CredentialRequest; -import com.google.android.gms.auth.api.credentials.CredentialRequestResult; -import com.google.android.gms.auth.api.credentials.IdentityProviders; -import com.google.android.gms.auth.api.signin.GoogleSignInOptions; -import com.google.android.gms.common.ConnectionResult; -import com.google.android.gms.common.api.CommonStatusCodes; -import com.google.android.gms.common.api.GoogleApiClient; -import com.google.android.gms.common.api.ResultCallback; -import com.google.android.gms.common.api.Status; - -public class CredentialsAPI implements - GoogleApiClient.ConnectionCallbacks, - GoogleApiClient.OnConnectionFailedListener { - private static final int RC_CREDENTIALS_READ = 2; - private static final String TAG = "CredentialsAPI"; - - private GoogleApiClient mGoogleApiClient; - private boolean mAutoSignInAvailable; - private boolean mSignInResolutionNeeded; - private Activity mActivity; - private CredentialRequestResult mCredentialRequestResult; - private ProgressDialog mProgressDialog; - private Credential mCredential; - private final CallbackInterface mCallback; - private PlayServicesHelper mPlayServicesHelper; - - public interface CallbackInterface { - void onAsyncTaskFinished(); - } - - public CredentialsAPI(Activity activity, CallbackInterface callback) { - mAutoSignInAvailable = false; - mSignInResolutionNeeded = false; - mActivity = activity; - mCallback = callback; - mPlayServicesHelper = PlayServicesHelper.getInstance(mActivity); - - initGoogleApiClient(null); - requestCredentials(true /* shouldResolve */, false /* onlyPasswords */); - } - - public boolean isPlayServicesAvailable() { - return mPlayServicesHelper.isPlayServicesAvailable(); - } - - public boolean isCredentialsAvailable() { - // TODO: (serikb) find the way to check if Credentials is available on top of play services - return true; - } - - public boolean isAutoSignInAvailable() { - return mAutoSignInAvailable; - } - - public boolean isSignInResolutionNeeded() { - return mSignInResolutionNeeded; - } - - public void resolveSignIn() { - mSignInResolutionNeeded = false; - } - - public void resolveSavedEmails(Activity activity) { - if (mCredentialRequestResult == null || mCredentialRequestResult.getStatus() == null) { - return; - } - Status status = mCredentialRequestResult.getStatus(); - if (status.getStatusCode() == CommonStatusCodes.RESOLUTION_REQUIRED) { - try { - status.startResolutionForResult(activity, RC_CREDENTIALS_READ); - } catch (IntentSender.SendIntentException e) { - Log.e(TAG, "Failed to send Credentials intent.", e); - } - } - } - - public Credential getCredential() { - return mCredential; - } - - public String getEmailFromCredential() { - if (mCredential == null) { - return null; - } - return mCredential.getId(); - } - - public String getAccountTypeFromCredential() { - if (mCredential == null) { - return null; - } - return mCredential.getAccountType(); - } - - public String getPasswordFromCredential() { - if (mCredential == null) { - return null; - } - return mCredential.getPassword(); - } - - @Override - public void onConnected(@Nullable Bundle bundle) {} - - @Override - public void onConnectionSuspended(int cause) {} - - private void initGoogleApiClient(String accountName) { - GoogleSignInOptions.Builder gsoBuilder = new GoogleSignInOptions - .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) - .requestEmail(); - - if (accountName != null) { - gsoBuilder.setAccountName(accountName); - } - - GoogleApiClient.Builder builder = new GoogleApiClient.Builder(mActivity) - .addConnectionCallbacks(this) - .addApi(Auth.CREDENTIALS_API) - .addApi(Auth.GOOGLE_SIGN_IN_API, gsoBuilder.build()); - - mGoogleApiClient = builder.build(); - } - - public void googleSilentSignIn() { - // Try silent sign-in with Google Sign In API - Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient); - } - - public void handleCredential(Credential credential) { - mCredential = credential; - - if (IdentityProviders.GOOGLE.equals(credential.getAccountType())) { - // Google account, rebuild GoogleApiClient to set account name and then try - initGoogleApiClient(credential.getId()); - googleSilentSignIn(); - } else { - // Email/password account - String status = String.format("Signed in as %s", credential.getId()); - Log.d(TAG, status); - } - } - - public void requestCredentials(final boolean shouldResolve, boolean onlyPasswords) { - if (!mPlayServicesHelper.isPlayServicesAvailable()) { - // TODO(samstern): it would probably be better to not actually call the method - // in this case. - return; - } - - CredentialRequest.Builder crBuilder = new CredentialRequest.Builder() - .setPasswordLoginSupported(true); - - if (!onlyPasswords) { - crBuilder.setAccountTypes(IdentityProviders.GOOGLE); - } - - showProgress(); - Auth.CredentialsApi.request(mGoogleApiClient, crBuilder.build()) - .setResultCallback( - new ResultCallback() { - @Override - public void onResult(CredentialRequestResult credentialRequestResult) { - mCredentialRequestResult = credentialRequestResult; - Status status = credentialRequestResult.getStatus(); - - if (status.isSuccess()) { - // Auto sign-in success - mAutoSignInAvailable = true; - handleCredential(credentialRequestResult.getCredential()); - } else if (status.getStatusCode() == - CommonStatusCodes.RESOLUTION_REQUIRED && shouldResolve) { - mSignInResolutionNeeded = true; - // Getting credential needs to show some UI, start resolution - } - hideProgress(); - mCallback.onAsyncTaskFinished(); - } - }); - } - - private void showProgress() { - if (mProgressDialog == null || !mProgressDialog.isShowing()) { - mProgressDialog = new ProgressDialog(mActivity); - mProgressDialog.setIndeterminate(true); - mProgressDialog.setMessage( - mActivity.getString(com.firebase.ui.auth.R.string.progress_dialog_loading)); - } - mProgressDialog.show(); - } - - private void hideProgress() { - if (mProgressDialog != null && mProgressDialog.isShowing()) { - mProgressDialog.dismiss(); - } - } - - public void onStart() { - if (mGoogleApiClient != null) { - mGoogleApiClient.connect(); - } - } - - public void onStop() { - if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) { - mGoogleApiClient.disconnect();; - } - - hideProgress(); - } - - @Override - public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { - Log.w(TAG, "onConnectionFailed:" + connectionResult); - Toast.makeText(mActivity, "An error has occurred.", Toast.LENGTH_SHORT).show(); - } - - public boolean isGoogleApiClient() { - return mGoogleApiClient != null; - } - - public GoogleApiClient getGoogleApiClient() { - return mGoogleApiClient; - } - - public void signOut() { - disableAutoSignIn(); - Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback( - new ResultCallback() { - @Override - public void onResult(Status status) { - mCallback.onAsyncTaskFinished(); - } - }); - } - - public void disableAutoSignIn() { - Auth.CredentialsApi.disableAutoSignIn(mGoogleApiClient); - } -} diff --git a/auth/src/main/java/com/firebase/ui/auth/util/smartlock/SaveSmartLock.java b/auth/src/main/java/com/firebase/ui/auth/util/SaveSmartLock.java similarity index 69% rename from auth/src/main/java/com/firebase/ui/auth/util/smartlock/SaveSmartLock.java rename to auth/src/main/java/com/firebase/ui/auth/util/SaveSmartLock.java index 49fe798cc..b698b3c4d 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/smartlock/SaveSmartLock.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/SaveSmartLock.java @@ -1,5 +1,6 @@ -package com.firebase.ui.auth.util.smartlock; +package com.firebase.ui.auth.util; +import android.app.Activity; import android.app.PendingIntent; import android.content.Intent; import android.content.IntentSender; @@ -11,6 +12,7 @@ import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.util.Log; +import android.widget.Toast; import com.firebase.ui.auth.BuildConfig; import com.firebase.ui.auth.ui.ActivityHelper; @@ -28,12 +30,44 @@ import static android.app.Activity.RESULT_OK; -public class SaveSmartLock extends SmartLock { +public class SaveSmartLock extends Fragment implements + GoogleApiClient.ConnectionCallbacks, + com.google.android.gms.common.api.ResultCallback, + GoogleApiClient.OnConnectionFailedListener { + private static final String TAG = "SaveSmartLock"; + private static final int RC_SAVE = 100; + private static final int RC_UPDATE_SERVICE = 28; + + private AppCompatBase mActivity; + private ActivityHelper mActivityHelper; + private GoogleApiClient mGoogleApiClient; + private String mName; + private String mEmail; + private String mPassword; + private String mProvider; + private String mProfilePictureUri; + + @Override + public void onCreate(Bundle savedInstance) { + super.onCreate(savedInstance); + if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) { + mGoogleApiClient.disconnect(); + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (mGoogleApiClient != null) { + mGoogleApiClient.connect(); + } + } + @Override public void onConnected(Bundle bundle) { if (mEmail == null) { Log.e(TAG, "Unable to save null credential!"); - finishOk(); + finish(); return; } @@ -64,13 +98,24 @@ public void onConnected(Bundle bundle) { } mActivityHelper.getCredentialsApi() - .save(mCredentialsApiClient, builder.build()) + .save(mGoogleApiClient, builder.build()) .setResultCallback(this); } + @Override + public void onConnectionSuspended(int i) { + if (BuildConfig.DEBUG) { + Log.d(TAG, "Connection suspended with code " + i); + } + } + @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { - super.onConnectionFailed(connectionResult); + if (BuildConfig.DEBUG) { + Log.d(TAG, "connection failed with " + connectionResult.getErrorMessage() + + " and code: " + connectionResult.getErrorCode()); + } + Toast.makeText(mActivity, "An error has occurred.", Toast.LENGTH_SHORT).show(); PendingIntent resolution = GoogleApiAvailability @@ -88,27 +133,28 @@ public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { null); } catch (IntentSender.SendIntentException e) { e.printStackTrace(); - finishOk(); + finish(); } } @Override public void onResult(@NonNull Status status) { if (status.isSuccess()) { - finishOk(); + finish(); } else { if (status.hasResolution()) { // Try to resolve the save request. This will prompt the user if // the credential is new. try { + // TODO force behavior to see if this works status.startResolutionForResult(mActivity, RC_SAVE); } catch (IntentSender.SendIntentException e) { // Could not resolve the request Log.e(TAG, "STATUS: Failed to send resolution.", e); - finishOk(); + finish(); } } else { - finishOk(); + finish(); } } } @@ -122,25 +168,30 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { if (BuildConfig.DEBUG) { Log.d(TAG, "SAVE: OK"); } - finishOk(); + finish(); } else { Log.e(TAG, "SAVE: Canceled by user"); - finishOk(); + finish(); } } else if (requestCode == RC_UPDATE_SERVICE) { if (resultCode == RESULT_OK) { Credential credential = new Credential.Builder(mEmail).setPassword(mPassword) .build(); mActivityHelper.getCredentialsApi() - .save(mCredentialsApiClient, credential) + .save(mGoogleApiClient, credential) .setResultCallback(this); } else { Log.e(TAG, "SAVE: Canceled by user"); - finishOk(); + finish(); } } } + private void finish() { + mActivity.setResult(Activity.RESULT_OK, mActivity.getIntent()); + mActivity.finish(); + } + /** * If SmartLock is enabled and Google Play Services is available, save the credentials. * Otherwise, finish the calling Activity with RESULT_OK. @@ -156,15 +207,24 @@ public void saveCredentialsOrFinish(AppCompatBase activity, FirebaseUser firebaseUser, @Nullable String password, @Nullable String provider) { - if (!initializeAndContinue(activity, - helper, - firebaseUser, - password, - provider)) { + if (!helper.getFlowParams().smartLockEnabled + || !PlayServicesHelper.getInstance(activity).isPlayServicesAvailable() + || !FirebaseAuthWrapperFactory.getFirebaseAuthWrapper(helper.getFlowParams().appName) + .isPlayServicesAvailable(activity)) { + finish(); return; } - mCredentialsApiClient = new GoogleApiClient.Builder(activity) + mActivity = activity; + mActivityHelper = helper; + mName = firebaseUser.getDisplayName(); + mEmail = firebaseUser.getEmail(); + mPassword = password; + mProvider = provider; + mProfilePictureUri = firebaseUser.getPhotoUrl() != null ? firebaseUser.getPhotoUrl() + .toString() : null; + + mGoogleApiClient = new GoogleApiClient.Builder(activity) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(Auth.CREDENTIALS_API) diff --git a/auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java b/auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java new file mode 100644 index 000000000..a9bdf8f32 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java @@ -0,0 +1,455 @@ +package com.firebase.ui.auth.util; + +import android.app.Activity; +import android.app.Fragment; +import android.app.FragmentManager; +import android.app.FragmentTransaction; +import android.app.ProgressDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.IntentSender; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.text.TextUtils; +import android.util.Log; +import android.widget.Toast; + +import com.firebase.ui.auth.AuthUI; +import com.firebase.ui.auth.BuildConfig; +import com.firebase.ui.auth.R; +import com.firebase.ui.auth.provider.IDPProviderParcel; +import com.firebase.ui.auth.ui.FlowParameters; +import com.firebase.ui.auth.ui.TaskFailureLogger; +import com.firebase.ui.auth.ui.idp.AuthMethodPickerActivity; +import com.firebase.ui.auth.ui.idp.IDPSignInContainerActivity; +import com.google.android.gms.auth.api.Auth; +import com.google.android.gms.auth.api.credentials.Credential; +import com.google.android.gms.auth.api.credentials.CredentialRequest; +import com.google.android.gms.auth.api.credentials.CredentialRequestResult; +import com.google.android.gms.auth.api.credentials.CredentialsApi; +import com.google.android.gms.auth.api.credentials.IdentityProviders; +import com.google.android.gms.auth.api.signin.GoogleSignInOptions; +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.api.CommonStatusCodes; +import com.google.android.gms.common.api.GoogleApiClient; +import com.google.android.gms.common.api.ResultCallback; +import com.google.android.gms.common.api.Status; +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.OnFailureListener; +import com.google.android.gms.tasks.OnSuccessListener; +import com.google.android.gms.tasks.Task; +import com.google.firebase.FirebaseApp; +import com.google.firebase.auth.AuthResult; +import com.google.firebase.auth.EmailAuthProvider; +import com.google.firebase.auth.FacebookAuthProvider; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseAuthInvalidUserException; +import com.google.firebase.auth.GoogleAuthProvider; + +import java.util.List; + +import static android.app.Activity.RESULT_CANCELED; +import static android.app.Activity.RESULT_FIRST_USER; +import static android.app.Activity.RESULT_OK; + +public class SignInDelegate extends Fragment implements + GoogleApiClient.ConnectionCallbacks, + ResultCallback, + GoogleApiClient.OnConnectionFailedListener { + private static final String TAG = "SignInDelegate"; + private static final int RC_CREDENTIALS_READ = 2; + private static final int RC_IDP_SIGNIN = 3; + private static final int RC_AUTH_METHOD_PICKER = 4; + private static final int RC_EMAIL_FLOW = 5; + private static final int RC_PLAY_SERVICES = 6; + + private Activity mActivity; + private GoogleApiClient mGoogleApiClient; + private ProgressDialog mProgressDialog; + private CredentialRequestResult mCredentialRequestResult; + private Credential mCredential; + private FlowParameters mFlowParams; + private AuthUI.AuthUIResult mAuthUIResult; + + @Override + public void onConnectionSuspended(int i) { + if (BuildConfig.DEBUG) { + Log.d(TAG, "Connection suspended with code " + i); + } + } + + @Override + public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { + if (BuildConfig.DEBUG) { + Log.d(TAG, "connection failed with " + connectionResult.getErrorMessage() + + " and code: " + connectionResult.getErrorCode()); + } + Toast.makeText(mActivity, "An error has occurred.", Toast.LENGTH_SHORT).show(); + } + + private void initGoogleApiClient(String accountName) { + GoogleSignInOptions.Builder gsoBuilder = new GoogleSignInOptions + .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) + .requestEmail(); + + if (accountName != null) { + gsoBuilder.setAccountName(accountName); + } + + mGoogleApiClient = new GoogleApiClient.Builder(mActivity) + .addConnectionCallbacks(this) + .addApi(Auth.CREDENTIALS_API) + .addApi(Auth.GOOGLE_SIGN_IN_API, gsoBuilder.build()) + .build(); + } + + private void showProgress() { + if (mProgressDialog == null || !mProgressDialog.isShowing()) { + mProgressDialog = new ProgressDialog(mActivity); + mProgressDialog.setIndeterminate(true); + mProgressDialog.setMessage( + mActivity.getString(R.string.progress_dialog_loading)); + } + mProgressDialog.show(); + } + + private void hideProgress() { + if (mProgressDialog != null && mProgressDialog.isShowing()) { + mProgressDialog.dismiss(); + } + } + + public static SignInDelegate newInstance(Activity activity, + AuthUI.AuthUIResult authUIResult, + FlowParameters parameters) { + SignInDelegate result; + + FragmentManager fm = activity.getFragmentManager(); + FragmentTransaction ft = fm.beginTransaction(); + + Fragment fragment = fm.findFragmentByTag(TAG); + if (fragment == null || !(fragment instanceof SignInDelegate)) { + result = new SignInDelegate(); + + result.mActivity = activity; + result.mAuthUIResult = authUIResult; + result.mFlowParams = parameters; + + ft.add(result, TAG).disallowAddToBackStack().commit(); + } else { + result = (SignInDelegate) fragment; + } + + return result; + } + + @Override + public void onCreate(Bundle savedInstance) { + super.onCreate(savedInstance); + if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) { + mGoogleApiClient.disconnect(); + } + + // Make Google Play Services available at the correct version, if possible + boolean madeAvailable = + PlayServicesHelper + .getInstance(mActivity) + .makePlayServicesAvailable(mActivity, RC_PLAY_SERVICES, + new DialogInterface.OnCancelListener() { + @Override + public void onCancel(DialogInterface dialogInterface) { + Log.w(TAG, + "playServices:dialog.onCancel()"); + mAuthUIResult.onResult(RESULT_CANCELED, + new Intent()); + } + }); + + if (!madeAvailable + || !PlayServicesHelper.getInstance(mActivity).isPlayServicesAvailable() + || !FirebaseAuthWrapperFactory.getFirebaseAuthWrapper(mFlowParams.appName) + .isPlayServicesAvailable(mActivity)) { + Log.w(TAG, "playServices: could not make available."); + mAuthUIResult.onResult(RESULT_CANCELED, new Intent()); + return; + } + + if (!mFlowParams.smartLockEnabled) { + startAuthMethodChoice(); + } else { + showProgress(); + initGoogleApiClient(null); + Auth.CredentialsApi + .request(mGoogleApiClient, + new CredentialRequest.Builder() + .setPasswordLoginSupported(true) + .setAccountTypes(IdentityProviders.GOOGLE).build()) + .setResultCallback(this); + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (mGoogleApiClient != null) { + mGoogleApiClient.connect(); + } + } + + private void logInWithCredential( + String email, + String password, + String accountType) { + if (email != null) { + if (password != null && !password.isEmpty()) { + // email/password combination + signInWithEmailAndPassword(email, password); + } else { + // identifier/provider combination + redirectToIdpSignIn(email, accountType); + } + } + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (BuildConfig.DEBUG) { + Log.d(TAG, "onActivityResult:" + requestCode + ":" + resultCode + ":" + data); + } + + // TODO: 10/15/2016 + + hideProgress(); + + switch (requestCode) { + case RC_CREDENTIALS_READ: + if (resultCode == RESULT_OK) { + // credential selected from SmartLock, log in with that credential + Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY); + handleCredential(credential); + logInWithCredential(getEmailFromCredential(), + getPasswordFromCredential(), + getAccountTypeFromCredential()); + } else if (resultCode == RESULT_CANCELED + || resultCode == CredentialsApi.ACTIVITY_RESULT_OTHER_ACCOUNT) { + // Smart lock selector cancelled, go to the AuthMethodPicker screen + startAuthMethodChoice(); + } else if (resultCode == RESULT_FIRST_USER) { + // TODO: (serikb) figure out flow + } + break; + case RC_IDP_SIGNIN: + case RC_AUTH_METHOD_PICKER: + case RC_EMAIL_FLOW: + mAuthUIResult.onResult(resultCode, new Intent()); + break; + case RC_PLAY_SERVICES: + if (resultCode != RESULT_OK) { + mAuthUIResult.onResult(resultCode, new Intent()); + } + break; + } + } + + @Override + public void onConnected(@Nullable Bundle bundle) { + } + + @Override + public void onResult(@NonNull CredentialRequestResult result) { + mCredentialRequestResult = result; + Status status = result.getStatus(); + + if (status.isSuccess()) { + // Auto sign-in success + handleCredential(result.getCredential()); + delegateSignIn(true, false); + } else if (status.getStatusCode() == CommonStatusCodes.RESOLUTION_REQUIRED) { + delegateSignIn(false, true); + } + hideProgress(); + } + + private void delegateSignIn(boolean isAutoSignInAvailable, boolean isSignInResolutionNeeded) { + String email = getEmailFromCredential(); + String password = getPasswordFromCredential(); + + // Attempt auto-sign in using SmartLock + if (isAutoSignInAvailable) { + googleSilentSignIn(); + if (!TextUtils.isEmpty(password)) { + // Sign in with the email/password retrieved from SmartLock + signInWithEmailAndPassword(email, password); + } else { + // log in with id/provider + redirectToIdpSignIn(email, getAccountTypeFromCredential()); + } + } else if (isSignInResolutionNeeded) { + // resolve credential + resolveSavedEmails(); + } else { + startAuthMethodChoice(); + } + } + + private void resolveSavedEmails() { + if (mCredentialRequestResult == null || mCredentialRequestResult.getStatus() == null) { + return; + } + Status status = mCredentialRequestResult.getStatus(); + if (status.getStatusCode() == CommonStatusCodes.RESOLUTION_REQUIRED) { + try { + // TODO check the mactcity stuff + status.startResolutionForResult(mActivity, RC_CREDENTIALS_READ); + } catch (IntentSender.SendIntentException e) { + Log.e(TAG, "Failed to send Credentials intent.", e); + } + } + } + + private void handleCredential(Credential credential) { + mCredential = credential; + + if (IdentityProviders.GOOGLE.equals(credential.getAccountType())) { + // Google account, rebuild GoogleApiClient to set account name and then try + initGoogleApiClient(credential.getId()); + Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient); + } else { + // Email/password account + String status = String.format("Signed in as %s", credential.getId()); + Log.d(TAG, status); + } + } + + private void googleSilentSignIn() { + // Try silent sign-in with Google Sign In API + Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient); + } + + /** + * Begin sign in process with email and password from a SmartLock credential. + * On success, finish with {@code RESULT_OK}. + * On failure, delete the credential from SmartLock (if applicable) and then launch the + * auth method picker flow. + */ + private void signInWithEmailAndPassword(String email, String password) { + FirebaseAuth.getInstance(FirebaseApp.getInstance(mFlowParams.appName)) + .signInWithEmailAndPassword(email, password) + .addOnFailureListener(new TaskFailureLogger( + TAG, "Error signing in with email and password")) + .addOnSuccessListener(new OnSuccessListener() { + @Override + public void onSuccess(AuthResult authResult) { + mAuthUIResult.onResult(RESULT_OK, new Intent()); + } + }) + .addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception e) { + if (e instanceof FirebaseAuthInvalidUserException) { + // In this case the credential saved in SmartLock was not + // a valid credential, we should delete it from SmartLock + // before continuing. + deleteCredentialAndRedirect(); + } else { + startAuthMethodChoice(); + } + } + }); + } + + /** + * Delete the last credential retrieved from SmartLock and then redirect to the + * auth method choice flow. + */ + private void deleteCredentialAndRedirect() { + if (mCredential == null) { + Log.w(TAG, "deleteCredentialAndRedirect: null credential"); + startAuthMethodChoice(); + return; + } + + CredentialsApiHelper credentialsApiHelper = CredentialsApiHelper.getInstance(mActivity); + credentialsApiHelper.delete(mCredential) + .addOnCompleteListener(mActivity, new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + if (!task.isSuccessful()) { + Log.w(TAG, "deleteCredential:failure", task.getException()); + } + startAuthMethodChoice(); + } + }); + } + + private void redirectToIdpSignIn(String email, String accountType) { + Intent nextIntent; + switch (accountType) { + case IdentityProviders.GOOGLE: + nextIntent = IDPSignInContainerActivity.createIntent( + mActivity, + mFlowParams, + GoogleAuthProvider.PROVIDER_ID, + email); + break; + case IdentityProviders.FACEBOOK: + nextIntent = IDPSignInContainerActivity.createIntent( + mActivity, + mFlowParams, + FacebookAuthProvider.PROVIDER_ID, + email); + break; + default: + Log.w(TAG, "unknown provider: " + accountType); + nextIntent = AuthMethodPickerActivity.createIntent( + mActivity, + mFlowParams); + } + this.startActivityForResult(nextIntent, RC_IDP_SIGNIN); + } + + private void startAuthMethodChoice() { + List providers = mFlowParams.providerInfo; + + // If the only provider is Email, immediately launch the email flow. Otherwise, launch + // the auth method picker screen. + if (providers.size() == 1 + && providers.get(0).getProviderType().equals(EmailAuthProvider.PROVIDER_ID)) { + startActivityForResult( + EmailFlowUtil.createIntent( + mActivity, + mFlowParams), + RC_EMAIL_FLOW); + } else { + startActivityForResult( + // TODO test this getcontext stuff + AuthMethodPickerActivity.createIntent( + mActivity, + mFlowParams), + RC_AUTH_METHOD_PICKER); + } + } + + private String getEmailFromCredential() { + if (mCredential == null) { + return null; + } + return mCredential.getId(); + } + + private String getAccountTypeFromCredential() { + if (mCredential == null) { + return null; + } + return mCredential.getAccountType(); + } + + private String getPasswordFromCredential() { + if (mCredential == null) { + return null; + } + return mCredential.getPassword(); + } +} diff --git a/auth/src/main/java/com/firebase/ui/auth/util/smartlock/RetrieveSmartLock.java b/auth/src/main/java/com/firebase/ui/auth/util/smartlock/RetrieveSmartLock.java deleted file mode 100644 index 75f7096a2..000000000 --- a/auth/src/main/java/com/firebase/ui/auth/util/smartlock/RetrieveSmartLock.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.firebase.ui.auth.util.smartlock; - -public class RetrieveSmartLock { -} diff --git a/auth/src/main/java/com/firebase/ui/auth/util/smartlock/SmartLock.java b/auth/src/main/java/com/firebase/ui/auth/util/smartlock/SmartLock.java deleted file mode 100644 index 85b7b54e5..000000000 --- a/auth/src/main/java/com/firebase/ui/auth/util/smartlock/SmartLock.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2016 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the - * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.firebase.ui.auth.util.smartlock; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.util.Log; -import android.widget.Toast; - -import com.firebase.ui.auth.BuildConfig; -import com.firebase.ui.auth.ui.ActivityHelper; -import com.firebase.ui.auth.ui.AppCompatBase; -import com.firebase.ui.auth.util.FirebaseAuthWrapperFactory; -import com.firebase.ui.auth.util.PlayServicesHelper; -import com.google.android.gms.common.ConnectionResult; -import com.google.android.gms.common.api.GoogleApiClient; -import com.google.android.gms.common.api.ResultCallback; -import com.google.android.gms.common.api.Status; -import com.google.firebase.auth.FirebaseUser; - -import static android.app.Activity.RESULT_OK; - -public abstract class SmartLock extends Fragment implements - GoogleApiClient.ConnectionCallbacks, - ResultCallback, - GoogleApiClient.OnConnectionFailedListener { - static final String TAG = "CredentialsSaveBase"; - static final int RC_SAVE = 100; - static final int RC_UPDATE_SERVICE = 28; - - AppCompatBase mActivity; - ActivityHelper mActivityHelper; - String mName; - String mEmail; - String mPassword; - String mProvider; - String mProfilePictureUri; - GoogleApiClient mCredentialsApiClient; - - @Override - public void onConnectionSuspended(int i) { - if (BuildConfig.DEBUG) { - Log.d(TAG, "Connection suspended with code " + i); - } - } - - @Override - public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { - if (BuildConfig.DEBUG) { - Log.d(TAG, "connection failed with " + connectionResult.getErrorMessage() - + " and code: " + connectionResult.getErrorCode()); - } - Toast.makeText(mActivity, "An error has occurred.", Toast.LENGTH_SHORT).show(); - } - - void finishOk() { - // For tests - mActivity.setResult(RESULT_OK); - - mActivity.finish(RESULT_OK, mActivity.getIntent()); - } - - boolean initializeAndContinue(AppCompatBase activity, - ActivityHelper helper, - FirebaseUser firebaseUser, - @Nullable String password, - @Nullable String provider) { - mActivity = activity; - mActivityHelper = helper; - mName = firebaseUser.getDisplayName(); - mEmail = firebaseUser.getEmail(); - mPassword = password; - mProvider = provider; - mProfilePictureUri = firebaseUser.getPhotoUrl() != null ? firebaseUser.getPhotoUrl() - .toString() : null; - - // If SmartLock is disabled or play services is not available, finish the Activity - if (!helper.getFlowParams().smartLockEnabled - || !PlayServicesHelper.getInstance(activity).isPlayServicesAvailable() - || !FirebaseAuthWrapperFactory.getFirebaseAuthWrapper(helper.getFlowParams().appName) - .isPlayServicesAvailable(activity)) { - finishOk(); - return false; - } else { - return true; - } - } -} diff --git a/auth/src/test/java/com/firebase/ui/auth/test_helpers/CustomRobolectricGradleTestRunner.java b/auth/src/test/java/com/firebase/ui/auth/test_helpers/CustomRobolectricGradleTestRunner.java index 41d51df3c..8900797dd 100644 --- a/auth/src/test/java/com/firebase/ui/auth/test_helpers/CustomRobolectricGradleTestRunner.java +++ b/auth/src/test/java/com/firebase/ui/auth/test_helpers/CustomRobolectricGradleTestRunner.java @@ -18,7 +18,6 @@ import com.firebase.ui.auth.provider.FacebookProvider; import com.firebase.ui.auth.provider.GoogleProvider; import com.firebase.ui.auth.ui.ActivityHelper; -import com.firebase.ui.auth.util.CredentialsAPI; import com.firebase.ui.auth.util.FirebaseAuthWrapperFactory; import com.firebase.ui.auth.util.FirebaseAuthWrapperImpl; diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/ChooseAccountActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/ChooseAccountActivityTest.java index 589fc4091..77da65a15 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/ChooseAccountActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/ChooseAccountActivityTest.java @@ -25,7 +25,6 @@ import com.firebase.ui.auth.test_helpers.TestConstants; import com.firebase.ui.auth.test_helpers.TestHelper; import com.firebase.ui.auth.ui.idp.IDPSignInContainerActivity; -import com.firebase.ui.auth.util.CredentialsAPI; import com.firebase.ui.auth.util.PlayServicesHelper; import com.google.android.gms.auth.api.credentials.IdentityProviders; import com.google.firebase.FirebaseApp; diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java index d150527e4..f08d7f682 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java @@ -31,7 +31,6 @@ import com.firebase.ui.auth.test_helpers.TestHelper; import com.firebase.ui.auth.ui.ExtraConstants; import com.firebase.ui.auth.util.PlayServicesHelper; -import com.firebase.ui.auth.util.smartlock.SmartLock; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.auth.UserProfileChangeRequest; diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java index 0e6512f4a..5e4a98431 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java @@ -30,7 +30,6 @@ import com.firebase.ui.auth.test_helpers.TestHelper; import com.firebase.ui.auth.ui.ExtraConstants; import com.firebase.ui.auth.util.PlayServicesHelper; -import com.firebase.ui.auth.util.smartlock.SmartLock; import com.google.firebase.auth.FirebaseUser; import org.junit.Before; diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java index c57f98c10..c58e5633b 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java @@ -36,7 +36,6 @@ import com.firebase.ui.auth.ui.ExtraConstants; import com.firebase.ui.auth.ui.email.EmailHintContainerActivity; import com.firebase.ui.auth.util.PlayServicesHelper; -import com.firebase.ui.auth.util.smartlock.SmartLock; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FacebookAuthProvider; diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java index 8adb2c3c2..e539281b7 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java @@ -34,9 +34,7 @@ import com.firebase.ui.auth.ui.FlowParameters; import com.firebase.ui.auth.ui.account_link.WelcomeBackIDPPrompt; import com.firebase.ui.auth.ui.account_link.WelcomeBackPasswordPrompt; -import com.firebase.ui.auth.util.CredentialsAPI; import com.firebase.ui.auth.util.PlayServicesHelper; -import com.firebase.ui.auth.util.smartlock.SmartLock; import com.google.android.gms.tasks.Task; import com.google.android.gms.tasks.Tasks; import com.google.firebase.FirebaseApp; From 5142dec2e5f2e4bfa3825c57627b3236c2561fbe Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Sat, 15 Oct 2016 20:14:13 -0700 Subject: [PATCH 16/79] Cleanup --- .../firebase/ui/auth/util/SignInDelegate.java | 358 +++++++++--------- 1 file changed, 176 insertions(+), 182 deletions(-) diff --git a/auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java b/auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java index a9bdf8f32..d8252aac3 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java @@ -72,78 +72,6 @@ public class SignInDelegate extends Fragment implements private FlowParameters mFlowParams; private AuthUI.AuthUIResult mAuthUIResult; - @Override - public void onConnectionSuspended(int i) { - if (BuildConfig.DEBUG) { - Log.d(TAG, "Connection suspended with code " + i); - } - } - - @Override - public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { - if (BuildConfig.DEBUG) { - Log.d(TAG, "connection failed with " + connectionResult.getErrorMessage() - + " and code: " + connectionResult.getErrorCode()); - } - Toast.makeText(mActivity, "An error has occurred.", Toast.LENGTH_SHORT).show(); - } - - private void initGoogleApiClient(String accountName) { - GoogleSignInOptions.Builder gsoBuilder = new GoogleSignInOptions - .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) - .requestEmail(); - - if (accountName != null) { - gsoBuilder.setAccountName(accountName); - } - - mGoogleApiClient = new GoogleApiClient.Builder(mActivity) - .addConnectionCallbacks(this) - .addApi(Auth.CREDENTIALS_API) - .addApi(Auth.GOOGLE_SIGN_IN_API, gsoBuilder.build()) - .build(); - } - - private void showProgress() { - if (mProgressDialog == null || !mProgressDialog.isShowing()) { - mProgressDialog = new ProgressDialog(mActivity); - mProgressDialog.setIndeterminate(true); - mProgressDialog.setMessage( - mActivity.getString(R.string.progress_dialog_loading)); - } - mProgressDialog.show(); - } - - private void hideProgress() { - if (mProgressDialog != null && mProgressDialog.isShowing()) { - mProgressDialog.dismiss(); - } - } - - public static SignInDelegate newInstance(Activity activity, - AuthUI.AuthUIResult authUIResult, - FlowParameters parameters) { - SignInDelegate result; - - FragmentManager fm = activity.getFragmentManager(); - FragmentTransaction ft = fm.beginTransaction(); - - Fragment fragment = fm.findFragmentByTag(TAG); - if (fragment == null || !(fragment instanceof SignInDelegate)) { - result = new SignInDelegate(); - - result.mActivity = activity; - result.mAuthUIResult = authUIResult; - result.mFlowParams = parameters; - - ft.add(result, TAG).disallowAddToBackStack().commit(); - } else { - result = (SignInDelegate) fragment; - } - - return result; - } - @Override public void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); @@ -197,21 +125,63 @@ public void onDestroy() { } } - private void logInWithCredential( - String email, - String password, - String accountType) { - if (email != null) { - if (password != null && !password.isEmpty()) { - // email/password combination + @Override + public void onConnected(@Nullable Bundle bundle) { + } + + @Override + public void onResult(@NonNull CredentialRequestResult result) { + mCredentialRequestResult = result; + Status status = result.getStatus(); + + if (status.isSuccess()) { + // Auto sign-in success + handleCredential(result.getCredential()); + delegateSignIn(true, false); + } else if (status.getStatusCode() == CommonStatusCodes.RESOLUTION_REQUIRED) { + delegateSignIn(false, true); + } + hideProgress(); + } + + private void delegateSignIn(boolean isAutoSignInAvailable, boolean isSignInResolutionNeeded) { + String email = getEmailFromCredential(); + String password = getPasswordFromCredential(); + + // Attempt auto-sign in using SmartLock + if (isAutoSignInAvailable) { + googleSilentSignIn(); + if (!TextUtils.isEmpty(password)) { + // Sign in with the email/password retrieved from SmartLock signInWithEmailAndPassword(email, password); } else { - // identifier/provider combination - redirectToIdpSignIn(email, accountType); + // log in with id/provider + redirectToIdpSignIn(email, getAccountTypeFromCredential()); } + } else if (isSignInResolutionNeeded) { + // resolve credential + resolveSavedEmails(); + } else { + startAuthMethodChoice(); } } + @Override + public void onConnectionSuspended(int i) { + if (BuildConfig.DEBUG) { + Log.d(TAG, "Connection suspended with code " + i); + } + } + + @Override + public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { + if (BuildConfig.DEBUG) { + Log.d(TAG, "connection failed with " + connectionResult.getErrorMessage() + + " and code: " + connectionResult.getErrorCode()); + } + Toast.makeText(mActivity, "An error has occurred.", Toast.LENGTH_SHORT).show(); + } + @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); @@ -229,9 +199,18 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { // credential selected from SmartLock, log in with that credential Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY); handleCredential(credential); - logInWithCredential(getEmailFromCredential(), - getPasswordFromCredential(), - getAccountTypeFromCredential()); + + String email = getEmailFromCredential(); + String password = getPasswordFromCredential(); + if (email != null) { + if (password != null && !password.isEmpty()) { + // email/password combination + signInWithEmailAndPassword(email, password); + } else { + // identifier/provider combination + redirectToIdpSignIn(email, getAccountTypeFromCredential()); + } + } } else if (resultCode == RESULT_CANCELED || resultCode == CredentialsApi.ACTIVITY_RESULT_OTHER_ACCOUNT) { // Smart lock selector cancelled, go to the AuthMethodPicker screen @@ -253,47 +232,57 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { } } - @Override - public void onConnected(@Nullable Bundle bundle) { + private String getEmailFromCredential() { + if (mCredential == null) { + return null; + } + return mCredential.getId(); } - @Override - public void onResult(@NonNull CredentialRequestResult result) { - mCredentialRequestResult = result; - Status status = result.getStatus(); + private String getAccountTypeFromCredential() { + if (mCredential == null) { + return null; + } + return mCredential.getAccountType(); + } - if (status.isSuccess()) { - // Auto sign-in success - handleCredential(result.getCredential()); - delegateSignIn(true, false); - } else if (status.getStatusCode() == CommonStatusCodes.RESOLUTION_REQUIRED) { - delegateSignIn(false, true); + private String getPasswordFromCredential() { + if (mCredential == null) { + return null; } - hideProgress(); + return mCredential.getPassword(); } - private void delegateSignIn(boolean isAutoSignInAvailable, boolean isSignInResolutionNeeded) { - String email = getEmailFromCredential(); - String password = getPasswordFromCredential(); + private void handleCredential(Credential credential) { + mCredential = credential; - // Attempt auto-sign in using SmartLock - if (isAutoSignInAvailable) { + if (IdentityProviders.GOOGLE.equals(credential.getAccountType())) { + // Google account, rebuild GoogleApiClient to set account name and then try + initGoogleApiClient(credential.getId()); googleSilentSignIn(); - if (!TextUtils.isEmpty(password)) { - // Sign in with the email/password retrieved from SmartLock - signInWithEmailAndPassword(email, password); - } else { - // log in with id/provider - redirectToIdpSignIn(email, getAccountTypeFromCredential()); - } - } else if (isSignInResolutionNeeded) { - // resolve credential - resolveSavedEmails(); } else { - startAuthMethodChoice(); + // Email/password account + String status = String.format("Signed in as %s", credential.getId()); + Log.d(TAG, status); } } + private void initGoogleApiClient(String accountName) { + GoogleSignInOptions.Builder gsoBuilder = new GoogleSignInOptions + .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) + .requestEmail(); + + if (accountName != null) { + gsoBuilder.setAccountName(accountName); + } + + mGoogleApiClient = new GoogleApiClient.Builder(mActivity) + .addConnectionCallbacks(this) + .addApi(Auth.CREDENTIALS_API) + .addApi(Auth.GOOGLE_SIGN_IN_API, gsoBuilder.build()) + .build(); + } + private void resolveSavedEmails() { if (mCredentialRequestResult == null || mCredentialRequestResult.getStatus() == null) { return; @@ -309,25 +298,33 @@ private void resolveSavedEmails() { } } - private void handleCredential(Credential credential) { - mCredential = credential; - - if (IdentityProviders.GOOGLE.equals(credential.getAccountType())) { - // Google account, rebuild GoogleApiClient to set account name and then try - initGoogleApiClient(credential.getId()); - Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient); - } else { - // Email/password account - String status = String.format("Signed in as %s", credential.getId()); - Log.d(TAG, status); - } - } - private void googleSilentSignIn() { // Try silent sign-in with Google Sign In API Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient); } + private void startAuthMethodChoice() { + List providers = mFlowParams.providerInfo; + + // If the only provider is Email, immediately launch the email flow. Otherwise, launch + // the auth method picker screen. + if (providers.size() == 1 + && providers.get(0).getProviderType().equals(EmailAuthProvider.PROVIDER_ID)) { + startActivityForResult( + EmailFlowUtil.createIntent( + mActivity, + mFlowParams), + RC_EMAIL_FLOW); + } else { + startActivityForResult( + // TODO test this getcontext stuff + AuthMethodPickerActivity.createIntent( + mActivity, + mFlowParams), + RC_AUTH_METHOD_PICKER); + } + } + /** * Begin sign in process with email and password from a SmartLock credential. * On success, finish with {@code RESULT_OK}. @@ -360,30 +357,6 @@ public void onFailure(@NonNull Exception e) { }); } - /** - * Delete the last credential retrieved from SmartLock and then redirect to the - * auth method choice flow. - */ - private void deleteCredentialAndRedirect() { - if (mCredential == null) { - Log.w(TAG, "deleteCredentialAndRedirect: null credential"); - startAuthMethodChoice(); - return; - } - - CredentialsApiHelper credentialsApiHelper = CredentialsApiHelper.getInstance(mActivity); - credentialsApiHelper.delete(mCredential) - .addOnCompleteListener(mActivity, new OnCompleteListener() { - @Override - public void onComplete(@NonNull Task task) { - if (!task.isSuccessful()) { - Log.w(TAG, "deleteCredential:failure", task.getException()); - } - startAuthMethodChoice(); - } - }); - } - private void redirectToIdpSignIn(String email, String accountType) { Intent nextIntent; switch (accountType) { @@ -410,46 +383,67 @@ private void redirectToIdpSignIn(String email, String accountType) { this.startActivityForResult(nextIntent, RC_IDP_SIGNIN); } - private void startAuthMethodChoice() { - List providers = mFlowParams.providerInfo; - - // If the only provider is Email, immediately launch the email flow. Otherwise, launch - // the auth method picker screen. - if (providers.size() == 1 - && providers.get(0).getProviderType().equals(EmailAuthProvider.PROVIDER_ID)) { - startActivityForResult( - EmailFlowUtil.createIntent( - mActivity, - mFlowParams), - RC_EMAIL_FLOW); - } else { - startActivityForResult( - // TODO test this getcontext stuff - AuthMethodPickerActivity.createIntent( - mActivity, - mFlowParams), - RC_AUTH_METHOD_PICKER); + /** + * Delete the last credential retrieved from SmartLock and then redirect to the + * auth method choice flow. + */ + private void deleteCredentialAndRedirect() { + if (mCredential == null) { + Log.w(TAG, "deleteCredentialAndRedirect: null credential"); + startAuthMethodChoice(); + return; } + + CredentialsApiHelper credentialsApiHelper = CredentialsApiHelper.getInstance(mActivity); + credentialsApiHelper.delete(mCredential) + .addOnCompleteListener(mActivity, new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + if (!task.isSuccessful()) { + Log.w(TAG, "deleteCredential:failure", task.getException()); + } + startAuthMethodChoice(); + } + }); } - private String getEmailFromCredential() { - if (mCredential == null) { - return null; + private void showProgress() { + if (mProgressDialog == null || !mProgressDialog.isShowing()) { + mProgressDialog = new ProgressDialog(mActivity); + mProgressDialog.setIndeterminate(true); + mProgressDialog.setMessage( + mActivity.getString(R.string.progress_dialog_loading)); } - return mCredential.getId(); + mProgressDialog.show(); } - private String getAccountTypeFromCredential() { - if (mCredential == null) { - return null; + private void hideProgress() { + if (mProgressDialog != null && mProgressDialog.isShowing()) { + mProgressDialog.dismiss(); } - return mCredential.getAccountType(); } - private String getPasswordFromCredential() { - if (mCredential == null) { - return null; + public static SignInDelegate newInstance(Activity activity, + AuthUI.AuthUIResult authUIResult, + FlowParameters parameters) { + SignInDelegate result; + + FragmentManager fm = activity.getFragmentManager(); + FragmentTransaction ft = fm.beginTransaction(); + + Fragment fragment = fm.findFragmentByTag(TAG); + if (fragment == null || !(fragment instanceof SignInDelegate)) { + result = new SignInDelegate(); + + result.mActivity = activity; + result.mAuthUIResult = authUIResult; + result.mFlowParams = parameters; + + ft.add(result, TAG).disallowAddToBackStack().commit(); + } else { + result = (SignInDelegate) fragment; } - return mCredential.getPassword(); + + return result; } } From 361d308348044bf1e76dafd8d409d95da952e363 Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Sat, 15 Oct 2016 22:22:47 -0700 Subject: [PATCH 17/79] Cleanup --- .../firebase/ui/auth/util/SaveSmartLock.java | 28 ++++++------------- .../firebase/ui/auth/util/SignInDelegate.java | 24 ++++++++-------- 2 files changed, 22 insertions(+), 30 deletions(-) diff --git a/auth/src/main/java/com/firebase/ui/auth/util/SaveSmartLock.java b/auth/src/main/java/com/firebase/ui/auth/util/SaveSmartLock.java index b698b3c4d..c5503ffbc 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/SaveSmartLock.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/SaveSmartLock.java @@ -23,6 +23,7 @@ import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GoogleApiAvailability; import com.google.android.gms.common.api.GoogleApiClient; +import com.google.android.gms.common.api.ResultCallback; import com.google.android.gms.common.api.Status; import com.google.firebase.auth.FacebookAuthProvider; import com.google.firebase.auth.FirebaseUser; @@ -32,7 +33,7 @@ public class SaveSmartLock extends Fragment implements GoogleApiClient.ConnectionCallbacks, - com.google.android.gms.common.api.ResultCallback, + ResultCallback, GoogleApiClient.OnConnectionFailedListener { private static final String TAG = "SaveSmartLock"; private static final int RC_SAVE = 100; @@ -47,22 +48,6 @@ public class SaveSmartLock extends Fragment implements private String mProvider; private String mProfilePictureUri; - @Override - public void onCreate(Bundle savedInstance) { - super.onCreate(savedInstance); - if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) { - mGoogleApiClient.disconnect(); - } - } - - @Override - public void onDestroy() { - super.onDestroy(); - if (mGoogleApiClient != null) { - mGoogleApiClient.connect(); - } - } - @Override public void onConnected(Bundle bundle) { if (mEmail == null) { @@ -146,8 +131,13 @@ public void onResult(@NonNull Status status) { // Try to resolve the save request. This will prompt the user if // the credential is new. try { - // TODO force behavior to see if this works - status.startResolutionForResult(mActivity, RC_SAVE); + startIntentSenderForResult(status.getResolution().getIntentSender(), + RC_SAVE, + null, + 0, + 0, + 0, + null); } catch (IntentSender.SendIntentException e) { // Could not resolve the request Log.e(TAG, "STATUS: Failed to send resolution.", e); diff --git a/auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java b/auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java index d8252aac3..4d17d2739 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java @@ -75,10 +75,6 @@ public class SignInDelegate extends Fragment implements @Override public void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); - if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) { - mGoogleApiClient.disconnect(); - } - // Make Google Play Services available at the correct version, if possible boolean madeAvailable = PlayServicesHelper @@ -112,7 +108,8 @@ public void onCancel(DialogInterface dialogInterface) { .request(mGoogleApiClient, new CredentialRequest.Builder() .setPasswordLoginSupported(true) - .setAccountTypes(IdentityProviders.GOOGLE).build()) + .setAccountTypes(IdentityProviders.GOOGLE) + .build()) .setResultCallback(this); } } @@ -121,14 +118,10 @@ public void onCancel(DialogInterface dialogInterface) { public void onDestroy() { super.onDestroy(); if (mGoogleApiClient != null) { - mGoogleApiClient.connect(); + mGoogleApiClient.disconnect(); } } - @Override - public void onConnected(@Nullable Bundle bundle) { - } - @Override public void onResult(@NonNull CredentialRequestResult result) { mCredentialRequestResult = result; @@ -141,7 +134,6 @@ public void onResult(@NonNull CredentialRequestResult result) { } else if (status.getStatusCode() == CommonStatusCodes.RESOLUTION_REQUIRED) { delegateSignIn(false, true); } - hideProgress(); } private void delegateSignIn(boolean isAutoSignInAvailable, boolean isSignInResolutionNeeded) { @@ -164,6 +156,11 @@ private void delegateSignIn(boolean isAutoSignInAvailable, boolean isSignInResol } else { startAuthMethodChoice(); } + hideProgress(); + } + + @Override + public void onConnected(@Nullable Bundle bundle) { } @Override @@ -276,11 +273,16 @@ private void initGoogleApiClient(String accountName) { gsoBuilder.setAccountName(accountName); } + if (mGoogleApiClient != null) { + mGoogleApiClient.disconnect(); + } + mGoogleApiClient = new GoogleApiClient.Builder(mActivity) .addConnectionCallbacks(this) .addApi(Auth.CREDENTIALS_API) .addApi(Auth.GOOGLE_SIGN_IN_API, gsoBuilder.build()) .build(); + mGoogleApiClient.connect(); } private void resolveSavedEmails() { From 9a4921ea336d5734fe391b035111733fb13f7763 Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Sat, 15 Oct 2016 22:23:37 -0700 Subject: [PATCH 18/79] Bug fix --- .../main/java/com/firebase/ui/auth/util/SmartLock.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java index 4135a93b1..f70a34b46 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java @@ -141,7 +141,13 @@ public void onResult(@NonNull Status status) { // Try to resolve the save request. This will prompt the user if // the credential is new. try { - status.startResolutionForResult(mActivity, RC_SAVE); + startIntentSenderForResult(status.getResolution().getIntentSender(), + RC_SAVE, + null, + 0, + 0, + 0, + null); } catch (IntentSender.SendIntentException e) { // Could not resolve the request Log.e(TAG, "STATUS: Failed to send resolution.", e); From 6af7674607a07e1545e25a278b66261a5087abb4 Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Sat, 15 Oct 2016 22:33:43 -0700 Subject: [PATCH 19/79] Cleanup --- .../main/java/com/firebase/ui/auth/util/SignInDelegate.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java b/auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java index 4d17d2739..6f31ce505 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java @@ -186,8 +186,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d(TAG, "onActivityResult:" + requestCode + ":" + resultCode + ":" + data); } - // TODO: 10/15/2016 - + // TODO: 10/15/2016 does work? hideProgress(); switch (requestCode) { @@ -292,7 +291,7 @@ private void resolveSavedEmails() { Status status = mCredentialRequestResult.getStatus(); if (status.getStatusCode() == CommonStatusCodes.RESOLUTION_REQUIRED) { try { - // TODO check the mactcity stuff + // TODO check the mActivity stuff status.startResolutionForResult(mActivity, RC_CREDENTIALS_READ); } catch (IntentSender.SendIntentException e) { Log.e(TAG, "Failed to send Credentials intent.", e); From 35d94bbc26e88b7902cd076d8e7870025a31320b Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Sat, 15 Oct 2016 22:53:14 -0700 Subject: [PATCH 20/79] Cleanup --- auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java | 1 + 1 file changed, 1 insertion(+) diff --git a/auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java b/auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java index 6f31ce505..1b68c9565 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java @@ -72,6 +72,7 @@ public class SignInDelegate extends Fragment implements private FlowParameters mFlowParams; private AuthUI.AuthUIResult mAuthUIResult; + // TODO: 10/15/2016 make SmartLock and inherit both again if green light from firui @Override public void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); From 64728b2514a9f9c1f4062f75eebfd4d46462166f Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Sun, 16 Oct 2016 13:10:26 -0700 Subject: [PATCH 21/79] Cleanup and bug fixes --- .../firebase/uidemo/auth/AuthUiActivity.java | 11 --- .../java/com/firebase/ui/auth/AuthUI.java | 7 +- .../WelcomeBackPasswordPrompt.java | 2 +- .../auth/ui/email/RegisterEmailActivity.java | 2 +- .../ui/auth/ui/email/SignInActivity.java | 2 +- .../auth/ui/idp/AuthMethodPickerActivity.java | 2 +- .../auth/ui/idp/CredentialSignInHandler.java | 2 +- .../ui/idp/IDPSignInContainerActivity.java | 2 +- .../util/{ => smartlock}/SaveSmartLock.java | 4 +- .../util/{ => smartlock}/SignInDelegate.java | 99 ++++++++++--------- .../ui/auth/util/smartlock/SmartLock.java | 4 + .../src/main/res/layout/delete_credential.xml | 18 ---- .../layout/email_hint_container_layout.xml | 6 -- .../res/layout/save_credentials_layout.xml | 6 -- 14 files changed, 69 insertions(+), 98 deletions(-) rename auth/src/main/java/com/firebase/ui/auth/util/{ => smartlock}/SaveSmartLock.java (98%) rename auth/src/main/java/com/firebase/ui/auth/util/{ => smartlock}/SignInDelegate.java (86%) create mode 100644 auth/src/main/java/com/firebase/ui/auth/util/smartlock/SmartLock.java delete mode 100644 auth/src/main/res/layout/delete_credential.xml delete mode 100644 auth/src/main/res/layout/email_hint_container_layout.xml delete mode 100644 auth/src/main/res/layout/save_credentials_layout.xml 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 a8a6aabf2..70463eea1 100644 --- a/app/src/main/java/com/firebase/uidemo/auth/AuthUiActivity.java +++ b/app/src/main/java/com/firebase/uidemo/auth/AuthUiActivity.java @@ -139,17 +139,6 @@ public void onResult(int resultCode, Intent data) { }); } - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (requestCode == RC_SIGN_IN) { - handleSignInResponse(resultCode, data); - return; - } - - showSnackbar(R.string.unknown_response); - } - @MainThread private void handleSignInResponse(int resultCode, Intent data) { if (resultCode == RESULT_OK) { diff --git a/auth/src/main/java/com/firebase/ui/auth/AuthUI.java b/auth/src/main/java/com/firebase/ui/auth/AuthUI.java index 2c845055b..ae11df2bc 100644 --- a/auth/src/main/java/com/firebase/ui/auth/AuthUI.java +++ b/auth/src/main/java/com/firebase/ui/auth/AuthUI.java @@ -21,6 +21,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StyleRes; +import android.support.v7.app.AppCompatActivity; import com.facebook.FacebookSdk; import com.facebook.login.LoginManager; @@ -31,7 +32,7 @@ import com.firebase.ui.auth.util.GoogleApiClientTaskHelper; import com.firebase.ui.auth.util.Preconditions; import com.firebase.ui.auth.util.ProviderHelper; -import com.firebase.ui.auth.util.SignInDelegate; +import com.firebase.ui.auth.util.smartlock.SignInDelegate; import com.google.android.gms.auth.api.Auth; import com.google.android.gms.auth.api.signin.GoogleSignInOptions; import com.google.android.gms.common.api.GoogleApiClient; @@ -419,12 +420,12 @@ public SignInIntentBuilder setIsSmartLockEnabled(boolean enabled) { return this; } - public void build(Activity activity, AuthUIResult result) { + public void build(@NonNull AppCompatActivity activity, @NonNull AuthUIResult result) { Context context = mApp.getApplicationContext(); build(context, activity, result); } - private void build(Context context, Activity activity, AuthUIResult result) { + private void build(Context context, AppCompatActivity activity, AuthUIResult result) { List providerInfo = ProviderHelper.getProviderParcels(context, mProviders); SignInDelegate.newInstance(activity, result, diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java b/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java index e5bb2549e..27155f8ae 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java @@ -37,7 +37,7 @@ import com.firebase.ui.auth.ui.TaskFailureLogger; import com.firebase.ui.auth.ui.email.PasswordToggler; import com.firebase.ui.auth.ui.email.RecoverPasswordActivity; -import com.firebase.ui.auth.util.SaveSmartLock; +import com.firebase.ui.auth.util.smartlock.SaveSmartLock; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; import com.google.firebase.auth.AuthCredential; diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java index a496ae9d3..c697bd20c 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java @@ -39,7 +39,7 @@ import com.firebase.ui.auth.ui.email.field_validators.EmailFieldValidator; import com.firebase.ui.auth.ui.email.field_validators.PasswordFieldValidator; import com.firebase.ui.auth.ui.email.field_validators.RequiredFieldValidator; -import com.firebase.ui.auth.util.SaveSmartLock; +import com.firebase.ui.auth.util.smartlock.SaveSmartLock; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java index 075c931d3..a94553a9e 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java @@ -34,7 +34,7 @@ import com.firebase.ui.auth.ui.TaskFailureLogger; import com.firebase.ui.auth.ui.email.field_validators.EmailFieldValidator; import com.firebase.ui.auth.ui.email.field_validators.RequiredFieldValidator; -import com.firebase.ui.auth.util.SaveSmartLock; +import com.firebase.ui.auth.util.smartlock.SaveSmartLock; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; import com.google.firebase.auth.AuthResult; diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java index e07a1224f..f62aa3590 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java @@ -35,7 +35,7 @@ import com.firebase.ui.auth.ui.TaskFailureLogger; import com.firebase.ui.auth.ui.email.EmailHintContainerActivity; import com.firebase.ui.auth.util.EmailFlowUtil; -import com.firebase.ui.auth.util.SaveSmartLock; +import com.firebase.ui.auth.util.smartlock.SaveSmartLock; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.EmailAuthProvider; import com.google.firebase.auth.FacebookAuthProvider; diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java index d2c26ef9d..68a744420 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java @@ -23,7 +23,7 @@ import com.firebase.ui.auth.ui.TaskFailureLogger; import com.firebase.ui.auth.ui.account_link.WelcomeBackIDPPrompt; import com.firebase.ui.auth.ui.account_link.WelcomeBackPasswordPrompt; -import com.firebase.ui.auth.util.SaveSmartLock; +import com.firebase.ui.auth.util.smartlock.SaveSmartLock; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java index 7f2fdb38a..c1f046f9c 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPSignInContainerActivity.java @@ -27,7 +27,7 @@ import com.firebase.ui.auth.ui.ExtraConstants; import com.firebase.ui.auth.ui.FlowParameters; import com.firebase.ui.auth.ui.TaskFailureLogger; -import com.firebase.ui.auth.util.SaveSmartLock; +import com.firebase.ui.auth.util.smartlock.SaveSmartLock; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.AuthResult; diff --git a/auth/src/main/java/com/firebase/ui/auth/util/SaveSmartLock.java b/auth/src/main/java/com/firebase/ui/auth/util/smartlock/SaveSmartLock.java similarity index 98% rename from auth/src/main/java/com/firebase/ui/auth/util/SaveSmartLock.java rename to auth/src/main/java/com/firebase/ui/auth/util/smartlock/SaveSmartLock.java index c5503ffbc..3f455e96c 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/SaveSmartLock.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/smartlock/SaveSmartLock.java @@ -1,4 +1,4 @@ -package com.firebase.ui.auth.util; +package com.firebase.ui.auth.util.smartlock; import android.app.Activity; import android.app.PendingIntent; @@ -17,6 +17,8 @@ import com.firebase.ui.auth.BuildConfig; import com.firebase.ui.auth.ui.ActivityHelper; import com.firebase.ui.auth.ui.AppCompatBase; +import com.firebase.ui.auth.util.FirebaseAuthWrapperFactory; +import com.firebase.ui.auth.util.PlayServicesHelper; import com.google.android.gms.auth.api.Auth; import com.google.android.gms.auth.api.credentials.Credential; import com.google.android.gms.auth.api.credentials.IdentityProviders; diff --git a/auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java b/auth/src/main/java/com/firebase/ui/auth/util/smartlock/SignInDelegate.java similarity index 86% rename from auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java rename to auth/src/main/java/com/firebase/ui/auth/util/smartlock/SignInDelegate.java index 1b68c9565..145ac9ea4 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/SignInDelegate.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/smartlock/SignInDelegate.java @@ -1,9 +1,5 @@ -package com.firebase.ui.auth.util; +package com.firebase.ui.auth.util.smartlock; -import android.app.Activity; -import android.app.Fragment; -import android.app.FragmentManager; -import android.app.FragmentTransaction; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; @@ -11,6 +7,10 @@ import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; +import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.util.Log; import android.widget.Toast; @@ -23,6 +23,10 @@ import com.firebase.ui.auth.ui.TaskFailureLogger; import com.firebase.ui.auth.ui.idp.AuthMethodPickerActivity; import com.firebase.ui.auth.ui.idp.IDPSignInContainerActivity; +import com.firebase.ui.auth.util.CredentialsApiHelper; +import com.firebase.ui.auth.util.EmailFlowUtil; +import com.firebase.ui.auth.util.FirebaseAuthWrapperFactory; +import com.firebase.ui.auth.util.PlayServicesHelper; import com.google.android.gms.auth.api.Auth; import com.google.android.gms.auth.api.credentials.Credential; import com.google.android.gms.auth.api.credentials.CredentialRequest; @@ -64,39 +68,40 @@ public class SignInDelegate extends Fragment implements private static final int RC_EMAIL_FLOW = 5; private static final int RC_PLAY_SERVICES = 6; - private Activity mActivity; - private GoogleApiClient mGoogleApiClient; + private AuthUI.AuthUIResult mAuthUIResult; + private FlowParameters mFlowParams; private ProgressDialog mProgressDialog; + + private GoogleApiClient mGoogleApiClient; private CredentialRequestResult mCredentialRequestResult; private Credential mCredential; - private FlowParameters mFlowParams; - private AuthUI.AuthUIResult mAuthUIResult; // TODO: 10/15/2016 make SmartLock and inherit both again if green light from firui + @Override public void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); + setRetainInstance(true); // Make Google Play Services available at the correct version, if possible boolean madeAvailable = PlayServicesHelper - .getInstance(mActivity) - .makePlayServicesAvailable(mActivity, RC_PLAY_SERVICES, + .getInstance(getActivity()) + .makePlayServicesAvailable(getActivity(), RC_PLAY_SERVICES, new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialogInterface) { Log.w(TAG, "playServices:dialog.onCancel()"); - mAuthUIResult.onResult(RESULT_CANCELED, - new Intent()); + finish(RESULT_CANCELED, new Intent()); } }); if (!madeAvailable - || !PlayServicesHelper.getInstance(mActivity).isPlayServicesAvailable() + || !PlayServicesHelper.getInstance(getActivity()).isPlayServicesAvailable() || !FirebaseAuthWrapperFactory.getFirebaseAuthWrapper(mFlowParams.appName) - .isPlayServicesAvailable(mActivity)) { + .isPlayServicesAvailable(getActivity())) { Log.w(TAG, "playServices: could not make available."); - mAuthUIResult.onResult(RESULT_CANCELED, new Intent()); + finish(RESULT_CANCELED, new Intent()); return; } @@ -115,14 +120,6 @@ public void onCancel(DialogInterface dialogInterface) { } } - @Override - public void onDestroy() { - super.onDestroy(); - if (mGoogleApiClient != null) { - mGoogleApiClient.disconnect(); - } - } - @Override public void onResult(@NonNull CredentialRequestResult result) { mCredentialRequestResult = result; @@ -177,7 +174,7 @@ public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { Log.d(TAG, "connection failed with " + connectionResult.getErrorMessage() + " and code: " + connectionResult.getErrorCode()); } - Toast.makeText(mActivity, "An error has occurred.", Toast.LENGTH_SHORT).show(); + Toast.makeText(getContext(), "An error has occurred.", Toast.LENGTH_SHORT).show(); } @Override @@ -187,9 +184,6 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d(TAG, "onActivityResult:" + requestCode + ":" + resultCode + ":" + data); } - // TODO: 10/15/2016 does work? - hideProgress(); - switch (requestCode) { case RC_CREDENTIALS_READ: if (resultCode == RESULT_OK) { @@ -219,11 +213,11 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { case RC_IDP_SIGNIN: case RC_AUTH_METHOD_PICKER: case RC_EMAIL_FLOW: - mAuthUIResult.onResult(resultCode, new Intent()); + finish(resultCode, new Intent()); break; case RC_PLAY_SERVICES: if (resultCode != RESULT_OK) { - mAuthUIResult.onResult(resultCode, new Intent()); + finish(resultCode, new Intent()); } break; } @@ -277,7 +271,7 @@ private void initGoogleApiClient(String accountName) { mGoogleApiClient.disconnect(); } - mGoogleApiClient = new GoogleApiClient.Builder(mActivity) + mGoogleApiClient = new GoogleApiClient.Builder(getContext()) .addConnectionCallbacks(this) .addApi(Auth.CREDENTIALS_API) .addApi(Auth.GOOGLE_SIGN_IN_API, gsoBuilder.build()) @@ -292,8 +286,13 @@ private void resolveSavedEmails() { Status status = mCredentialRequestResult.getStatus(); if (status.getStatusCode() == CommonStatusCodes.RESOLUTION_REQUIRED) { try { - // TODO check the mActivity stuff - status.startResolutionForResult(mActivity, RC_CREDENTIALS_READ); + startIntentSenderForResult(status.getResolution().getIntentSender(), + RC_CREDENTIALS_READ, + null, + 0, + 0, + 0, + null); } catch (IntentSender.SendIntentException e) { Log.e(TAG, "Failed to send Credentials intent.", e); } @@ -314,14 +313,14 @@ private void startAuthMethodChoice() { && providers.get(0).getProviderType().equals(EmailAuthProvider.PROVIDER_ID)) { startActivityForResult( EmailFlowUtil.createIntent( - mActivity, + getContext(), mFlowParams), RC_EMAIL_FLOW); } else { startActivityForResult( // TODO test this getcontext stuff AuthMethodPickerActivity.createIntent( - mActivity, + getContext(), mFlowParams), RC_AUTH_METHOD_PICKER); } @@ -341,7 +340,7 @@ private void signInWithEmailAndPassword(String email, String password) { .addOnSuccessListener(new OnSuccessListener() { @Override public void onSuccess(AuthResult authResult) { - mAuthUIResult.onResult(RESULT_OK, new Intent()); + finish(RESULT_OK, new Intent()); } }) .addOnFailureListener(new OnFailureListener() { @@ -364,14 +363,14 @@ private void redirectToIdpSignIn(String email, String accountType) { switch (accountType) { case IdentityProviders.GOOGLE: nextIntent = IDPSignInContainerActivity.createIntent( - mActivity, + getContext(), mFlowParams, GoogleAuthProvider.PROVIDER_ID, email); break; case IdentityProviders.FACEBOOK: nextIntent = IDPSignInContainerActivity.createIntent( - mActivity, + getContext(), mFlowParams, FacebookAuthProvider.PROVIDER_ID, email); @@ -379,7 +378,7 @@ private void redirectToIdpSignIn(String email, String accountType) { default: Log.w(TAG, "unknown provider: " + accountType); nextIntent = AuthMethodPickerActivity.createIntent( - mActivity, + getContext(), mFlowParams); } this.startActivityForResult(nextIntent, RC_IDP_SIGNIN); @@ -396,9 +395,9 @@ private void deleteCredentialAndRedirect() { return; } - CredentialsApiHelper credentialsApiHelper = CredentialsApiHelper.getInstance(mActivity); + CredentialsApiHelper credentialsApiHelper = CredentialsApiHelper.getInstance(getActivity()); credentialsApiHelper.delete(mCredential) - .addOnCompleteListener(mActivity, new OnCompleteListener() { + .addOnCompleteListener(getActivity(), new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { if (!task.isSuccessful()) { @@ -411,10 +410,9 @@ public void onComplete(@NonNull Task task) { private void showProgress() { if (mProgressDialog == null || !mProgressDialog.isShowing()) { - mProgressDialog = new ProgressDialog(mActivity); + mProgressDialog = new ProgressDialog(getActivity()); mProgressDialog.setIndeterminate(true); - mProgressDialog.setMessage( - mActivity.getString(R.string.progress_dialog_loading)); + mProgressDialog.setMessage(getString(R.string.progress_dialog_loading)); } mProgressDialog.show(); } @@ -425,19 +423,26 @@ private void hideProgress() { } } - public static SignInDelegate newInstance(Activity activity, + private void finish(int resultCode, Intent data) { + if (mGoogleApiClient != null) { + mGoogleApiClient.disconnect(); + } + mAuthUIResult.onResult(resultCode, data); + getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit(); + } + + public static SignInDelegate newInstance(AppCompatActivity activity, AuthUI.AuthUIResult authUIResult, FlowParameters parameters) { SignInDelegate result; - FragmentManager fm = activity.getFragmentManager(); + FragmentManager fm = activity.getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); Fragment fragment = fm.findFragmentByTag(TAG); if (fragment == null || !(fragment instanceof SignInDelegate)) { result = new SignInDelegate(); - result.mActivity = activity; result.mAuthUIResult = authUIResult; result.mFlowParams = parameters; diff --git a/auth/src/main/java/com/firebase/ui/auth/util/smartlock/SmartLock.java b/auth/src/main/java/com/firebase/ui/auth/util/smartlock/SmartLock.java new file mode 100644 index 000000000..ae5d2f2e9 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/util/smartlock/SmartLock.java @@ -0,0 +1,4 @@ +package com.firebase.ui.auth.util.smartlock; + +public class SmartLock { +} diff --git a/auth/src/main/res/layout/delete_credential.xml b/auth/src/main/res/layout/delete_credential.xml deleted file mode 100644 index df77836c0..000000000 --- a/auth/src/main/res/layout/delete_credential.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - -