13c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller// Copyright 2013 The Chromium Authors. All rights reserved.
23c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller// Use of this source code is governed by a BSD-style license that can be
33c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller// found in the LICENSE file.
43c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
53c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerpackage org.chromium.chrome.browser.infobar;
63c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
73c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport android.accounts.Account;
83c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport android.accounts.AccountManager;
93c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport android.accounts.AccountManagerCallback;
103c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport android.accounts.AccountManagerFuture;
113c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport android.app.Activity;
123c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport android.os.Bundle;
133c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport android.util.Log;
143c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
153c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport org.chromium.sync.signin.ChromeSigninController;
163c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
173c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller/**
183c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * Performs the actual login to the requried service.
193c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller */
203c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerpublic class AutoLoginAccountDelegate implements AccountManagerCallback<Bundle> {
213c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
223c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    private static final String WEB_LOGIN_PREFIX = "weblogin:";
233c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    private final Activity mActivity;
243c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    private final AutoLoginProcessor mAutoLoginProcessor;
253c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    private final AccountManager mAccountManager;
263c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    private final Account mAccount;
273c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    private boolean mLogInRequested;
283c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    private final String mAuthTokenType;
293c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
303c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    public AutoLoginAccountDelegate(Activity activity, AutoLoginProcessor autoLoginProcessor,
313c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller            String realm, String account, String accountArgs) {
323c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        mActivity = activity;
333c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        mAutoLoginProcessor = autoLoginProcessor;
343c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        mAccountManager = AccountManager.get(activity);
353c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        mAccount = ChromeSigninController.get(activity).getSignedInUser();
363c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        mLogInRequested = false;
373c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        mAuthTokenType = WEB_LOGIN_PREFIX + accountArgs;
383c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    }
393c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
403c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    public boolean logIn() {
413c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        Log.i("AutoLoginAccountDelegate", "auto-login requested for "
423c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller                + (mAccount != null ? mAccount.toString() : "?"));
433c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
443c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        Account currentAccount = ChromeSigninController.get(mActivity).getSignedInUser();
453c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        if (mAccount == null || !mAccount.equals(currentAccount)) {
463c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller            Log.i("InfoBar", "auto-login failed because account is no longer valid");
473c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller            return false;
483c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        }
493c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
503c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        // The callback for this request comes in on a non-UI thread.
513c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        mAccountManager.getAuthToken(mAccount, mAuthTokenType, null, mActivity, this, null);
523c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        mLogInRequested = true;
533c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        return true;
543c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    }
553c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
563c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    String getAuthToken() {
573c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        return mAuthTokenType;
583c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    }
593c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
603c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    String getAccountName() {
613c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        return mAccount != null ? mAccount.name : "";
623c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    }
633c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
643c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    boolean loginRequested() {
653c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        return mLogInRequested;
663c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    }
673c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
683c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    boolean hasAccount() {
693c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        return mAccount != null;
703c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    }
713c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
723c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    @Override
733c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    public void run(AccountManagerFuture<Bundle> value) {
743c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        String result = null;
753c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        try {
763c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller            result = value.getResult().getString(AccountManager.KEY_AUTHTOKEN);
773c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        } catch (Exception e) {
783c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller            result = null;
793c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        }
803c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
813c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        final boolean success = result != null;
823c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
833c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        // Can't rely on the Bundle's auth token or account name as they might be null
843c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        // if this was a failed attempt.
853c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        if (mAutoLoginProcessor != null) {
863c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller            mAutoLoginProcessor.processAutoLoginResult(getAccountName(), getAuthToken(),
873c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller                    success, result);
883c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        }
893c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    }
903c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller}
913c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller