blob: 925b1a3af74fa8a0e9b63782155b6674903967e5 [file] [log] [blame]
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 );
}
});
}
}