replicant-packages_apps_Email/src/com/android/email/activity/setup/AuthenticationView.java

268 lines
9.9 KiB
Java

package com.android.email.activity.setup;
import android.content.Context;
import android.os.Bundle;
import android.os.Parcelable;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.android.email.R;
import com.android.email.activity.UiUtilities;
import com.android.emailcommon.VendorPolicyLoader.OAuthProvider;
import com.android.emailcommon.provider.Credential;
import com.android.emailcommon.provider.HostAuth;
import com.google.common.annotations.VisibleForTesting;
public class AuthenticationView extends LinearLayout implements OnClickListener {
private final static String SUPER_STATE = "super_state";
private final static String SAVE_PASSWORD = "save_password";
private final static String SAVE_OFFER_OAUTH = "save_offer_oauth";
private final static String SAVE_USE_OAUTH = "save_use_oauth";
private final static String SAVE_OAUTH_PROVIDER = "save_oauth_provider";
// Views
private TextView mAuthenticationHeader;
private View mPasswordWrapper;
private View mOAuthWrapper;
private View mNoAuthWrapper;
private TextView mPasswordLabel;
private EditText mPasswordEdit;
private TextView mOAuthLabel;
private View mClearPasswordView;
private View mClearOAuthView;
private View mAddAuthenticationView;
private boolean mOfferOAuth;
private boolean mUseOAuth;
private String mOAuthProvider;
private boolean mAuthenticationValid;
private AuthenticationCallback mAuthenticationCallback;
public interface AuthenticationCallback {
public void onValidateStateChanged();
public void onRequestSignIn();
}
public AuthenticationView(Context context) {
this(context, null);
}
public AuthenticationView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public AuthenticationView(Context context, AttributeSet attrs, int defstyle) {
super(context, attrs, defstyle);
LayoutInflater.from(context).inflate(R.layout.authentication_view, this, true);
}
@Override
public void onFinishInflate() {
super.onFinishInflate();
mPasswordWrapper = UiUtilities.getView(this, R.id.password_wrapper);
mOAuthWrapper = UiUtilities.getView(this, R.id.oauth_wrapper);
mPasswordEdit = UiUtilities.getView(this, R.id.password_edit);
mOAuthLabel = UiUtilities.getView(this, R.id.oauth_label);
mClearPasswordView = UiUtilities.getView(this, R.id.clear_password);
mClearOAuthView = UiUtilities.getView(this, R.id.clear_oauth);
mAddAuthenticationView = UiUtilities.getView(this, R.id.add_authentication);
// Don't use UiUtilities here, in some configurations, these view doesn't exist and
// UiUtilities throws an exception in this case.
mPasswordLabel = (TextView)findViewById(R.id.password_label);
mAuthenticationHeader = (TextView)findViewById(R.id.authentication_header);
mClearPasswordView.setOnClickListener(this);
mClearOAuthView.setOnClickListener(this);
mAddAuthenticationView.setOnClickListener(this);
final TextWatcher validationTextWatcher = new PasswordTextWatcher();
mPasswordEdit.addTextChangedListener(validationTextWatcher);
}
private class PasswordTextWatcher implements TextWatcher {
@Override
public void afterTextChanged(Editable s) {
validateFields();
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) { }
}
public void setAuthenticationCallback(final AuthenticationCallback host) {
mAuthenticationCallback = host;
}
public boolean getAuthValid() {
if (mOfferOAuth & mUseOAuth) {
return mOAuthProvider != null;
} else {
return !TextUtils.isEmpty(mPasswordEdit.getText());
}
}
@VisibleForTesting
public void setPassword(final String password) {
mPasswordEdit.setText(password);
}
public String getPassword() {
return mPasswordEdit.getText().toString();
}
public String getOAuthProvider() {
return mOAuthProvider;
}
private void validateFields() {
boolean valid = getAuthValid();
if (valid != mAuthenticationValid) {
mAuthenticationCallback.onValidateStateChanged();
mAuthenticationValid = valid;
}
}
public void setAuthInfo(final boolean offerOAuth, final HostAuth hostAuth) {
mOfferOAuth = offerOAuth;
if (mOfferOAuth) {
final Credential cred = hostAuth.getCredential(getContext());
if (cred != null) {
// We're authenticated with OAuth.
mUseOAuth = true;
mOAuthProvider = cred.mProviderId;
} else {
mUseOAuth = false;
}
} else {
// We're using a POP or Exchange account, which does not offer oAuth.
mUseOAuth = false;
}
mPasswordEdit.setText(hostAuth.mPassword);
if (mOfferOAuth && mUseOAuth) {
// We're authenticated with OAuth.
final OAuthProvider provider = AccountSettingsUtils.findOAuthProvider(
getContext(), mOAuthProvider);
mOAuthLabel.setText(getContext().getString(R.string.signed_in_with_service_label,
provider.label));
}
updateVisibility();
validateFields();
}
private void updateVisibility() {
if (mOfferOAuth) {
if (mAuthenticationHeader != null) {
mAuthenticationHeader.setVisibility(View.VISIBLE);
mAuthenticationHeader.setText(R.string.authentication_label);
}
if (mUseOAuth) {
// We're authenticated with OAuth.
mOAuthWrapper.setVisibility(View.VISIBLE);
mPasswordWrapper.setVisibility(View.GONE);
mAddAuthenticationView.setVisibility(View.GONE);
if (mPasswordLabel != null) {
mPasswordLabel.setVisibility(View.VISIBLE);
}
} else if (!TextUtils.isEmpty(getPassword())) {
// We're authenticated with a password.
mOAuthWrapper.setVisibility(View.GONE);
mPasswordWrapper.setVisibility(View.VISIBLE);
mAddAuthenticationView.setVisibility(View.GONE);
if (TextUtils.isEmpty(mPasswordEdit.getText())) {
mPasswordEdit.requestFocus();
}
mClearPasswordView.setVisibility(View.VISIBLE);
} else {
// We have no authentication, we need to allow either password or oauth.
mOAuthWrapper.setVisibility(View.GONE);
mPasswordWrapper.setVisibility(View.GONE);
mAddAuthenticationView.setVisibility(View.VISIBLE);
}
} else {
// We're using a POP or Exchange account, which does not offer oAuth.
if (mAuthenticationHeader != null) {
mAuthenticationHeader.setVisibility(View.VISIBLE);
mAuthenticationHeader.setText(R.string.account_setup_incoming_password_label);
}
mOAuthWrapper.setVisibility(View.GONE);
mPasswordWrapper.setVisibility(View.VISIBLE);
mAddAuthenticationView.setVisibility(View.GONE);
mClearPasswordView.setVisibility(View.GONE);
if (TextUtils.isEmpty(mPasswordEdit.getText())) {
mPasswordEdit.requestFocus();
}
if (mPasswordLabel != null) {
mPasswordLabel.setVisibility(View.GONE);
}
}
}
@Override
public Parcelable onSaveInstanceState() {
Bundle bundle = new Bundle();
bundle.putParcelable(SUPER_STATE, super.onSaveInstanceState());
bundle.putBoolean(SAVE_OFFER_OAUTH, mOfferOAuth);
bundle.putBoolean(SAVE_USE_OAUTH, mUseOAuth);
bundle.putString(SAVE_PASSWORD, getPassword());
bundle.putString(SAVE_OAUTH_PROVIDER, mOAuthProvider);
return bundle;
}
@Override
public void onRestoreInstanceState(Parcelable parcelable) {
if (parcelable instanceof Bundle) {
Bundle bundle = (Bundle)parcelable;
super.onRestoreInstanceState(bundle.getParcelable(SUPER_STATE));
mOfferOAuth = bundle.getBoolean(SAVE_OFFER_OAUTH);
mUseOAuth = bundle.getBoolean(SAVE_USE_OAUTH);
mOAuthProvider = bundle.getString(SAVE_OAUTH_PROVIDER);
final String password = bundle.getString(SAVE_PASSWORD);
mPasswordEdit.setText(password);
if (!TextUtils.isEmpty(mOAuthProvider)) {
final OAuthProvider provider = AccountSettingsUtils.findOAuthProvider(
getContext(), mOAuthProvider);
if (provider != null) {
mOAuthLabel.setText(getContext().getString(R.string.signed_in_with_service_label,
provider.label));
}
}
updateVisibility();
}
}
@Override
public void onClick(View view) {
if (view == mClearPasswordView) {
mPasswordEdit.setText(null);
updateVisibility();
validateFields();
} else if (view == mClearOAuthView) {
mUseOAuth = false;
mOAuthProvider = null;
updateVisibility();
validateFields();
} else if (view == mAddAuthenticationView) {
mAuthenticationCallback.onRequestSignIn();
}
}
}