diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/com/android/browser/BrowserActivity.java | 38 | ||||
| -rw-r--r-- | src/com/android/browser/Controller.java | 18 | ||||
| -rw-r--r-- | src/com/android/browser/GoogleAccountLogin.java | 87 |
3 files changed, 102 insertions, 41 deletions
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java index 527f025df..ec096731d 100644 --- a/src/com/android/browser/BrowserActivity.java +++ b/src/com/android/browser/BrowserActivity.java @@ -19,14 +19,12 @@ package com.android.browser; import com.google.common.annotations.VisibleForTesting; import android.app.Activity; -import android.app.ProgressDialog; import android.content.Intent; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.PixelFormat; import android.os.Bundle; -import android.os.Handler; import android.util.Log; import android.view.ActionMode; import android.view.ContextMenu; @@ -113,36 +111,12 @@ public class BrowserActivity extends Activity { icicle = state; } - String account = settings.getAutoLoginAccount(this); - if (settings.isAutoLoginEnabled() && account != null && - !GoogleAccountLogin.isLoggedIn()) { - GoogleAccountLogin login = - new GoogleAccountLogin(this, account); - final ProgressDialog dialog = ProgressDialog.show(this, - getString(R.string.pref_autologin_title), - getString(R.string.pref_autologin_progress, account), - true /* indeterminate */, - true /* cancelable */, - login); - final Bundle b = icicle; - final Handler handler = new Handler(); - final Runnable dismiss = new Runnable() { - @Override public void run() { - dialog.dismiss(); - } - }; - final Runnable start = new Runnable() { - @Override public void run() { - // Post a delayed dismiss message to avoid a flash of the - // progress dialog. - handler.postDelayed(dismiss, 1000); - mController.start(b, getIntent()); - } - }; - login.startLogin(start); - } else { - mController.start(icicle, getIntent()); - } + final Bundle b = icicle; + GoogleAccountLogin.startLoginIfNeeded(this, settings, new Runnable() { + @Override public void run() { + mController.start(b, getIntent()); + } + }); } @VisibleForTesting diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java index 472201b91..a2ddc8c91 100644 --- a/src/com/android/browser/Controller.java +++ b/src/com/android/browser/Controller.java @@ -2093,8 +2093,8 @@ public class Controller // This method does a ton of stuff. It will attempt to create a new tab // if we haven't reached MAX_TABS. Otherwise it uses the current tab. If // url isn't null, it will load the given url. - public Tab openTabAndShow(Tab parent, UrlData urlData, boolean closeOnExit, - String appId) { + public Tab openTabAndShow(Tab parent, final UrlData urlData, + boolean closeOnExit, String appId) { final Tab currentTab = mTabControl.getCurrentTab(); if (mTabControl.canCreateNewTab()) { final Tab tab = mTabControl.createNewTab(closeOnExit, appId, @@ -2105,9 +2105,17 @@ public class Controller // animation behavior. addTab(tab); setActiveTab(tab); - if (!urlData.isEmpty()) { - loadUrlDataIn(tab, urlData); - } + + // Callback to load the url data. + final Runnable load = new Runnable() { + @Override public void run() { + if (!urlData.isEmpty()) { + loadUrlDataIn(tab, urlData); + } + } + }; + + GoogleAccountLogin.startLoginIfNeeded(mActivity, mSettings, load); return tab; } else { // Get rid of the subwindow if it exists diff --git a/src/com/android/browser/GoogleAccountLogin.java b/src/com/android/browser/GoogleAccountLogin.java index 910c1bcc6..6bec8dc8e 100644 --- a/src/com/android/browser/GoogleAccountLogin.java +++ b/src/com/android/browser/GoogleAccountLogin.java @@ -29,12 +29,16 @@ import android.accounts.AccountManager; import android.accounts.AccountManagerCallback; import android.accounts.AccountManagerFuture; import android.app.Activity; +import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; +import android.content.SharedPreferences.Editor; import android.net.http.AndroidHttpClient; import android.net.Uri; import android.os.Bundle; +import android.os.Handler; +import android.preference.PreferenceManager; import android.util.Log; import android.webkit.CookieManager; import android.webkit.WebView; @@ -55,21 +59,32 @@ public class GoogleAccountLogin extends Thread implements "https://www.google.com/accounts/TokenAuth"); // Google account type private static final String GOOGLE = "com.google"; + // Last auto login time + private static final String PREF_AUTOLOGIN_TIME = "last_autologin_time"; + // A week in milliseconds (7*24*60*60*1000) + private static final long WEEK_IN_MILLIS = 604800000L; private final Activity mActivity; private final Account mAccount; private final WebView mWebView; + // Does not matter if this is initialized in a non-ui thread. + // Dialog.dismiss() will post to the right handler. + private final Handler mHandler = new Handler(); private Runnable mRunnable; + private ProgressDialog mProgressDialog; // SID and LSID retrieval process. private String mSid; private String mLsid; private int mState; // {NONE(0), SID(1), LSID(2)} - GoogleAccountLogin(Activity activity, String name) { + private GoogleAccountLogin(Activity activity, String name, + Runnable runnable) { mActivity = activity; mAccount = new Account(name, GOOGLE); mWebView = new WebView(mActivity); + mRunnable = runnable; + mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { @@ -77,11 +92,19 @@ public class GoogleAccountLogin extends Thread implements } @Override public void onPageFinished(WebView view, String url) { + saveLoginTime(); done(); } }); } + private void saveLoginTime() { + Editor ed = PreferenceManager. + getDefaultSharedPreferences(mActivity).edit(); + ed.putLong(PREF_AUTOLOGIN_TIME, System.currentTimeMillis()); + ed.apply(); + } + // Thread @Override public void run() { @@ -178,8 +201,42 @@ public class GoogleAccountLogin extends Thread implements } } - public void startLogin(Runnable runnable) { - mRunnable = runnable; + // Start the login process if auto-login is enabled and the user is not + // already logged in. + public static void startLoginIfNeeded(Activity activity, + BrowserSettings settings, Runnable runnable) { + // Auto login not enabled? + if (!settings.isAutoLoginEnabled()) { + runnable.run(); + return; + } + + // No account found? + String account = settings.getAutoLoginAccount(activity); + if (account == null) { + runnable.run(); + return; + } + + // Already logged in? + if (isLoggedIn(activity)) { + runnable.run(); + return; + } + + GoogleAccountLogin login = + new GoogleAccountLogin(activity, account, runnable); + login.startLogin(); + } + + private void startLogin() { + mProgressDialog = ProgressDialog.show(mActivity, + mActivity.getString(R.string.pref_autologin_title), + mActivity.getString(R.string.pref_autologin_progress, + mAccount.name), + true /* indeterminate */, + true /* cancelable */, + this); mState = 1; // SID AccountManager.get(mActivity).getAuthToken( mAccount, "SID", null, mActivity, this, null); @@ -209,7 +266,20 @@ public class GoogleAccountLogin extends Thread implements } // Checks for the presence of the SID cookie on google.com. - public static boolean isLoggedIn() { + public static boolean isLoggedIn(Context ctx) { + // See if we last logged in less than a week ago. + long lastLogin = PreferenceManager. + getDefaultSharedPreferences(ctx). + getLong(PREF_AUTOLOGIN_TIME, -1); + if (lastLogin == -1) { + return false; + } + long diff = System.currentTimeMillis() - lastLogin; + if (diff > WEEK_IN_MILLIS) { + Log.d(LOGTAG, "Forcing login after " + diff + "ms"); + return false; + } + String cookies = CookieManager.getInstance().getCookie( "http://www.google.com"); if (cookies != null) { @@ -230,6 +300,15 @@ public class GoogleAccountLogin extends Thread implements if (mRunnable != null) { Log.d(LOGTAG, "Finished login attempt for " + mAccount.name); mActivity.runOnUiThread(mRunnable); + + // Post a delayed message to dismiss the dialog in order to avoid a + // flash of the progress dialog. + mHandler.postDelayed(new Runnable() { + @Override public void run() { + mProgressDialog.dismiss(); + } + }, 1000); + mRunnable = null; mWebView.destroy(); } |
