Commit 23a950eb authored by Bruno Santos's avatar Bruno Santos Committed by Commit Bot

Add new screen for supervision transitions.

Screen will appear when user is re-authenticating after a supervision
transition occurs, if ARC++ was enabled when that happened.
Screen will remain visible until transition finishes or times out,
in which case it will clean up all ARC++ data.

Bug: 903851
Change-Id: Ia960355930fba05dd6ffd07b23693690c77b28b1
Reviewed-on: https://chromium-review.googlesource.com/c/1340891
Commit-Queue: Bruno Santos <brunoad@google.com>
Reviewed-by: default avatarJacob Dufault <jdufault@chromium.org>
Reviewed-by: default avatarYury Khmel <khmel@chromium.org>
Reviewed-by: default avatarMichael Giuffrida <michaelpg@chromium.org>
Cr-Commit-Position: refs/heads/master@{#615675}
parent e9cdb6f0
......@@ -3302,6 +3302,26 @@
Please wait...
</message>
<!-- Supervision transition OOBE screen. -->
<message name="IDS_REMOVING_SUPERVISION_TITLE" desc="Title of the supervision transition OOBE screen when stopping supervision.">
Stopping supervision...
</message>
<message name="IDS_ADDING_SUPERVISION_TITLE" desc="Title of the supervision transition OOBE screen when adding supervision.">
Setting up supervision...
</message>
<message name="IDS_SUPERVISION_TRANSITION_MESSAGE" desc="Introduction message for the supervision transition OOBE screen.">
Keep device turned on
</message>
<message name="IDS_SUPERVISION_TRANSITION_ERROR_TITLE" desc="Title of the supervision transition OOBE error screen.">
Something went wrong
</message>
<message name="IDS_SUPERVISION_TRANSITION_ERROR_MESSAGE" desc="Introduction message for the supervision transition OOBE error screen.">
Data from some apps may be lost
</message>
<message name="IDS_SUPERVISION_TRANSITION_ERROR_BUTTON" desc="Button label for acknowledging that supervision transition failed.">
OK
</message>
<!-- Print Job Notification -->
<message name="IDS_PRINT_JOB_NOTIFICATION_DISPLAY_SOURCE" desc="The context title of printing notification.">
Print
......
87a3260f32d7afdb64aaee3a6a9cd4cf9b8a2703
\ No newline at end of file
945a9188f00715d169a8b5a0cc4edc9c680666e9
\ No newline at end of file
90bdaa3753fc18488ca98cb40dbb706cfebdf522
\ No newline at end of file
90bdaa3753fc18488ca98cb40dbb706cfebdf522
\ No newline at end of file
90bdaa3753fc18488ca98cb40dbb706cfebdf522
\ No newline at end of file
87a3260f32d7afdb64aaee3a6a9cd4cf9b8a2703
\ No newline at end of file
......@@ -670,6 +670,7 @@
</if>
<if expr="chromeos">
<include name="IDR_ASSISTANT_LOGO_PNG" file="resources\chromeos\assistant_optin\assistant_logo.png" type="BINDATA" />
<include name="IDR_SUPERVISION_ICON_PNG" file="resources\chromeos\supervision\supervision_icon.png" type="BINDATA" />
</if>
<if expr="safe_browsing_mode == 1">
<include name="IDR_RESET_PASSWORD_HTML" file="resources\reset_password\reset_password.html" type="BINDATA" compress="gzip" />
......
......@@ -1230,6 +1230,9 @@ source_set("chromeos") {
"login/screens/reset_view.h",
"login/screens/screen_exit_code.cc",
"login/screens/screen_exit_code.h",
"login/screens/supervision_transition_screen.cc",
"login/screens/supervision_transition_screen.h",
"login/screens/supervision_transition_screen_view.h",
"login/screens/sync_consent_screen.cc",
"login/screens/sync_consent_screen.h",
"login/screens/sync_consent_screen_view.h",
......@@ -2039,6 +2042,8 @@ static_library("test_support") {
"login/screens/mock_model_view_channel.h",
"login/screens/mock_network_screen.cc",
"login/screens/mock_network_screen.h",
"login/screens/mock_supervision_transition_screen.cc",
"login/screens/mock_supervision_transition_screen.h",
"login/screens/mock_update_screen.cc",
"login/screens/mock_update_screen.h",
"login/screens/mock_welcome_screen.cc",
......
......@@ -51,6 +51,7 @@ const char* kScreenNames[] = {
"encryption-migration", // SCREEN_ENCRYPTION_MIGRATION
"voice-interaction-value-prop", // SCREEN_VOICE_INTERACTION_VALUE_PROP
"wait-for-container-ready", // SCREEN_WAIT_FOR_CONTAINTER_READY
"supervision-transition", // SCREEN_SUPERVISION_TRANSITION
"update-required", // SCREEN_UPDATE_REQUIRED
"assistant-optin-flow", // SCREEN_ASSISTANT_OPTIN_FLOW
"login", // SCREEN_SPECIAL_LOGIN
......
......@@ -49,6 +49,7 @@ enum class OobeScreen : unsigned int {
SCREEN_ENCRYPTION_MIGRATION,
SCREEN_VOICE_INTERACTION_VALUE_PROP,
SCREEN_WAIT_FOR_CONTAINER_READY,
SCREEN_SUPERVISION_TRANSITION,
SCREEN_UPDATE_REQUIRED,
SCREEN_ASSISTANT_OPTIN_FLOW,
......
......@@ -33,6 +33,7 @@ class ScreenManager {
friend class WizardControllerOobeResumeTest;
friend class WizardControllerBrokenLocalStateTest;
friend class WizardControllerOobeConfigurationTest;
friend class WizardControllerSupervisionTransitionOobeTest;
// Created screens.
std::map<OobeScreen, std::unique_ptr<BaseScreen>> screens_;
......
// Copyright (c) 2018 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/chromeos/login/screens/mock_supervision_transition_screen.h"
using ::testing::_;
using ::testing::AtLeast;
namespace chromeos {
MockSupervisionTransitionScreen::MockSupervisionTransitionScreen(
BaseScreenDelegate* base_screen_delegate,
SupervisionTransitionScreenView* view)
: SupervisionTransitionScreen(base_screen_delegate, view) {}
MockSupervisionTransitionScreen::~MockSupervisionTransitionScreen() = default;
MockSupervisionTransitionScreenView::MockSupervisionTransitionScreenView() {
EXPECT_CALL(*this, MockBind(_)).Times(AtLeast(1));
}
MockSupervisionTransitionScreenView::~MockSupervisionTransitionScreenView() {
if (screen_)
screen_->OnViewDestroyed(this);
}
void MockSupervisionTransitionScreenView::Bind(
SupervisionTransitionScreen* screen) {
screen_ = screen;
MockBind(screen);
}
void MockSupervisionTransitionScreenView::Unbind() {
screen_ = nullptr;
MockUnbind();
}
} // namespace chromeos
// Copyright (c) 2018 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.
#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_MOCK_SUPERVISION_TRANSITION_SCREEN_H_
#define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_MOCK_SUPERVISION_TRANSITION_SCREEN_H_
#include "chrome/browser/chromeos/login/screens/base_screen_delegate.h"
#include "chrome/browser/chromeos/login/screens/supervision_transition_screen.h"
#include "chrome/browser/chromeos/login/screens/supervision_transition_screen_view.h"
#include "testing/gmock/include/gmock/gmock.h"
namespace chromeos {
class MockSupervisionTransitionScreen : public SupervisionTransitionScreen {
public:
MockSupervisionTransitionScreen(BaseScreenDelegate* base_screen_delegate,
SupervisionTransitionScreenView* view);
virtual ~MockSupervisionTransitionScreen();
MOCK_METHOD0(Show, void());
MOCK_METHOD0(Hide, void());
private:
DISALLOW_COPY_AND_ASSIGN(MockSupervisionTransitionScreen);
};
class MockSupervisionTransitionScreenView
: public SupervisionTransitionScreenView {
public:
MockSupervisionTransitionScreenView();
virtual ~MockSupervisionTransitionScreenView();
void Bind(SupervisionTransitionScreen* screen) override;
void Unbind() override;
MOCK_METHOD0(Show, void());
MOCK_METHOD0(Hide, void());
MOCK_METHOD1(MockBind, void(SupervisionTransitionScreen* screen));
MOCK_METHOD0(MockUnbind, void());
private:
SupervisionTransitionScreen* screen_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(MockSupervisionTransitionScreenView);
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_MOCK_SUPERVISION_TRANSITION_SCREEN_H_
......@@ -104,6 +104,8 @@ std::string ExitCodeToString(ScreenExitCode code) {
return "ASSISTANT_OPTIN_FLOW_FINISHED";
case ScreenExitCode::MULTIDEVICE_SETUP_FINISHED:
return "MULTIDEVICE_SETUP_FINISHED";
case ScreenExitCode::SUPERVISION_TRANSITION_FINISHED:
return "SUPERVISION_TRANSITION_FINISHED";
case ScreenExitCode::EXIT_CODES_COUNT:
default:
NOTREACHED();
......
......@@ -74,6 +74,7 @@ enum class ScreenExitCode {
ASSISTANT_OPTIN_FLOW_FINISHED = 47,
MULTIDEVICE_SETUP_FINISHED = 48,
UPDATE_REJECT_OVER_CELLULAR = 49,
SUPERVISION_TRANSITION_FINISHED = 50,
EXIT_CODES_COUNT // not a real code, must be the last
};
......
// Copyright 2018 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/chromeos/login/screens/supervision_transition_screen.h"
#include "chrome/browser/chromeos/login/screens/base_screen_delegate.h"
#include "chrome/browser/chromeos/login/screens/supervision_transition_screen_view.h"
namespace chromeos {
SupervisionTransitionScreen::SupervisionTransitionScreen(
BaseScreenDelegate* base_screen_delegate,
SupervisionTransitionScreenView* view)
: BaseScreen(base_screen_delegate,
OobeScreen::SCREEN_SUPERVISION_TRANSITION),
view_(view) {
if (view_)
view_->Bind(this);
}
SupervisionTransitionScreen::~SupervisionTransitionScreen() {
if (view_)
view_->Unbind();
}
void SupervisionTransitionScreen::Show() {
if (view_)
view_->Show();
}
void SupervisionTransitionScreen::Hide() {
if (view_)
view_->Hide();
}
void SupervisionTransitionScreen::OnViewDestroyed(
SupervisionTransitionScreenView* view) {
if (view_ == view)
view_ = nullptr;
}
void SupervisionTransitionScreen::OnSupervisionTransitionFinished() {
Finish(ScreenExitCode::SUPERVISION_TRANSITION_FINISHED);
}
} // namespace chromeos
// Copyright 2018 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.
#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_SUPERVISION_TRANSITION_SCREEN_H_
#define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_SUPERVISION_TRANSITION_SCREEN_H_
#include <string>
#include "base/macros.h"
#include "chrome/browser/chromeos/login/screens/base_screen.h"
namespace chromeos {
class SupervisionTransitionScreenView;
class BaseScreenDelegate;
class SupervisionTransitionScreen : public BaseScreen {
public:
SupervisionTransitionScreen(BaseScreenDelegate* base_screen_delegate,
SupervisionTransitionScreenView* view);
~SupervisionTransitionScreen() override;
// BaseScreen:
void Show() override;
void Hide() override;
// Called when view is destroyed so there's no dead reference to it.
void OnViewDestroyed(SupervisionTransitionScreenView* view_);
// Called when transition has finished, exits the screen.
void OnSupervisionTransitionFinished();
private:
SupervisionTransitionScreenView* view_;
DISALLOW_COPY_AND_ASSIGN(SupervisionTransitionScreen);
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_SUPERVISION_TRANSITION_SCREEN_H_
// 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.
#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_SUPERVISION_TRANSITION_SCREEN_VIEW_H_
#define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_SUPERVISION_TRANSITION_SCREEN_VIEW_H_
#include "chrome/browser/chromeos/login/oobe_screen.h"
namespace chromeos {
class SupervisionTransitionScreen;
// Interface for dependency injection between SupervisionTransitionScreen
// and its WebUI representation.
class SupervisionTransitionScreenView {
public:
constexpr static OobeScreen kScreenId =
OobeScreen::SCREEN_SUPERVISION_TRANSITION;
virtual ~SupervisionTransitionScreenView() {}
virtual void Bind(SupervisionTransitionScreen* screen) = 0;
virtual void Unbind() = 0;
virtual void Show() = 0;
virtual void Hide() = 0;
protected:
SupervisionTransitionScreenView() = default;
private:
DISALLOW_COPY_AND_ASSIGN(SupervisionTransitionScreenView);
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_SUPERVISION_TRANSITION_SCREEN_VIEW_H_
......@@ -1674,6 +1674,11 @@ bool UserSessionManager::InitializeUserSession(Profile* profile) {
ActivateWizard(OobeScreen::SCREEN_TERMS_OF_SERVICE);
return false;
} else if (!user_manager->IsCurrentUserNew() &&
arc::GetSupervisionTransition(profile) !=
arc::ArcSupervisionTransition::NO_TRANSITION) {
ActivateWizard(OobeScreen::SCREEN_SUPERVISION_TRANSITION);
return false;
}
}
......
......@@ -64,6 +64,7 @@
#include "chrome/browser/chromeos/login/screens/network_screen.h"
#include "chrome/browser/chromeos/login/screens/recommend_apps_screen.h"
#include "chrome/browser/chromeos/login/screens/reset_screen.h"
#include "chrome/browser/chromeos/login/screens/supervision_transition_screen.h"
#include "chrome/browser/chromeos/login/screens/sync_consent_screen.h"
#include "chrome/browser/chromeos/login/screens/terms_of_service_screen.h"
#include "chrome/browser/chromeos/login/screens/update_required_screen.h"
......@@ -521,6 +522,9 @@ std::unique_ptr<BaseScreen> WizardController::CreateScreen(OobeScreen screen) {
} else if (screen == OobeScreen::SCREEN_WAIT_FOR_CONTAINER_READY) {
return std::make_unique<WaitForContainerReadyScreen>(
this, oobe_ui->GetWaitForContainerReadyScreenView());
} else if (screen == OobeScreen::SCREEN_SUPERVISION_TRANSITION) {
return std::make_unique<SupervisionTransitionScreen>(
this, oobe_ui->GetSupervisionTransitionScreenView());
} else if (screen == OobeScreen::SCREEN_UPDATE_REQUIRED) {
return std::make_unique<UpdateRequiredScreen>(
this, oobe_ui->GetUpdateRequiredScreenView());
......@@ -810,6 +814,13 @@ void WizardController::ShowWaitForContainerReadyScreen() {
SetCurrentScreen(GetScreen(OobeScreen::SCREEN_WAIT_FOR_CONTAINER_READY));
}
void WizardController::ShowSupervisionTransitionScreen() {
VLOG(1) << "Showing supervision transition screen.";
UpdateStatusAreaVisibilityForScreen(
OobeScreen::SCREEN_SUPERVISION_TRANSITION);
SetCurrentScreen(GetScreen(OobeScreen::SCREEN_SUPERVISION_TRANSITION));
}
void WizardController::ShowUpdateRequiredScreen() {
SetCurrentScreen(GetScreen(OobeScreen::SCREEN_UPDATE_REQUIRED));
}
......@@ -1151,6 +1162,10 @@ void WizardController::OnWaitForContainerReadyFinished() {
StartVoiceInteractionSetupWizard();
}
void WizardController::OnSupervisionTransitionFinished() {
OnOobeFlowFinished();
}
void WizardController::OnAssistantOptInFlowFinished() {
ShowMultiDeviceSetupScreen();
}
......@@ -1199,7 +1214,8 @@ void WizardController::OnDemoPreferencesCanceled() {
}
void WizardController::OnOobeFlowFinished() {
if (is_in_session_oobe_) {
if (is_in_session_oobe_ && current_screen_->screen_id() !=
OobeScreen::SCREEN_SUPERVISION_TRANSITION) {
GetLoginDisplayHost()->SetStatusAreaVisible(true);
GetLoginDisplayHost()->Finalize(base::OnceClosure());
return;
......@@ -1398,6 +1414,7 @@ void WizardController::UpdateStatusAreaVisibilityForScreen(OobeScreen screen) {
screen == OobeScreen::SCREEN_KIOSK_AUTOLAUNCH ||
screen == OobeScreen::SCREEN_OOBE_ENABLE_DEBUGGING ||
screen == OobeScreen::SCREEN_WRONG_HWID ||
screen == OobeScreen::SCREEN_SUPERVISION_TRANSITION ||
screen == OobeScreen::SCREEN_ARC_KIOSK_SPLASH ||
screen == OobeScreen::SCREEN_OOBE_CONTROLLER_PAIRING ||
screen == OobeScreen::SCREEN_OOBE_HOST_PAIRING) {
......@@ -1509,6 +1526,8 @@ void WizardController::AdvanceToScreen(OobeScreen screen) {
ShowFingerprintSetupScreen();
} else if (screen == OobeScreen::SCREEN_MARKETING_OPT_IN) {
ShowMarketingOptInScreen();
} else if (screen == OobeScreen::SCREEN_SUPERVISION_TRANSITION) {
ShowSupervisionTransitionScreen();
} else if (screen != OobeScreen::SCREEN_TEST_NO_WINDOW) {
if (is_out_of_box_) {
time_oobe_started_ = base::Time::Now();
......@@ -1697,6 +1716,9 @@ void WizardController::OnExit(ScreenExitCode exit_code) {
case ScreenExitCode::MULTIDEVICE_SETUP_FINISHED:
OnMultiDeviceSetupFinished();
break;
case ScreenExitCode::SUPERVISION_TRANSITION_FINISHED:
OnSupervisionTransitionFinished();
break;
default:
NOTREACHED();
}
......
......@@ -195,6 +195,7 @@ class WizardController : public BaseScreenDelegate,
void ShowEncryptionMigrationScreen();
void ShowVoiceInteractionValuePropScreen();
void ShowWaitForContainerReadyScreen();
void ShowSupervisionTransitionScreen();
void ShowUpdateRequiredScreen();
void ShowAssistantOptInFlowScreen();
void ShowMultiDeviceSetupScreen();
......@@ -247,6 +248,7 @@ class WizardController : public BaseScreenDelegate,
void OnDemoPreferencesContinued();
void OnDemoPreferencesCanceled();
void OnWaitForContainerReadyFinished();
void OnSupervisionTransitionFinished();
void OnAssistantOptInFlowFinished();
void OnMultiDeviceSetupFinished();
void OnOobeFlowFinished();
......@@ -469,6 +471,7 @@ class WizardController : public BaseScreenDelegate,
friend class WizardControllerFlowTest;
friend class WizardControllerOobeConfigurationTest;
friend class WizardControllerOobeResumeTest;
friend class WizardControllerSupervisionTransitionOobeTest;
std::unique_ptr<AccessibilityStatusSubscription> accessibility_subscription_;
......
......@@ -38,6 +38,7 @@
#include "chrome/browser/chromeos/login/screens/mock_enable_debugging_screen.h"
#include "chrome/browser/chromeos/login/screens/mock_eula_screen.h"
#include "chrome/browser/chromeos/login/screens/mock_network_screen.h"
#include "chrome/browser/chromeos/login/screens/mock_supervision_transition_screen.h"
#include "chrome/browser/chromeos/login/screens/mock_update_screen.h"
#include "chrome/browser/chromeos/login/screens/mock_welcome_screen.h"
#include "chrome/browser/chromeos/login/screens/mock_wrong_hwid_screen.h"
......@@ -64,6 +65,7 @@
#include "chrome/common/pref_names.h"
#include "chrome/grit/generated_resources.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/testing_profile.h"
#include "chromeos/audio/cras_audio_handler.h"
#include "chromeos/chromeos_switches.h"
#include "chromeos/chromeos_test_utils.h"
......@@ -84,6 +86,8 @@
#include "components/prefs/pref_service.h"
#include "components/prefs/pref_service_factory.h"
#include "components/prefs/testing_pref_store.h"
#include "components/session_manager/core/session_manager.h"
#include "components/session_manager/session_manager_types.h"
#include "content/public/common/content_switches.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_utils.h"
......@@ -481,6 +485,68 @@ IN_PROC_BROWSER_TEST_F(WizardControllerTest, VolumeIsAdjustedForChromeVox) {
cras->GetOutputVolumePercent());
}
class WizardControllerSupervisionTransitionOobeTest
: public WizardControllerTest {
protected:
WizardControllerSupervisionTransitionOobeTest() = default;
void SetUpOnMainThread() override {
WizardControllerTest::SetUpOnMainThread();
// Setup existing user session and profile.
const AccountId test_account_id_ =
AccountId::FromUserEmailGaiaId("test@gmail.com", "123456");
session_manager::SessionManager::Get()->CreateSession(
test_account_id_, test_account_id_.GetUserEmail(),
/* is_child= */ false);
ProfileHelper::Get()->GetProfileByUserIdHashForTest(
test_account_id_.GetUserEmail());
// Pretend OOBE was complete.
StartupUtils::MarkOobeCompleted();
WizardController::default_controller()->is_official_build_ = true;
MOCK(mock_supervision_transition_screen_,
OobeScreen::SCREEN_SUPERVISION_TRANSITION,
MockSupervisionTransitionScreen, MockSupervisionTransitionScreenView);
}
void SetUpCommandLine(base::CommandLine* command_line) override {
command_line->AppendSwitch(switches::kLoginManager);
command_line->AppendSwitchASCII(switches::kLoginProfile,
TestingProfile::kTestUserProfileDir);
}
void OnSupervisionTransitionFinished() {
WizardController::default_controller()->OnExit(
ScreenExitCode::SUPERVISION_TRANSITION_FINISHED);
}
MockOutShowHide<MockSupervisionTransitionScreen,
MockSupervisionTransitionScreenView>*
mock_supervision_transition_screen_;
private:
DISALLOW_COPY_AND_ASSIGN(WizardControllerSupervisionTransitionOobeTest);
};
// Tests that when supervision transition screen finishes, session
// proceeds to ACTIVE state.
IN_PROC_BROWSER_TEST_F(WizardControllerSupervisionTransitionOobeTest,
SupervisionTransitionScreenFinished) {
EXPECT_CALL(*mock_supervision_transition_screen_, Show()).Times(1);
ASSERT_NE(session_manager::SessionManager::Get()->session_state(),
session_manager::SessionState::ACTIVE);
// Start from login screen.
LoginDisplayHost::default_host()->StartSignInScreen(LoginScreenContext());
// Advance to supervision transition screen.
WizardController::default_controller()->AdvanceToScreen(
OobeScreen::SCREEN_SUPERVISION_TRANSITION);
CheckCurrentScreen(OobeScreen::SCREEN_SUPERVISION_TRANSITION);
OnSupervisionTransitionFinished();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(session_manager::SessionManager::Get()->session_state(),
session_manager::SessionState::ACTIVE);
}
class TimeZoneTestRunner {
public:
void OnResolved() { loop_.Quit(); }
......@@ -2697,7 +2763,7 @@ IN_PROC_BROWSER_TEST_F(WizardControllerOobeConfigurationTest,
// TODO(khorimoto): Add tests for MultiDevice Setup UI.
static_assert(static_cast<int>(ScreenExitCode::EXIT_CODES_COUNT) == 50,
static_assert(static_cast<int>(ScreenExitCode::EXIT_CODES_COUNT) == 51,
"tests for new control flow are missing");
} // namespace chromeos
......@@ -26,6 +26,7 @@
<include src="oobe_reset_confirmation_overlay.html">
<include src="oobe_voice_interaction_value_prop.html">
<include src="oobe_wait_for_container_ready.html">
<include src="oobe_supervision_transition.html">
<include src="encryption_migration.html">
<include src="enrollment_license_card.html">
<include src="sync_consent.html">
......
......@@ -32,6 +32,7 @@
// <include src="encryption_migration.js">
// <include src="oobe_voice_interaction_value_prop.js">
// <include src="oobe_wait_for_container_ready.js">
// <include src="oobe_supervision_transition.js">
// <include src="enrollment_license_card.js">
// <include src="sync_consent.js">
// <include src="fingerprint_setup.js">
......
......@@ -33,6 +33,7 @@
<include src="oobe_welcome.html">
<include src="oobe_voice_interaction_value_prop.html">
<include src="oobe_wait_for_container_ready.html">
<include src="oobe_supervision_transition.html">
<include src="offline_ad_login.html">
<include src="active_directory_password_change.html">
<include src="arc_terms_of_service.html">
......
......@@ -46,6 +46,7 @@
// <include src="arc_terms_of_service.js">
// <include src="oobe_voice_interaction_value_prop.js">
// <include src="oobe_wait_for_container_ready.js">
// <include src="oobe_supervision_transition.js">
// <include src="enrollment_license_card.js">
// <include src="sync_consent.js">
// <include src="fingerprint_setup.js">
......
......@@ -57,6 +57,7 @@ cr.define('cr.ui.Oobe', function() {
login.EncryptionMigrationScreen.register();
login.VoiceInteractionValuePropScreen.register();
login.WaitForContainerReadyScreen.register();
login.SupervisionTransitionScreen.register();
login.UpdateRequiredScreen.register();
login.DemoSetupScreen.register();
login.DiscoverScreen.register();
......
......@@ -16,6 +16,7 @@ screen, it should be added to login_shared.html
<link rel="stylesheet" href="oobe_screen_user_image.css">
<link rel="stylesheet" href="oobe_screen_voice_interaction_value_prop.css">
<link rel="stylesheet" href="oobe_screen_wait_for_container_ready.css">
<link rel="stylesheet" href="oobe_screen_supervision_transition.css">
<link rel="stylesheet" href="screen_app_launch_splash.css">
<link rel="stylesheet" href="screen_arc_kiosk_splash.css">
......
......@@ -15,6 +15,7 @@
// <include src="oobe_screen_user_image.js">
// <include src="oobe_screen_voice_interaction_value_prop.js">
// <include src="oobe_screen_wait_for_container_ready.js">
// <include src="oobe_screen_supervision_transition.js">
// <include src="oobe_screen_assistant_optin_flow.js">
// <include src="oobe_select.js">
......
......@@ -5,6 +5,7 @@
<include src="oobe_screen_user_image.html">
<include src="oobe_screen_voice_interaction_value_prop.html">
<include src="oobe_screen_wait_for_container_ready.html">
<include src="oobe_screen_supervision_transition.html">
<include src="oobe_screen_assistant_optin_flow.html">
<include src="../../../../../ui/login/account_picker/screen_account_picker.html">
<include src="screen_arc_terms_of_service.html">
......
......@@ -57,6 +57,7 @@ cr.define('cr.ui.Oobe', function() {
login.EncryptionMigrationScreen.register();
login.VoiceInteractionValuePropScreen.register();
login.WaitForContainerReadyScreen.register();
login.SupervisionTransitionScreen.register();
login.UpdateRequiredScreen.register();
login.DiscoverScreen.register();
login.MarketingOptInScreen.register();
......
......@@ -5,6 +5,7 @@
<include src="oobe_screen_user_image.html">
<include src="oobe_screen_voice_interaction_value_prop.html">
<include src="oobe_screen_wait_for_container_ready.html">
<include src="oobe_screen_supervision_transition.html">
<include src="oobe_screen_assistant_optin_flow.html">
<include src="../../../../../ui/login/account_picker/md_screen_account_picker.html">
<include src="screen_arc_terms_of_service.html">
......
......@@ -66,6 +66,7 @@ cr.define('cr.ui.Oobe', function() {
login.ActiveDirectoryPasswordChangeScreen.register(/* lazyInit= */ true);
login.VoiceInteractionValuePropScreen.register();
login.WaitForContainerReadyScreen.register();
login.SupervisionTransitionScreen.register();
login.DemoSetupScreen.register();
login.DemoPreferencesScreen.register();
login.DiscoverScreen.register();
......
/* Copyright 2018 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. */
#supervision-transition {
display: flex;
flex-flow: column;
font-size: 16px;
min-height: 0;
}
<!-- Copyright 2018 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. -->
<div class="step faded hidden no-logo" id="supervision-transition"
role="group" hidden>
<supervision-transition-md id="supervision-transition-md">
</supervision-transition-md>
</div>
\ No newline at end of file
// Copyright 2018 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.
/**
* @fileoverview Oobe Supervision Transition screen implementation.
*/
login.createScreen(
'SupervisionTransitionScreen', 'supervision-transition', function() {
return {
/** @override */
get defaultControl() {
return $('supervision-transition-md');
},
/** @override */
onBeforeShow: function(data) {
Oobe.getInstance().headerHidden = true;
$('supervision-transition-md')
.setIsRemovingSupervision(
data['isRemovingSupervision'] ? true : false);
},
};
});
......@@ -14,6 +14,7 @@
<include src="oobe_screen_hid_detection.html">
<include src="oobe_screen_voice_interaction_value_prop.html">
<include src="oobe_screen_wait_for_container_ready.html">
<include src="oobe_screen_supervision_transition.html">
<include src="oobe_screen_demo_setup.html">
<include src="oobe_screen_demo_preferences.html">
<include src="oobe_screen_assistant_optin_flow.html">
......
/* Copyright 2018 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. */
paper-progress {
--paper-progress-active-color: rgb(66, 133, 244);
--paper-progress-container-color: rgb(206, 224, 252);
--paper-progress-secondary-color: rgb(66, 133, 244);
display: block;
height: 3px;
padding: 40px 0 0 0;
width: 100%;
}
<!-- Copyright 2018 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. -->
<dom-module id="supervision-transition-md">
<template>
<link rel="stylesheet" href="oobe_flex_layout.css">
<link rel="stylesheet" href="oobe_supervision_transition.css">
<oobe-dialog id="supervisionTransitionDialog">
<iron-icon src="chrome://oobe/supervision_icon.png" slot="oobe-icon">
</iron-icon>
<h1 slot="title" id="supervisionTitle">
<div hidden="[[isRemovingSupervision_]]">
$i18n{addingSupervisionTitle}
</div>
<div hidden="[[!isRemovingSupervision_]]">
$i18n{removingSupervisionTitle}
</div>
</h1>
<div slot="subtitle">$i18n{supervisionTransitionIntroMessage}</div>
<div slot="footer">
<paper-progress class="slow" indeterminate>
</paper-progress>
</div>
</oobe-dialog>
<oobe-dialog id="supervisionTransitionErrorDialog" has-buttons hidden>
<iron-icon src="chrome://oobe/supervision_icon.png" slot="oobe-icon">
</iron-icon>
<h1 slot="title">$i18n{supervisionTransitionErrorTitle}</h1>
<div slot="subtitle">$i18n{supervisionTransitionErrorMessage}</div>
<div slot="bottom-buttons" class="layout horizontal end-justified">
<oobe-text-button on-tap="onAcceptAndContinue_" inverse>
<div>$i18n{supervisionTransitionButton}</div>
</oobe-text-button>
</div>
</oobe-dialog>
</template>
</dom-module>
// Copyright 2018 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.
/**
* @fileoverview Polymer element for displaying material design supervision
* transition screen.
*/
Polymer({
is: 'supervision-transition-md',
behaviors: [OobeDialogHostBehavior],
properties: {
/**
* Flag that determines whether supervision is being removed or added.
*/
isRemovingSupervision_: Boolean,
},
setIsRemovingSupervision: function(is_removing_supervision) {
this.isRemovingSupervision_ = is_removing_supervision;
},
/** @override */
attached: function() {
cr.addWebUIListener(
'supervision-transition-failed',
this.showSupervisionTransitionFailedScreen_.bind(this));
},
/** @private */
showSupervisionTransitionFailedScreen_: function() {
this.$.supervisionTransitionDialog.hidden = true;
this.$.supervisionTransitionErrorDialog.hidden = false;
this.$.supervisionTransitionErrorDialog.show();
this.$.supervisionTransitionErrorDialog.focus();
},
/**
* On-tap event handler for OK button.
*
* @private
*/
onAcceptAndContinue_: function() {
chrome.send('finishSupervisionTransition');
},
});
......@@ -1608,6 +1608,8 @@ jumbo_split_static_library("ui") {
"webui/chromeos/login/screenlock_icon_source.h",
"webui/chromeos/login/signin_screen_handler.cc",
"webui/chromeos/login/signin_screen_handler.h",
"webui/chromeos/login/supervision_transition_screen_handler.cc",
"webui/chromeos/login/supervision_transition_screen_handler.h",
"webui/chromeos/login/sync_consent_screen_handler.cc",
"webui/chromeos/login/sync_consent_screen_handler.h",
"webui/chromeos/login/terms_of_service_screen_handler.cc",
......
......@@ -70,6 +70,7 @@
#include "chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/reset_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/supervision_transition_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/update_required_screen_handler.h"
......@@ -127,6 +128,7 @@ constexpr char kArcOverlayCSSPath[] = "overlay.css";
constexpr char kArcPlaystoreCSSPath[] = "playstore.css";
constexpr char kArcPlaystoreJSPath[] = "playstore.js";
constexpr char kArcPlaystoreLogoPath[] = "playstore.svg";
constexpr char kArcSupervisionIconPath[] = "supervision_icon.png";
constexpr char kCustomElementsHTMLPath[] = "custom_elements.html";
constexpr char kCustomElementsJSPath[] = "custom_elements.js";
constexpr char kCustomElementsUserPodHTMLPath[] =
......@@ -156,6 +158,7 @@ constexpr char kEnrollmentJSPath[] = "enrollment.js";
void AddProductLogoResources(content::WebUIDataSource* source) {
// Required for Assistant OOBE.
source->AddResourcePath(kArcAssistantLogoPath, IDR_ASSISTANT_LOGO_PNG);
source->AddResourcePath(kArcSupervisionIconPath, IDR_SUPERVISION_ICON_PNG);
#if defined(GOOGLE_CHROME_BUILD)
source->AddResourcePath(kLogo24PX1XSvgPath, IDR_PRODUCT_LOGO_24PX_1X);
......@@ -425,6 +428,8 @@ void OobeUI::ConfigureOobeDisplay() {
AddScreenHandler(std::make_unique<WaitForContainerReadyScreenHandler>());
AddScreenHandler(std::make_unique<SupervisionTransitionScreenHandler>());
AddScreenHandler(std::make_unique<UpdateRequiredScreenHandler>());
AddScreenHandler(std::make_unique<AssistantOptInFlowScreenHandler>());
......@@ -626,6 +631,10 @@ WaitForContainerReadyScreenView* OobeUI::GetWaitForContainerReadyScreenView() {
return GetView<WaitForContainerReadyScreenHandler>();
}
SupervisionTransitionScreenView* OobeUI::GetSupervisionTransitionScreenView() {
return GetView<SupervisionTransitionScreenHandler>();
}
UpdateRequiredView* OobeUI::GetUpdateRequiredScreenView() {
return GetView<UpdateRequiredScreenHandler>();
}
......
......@@ -74,6 +74,7 @@ class UpdateView;
class UpdateRequiredView;
class VoiceInteractionValuePropScreenView;
class WaitForContainerReadyScreenView;
class SupervisionTransitionScreenView;
class WelcomeView;
class WrongHWIDScreenView;
......@@ -141,6 +142,7 @@ class OobeUI : public ui::MojoWebUIController,
EncryptionMigrationScreenView* GetEncryptionMigrationScreenView();
VoiceInteractionValuePropScreenView* GetVoiceInteractionValuePropScreenView();
WaitForContainerReadyScreenView* GetWaitForContainerReadyScreenView();
SupervisionTransitionScreenView* GetSupervisionTransitionScreenView();
UpdateRequiredView* GetUpdateRequiredScreenView();
AssistantOptInFlowScreenView* GetAssistantOptInFlowScreenView();
MultiDeviceSetupScreenView* GetMultiDeviceSetupScreenView();
......
// Copyright 2018 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/supervision_transition_screen_handler.h"
#include "base/logging.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/arc/arc_session_manager.h"
#include "chrome/browser/chromeos/arc/arc_util.h"
#include "chrome/browser/chromeos/login/oobe_screen.h"
#include "chrome/browser/chromeos/login/screens/supervision_transition_screen.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/ash/login_screen_client.h"
#include "chrome/grit/generated_resources.h"
#include "components/arc/arc_prefs.h"
#include "components/login/localized_values_builder.h"
namespace {
constexpr char kJsScreenPath[] = "login.SupervisionTransitionScreen";
constexpr base::TimeDelta kWaitingTimeout = base::TimeDelta::FromMinutes(2);
} // namespace
namespace chromeos {
SupervisionTransitionScreenHandler::SupervisionTransitionScreenHandler()
: BaseScreenHandler(kScreenId) {
set_call_js_prefix(kJsScreenPath);
}
SupervisionTransitionScreenHandler::~SupervisionTransitionScreenHandler() {
if (screen_)
screen_->OnViewDestroyed(this);
timer_.Stop();
}
void SupervisionTransitionScreenHandler::DeclareLocalizedValues(
::login::LocalizedValuesBuilder* builder) {
builder->Add("removingSupervisionTitle", IDS_REMOVING_SUPERVISION_TITLE);
builder->Add("addingSupervisionTitle", IDS_ADDING_SUPERVISION_TITLE);
builder->Add("supervisionTransitionIntroMessage",
IDS_SUPERVISION_TRANSITION_MESSAGE);
builder->Add("supervisionTransitionErrorTitle",
IDS_SUPERVISION_TRANSITION_ERROR_TITLE);
builder->Add("supervisionTransitionErrorMessage",
IDS_SUPERVISION_TRANSITION_ERROR_MESSAGE);
builder->Add("supervisionTransitionButton",
IDS_SUPERVISION_TRANSITION_ERROR_BUTTON);
}
void SupervisionTransitionScreenHandler::RegisterMessages() {
AddCallback(
"finishSupervisionTransition",
&SupervisionTransitionScreenHandler::OnSupervisionTransitionFinished);
BaseScreenHandler::RegisterMessages();
}
void SupervisionTransitionScreenHandler::Bind(
SupervisionTransitionScreen* screen) {
BaseScreenHandler::SetBaseScreen(screen);
screen_ = screen;
if (page_is_ready())
Initialize();
}
void SupervisionTransitionScreenHandler::Unbind() {
screen_ = nullptr;
BaseScreenHandler::SetBaseScreen(nullptr);
timer_.Stop();
}
void SupervisionTransitionScreenHandler::Show() {
if (!page_is_ready() || !screen_) {
show_on_init_ = true;
return;
}
timer_.Start(
FROM_HERE, kWaitingTimeout,
base::BindOnce(
&SupervisionTransitionScreenHandler::OnSupervisionTransitionFailed,
weak_factory_.GetWeakPtr()));
registrar_.Init(profile_->GetPrefs());
registrar_.Add(
arc::prefs::kArcSupervisionTransition,
base::BindRepeating(
&SupervisionTransitionScreenHandler::OnSupervisionTransitionFinished,
weak_factory_.GetWeakPtr()));
LoginScreenClient::Get()->login_screen()->SetAllowLoginAsGuest(false);
LoginScreenClient::Get()->login_screen()->SetShowGuestButtonInOobe(false);
base::DictionaryValue data;
data.SetBoolean("isRemovingSupervision",
arc::GetSupervisionTransition(profile_) ==
arc::ArcSupervisionTransition::CHILD_TO_REGULAR);
ShowScreenWithData(kScreenId, &data);
}
void SupervisionTransitionScreenHandler::Hide() {}
void SupervisionTransitionScreenHandler::Initialize() {
profile_ = ProfileManager::GetPrimaryUserProfile();
if (!screen_ || !show_on_init_)
return;
Show();
show_on_init_ = false;
}
void SupervisionTransitionScreenHandler::OnSupervisionTransitionFailed() {
LOG(ERROR) << "Supervision transition failed; resetting ARC++ data.";
arc::ArcSessionManager::Get()->RequestArcDataRemoval();
arc::ArcSessionManager::Get()->StopAndEnableArc();
if (screen_) {
AllowJavascript();
FireWebUIListener("supervision-transition-failed");
}
}
void SupervisionTransitionScreenHandler::OnSupervisionTransitionFinished() {
if (screen_)
screen_->OnSupervisionTransitionFinished();
}
} // namespace chromeos
// Copyright 2018 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.
#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_SUPERVISION_TRANSITION_SCREEN_HANDLER_H_
#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_SUPERVISION_TRANSITION_SCREEN_HANDLER_H_
#include <memory>
#include <string>
#include "base/macros.h"
#include "base/timer/timer.h"
#include "chrome/browser/chromeos/login/screens/supervision_transition_screen_view.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h"
#include "components/prefs/pref_change_registrar.h"
namespace chromeos {
class SupervisionTransitionScreenHandler
: public BaseScreenHandler,
public SupervisionTransitionScreenView {
public:
SupervisionTransitionScreenHandler();
~SupervisionTransitionScreenHandler() override;
// BaseScreenHandler:
void DeclareLocalizedValues(
::login::LocalizedValuesBuilder* builder) override;
void RegisterMessages() override;
// SupervisionTransitionScreenView:
void Bind(SupervisionTransitionScreen* screen) override;
void Unbind() override;
void Show() override;
void Hide() override;
private:
// BaseScreenHandler:
void Initialize() override;
// Called when the max wait timeout is reached.
void OnSupervisionTransitionFailed();
void OnSupervisionTransitionFinished();
SupervisionTransitionScreen* screen_ = nullptr;
// Whether the screen should be shown right after initialization.
bool show_on_init_ = false;
// The primary user profile.
Profile* profile_ = nullptr;
// Timer used to exit the page when timeout reaches.
base::OneShotTimer timer_;
// Listens to pref changes.
PrefChangeRegistrar registrar_;
base::WeakPtrFactory<SupervisionTransitionScreenHandler> weak_factory_{this};
DISALLOW_COPY_AND_ASSIGN(SupervisionTransitionScreenHandler);
};
} // namespace chromeos
#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_SUPERVISION_TRANSITION_SCREEN_HANDLER_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment