| /* |
| * 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.os.Bundle; |
| import android.webkit.WebView; |
| |
| public class DeviceAccountLogin implements |
| AccountManagerCallback<Bundle> { |
| |
| private final Activity mActivity; |
| private final WebView mWebView; |
| private final Tab mTab; |
| private final WebViewController mWebViewController; |
| private final AccountManager mAccountManager; |
| Account[] mAccounts; |
| 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 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 { |
| if (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(int accountIndex, AutoLoginCallback cb) { |
| mState = PROCESSING; |
| mCallback = cb; |
| mAccountManager.getAuthToken( |
| mAccounts[accountIndex], mAuthToken, null, |
| mActivity, this, null); |
| } |
| |
| public String[] getAccountNames() { |
| String[] names = new String[mAccounts.length]; |
| for (int i = 0; i < mAccounts.length; i++) { |
| names[i] = mAccounts[i].name; |
| } |
| return names; |
| } |
| } |