aboutsummaryrefslogtreecommitdiff
path: root/WordPress/src/main/java/org/wordpress/android/ui/accounts/SmartLockHelper.java
diff options
context:
space:
mode:
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/ui/accounts/SmartLockHelper.java')
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/accounts/SmartLockHelper.java150
1 files changed, 150 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/SmartLockHelper.java b/WordPress/src/main/java/org/wordpress/android/ui/accounts/SmartLockHelper.java
new file mode 100644
index 000000000..925b1a3af
--- /dev/null
+++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/SmartLockHelper.java
@@ -0,0 +1,150 @@
+package org.wordpress.android.ui.accounts;
+
+import android.app.Activity;
+import android.content.IntentSender;
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.v4.app.FragmentActivity;
+
+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.common.ConnectionResult;
+import com.google.android.gms.common.GoogleApiAvailability;
+import com.google.android.gms.common.api.CommonStatusCodes;
+import com.google.android.gms.common.api.GoogleApiClient;
+import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
+import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
+import com.google.android.gms.common.api.ResultCallback;
+import com.google.android.gms.common.api.Status;
+
+import org.wordpress.android.util.AppLog;
+import org.wordpress.android.util.AppLog.T;
+
+import java.lang.ref.WeakReference;
+
+public class SmartLockHelper {
+ private GoogleApiClient mCredentialsClient;
+ private WeakReference<FragmentActivity> mActivity;
+
+ public interface Callback {
+ void onCredentialRetrieved(Credential credential);
+ }
+
+ public SmartLockHelper(@NonNull FragmentActivity activity) {
+ if (activity instanceof OnConnectionFailedListener && activity instanceof ConnectionCallbacks) {
+ mActivity = new WeakReference<>(activity);
+ } else {
+ throw new RuntimeException("SmartLockHelper constructor needs an activity that " +
+ "implements OnConnectionFailedListener and ConnectionCallbacks");
+ }
+ }
+
+ private FragmentActivity getActivityAndCheckAvailability() {
+ FragmentActivity activity = mActivity.get();
+ if (activity == null) {
+ return null;
+ }
+ int status = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(activity);
+ if (status == ConnectionResult.SUCCESS) {
+ return activity;
+ }
+ return null;
+ }
+
+ public void initSmartLockForPasswords() {
+ FragmentActivity activity = getActivityAndCheckAvailability();
+ if (activity == null) {
+ return;
+ }
+ mCredentialsClient = new GoogleApiClient.Builder(activity)
+ .addConnectionCallbacks((ConnectionCallbacks) activity)
+ .enableAutoManage(activity, (OnConnectionFailedListener) activity)
+ .addApi(Auth.CREDENTIALS_API)
+ .build();
+ }
+
+ public void smartLockAutoFill(@NonNull final Callback callback) {
+ Activity activity = getActivityAndCheckAvailability();
+ if (activity == null || mCredentialsClient == null || !mCredentialsClient.isConnected()) {
+ return;
+ }
+ CredentialRequest credentialRequest = new CredentialRequest.Builder()
+ .setPasswordLoginSupported(true)
+ .build();
+ Auth.CredentialsApi.request(mCredentialsClient, credentialRequest).setResultCallback(
+ new ResultCallback<CredentialRequestResult>() {
+ @Override
+ public void onResult(@NonNull CredentialRequestResult result) {
+ Status status = result.getStatus();
+ if (status.isSuccess()) {
+ Credential credential = result.getCredential();
+ callback.onCredentialRetrieved(credential);
+ } else {
+ if (status.getStatusCode() == CommonStatusCodes.RESOLUTION_REQUIRED) {
+ try {
+ Activity activity = getActivityAndCheckAvailability();
+ if (activity == null) {
+ return;
+ }
+ // Prompt the user to choose a saved credential
+ status.startResolutionForResult(activity, SignInActivity.SMART_LOCK_READ);
+ } catch (IntentSender.SendIntentException e) {
+ AppLog.d(T.NUX, "SmartLock: Failed to send resolution for credential request");
+ }
+ } else {
+ // The user must create an account or sign in manually.
+ AppLog.d(T.NUX, "SmartLock: Unsuccessful credential request.");
+ }
+ }
+ }
+ });
+ }
+
+
+ public void saveCredentialsInSmartLock(@NonNull final String username, @NonNull final String password,
+ @NonNull final String displayName, @NonNull final Uri profilePicture) {
+ Activity activity = getActivityAndCheckAvailability();
+ if (activity == null || mCredentialsClient == null || !mCredentialsClient.isConnected()) {
+ return;
+ }
+ Credential credential = new Credential.Builder(username).setPassword(password)
+ .setName(displayName).setProfilePictureUri(profilePicture).build();
+ Auth.CredentialsApi.save(mCredentialsClient, credential).setResultCallback(
+ new ResultCallback<Status>() {
+ @Override
+ public void onResult(@NonNull Status status) {
+ if (!status.isSuccess() && status.hasResolution()) {
+ try {
+ Activity activity = getActivityAndCheckAvailability();
+ if (activity == null) {
+ return;
+ }
+ // This prompt the user to resolve the save request
+ status.startResolutionForResult(activity, SignInActivity.SMART_LOCK_SAVE);
+ } catch (IntentSender.SendIntentException e) {
+ // Could not resolve the request
+ }
+ }
+ }
+ });
+ }
+
+ public void deleteCredentialsInSmartLock(@NonNull final String username, @NonNull final String password) {
+ Activity activity = getActivityAndCheckAvailability();
+ if (activity == null || mCredentialsClient == null || !mCredentialsClient.isConnected()) {
+ return;
+ }
+
+ Credential credential = new Credential.Builder(username).setPassword(password).build();
+ Auth.CredentialsApi.delete(mCredentialsClient, credential).setResultCallback(
+ new ResultCallback<Status>() {
+ @Override
+ public void onResult(@NonNull Status status) {
+ AppLog.i(T.NUX, status.isSuccess() ? "SmartLock: credentials deleted for username: " + username
+ : "SmartLock: Credentials not deleted for username: " + username );
+ }
+ });
+ }
+}