15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/signin/login_ui_service.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/signin/signin_promo.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h"
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/chrome_pages.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/host_desktop.h"
140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/sync/inline_login_dialog.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "components/signin/core/common/profile_management_switches.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/app_mode/app_mode_utils.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LoginUIService::LoginUIService(Profile* profile)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ui_(NULL), profile_(profile) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LoginUIService::~LoginUIService() {}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUIService::AddObserver(LoginUIService::Observer* observer) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer_list_.AddObserver(observer);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUIService::RemoveObserver(LoginUIService::Observer* observer) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer_list_.RemoveObserver(observer);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUIService::SetLoginUI(LoginUI* ui) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!current_login_ui() || current_login_ui() == ui);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_ = ui;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(Observer, observer_list_, OnLoginUIShown(ui_));
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUIService::LoginUIClosed(LoginUI* ui) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (current_login_ui() != ui)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_ = NULL;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(Observer, observer_list_, OnLoginUIClosed(ui));
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void LoginUIService::SyncConfirmationUIClosed(bool configure_sync_first) {
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  FOR_EACH_OBSERVER(
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      Observer,
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      observer_list_,
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      OnSyncConfirmationUIClosed(configure_sync_first));
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid LoginUIService::UntrustedLoginUIShown() {
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FOR_EACH_OBSERVER(Observer, observer_list_, OnUntrustedLoginUIShown());
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUIService::ShowLoginPopup() {
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (chrome::IsRunningInForcedAppMode())
6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    InlineLoginDialog::Show(profile_);
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  chrome::ScopedTabbedBrowserDisplayer displayer(
690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      profile_, chrome::GetActiveDesktop());
700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  chrome::ShowBrowserSignin(displayer.browser(), signin::SOURCE_APP_LAUNCHER);
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void LoginUIService::DisplayLoginResult(Browser* browser,
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                        const base::string16& message) {
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  last_login_result_ = message;
7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (switches::IsNewAvatarMenu()) {
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    browser->window()->ShowAvatarBubbleFromAvatarButton(
7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        message.empty() ? BrowserWindow::AVATAR_BUBBLE_MODE_CONFIRM_SIGNIN :
8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                          BrowserWindow::AVATAR_BUBBLE_MODE_SHOW_ERROR,
8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        signin::ManageAccountsParams());
8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  } else {
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#if defined(ENABLE_ONE_CLICK_SIGNIN)
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    browser->window()->ShowOneClickSigninBubble(
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE,
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        base::string16(), /* no SAML email */
8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        message,
8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        // This callback is never invoked.
8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        // TODO(rogerta): Separate out the bubble API so we don't have to pass
9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        // ignored |email| and |callback| params.
9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        BrowserWindow::StartSyncCallback());
9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif
9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const base::string16& LoginUIService::GetLastLoginResult() {
9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return last_login_result_;
9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
99