diff options
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.java | 150 |
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 ); + } + }); + } +} |