blob: 83a93a1b036c261166b878a2acda8cc9bee4b459 [file] [log] [blame]
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.email.activity.setup;
import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.Toast;
import com.android.email.R;
import com.android.email.activity.UiUtilities;
import com.android.emailcommon.Logging;
import com.android.emailcommon.VendorPolicyLoader.OAuthProvider;
import com.android.emailcommon.VendorPolicyLoader.Provider;
import com.android.mail.utils.LogUtils;
import java.util.List;
public class SignInFragment extends Fragment implements OnClickListener {
public static final int REQUEST_OAUTH = 1;
public static final int RESULT_OAUTH_SUCCESS = 0;
public static final int RESULT_OAUTH_USER_CANCELED = -1;
public static final int RESULT_OAUTH_FAILURE = -2;
private View mNextButton;
private View mPreviousButton;
private View mOAuthButton;
private EditText mPasswordText;
private TextWatcher mValidationTextWatcher;
private String mEmailAddress;
private String mProviderId;
private SignInCallback mCallback;
private Context mContext;
public interface SignInCallback {
public void onOAuthSignIn(final String providerId, final String accessToken,
final String refreshToken, final int expiresInSeconds);
public void onPasswordSignIn(final String password);
public void onCancel();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.sign_in_fragment, container, false);
mNextButton = UiUtilities.getView(view, R.id.next);
mPreviousButton = UiUtilities.getView(view, R.id.previous);
mOAuthButton = UiUtilities.getView(view, R.id.sign_in_with_google);
mPasswordText = UiUtilities.getView(view, R.id.account_password);
mNextButton.setOnClickListener(this);
mPreviousButton.setOnClickListener(this);
mOAuthButton.setOnClickListener(this);
// After any text edits, call validateFields() which enables or disables the Next button
mValidationTextWatcher = new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
validatePassword();
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) { }
};
mPasswordText.addTextChangedListener(mValidationTextWatcher);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
mContext = getActivity();
}
@Override
public void onDestroy() {
super.onDestroy();
mPasswordText.removeTextChangedListener(mValidationTextWatcher);
mPasswordText = null;
}
public void validatePassword() {
enableNextButton(!TextUtils.isEmpty(mPasswordText.getText()));
// Warn (but don't prevent) if password has leading/trailing spaces
AccountSettingsUtils.checkPasswordSpaces(mContext, mPasswordText);
}
private void enableNextButton(final boolean enabled) {
mNextButton.setEnabled(enabled);
}
@Override
public void onActivityResult(final int requestCode, final int resultCode,
final Intent data) {
if (requestCode == REQUEST_OAUTH) {
if (resultCode == RESULT_OAUTH_SUCCESS) {
final String accessToken = data.getStringExtra(
OAuthAuthenticationActivity.EXTRA_OAUTH_ACCESS_TOKEN);
final String refreshToken = data.getStringExtra(
OAuthAuthenticationActivity.EXTRA_OAUTH_REFRESH_TOKEN);
final int expiresInSeconds = data.getIntExtra(
OAuthAuthenticationActivity.EXTRA_OAUTH_EXPIRES_IN, 0);
mCallback.onOAuthSignIn(mProviderId, accessToken, refreshToken, expiresInSeconds);
getActivity().finish();
} else if (resultCode == RESULT_OAUTH_FAILURE
|| resultCode == RESULT_OAUTH_USER_CANCELED) {
LogUtils.i(Logging.LOG_TAG, "Result from oauth %d", resultCode);
} else {
LogUtils.wtf(Logging.LOG_TAG, "Unknown result code from OAUTH: %d", resultCode);
}
} else {
LogUtils.e(Logging.LOG_TAG, "Unknown request code for onActivityResult in"
+ " AccountSetupBasics: %d", requestCode);
}
}
@Override
public void onClick(View view) {
if (view == mNextButton) {
mCallback.onPasswordSignIn(mPasswordText.getText().toString());
} else if (view == mPreviousButton) {
mCallback.onCancel();
} else if (view == mOAuthButton) {
List<OAuthProvider> oauthProviders = AccountSettingsUtils.getAllOAuthProviders(
mContext);
// FLAG currently the only oauth provider we support is google.
// If we ever have more than 1 oauth provider, then we need to implement some sort
// of picker UI. For now, just always take the first oauth provider.
if (oauthProviders.size() > 0) {
mProviderId = oauthProviders.get(0).id;
final Intent i = new Intent(mContext, OAuthAuthenticationActivity.class);
i.putExtra(OAuthAuthenticationActivity.EXTRA_EMAIL_ADDRESS, mEmailAddress);
i.putExtra(OAuthAuthenticationActivity.EXTRA_PROVIDER, mProviderId);
startActivityForResult(i, REQUEST_OAUTH);
}
}
}
public void setEmailAddress(final String emailAddress) {
mEmailAddress = emailAddress;
}
public String getEmailAddress() {
return mEmailAddress;
}
public void setSignInCallback(SignInCallback callback) {
mCallback = callback;
}
}