1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "components/signin/core/browser/signin_tracker.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "components/signin/core/browser/account_reconcilor.h"
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/profile_oauth2_token_service.h"
9e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_client.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_constants.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochSigninTracker::SigninTracker(ProfileOAuth2TokenService* token_service,
13e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                             SigninManagerBase* signin_manager,
14e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                             AccountReconcilor* account_reconcilor,
15e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                             SigninClient* client,
16e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                             Observer* observer)
17e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    : token_service_(token_service),
18e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      signin_manager_(signin_manager),
19e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      account_reconcilor_(account_reconcilor),
20e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      client_(client),
21e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      observer_(observer) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Initialize();
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SigninTracker::~SigninTracker() {
26e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  signin_manager_->RemoveObserver(this);
27e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  token_service_->RemoveObserver(this);
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
29e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (account_reconcilor_) {
30e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    account_reconcilor_->RemoveMergeSessionObserver(this);
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_CHROMEOS)
32e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  } else if (client_->ShouldMergeSigninCredentialsIntoCookieJar()) {
33e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    SigninManager* manager = static_cast<SigninManager*>(signin_manager_);
34e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    manager->RemoveMergeSessionObserver(this);
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninTracker::Initialize() {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(observer_);
41e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  signin_manager_->AddObserver(this);
42e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  token_service_->AddObserver(this);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SigninTracker::GoogleSigninFailed(const GoogleServiceAuthError& error) {
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  observer_->SigninFailed(error);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void SigninTracker::OnRefreshTokenAvailable(const std::string& account_id) {
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (account_id != signin_manager_->GetAuthenticatedAccountId())
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return;
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
53e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (account_reconcilor_) {
54e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    account_reconcilor_->AddMergeSessionObserver(this);
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_CHROMEOS)
56e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  } else if (client_->ShouldMergeSigninCredentialsIntoCookieJar()) {
57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    SigninManager* manager = static_cast<SigninManager*>(signin_manager_);
58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    manager->AddMergeSessionObserver(this);
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  observer_->SigninSuccess();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void SigninTracker::OnRefreshTokenRevoked(const std::string& account_id) {
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  NOTREACHED();
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SigninTracker::MergeSessionCompleted(
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& account_id,
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const GoogleServiceAuthError& error) {
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  observer_->MergeSessionComplete(error);
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
74