blob: 8f544986b521ab5096dba4c24fcb6b8fb6489b92 [file] [log] [blame]
package org.wordpress.android.ui.accounts;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.view.Window;
import com.google.android.gms.auth.api.credentials.Credential;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.analytics.AnalyticsTracker;
import org.wordpress.android.analytics.AnalyticsTracker.Stat;
import org.wordpress.android.models.Blog;
import org.wordpress.android.ui.ActivityId;
import org.wordpress.android.ui.accounts.SmartLockHelper.Callback;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.AppLog.T;
public class SignInActivity extends AppCompatActivity implements ConnectionCallbacks, OnConnectionFailedListener {
public static final int SIGN_IN_REQUEST = 1;
public static final int REQUEST_CODE = 5000;
public static final int ADD_SELF_HOSTED_BLOG = 2;
public static final int SHOW_CERT_DETAILS = 4;
public static final int SMART_LOCK_SAVE = 5;
public static final int SMART_LOCK_READ = 6;
public static final String EXTRA_START_FRAGMENT = "start-fragment";
public static final String EXTRA_JETPACK_SITE_AUTH = "EXTRA_JETPACK_SITE_AUTH";
public static final String EXTRA_JETPACK_MESSAGE_AUTH = "EXTRA_JETPACK_MESSAGE_AUTH";
public static final String EXTRA_IS_AUTH_ERROR = "EXTRA_IS_AUTH_ERROR";
public static final String EXTRA_PREFILL_URL = "EXTRA_PREFILL_URL";
private SmartLockHelper mSmartLockHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.welcome_activity);
String action = getIntent().getAction();
Uri data = getIntent().getData();
if (Intent.ACTION_VIEW.equals(action) && data != null) {
if (data.getBooleanQueryParameter("selfhosted", false)) {
getIntent().putExtra(SignInActivity.EXTRA_START_FRAGMENT, SignInActivity.ADD_SELF_HOSTED_BLOG);
if (data.getQueryParameter("url") != null) {
getIntent().putExtra(EXTRA_PREFILL_URL, data.getQueryParameter("url"));
}
}
}
if (savedInstanceState == null) {
addSignInFragment();
}
mSmartLockHelper = new SmartLockHelper(this);
mSmartLockHelper.initSmartLockForPasswords();
ActivityId.trackLastActivity(ActivityId.LOGIN);
}
@Override
protected void onResume() {
super.onResume();
actionMode(getIntent().getExtras());
}
protected void addSignInFragment() {
SignInFragment signInFragment = new SignInFragment();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, signInFragment, SignInFragment.TAG);
fragmentTransaction.commit();
}
protected void actionMode(Bundle extras) {
int actionMode = SIGN_IN_REQUEST;
String prefillUrl = "";
if (extras != null) {
actionMode = extras.getInt(EXTRA_START_FRAGMENT, -1);
if (extras.containsKey(EXTRA_JETPACK_SITE_AUTH)) {
Blog jetpackBlog = WordPress.getBlog(extras.getInt(EXTRA_JETPACK_SITE_AUTH));
if (jetpackBlog != null) {
String customMessage = extras.getString(EXTRA_JETPACK_MESSAGE_AUTH, null);
getSignInFragment().setBlogAndCustomMessageForJetpackAuth(jetpackBlog, customMessage);
}
} else if (extras.containsKey(EXTRA_IS_AUTH_ERROR)) {
getSignInFragment().showAuthErrorMessage();
}
prefillUrl = extras.getString(EXTRA_PREFILL_URL, "");
}
switch (actionMode) {
case ADD_SELF_HOSTED_BLOG:
getSignInFragment().forceSelfHostedMode(prefillUrl);
break;
default:
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == SHOW_CERT_DETAILS) {
getSignInFragment().askForSslTrust();
} else if (requestCode == SMART_LOCK_SAVE) {
if (resultCode == RESULT_OK) {
AnalyticsTracker.track(Stat.LOGIN_AUTOFILL_CREDENTIALS_UPDATED);
AppLog.d(T.NUX, "Credentials saved");
} else {
AppLog.d(T.NUX, "Credentials save cancelled");
}
} else if (requestCode == SMART_LOCK_READ) {
if (resultCode == RESULT_OK) {
AppLog.d(T.NUX, "Credentials retrieved");
Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
SignInFragment signInFragment =
(SignInFragment) getSupportFragmentManager().findFragmentByTag(SignInFragment.TAG);
if (signInFragment != null) {
signInFragment.onCredentialRetrieved(credential);
}
} else {
AppLog.e(T.NUX, "Credential read failed");
}
}
}
public SignInFragment getSignInFragment() {
SignInFragment signInFragment = (SignInFragment) getSupportFragmentManager().findFragmentByTag(SignInFragment.TAG);
if (signInFragment == null) {
return new SignInFragment();
} else {
return signInFragment;
}
}
public SmartLockHelper getSmartLockHelper() {
return mSmartLockHelper;
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
AppLog.d(T.NUX, "Connection result: " + connectionResult);
}
@Override
public void onConnected(Bundle bundle) {
AppLog.d(T.NUX, "Google API client connected");
SignInFragment signInFragment =
(SignInFragment) getSupportFragmentManager().findFragmentByTag(SignInFragment.TAG);
// Autofill only if signInFragment is there and if it can be autofilled (ie. username and password fields are
// empty).
if (signInFragment != null && signInFragment.canAutofillUsernameAndPassword()) {
mSmartLockHelper.smartLockAutoFill(new Callback() {
@Override
public void onCredentialRetrieved(Credential credential) {
SignInFragment signInFragment =
(SignInFragment) getSupportFragmentManager().findFragmentByTag(SignInFragment.TAG);
if (signInFragment != null) {
signInFragment.onCredentialRetrieved(credential);
}
}
});
}
}
@Override
public void onConnectionSuspended(int i) {
AppLog.d(T.NUX, "Google API client connection suspended");
}
}