diff options
Diffstat (limited to 'src/com/android/browser/DeviceAccountLogin.java')
| -rw-r--r-- | src/com/android/browser/DeviceAccountLogin.java | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/src/com/android/browser/DeviceAccountLogin.java b/src/com/android/browser/DeviceAccountLogin.java new file mode 100644 index 000000000..50b8c979e --- /dev/null +++ b/src/com/android/browser/DeviceAccountLogin.java @@ -0,0 +1,165 @@ +/* + * Copyright (C) 2011 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.browser; + +import android.accounts.Account; +import android.accounts.AccountManager; +import android.accounts.AccountManagerCallback; +import android.accounts.AccountManagerFuture; +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.os.Bundle; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +public class DeviceAccountLogin implements + AccountManagerCallback<Bundle>, DialogInterface.OnClickListener { + + private final Activity mActivity; + private final WebView mWebView; + private final Tab mTab; + private final WebViewController mWebViewController; + private final AccountManager mAccountManager; + private Account[] mAccounts; + private int mCurrentAccount; + private AutoLoginCallback mCallback; + private String mAuthToken; + + // Current state of the login. + private int mState = INITIAL; + + public static final int INITIAL = 0; + public static final int FAILED = 1; + public static final int PROCESSING = 2; + + public interface AutoLoginCallback { + public void setAccount(String account); + public void loginFailed(); + } + + public DeviceAccountLogin(Activity activity, WebView view, Tab tab, + WebViewController controller) { + mActivity = activity; + mWebView = view; + mTab = tab; + mWebViewController = controller; + mAccountManager = AccountManager.get(activity); + } + + public void handleLogin(String realm, String account, String args) { + mAccounts = mAccountManager.getAccountsByType(realm); + mAuthToken = "weblogin:" + args; + + // No need to display UI if there are no accounts. + if (mAccounts.length == 0) { + return; + } + + // Verify the account before using it. + for (Account a : mAccounts) { + if (a.name.equals(account)) { + // Handle the automatic login case where the service gave us an + // account to use. + mAccountManager.getAuthToken(a, mAuthToken, null, + mActivity, this, null); + return; + } + } + + displayLoginUi(); + } + + @Override + public void run(AccountManagerFuture<Bundle> value) { + try { + String result = value.getResult().getString( + AccountManager.KEY_AUTHTOKEN); + if (result == null) { + loginFailed(); + } else { + mWebView.loadUrl(result); + mTab.setDeviceAccountLogin(null); + if (mTab.inForeground()) { + mWebViewController.hideAutoLogin(mTab); + } + } + } catch (Exception e) { + loginFailed(); + } + } + + public int getState() { + return mState; + } + + private void loginFailed() { + mState = FAILED; + if (mTab.getDeviceAccountLogin() == null) { + displayLoginUi(); + } else { + assert mCallback != null; + mCallback.loginFailed(); + } + } + + private void displayLoginUi() { + // Display the account picker. + mTab.setDeviceAccountLogin(this); + if (mTab.inForeground()) { + mWebViewController.showAutoLogin(mTab); + } + } + + public void cancel() { + mTab.setDeviceAccountLogin(null); + } + + public void login(AutoLoginCallback cb) { + mState = PROCESSING; + mCallback = cb; + mAccountManager.getAuthToken( + mAccounts[mCurrentAccount], mAuthToken, null, + mActivity, this, null); + } + + public void chooseAccount(AutoLoginCallback cb) { + mCallback = cb; + CharSequence[] names = new CharSequence[mAccounts.length]; + int i = 0; + for (Account a : mAccounts) { + names[i++] = a.name; + } + new AlertDialog.Builder(mActivity) + .setTitle(R.string.pref_autologin_title) + .setSingleChoiceItems(names, mCurrentAccount, this) + .setCancelable(true) + .show(); + } + + public String getCurrentAccount() { + return mAccounts[mCurrentAccount].name; + } + + @Override + public void onClick(DialogInterface d, int which) { + assert mCallback != null; + mCallback.setAccount(mAccounts[which].name); + mCurrentAccount = which; + d.dismiss(); + } +} |
