blob: 8d734c230dc69b50f0be476d64e8d93e5ba3b576 [file] [log] [blame]
/*
* 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;
}
}