blob: eea0ea9d7abac5ce53a476263e8c8fb98a4e7ef6 [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/ash/login/user_adding_screen.h"
#include "base/functional/bind.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/singleton.h"
#include "base/observer_list.h"
#include "chrome/browser/ash/login/screens/user_selection_screen.h"
#include "chrome/browser/ui/ash/login/login_display_host.h"
#include "chrome/browser/ui/ash/login/login_display_host_mojo.h"
#include "chrome/browser/ui/ash/login/user_adding_screen_input_methods_controller.h"
#include "chrome/browser/ui/ash/wallpaper/wallpaper_controller_client_impl.h"
#include "components/session_manager/core/session_manager.h"
#include "components/session_manager/session_manager_types.h"
#include "components/user_manager/user_manager.h"
namespace ash {
namespace {
class UserAddingScreenImpl : public UserAddingScreen {
public:
void Start() override;
void Cancel() override;
bool IsRunning() override;
void AddObserver(UserAddingScreen::Observer* observer) override;
void RemoveObserver(UserAddingScreen::Observer* observer) override;
static UserAddingScreenImpl* GetInstance();
private:
friend struct base::DefaultSingletonTraits<UserAddingScreenImpl>;
void OnDisplayHostCompletion();
UserAddingScreenImpl();
~UserAddingScreenImpl() override;
base::ObserverList<UserAddingScreen::Observer>::UncheckedAndDanglingUntriaged
observers_;
raw_ptr<LoginDisplayHost, DanglingUntriaged> display_host_;
UserAddingScreenInputMethodsController im_controller_;
};
void UserAddingScreenImpl::Start() {
CHECK(!IsRunning());
display_host_ = new LoginDisplayHostMojo(DisplayedScreen::USER_ADDING_SCREEN);
// This triggers input method manager to filter login screen methods. This
// should happen before setting user input method, which happens when focusing
// user pod (triggered by SetSessionState)"
for (auto& observer : observers_) {
observer.OnBeforeUserAddingScreenStarted();
}
session_manager::SessionManager::Get()->SetSessionState(
session_manager::SessionState::LOGIN_SECONDARY);
display_host_->StartUserAdding(base::BindOnce(
&UserAddingScreenImpl::OnDisplayHostCompletion, base::Unretained(this)));
}
void UserAddingScreenImpl::Cancel() {
CHECK(IsRunning());
display_host_->CancelUserAdding();
// Reset wallpaper if cancel adding user from multiple user sign in page.
if (user_manager::UserManager::Get()->IsUserLoggedIn()) {
WallpaperControllerClientImpl::Get()->ShowUserWallpaper(
user_manager::UserManager::Get()->GetActiveUser()->GetAccountId());
}
}
bool UserAddingScreenImpl::IsRunning() {
return display_host_ != nullptr;
}
void UserAddingScreenImpl::AddObserver(UserAddingScreen::Observer* observer) {
observers_.AddObserver(observer);
}
void UserAddingScreenImpl::RemoveObserver(
UserAddingScreen::Observer* observer) {
observers_.RemoveObserver(observer);
}
void UserAddingScreenImpl::OnDisplayHostCompletion() {
CHECK(IsRunning());
display_host_ = nullptr;
session_manager::SessionManager::Get()->SetSessionState(
session_manager::SessionState::ACTIVE);
for (auto& observer : observers_) {
observer.OnUserAddingFinished();
}
}
// static
UserAddingScreenImpl* UserAddingScreenImpl::GetInstance() {
return base::Singleton<UserAddingScreenImpl>::get();
}
UserAddingScreenImpl::UserAddingScreenImpl()
: display_host_(nullptr), im_controller_(this) {}
UserAddingScreenImpl::~UserAddingScreenImpl() {}
} // anonymous namespace
UserAddingScreen::UserAddingScreen() {}
UserAddingScreen::~UserAddingScreen() {}
UserAddingScreen* UserAddingScreen::Get() {
return UserAddingScreenImpl::GetInstance();
}
} // namespace ash