blob: f8715f2eee29cdf8ef9c47f973aa757fb60a3218 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/webui/chromeos/login/wait_for_container_ready_screen_handler.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/login/oobe_screen.h"
#include "chrome/browser/chromeos/login/screens/wait_for_container_ready_screen.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
#include "chrome/grit/generated_resources.h"
#include "components/login/localized_values_builder.h"
namespace {
constexpr char kJsScreenPath[] = "login.WaitForContainerReadyScreen";
constexpr base::TimeDelta kWaitingTimeout = base::TimeDelta::FromMinutes(1);
} // namespace
namespace chromeos {
WaitForContainerReadyScreenHandler::WaitForContainerReadyScreenHandler()
: BaseScreenHandler(kScreenId), weak_ptr_factory_(this) {
set_call_js_prefix(kJsScreenPath);
}
WaitForContainerReadyScreenHandler::~WaitForContainerReadyScreenHandler() {
if (screen_) {
screen_->OnViewDestroyed(this);
}
timer_.Stop();
arc::ArcSessionManager::Get()->RemoveObserver(this);
if (!profile_)
return;
ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_);
if (prefs)
prefs->RemoveObserver(this);
}
void WaitForContainerReadyScreenHandler::DeclareLocalizedValues(
::login::LocalizedValuesBuilder* builder) {
builder->Add("waitForContainerReadyTitle",
IDS_WAIT_FOR_CONTAINER_READY_TITLE);
builder->Add("waitForContainerReadyIntroMessage",
IDS_WAIT_FOR_CONTAINER_READY_INTRO_MESSAGE);
builder->Add("voiceInteractionLogo", IDS_VOICE_INTERACTION_LOGO);
}
void WaitForContainerReadyScreenHandler::Bind(
WaitForContainerReadyScreen* screen) {
BaseScreenHandler::SetBaseScreen(screen);
screen_ = screen;
if (page_is_ready())
Initialize();
}
void WaitForContainerReadyScreenHandler::Unbind() {
screen_ = nullptr;
BaseScreenHandler::SetBaseScreen(nullptr);
timer_.Stop();
}
void WaitForContainerReadyScreenHandler::Show() {
if (!page_is_ready() || !screen_) {
show_on_init_ = true;
return;
}
if (is_app_list_ready_) {
NotifyContainerReady();
return;
}
timer_.Start(
FROM_HERE, kWaitingTimeout,
base::Bind(&WaitForContainerReadyScreenHandler::OnMaxContainerWaitTimeout,
weak_ptr_factory_.GetWeakPtr()));
ShowScreen(kScreenId);
}
void WaitForContainerReadyScreenHandler::Hide() {}
void WaitForContainerReadyScreenHandler::OnPackageListInitialRefreshed() {
is_app_list_ready_ = true;
if (!screen_)
return;
// TODO(updowndota): Remove the temporary delay after the potential racing
// issue is eliminated.
timer_.Stop();
timer_.Start(
FROM_HERE, base::TimeDelta::FromSeconds(5),
base::Bind(&WaitForContainerReadyScreenHandler::NotifyContainerReady,
weak_ptr_factory_.GetWeakPtr()));
}
void WaitForContainerReadyScreenHandler::OnArcErrorShowRequested(
ArcSupportHost::Error error) {
// Error occurs during Arc provisioning, close the screen.
if (screen_)
screen_->OnContainerError();
}
void WaitForContainerReadyScreenHandler::Initialize() {
profile_ = ProfileManager::GetPrimaryUserProfile();
ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_);
if (prefs) {
is_app_list_ready_ = prefs->package_list_initial_refreshed();
if (!is_app_list_ready_)
prefs->AddObserver(this);
}
arc::ArcSessionManager::Get()->AddObserver(this);
if (!screen_ || !show_on_init_)
return;
Show();
show_on_init_ = false;
}
void WaitForContainerReadyScreenHandler::OnMaxContainerWaitTimeout() {
// TODO(updowndota): Add histogram to Voice Interaction OptIn flow.
if (screen_)
screen_->OnContainerError();
}
void WaitForContainerReadyScreenHandler::NotifyContainerReady() {
if (screen_)
screen_->OnContainerReady();
}
} // namespace chromeos