Add temporary code to do oauth authentication
This just adds an oauth button to the accountSetupBasics screen, which will launch a webview and go to the google authentication page. Change-Id: I09d5182fa6081fb94b40e7910b71afbbee70387e
This commit is contained in:
parent
5632d4449b
commit
874d25ff70
|
@ -138,6 +138,11 @@
|
||||||
<activity-alias android:name="com.android.mail.compose.ComposeActivity"
|
<activity-alias android:name="com.android.mail.compose.ComposeActivity"
|
||||||
android:targetActivity="com.android.email.activity.ComposeActivityEmail"/>
|
android:targetActivity="com.android.email.activity.ComposeActivityEmail"/>
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".activity.setup.OAuthAuthenticationActivity"
|
||||||
|
android:label="@string/oauth_authentication_title">
|
||||||
|
</activity>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".activity.EventViewer"
|
android:name=".activity.EventViewer"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
|
|
|
@ -55,12 +55,20 @@
|
||||||
style="@style/accountSetupButton"
|
style="@style/accountSetupButton"
|
||||||
android:text="@string/account_setup_basics_manual_setup_action" />
|
android:text="@string/account_setup_basics_manual_setup_action" />
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/next"
|
android:id="@+id/oauth_setup"
|
||||||
android:layout_below="@+id/manual_setup"
|
android:layout_below="@+id/manual_setup"
|
||||||
android:layout_alignParentRight="true"
|
android:layout_alignParentRight="true"
|
||||||
android:layout_marginTop="@dimen/setup_buttons_vertical_spacing"
|
android:layout_marginTop="@dimen/setup_buttons_vertical_spacing"
|
||||||
android:layout_marginRight="@dimen/setup_buttons_padding_right"
|
android:layout_marginRight="@dimen/setup_buttons_padding_right"
|
||||||
style="@style/accountSetupButton"
|
style="@style/accountSetupButton"
|
||||||
|
android:text="@string/account_setup_basics_oauth_setup_action" />
|
||||||
|
<Button
|
||||||
|
android:id="@+id/next"
|
||||||
|
android:layout_below="@+id/oauth_setup"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:layout_marginTop="@dimen/setup_buttons_vertical_spacing"
|
||||||
|
android:layout_marginRight="@dimen/setup_buttons_padding_right"
|
||||||
|
style="@style/accountSetupButton"
|
||||||
android:text="@string/next_action" />
|
android:text="@string/next_action" />
|
||||||
|
|
||||||
<!-- Frame on the left containing the (common) setup info -->
|
<!-- Frame on the left containing the (common) setup info -->
|
||||||
|
|
|
@ -83,6 +83,13 @@
|
||||||
android:layout_marginLeft="@dimen/setup_buttons_padding_left"
|
android:layout_marginLeft="@dimen/setup_buttons_padding_left"
|
||||||
style="@style/accountSetupButton"
|
style="@style/accountSetupButton"
|
||||||
android:text="@string/account_setup_basics_manual_setup_action" />
|
android:text="@string/account_setup_basics_manual_setup_action" />
|
||||||
|
<Button
|
||||||
|
android:id="@+id/oauth_setup"
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:layout_alignParentLeft="true"
|
||||||
|
android:layout_marginLeft="@dimen/setup_buttons_padding_left"
|
||||||
|
style="@style/accountSetupButton"
|
||||||
|
android:text="@string/account_setup_basics_oauth_setup_action" />
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/next"
|
android:id="@+id/next"
|
||||||
android:layout_alignParentTop="true"
|
android:layout_alignParentTop="true"
|
||||||
|
|
|
@ -61,6 +61,12 @@
|
||||||
android:layout_width="0dip"
|
android:layout_width="0dip"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:text="@string/account_setup_basics_manual_setup_action" />
|
android:text="@string/account_setup_basics_manual_setup_action" />
|
||||||
|
<Button
|
||||||
|
android:id="@+id/oauth_setup"
|
||||||
|
style="@style/accountSetupButton"
|
||||||
|
android:layout_width="0dip"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:text="@string/account_setup_basics_oauth_setup_action" />
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/next"
|
android:id="@+id/next"
|
||||||
style="@style/accountSetupButton"
|
style="@style/accountSetupButton"
|
||||||
|
|
|
@ -190,6 +190,8 @@
|
||||||
|
|
||||||
<!-- Title of screen when setting up new email account [CHAR LIMIT=45] -->
|
<!-- Title of screen when setting up new email account [CHAR LIMIT=45] -->
|
||||||
<string name="account_setup_basics_title">Account setup</string>
|
<string name="account_setup_basics_title">Account setup</string>
|
||||||
|
<!-- Do Not Translate. Title of screen when trying to get oauth authentication -->
|
||||||
|
<string name="oauth_authentication_title" translatable="false">OAuth authentication</string>
|
||||||
<!-- Headline of screen when setting up new email account (large text over divider)
|
<!-- Headline of screen when setting up new email account (large text over divider)
|
||||||
[CHAR LIMIT=none] -->
|
[CHAR LIMIT=none] -->
|
||||||
<string name="account_setup_basics_headline">Email account</string>
|
<string name="account_setup_basics_headline">Email account</string>
|
||||||
|
@ -202,6 +204,10 @@
|
||||||
<string name="account_setup_basics_password_label">Password</string>
|
<string name="account_setup_basics_password_label">Password</string>
|
||||||
<!-- Button name on "Set up email" screen [CHAR LIMIT=20] -->
|
<!-- Button name on "Set up email" screen [CHAR LIMIT=20] -->
|
||||||
<string name="account_setup_basics_manual_setup_action">Manual setup</string>
|
<string name="account_setup_basics_manual_setup_action">Manual setup</string>
|
||||||
|
<!-- Do not translate. Button name on "Set up email" screen [CHAR LIMIT=20] TODO: This is a temporary workaround
|
||||||
|
to allow initiating the OAuth setup flow before we have the real design working. This string
|
||||||
|
should be removed. -->
|
||||||
|
<string name="account_setup_basics_oauth_setup_action" translatable="false">OAuth</string>
|
||||||
<!-- Toast when we can't build a URI from the given email & password -->
|
<!-- Toast when we can't build a URI from the given email & password -->
|
||||||
<!-- Note, the error message in the toast is purposefully vague, because I *don't* know
|
<!-- Note, the error message in the toast is purposefully vague, because I *don't* know
|
||||||
exactly what's wrong. -->
|
exactly what's wrong. -->
|
||||||
|
|
|
@ -114,6 +114,9 @@ public class AccountSetupBasics extends AccountSetupActivity
|
||||||
private final EmailAddressValidator mEmailValidator = new EmailAddressValidator();
|
private final EmailAddressValidator mEmailValidator = new EmailAddressValidator();
|
||||||
private Provider mProvider;
|
private Provider mProvider;
|
||||||
private Button mManualButton;
|
private Button mManualButton;
|
||||||
|
// TODO: This is a temporary hack to allow us to start testing OAuth flow. It should be
|
||||||
|
// removed once we have the new setup UI working.
|
||||||
|
private Button mOAuthButton;
|
||||||
private Button mNextButton;
|
private Button mNextButton;
|
||||||
private boolean mNextButtonInhibit;
|
private boolean mNextButtonInhibit;
|
||||||
private boolean mPaused;
|
private boolean mPaused;
|
||||||
|
@ -237,12 +240,15 @@ public class AccountSetupBasics extends AccountSetupActivity
|
||||||
|
|
||||||
// Configure buttons
|
// Configure buttons
|
||||||
mManualButton = UiUtilities.getView(this, R.id.manual_setup);
|
mManualButton = UiUtilities.getView(this, R.id.manual_setup);
|
||||||
|
mOAuthButton = UiUtilities.getView(this, R.id.oauth_setup);
|
||||||
mNextButton = UiUtilities.getView(this, R.id.next);
|
mNextButton = UiUtilities.getView(this, R.id.next);
|
||||||
mManualButton.setVisibility(View.VISIBLE);
|
mManualButton.setVisibility(View.VISIBLE);
|
||||||
mManualButton.setOnClickListener(this);
|
mManualButton.setOnClickListener(this);
|
||||||
|
mOAuthButton.setOnClickListener(this);
|
||||||
mNextButton.setOnClickListener(this);
|
mNextButton.setOnClickListener(this);
|
||||||
// Force disabled until validator notifies otherwise
|
// Force disabled until validator notifies otherwise
|
||||||
onEnableProceedButtons(false);
|
onEnableProceedButtons(false);
|
||||||
|
mOAuthButton.setEnabled(false);
|
||||||
// Lightweight debounce while Async tasks underway
|
// Lightweight debounce while Async tasks underway
|
||||||
mNextButtonInhibit = false;
|
mNextButtonInhibit = false;
|
||||||
|
|
||||||
|
@ -379,6 +385,22 @@ public class AccountSetupBasics extends AccountSetupActivity
|
||||||
case R.id.manual_setup:
|
case R.id.manual_setup:
|
||||||
onManualSetup(false);
|
onManualSetup(false);
|
||||||
break;
|
break;
|
||||||
|
case R.id.oauth_setup:
|
||||||
|
// TODO: This is a temporary hack to allow oauth flow to be shown. It should be
|
||||||
|
// removed when the real account setup flow is implemented.
|
||||||
|
// TODO: Also note that this check reads and parses the xml file each time. This
|
||||||
|
// should probably get cached somewhere.
|
||||||
|
final String email = mEmailView.getText().toString().trim();
|
||||||
|
final String[] emailParts = email.split("@");
|
||||||
|
final String domain = emailParts[1].trim();
|
||||||
|
Provider provider = AccountSettingsUtils.findProviderForDomain(this, domain);
|
||||||
|
if (provider != null && provider.oauth != null) {
|
||||||
|
final Intent i = new Intent(this, OAuthAuthenticationActivity.class);
|
||||||
|
i.putExtra(OAuthAuthenticationActivity.EXTRA_EMAIL_ADDRESS, email);
|
||||||
|
i.putExtra(OAuthAuthenticationActivity.EXTRA_PROVIDER, provider.oauth);
|
||||||
|
startActivity(i);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -410,6 +432,23 @@ public class AccountSetupBasics extends AccountSetupActivity
|
||||||
&& mEmailValidator.isValid(mEmailView.getText().toString().trim());
|
&& mEmailValidator.isValid(mEmailView.getText().toString().trim());
|
||||||
onEnableProceedButtons(valid);
|
onEnableProceedButtons(valid);
|
||||||
|
|
||||||
|
// TODO: This is a temporary hack to allow oauth flow to be started. It should be
|
||||||
|
// removed when the real account setup flow is implemented.
|
||||||
|
boolean allowOauth = false;
|
||||||
|
if (!TextUtils.isEmpty(mEmailView.getText())
|
||||||
|
&& mEmailValidator.isValid(mEmailView.getText().toString().trim())) {
|
||||||
|
final String email = mEmailView.getText().toString().trim();
|
||||||
|
final String[] emailParts = email.split("@");
|
||||||
|
final String domain = emailParts[1].trim();
|
||||||
|
// TODO: Note that this check reads and parses the xml file each time. This
|
||||||
|
// should probably get cached somewhere.
|
||||||
|
Provider provider = AccountSettingsUtils.findProviderForDomain(this, domain);
|
||||||
|
if (provider != null && provider.oauth != null) {
|
||||||
|
allowOauth = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mOAuthButton.setEnabled(allowOauth);
|
||||||
|
|
||||||
// Warn (but don't prevent) if password has leading/trailing spaces
|
// Warn (but don't prevent) if password has leading/trailing spaces
|
||||||
AccountSettingsUtils.checkPasswordSpaces(this, mPasswordView);
|
AccountSettingsUtils.checkPasswordSpaces(this, mPasswordView);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,102 @@
|
||||||
|
package com.android.email.activity.setup;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.webkit.CookieManager;
|
||||||
|
import android.webkit.CookieSyncManager;
|
||||||
|
import android.webkit.WebResourceResponse;
|
||||||
|
import android.webkit.WebView;
|
||||||
|
import android.webkit.WebViewClient;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import com.android.email.R;
|
||||||
|
import com.android.emailcommon.Logging;
|
||||||
|
import com.android.emailcommon.VendorPolicyLoader.OAuthProvider;
|
||||||
|
import com.android.mail.utils.LogUtils;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Activity to display a webview to perform oauth authentication. This activity
|
||||||
|
* should obtain an authorization code, which can be used to obtain access and
|
||||||
|
* refresh tokens.
|
||||||
|
*/
|
||||||
|
public class OAuthAuthenticationActivity extends Activity {
|
||||||
|
private final static String TAG = Logging.LOG_TAG;
|
||||||
|
|
||||||
|
public static final String EXTRA_EMAIL_ADDRESS = "email_address";
|
||||||
|
public static final String EXTRA_PROVIDER = "provider";
|
||||||
|
|
||||||
|
WebView mWv;
|
||||||
|
OAuthProvider mProvider;
|
||||||
|
|
||||||
|
private class MyWebViewClient extends WebViewClient {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldOverrideUrlLoading(WebView wv, String url) {
|
||||||
|
// TODO: This method works for Google's redirect url to https://localhost.
|
||||||
|
// Does it work for the general case? I don't know what redirect url other
|
||||||
|
// providers use, or how the authentication code is returned.
|
||||||
|
LogUtils.d(TAG, "shouldOverrideUrlLoading %s", url);
|
||||||
|
final String deparameterizedUrl;
|
||||||
|
int i = url.lastIndexOf('?');
|
||||||
|
if (i == -1) {
|
||||||
|
deparameterizedUrl = url;
|
||||||
|
} else {
|
||||||
|
deparameterizedUrl = url.substring(0,i);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TextUtils.equals(deparameterizedUrl, mProvider.redirectUri)) {
|
||||||
|
final Uri uri = Uri.parse(url);
|
||||||
|
// Check the params of this uri, they contain success/failure info,
|
||||||
|
// along with the authentication token.
|
||||||
|
final String error = uri.getQueryParameter("error");
|
||||||
|
if (error != null) {
|
||||||
|
// TODO display failure screen
|
||||||
|
LogUtils.d(TAG, "error code %s", error);
|
||||||
|
Toast.makeText(OAuthAuthenticationActivity.this,
|
||||||
|
"Couldn't authenticate", Toast.LENGTH_LONG).show();
|
||||||
|
} else {
|
||||||
|
// TODO use this token to request the access and refresh tokens
|
||||||
|
final String code = uri.getQueryParameter("code");
|
||||||
|
LogUtils.d(TAG, "authorization code %s", code);
|
||||||
|
Toast.makeText(OAuthAuthenticationActivity.this,
|
||||||
|
"OAuth not implemented", Toast.LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
finish();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle bundle) {
|
||||||
|
super.onCreate(bundle);
|
||||||
|
CookieSyncManager.createInstance(this);
|
||||||
|
CookieManager cm = CookieManager.getInstance();
|
||||||
|
cm.removeAllCookie();
|
||||||
|
|
||||||
|
mWv = new WebView(this);
|
||||||
|
mWv.setWebViewClient(new MyWebViewClient());
|
||||||
|
mWv.getSettings().setJavaScriptEnabled(true);
|
||||||
|
setContentView(mWv);
|
||||||
|
|
||||||
|
final Intent i = getIntent();
|
||||||
|
final String email = i.getStringExtra(EXTRA_EMAIL_ADDRESS);
|
||||||
|
final String providerName = i.getStringExtra(EXTRA_PROVIDER);
|
||||||
|
mProvider = AccountSettingsUtils.findOAuthProvider(this, providerName);
|
||||||
|
final Uri uri = AccountSettingsUtils.createOAuthRegistrationRequest(this, mProvider, email);
|
||||||
|
LogUtils.d(Logging.LOG_TAG, "launching '%s'", uri);
|
||||||
|
mWv.loadUrl(uri.toString());
|
||||||
|
}
|
||||||
|
}
|
|
@ -497,10 +497,10 @@ public class EmailProvider extends ContentProvider {
|
||||||
if (DatabaseUtils.longForQuery(mainDatabase,
|
if (DatabaseUtils.longForQuery(mainDatabase,
|
||||||
"SELECT EXISTS (SELECT ? FROM " + Account.TABLE_NAME + " )",
|
"SELECT EXISTS (SELECT ? FROM " + Account.TABLE_NAME + " )",
|
||||||
EmailContent.ID_PROJECTION) > 0) {
|
EmailContent.ID_PROJECTION) > 0) {
|
||||||
if (MailActivityEmail.DEBUG) {
|
if (MailActivityEmail.DEBUG) {
|
||||||
LogUtils.w(TAG, "restoreIfNeeded: Account exists.");
|
LogUtils.w(TAG, "restoreIfNeeded: Account exists.");
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
restoreAccounts(context, mainDatabase);
|
restoreAccounts(context, mainDatabase);
|
||||||
|
|
Loading…
Reference in New Issue