Home | History | Annotate | Download | only in ui
      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