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/chromeos/login/helper.h" 13 #include "chrome/browser/chromeos/login/ui/login_display_host_impl.h" 14 #include "chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.h" 15 #include "ui/gfx/rect.h" 16 #include "ui/gfx/size.h" 17 18 namespace chromeos { 19 20 namespace { 21 22 class UserAddingScreenImpl : public UserAddingScreen { 23 public: 24 virtual void Start() OVERRIDE; 25 virtual void Cancel() OVERRIDE; 26 virtual bool IsRunning() OVERRIDE; 27 28 virtual void AddObserver(Observer* observer) OVERRIDE; 29 virtual void RemoveObserver(Observer* observer) OVERRIDE; 30 31 static UserAddingScreenImpl* GetInstance(); 32 private: 33 friend struct DefaultSingletonTraits<UserAddingScreenImpl>; 34 35 void OnDisplayHostCompletion(); 36 37 UserAddingScreenImpl(); 38 virtual ~UserAddingScreenImpl(); 39 40 ObserverList<Observer> observers_; 41 LoginDisplayHost* display_host_; 42 }; 43 44 void UserAddingScreenImpl::Start() { 45 CHECK(!IsRunning()); 46 gfx::Rect screen_bounds(chromeos::CalculateScreenBounds(gfx::Size())); 47 display_host_ = new chromeos::LoginDisplayHostImpl(screen_bounds); 48 display_host_->StartUserAdding( 49 base::Bind(&UserAddingScreenImpl::OnDisplayHostCompletion, 50 base::Unretained(this))); 51 FOR_EACH_OBSERVER(Observer, observers_, OnUserAddingStarted()); 52 } 53 54 void UserAddingScreenImpl::Cancel() { 55 CHECK(IsRunning()); 56 57 // Make sure that system tray is enabled after this flow. 58 ash::Shell::GetInstance()->GetPrimarySystemTray()->SetEnabled(true); 59 display_host_->Finalize(); 60 61 // Reset wallpaper if cancel adding user from multiple user sign in page. 62 if (UserManager::Get()->IsUserLoggedIn()) { 63 WallpaperManager::Get()->SetUserWallpaperDelayed( 64 UserManager::Get()->GetActiveUser()->email()); 65 } 66 } 67 68 bool UserAddingScreenImpl::IsRunning() { 69 return display_host_ != NULL; 70 } 71 72 void UserAddingScreenImpl::AddObserver(Observer* observer) { 73 observers_.AddObserver(observer); 74 } 75 76 void UserAddingScreenImpl::RemoveObserver(Observer* observer) { 77 observers_.RemoveObserver(observer); 78 } 79 80 void UserAddingScreenImpl::OnDisplayHostCompletion() { 81 CHECK(IsRunning()); 82 display_host_ = NULL; 83 FOR_EACH_OBSERVER(Observer, observers_, OnUserAddingFinished()); 84 } 85 86 // static 87 UserAddingScreenImpl* UserAddingScreenImpl::GetInstance() { 88 return Singleton<UserAddingScreenImpl>::get(); 89 } 90 91 UserAddingScreenImpl::UserAddingScreenImpl() 92 : display_host_(NULL) { 93 } 94 95 UserAddingScreenImpl::~UserAddingScreenImpl() { 96 } 97 98 } // anonymous namespace 99 100 UserAddingScreen::UserAddingScreen() {} 101 UserAddingScreen::~UserAddingScreen() {} 102 103 UserAddingScreen* UserAddingScreen::Get() { 104 return UserAddingScreenImpl::GetInstance(); 105 } 106 107 } // namespace chromeos 108 109