1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/chromeos/login/ui/user_adding_screen.h" 6 7#include "ash/shell.h" 8#include "ash/system/tray/system_tray.h" 9#include "base/bind.h" 10#include "base/memory/singleton.h" 11#include "base/observer_list.h" 12#include "chrome/browser/browser_process.h" 13#include "chrome/browser/chromeos/login/helper.h" 14#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h" 15#include "chrome/browser/chromeos/login/ui/user_adding_screen_input_methods_controller.h" 16#include "chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.h" 17#include "components/session_manager/core/session_manager.h" 18#include "components/user_manager/user_manager.h" 19#include "ui/gfx/rect.h" 20#include "ui/gfx/size.h" 21 22namespace chromeos { 23 24namespace { 25 26class UserAddingScreenImpl : public UserAddingScreen { 27 public: 28 virtual void Start() OVERRIDE; 29 virtual void Cancel() OVERRIDE; 30 virtual bool IsRunning() OVERRIDE; 31 32 virtual void AddObserver(Observer* observer) OVERRIDE; 33 virtual void RemoveObserver(Observer* observer) OVERRIDE; 34 35 static UserAddingScreenImpl* GetInstance(); 36 private: 37 friend struct DefaultSingletonTraits<UserAddingScreenImpl>; 38 39 void OnDisplayHostCompletion(); 40 41 UserAddingScreenImpl(); 42 virtual ~UserAddingScreenImpl(); 43 44 ObserverList<Observer> observers_; 45 LoginDisplayHost* display_host_; 46 47 UserAddingScreenInputMethodsController im_controller_; 48}; 49 50void UserAddingScreenImpl::Start() { 51 CHECK(!IsRunning()); 52 gfx::Rect screen_bounds(chromeos::CalculateScreenBounds(gfx::Size())); 53 display_host_ = new chromeos::LoginDisplayHostImpl(screen_bounds); 54 display_host_->StartUserAdding( 55 base::Bind(&UserAddingScreenImpl::OnDisplayHostCompletion, 56 base::Unretained(this))); 57 58 g_browser_process->platform_part()->SessionManager()->SetSessionState( 59 session_manager::SESSION_STATE_LOGIN_SECONDARY); 60 FOR_EACH_OBSERVER(Observer, observers_, OnUserAddingStarted()); 61} 62 63void UserAddingScreenImpl::Cancel() { 64 CHECK(IsRunning()); 65 66 // Make sure that system tray is enabled after this flow. 67 ash::Shell::GetInstance()->GetPrimarySystemTray()->SetEnabled(true); 68 display_host_->Finalize(); 69 70 // Reset wallpaper if cancel adding user from multiple user sign in page. 71 if (user_manager::UserManager::Get()->IsUserLoggedIn()) { 72 WallpaperManager::Get()->SetUserWallpaperDelayed( 73 user_manager::UserManager::Get()->GetActiveUser()->email()); 74 } 75} 76 77bool UserAddingScreenImpl::IsRunning() { 78 return display_host_ != NULL; 79} 80 81void UserAddingScreenImpl::AddObserver(Observer* observer) { 82 observers_.AddObserver(observer); 83} 84 85void UserAddingScreenImpl::RemoveObserver(Observer* observer) { 86 observers_.RemoveObserver(observer); 87} 88 89void UserAddingScreenImpl::OnDisplayHostCompletion() { 90 CHECK(IsRunning()); 91 display_host_ = NULL; 92 93 g_browser_process->platform_part()->SessionManager()->SetSessionState( 94 session_manager::SESSION_STATE_ACTIVE); 95 FOR_EACH_OBSERVER(Observer, observers_, OnUserAddingFinished()); 96} 97 98// static 99UserAddingScreenImpl* UserAddingScreenImpl::GetInstance() { 100 return Singleton<UserAddingScreenImpl>::get(); 101} 102 103UserAddingScreenImpl::UserAddingScreenImpl() 104 : display_host_(NULL), im_controller_(this) { 105} 106 107UserAddingScreenImpl::~UserAddingScreenImpl() { 108} 109 110} // anonymous namespace 111 112UserAddingScreen::UserAddingScreen() {} 113UserAddingScreen::~UserAddingScreen() {} 114 115UserAddingScreen* UserAddingScreen::Get() { 116 return UserAddingScreenImpl::GetInstance(); 117} 118 119} // namespace chromeos 120 121