Commit 46eca389 authored by Yue Cen's avatar Yue Cen Committed by Commit Bot

Chrome OS: Implement UI for first login Recommend Apps screen.

This only contains the UI skeleton.

Bug: 835029
Cq-Include-Trybots: master.tryserver.chromium.linux:closure_compilation
Change-Id: I98f22b71dd3ab0a51e2f13ab96c54a011897a15d
Reviewed-on: https://chromium-review.googlesource.com/1016083
Commit-Queue: Yue Cen <rsgingerrs@chromium.org>
Reviewed-by: default avatarWenzhao (Colin) Zang <wzang@chromium.org>
Reviewed-by: default avatarAlexander Alekseev <alemate@chromium.org>
Cr-Commit-Position: refs/heads/master@{#553208}
parent 8e2f297b
...@@ -1753,6 +1753,18 @@ ...@@ -1753,6 +1753,18 @@
<message name="IDS_LOGIN_SYNC_CONSENT_SCREEN_ACCEPT_AND_CONTINUE" desc="The label on the button that closes dialog while accepting the selected settings."> <message name="IDS_LOGIN_SYNC_CONSENT_SCREEN_ACCEPT_AND_CONTINUE" desc="The label on the button that closes dialog while accepting the selected settings.">
Accept and continue Accept and continue
</message> </message>
<message name="IDS_LOGIN_RECOMMEND_APPS_SCREEN_TITLE" desc="The title of the dialog that recommend apps which user has installed in other devices">
Install apps from your other devices
</message>
<message name="IDS_LOGIN_RECOMMEND_APPS_SCREEN_DESCRIPTION" desc="The description of the 'Recommend Apps' section">
You have apps that are optimized for Chromebooks
</message>
<message name="IDS_LOGIN_RECOMMEND_APPS_SKIP" desc="The label on the button that skips installing any recommended apps">
Skip
</message>
<message name="IDS_LOGIN_RECOMMEND_APPS_INSTALL" desc="The label on the button that installs the user selected apps">
Install
</message>
<message name="IDS_DISABLED_ADD_USER_TOOLTIP" desc="Tooltip over disabled Add user button"> <message name="IDS_DISABLED_ADD_USER_TOOLTIP" desc="Tooltip over disabled Add user button">
The owner of this device has disabled new users from being added The owner of this device has disabled new users from being added
</message> </message>
......
...@@ -1039,6 +1039,9 @@ source_set("chromeos") { ...@@ -1039,6 +1039,9 @@ source_set("chromeos") {
"login/screens/network_screen.cc", "login/screens/network_screen.cc",
"login/screens/network_screen.h", "login/screens/network_screen.h",
"login/screens/network_view.h", "login/screens/network_view.h",
"login/screens/recommend_apps_screen.cc",
"login/screens/recommend_apps_screen.h",
"login/screens/recommend_apps_screen_view.h",
"login/screens/reset_screen.cc", "login/screens/reset_screen.cc",
"login/screens/reset_screen.h", "login/screens/reset_screen.h",
"login/screens/reset_view.h", "login/screens/reset_view.h",
......
...@@ -56,6 +56,7 @@ const char* kScreenNames[] = { ...@@ -56,6 +56,7 @@ const char* kScreenNames[] = {
"test:nowindow", // SCREEN_TEST_NO_WINDOW "test:nowindow", // SCREEN_TEST_NO_WINDOW
"sync-consent", // SCREEN_SYNC_CONSENT "sync-consent", // SCREEN_SYNC_CONSENT
"demo-setup", // SCREEN_OOBE_DEMO_SETUP "demo-setup", // SCREEN_OOBE_DEMO_SETUP
"recommend-apps", // SCREEN_RECOMMEND_APPS
"unknown", // SCREEN_UNKNOWN "unknown", // SCREEN_UNKNOWN
}; };
......
...@@ -60,6 +60,8 @@ enum class OobeScreen : unsigned int { ...@@ -60,6 +60,8 @@ enum class OobeScreen : unsigned int {
SCREEN_SYNC_CONSENT, SCREEN_SYNC_CONSENT,
SCREEN_OOBE_DEMO_SETUP, SCREEN_OOBE_DEMO_SETUP,
SCREEN_RECOMMEND_APPS,
SCREEN_UNKNOWN // This must always be the last element. SCREEN_UNKNOWN // This must always be the last element.
}; };
......
// 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/recommend_apps_screen.h"
namespace chromeos {
namespace {
constexpr const char kUserActionSkip[] = "recommendAppsSkip";
} // namespace
RecommendAppsScreen::RecommendAppsScreen(
BaseScreenDelegate* base_screen_delegate,
RecommendAppsScreenView* view)
: BaseScreen(base_screen_delegate, OobeScreen::SCREEN_RECOMMEND_APPS),
view_(view) {
DCHECK(view_);
view_->Bind(this);
}
RecommendAppsScreen::~RecommendAppsScreen() {
view_->Bind(NULL);
}
void RecommendAppsScreen::Show() {
view_->Show();
}
void RecommendAppsScreen::Hide() {
view_->Hide();
}
void RecommendAppsScreen::OnUserAction(const std::string& action_id) {
if (action_id == kUserActionSkip) {
Finish(ScreenExitCode::RECOMMEND_APPS_SKIPPED);
return;
}
BaseScreen::OnUserAction(action_id);
}
} // 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_RECOMMEND_APPS_SCREEN_H_
#define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_RECOMMEND_APPS_SCREEN_H_
#include <memory>
#include <string>
#include "base/macros.h"
#include "chrome/browser/chromeos/login/screens/base_screen.h"
#include "chrome/browser/chromeos/login/screens/recommend_apps_screen_view.h"
namespace chromeos {
class BaseScreenDelegate;
// This is Recommend Apps screen that is displayed as a part of user first
// sign-in flow.
class RecommendAppsScreen : public BaseScreen {
public:
RecommendAppsScreen(BaseScreenDelegate* base_screen_delegate,
RecommendAppsScreenView* view);
~RecommendAppsScreen() override;
// BaseScreen:
void Show() override;
void Hide() override;
void OnUserAction(const std::string& action_id) override;
private:
RecommendAppsScreenView* const view_;
DISALLOW_COPY_AND_ASSIGN(RecommendAppsScreen);
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_RECOMMEND_APPS_SCREEN_H_
// 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_RECOMMEND_APPS_SCREEN_VIEW_H_
#define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_RECOMMEND_APPS_SCREEN_VIEW_H_
#include "chrome/browser/chromeos/login/oobe_screen.h"
namespace chromeos {
class RecommendAppsScreen;
// Interface for dependency injection between RecommendAppsScreen and its
// WebUI representation.
class RecommendAppsScreenView {
public:
constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_RECOMMEND_APPS;
virtual ~RecommendAppsScreenView() = default;
// Sets screen this view belongs to.
virtual void Bind(RecommendAppsScreen* screen) = 0;
// Shows the contents of the screen.
virtual void Show() = 0;
// Hides the contents of the screen.
virtual void Hide() = 0;
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_RECOMMEND_APPS_SCREEN_VIEW_H_
...@@ -74,6 +74,10 @@ std::string ExitCodeToString(ScreenExitCode code) { ...@@ -74,6 +74,10 @@ std::string ExitCodeToString(ScreenExitCode code) {
return "SYNC_CONSENT_FINISHED"; return "SYNC_CONSENT_FINISHED";
case ScreenExitCode::DEMO_MODE_SETUP_CLOSED: case ScreenExitCode::DEMO_MODE_SETUP_CLOSED:
return "DEMO_MODE_SETUP_CLOSED"; return "DEMO_MODE_SETUP_CLOSED";
case ScreenExitCode::RECOMMEND_APPS_SKIPPED:
return "RECOMMEND_APPS_SKIPPED";
case ScreenExitCode::RECOMMEND_APPS_SELECTED:
return "RECOMMEND_APPS_SELECTED";
case ScreenExitCode::EXIT_CODES_COUNT: case ScreenExitCode::EXIT_CODES_COUNT:
default: default:
NOTREACHED(); NOTREACHED();
......
...@@ -58,6 +58,8 @@ enum class ScreenExitCode { ...@@ -58,6 +58,8 @@ enum class ScreenExitCode {
WAIT_FOR_CONTAINER_READY_ERROR = 31, WAIT_FOR_CONTAINER_READY_ERROR = 31,
SYNC_CONSENT_FINISHED = 32, SYNC_CONSENT_FINISHED = 32,
DEMO_MODE_SETUP_CLOSED = 33, DEMO_MODE_SETUP_CLOSED = 33,
RECOMMEND_APPS_SKIPPED = 34,
RECOMMEND_APPS_SELECTED = 35,
EXIT_CODES_COUNT // not a real code, must be the last EXIT_CODES_COUNT // not a real code, must be the last
}; };
......
...@@ -49,6 +49,7 @@ ...@@ -49,6 +49,7 @@
#include "chrome/browser/chromeos/login/screens/kiosk_enable_screen.h" #include "chrome/browser/chromeos/login/screens/kiosk_enable_screen.h"
#include "chrome/browser/chromeos/login/screens/network_error.h" #include "chrome/browser/chromeos/login/screens/network_error.h"
#include "chrome/browser/chromeos/login/screens/network_view.h" #include "chrome/browser/chromeos/login/screens/network_view.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/reset_screen.h"
#include "chrome/browser/chromeos/login/screens/sync_consent_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/terms_of_service_screen.h"
...@@ -129,7 +130,8 @@ const chromeos::OobeScreen kResumableScreens[] = { ...@@ -129,7 +130,8 @@ const chromeos::OobeScreen kResumableScreens[] = {
chromeos::OobeScreen::SCREEN_TERMS_OF_SERVICE, chromeos::OobeScreen::SCREEN_TERMS_OF_SERVICE,
chromeos::OobeScreen::SCREEN_SYNC_CONSENT, chromeos::OobeScreen::SCREEN_SYNC_CONSENT,
chromeos::OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE, chromeos::OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
chromeos::OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK}; chromeos::OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK,
chromeos::OobeScreen::SCREEN_RECOMMEND_APPS};
// Checks if device is in tablet mode, and that HID-detection screen is not // Checks if device is in tablet mode, and that HID-detection screen is not
// disabled by flag. // disabled by flag.
...@@ -416,6 +418,9 @@ BaseScreen* WizardController::CreateScreen(OobeScreen screen) { ...@@ -416,6 +418,9 @@ BaseScreen* WizardController::CreateScreen(OobeScreen screen) {
} else if (screen == OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE) { } else if (screen == OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE) {
return new ArcTermsOfServiceScreen( return new ArcTermsOfServiceScreen(
this, oobe_ui_->GetArcTermsOfServiceScreenView()); this, oobe_ui_->GetArcTermsOfServiceScreenView());
} else if (screen == OobeScreen::SCREEN_RECOMMEND_APPS) {
return new RecommendAppsScreen(this,
oobe_ui_->GetRecommendAppsScreenView());
} else if (screen == OobeScreen::SCREEN_WRONG_HWID) { } else if (screen == OobeScreen::SCREEN_WRONG_HWID) {
return new WrongHWIDScreen(this, oobe_ui_->GetWrongHWIDScreenView()); return new WrongHWIDScreen(this, oobe_ui_->GetWrongHWIDScreenView());
} else if (screen == OobeScreen::SCREEN_CREATE_SUPERVISED_USER_FLOW) { } else if (screen == OobeScreen::SCREEN_CREATE_SUPERVISED_USER_FLOW) {
...@@ -615,6 +620,13 @@ void WizardController::ShowArcTermsOfServiceScreen() { ...@@ -615,6 +620,13 @@ void WizardController::ShowArcTermsOfServiceScreen() {
} }
} }
void WizardController::ShowRecommendAppsScreen() {
// TODO(rsgingerrs): should maybe check if ToS has been accepted
VLOG(1) << "Showing Recommend Apps screen.";
UpdateStatusAreaVisibilityForScreen(OobeScreen::SCREEN_RECOMMEND_APPS);
SetCurrentScreen(GetScreen(OobeScreen::SCREEN_RECOMMEND_APPS));
}
void WizardController::ShowWrongHWIDScreen() { void WizardController::ShowWrongHWIDScreen() {
VLOG(1) << "Showing wrong HWID screen."; VLOG(1) << "Showing wrong HWID screen.";
UpdateStatusAreaVisibilityForScreen(OobeScreen::SCREEN_WRONG_HWID); UpdateStatusAreaVisibilityForScreen(OobeScreen::SCREEN_WRONG_HWID);
...@@ -918,6 +930,10 @@ void WizardController::OnArcTermsOfServiceAccepted() { ...@@ -918,6 +930,10 @@ void WizardController::OnArcTermsOfServiceAccepted() {
ShowUserImageScreen(); ShowUserImageScreen();
} }
void WizardController::OnRecommendAppsSkipped() {
OnOobeFlowFinished(); // TODO(rsgingerrs): there may be a next step?
}
void WizardController::OnVoiceInteractionValuePropSkipped() { void WizardController::OnVoiceInteractionValuePropSkipped() {
OnOobeFlowFinished(); OnOobeFlowFinished();
} }
...@@ -1192,6 +1208,8 @@ void WizardController::AdvanceToScreen(OobeScreen screen) { ...@@ -1192,6 +1208,8 @@ void WizardController::AdvanceToScreen(OobeScreen screen) {
ShowSyncConsentScreen(); ShowSyncConsentScreen();
} else if (screen == OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE) { } else if (screen == OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE) {
ShowArcTermsOfServiceScreen(); ShowArcTermsOfServiceScreen();
} else if (screen == OobeScreen::SCREEN_RECOMMEND_APPS) {
ShowRecommendAppsScreen();
} else if (screen == OobeScreen::SCREEN_WRONG_HWID) { } else if (screen == OobeScreen::SCREEN_WRONG_HWID) {
ShowWrongHWIDScreen(); ShowWrongHWIDScreen();
} else if (screen == OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK) { } else if (screen == OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK) {
...@@ -1344,6 +1362,12 @@ void WizardController::OnExit(BaseScreen& /* screen */, ...@@ -1344,6 +1362,12 @@ void WizardController::OnExit(BaseScreen& /* screen */,
case ScreenExitCode::SYNC_CONSENT_FINISHED: case ScreenExitCode::SYNC_CONSENT_FINISHED:
ShowArcTermsOfServiceScreen(); ShowArcTermsOfServiceScreen();
break; break;
case ScreenExitCode::RECOMMEND_APPS_SKIPPED:
OnRecommendAppsSkipped();
break;
case ScreenExitCode::RECOMMEND_APPS_SELECTED:
// TODO(rsgingerrs): Actions if user selects some apps to install
break;
case ScreenExitCode::DEMO_MODE_SETUP_CLOSED: case ScreenExitCode::DEMO_MODE_SETUP_CLOSED:
OnDemoSetupClosed(); OnDemoSetupClosed();
break; break;
......
...@@ -149,6 +149,7 @@ class WizardController : public BaseScreenDelegate, ...@@ -149,6 +149,7 @@ class WizardController : public BaseScreenDelegate,
void ShowTermsOfServiceScreen(); void ShowTermsOfServiceScreen();
void ShowSyncConsentScreen(); void ShowSyncConsentScreen();
void ShowArcTermsOfServiceScreen(); void ShowArcTermsOfServiceScreen();
void ShowRecommendAppsScreen();
void ShowWrongHWIDScreen(); void ShowWrongHWIDScreen();
void ShowAutoEnrollmentCheckScreen(); void ShowAutoEnrollmentCheckScreen();
void ShowSupervisedUserCreationScreen(); void ShowSupervisedUserCreationScreen();
...@@ -185,6 +186,7 @@ class WizardController : public BaseScreenDelegate, ...@@ -185,6 +186,7 @@ class WizardController : public BaseScreenDelegate,
void OnTermsOfServiceAccepted(); void OnTermsOfServiceAccepted();
void OnArcTermsOfServiceSkipped(); void OnArcTermsOfServiceSkipped();
void OnArcTermsOfServiceAccepted(); void OnArcTermsOfServiceAccepted();
void OnRecommendAppsSkipped();
void OnVoiceInteractionValuePropSkipped(); void OnVoiceInteractionValuePropSkipped();
void OnVoiceInteractionValuePropAccepted(); void OnVoiceInteractionValuePropAccepted();
void OnControllerPairingFinished(); void OnControllerPairingFinished();
......
...@@ -1372,7 +1372,9 @@ IN_PROC_BROWSER_TEST_F(WizardControllerCellularFirstTest, CellularFirstFlow) { ...@@ -1372,7 +1372,9 @@ IN_PROC_BROWSER_TEST_F(WizardControllerCellularFirstTest, CellularFirstFlow) {
// TODO(updowndota): Add tests for Voice Interaction OptIn flow. // TODO(updowndota): Add tests for Voice Interaction OptIn flow.
// TODO(alemate): Add tests for Sync Consent UI. // TODO(alemate): Add tests for Sync Consent UI.
static_assert(static_cast<int>(ScreenExitCode::EXIT_CODES_COUNT) == 34,
// TODO(rsgingerrs): Add tests for Recommend Apps UI.
static_assert(static_cast<int>(ScreenExitCode::EXIT_CODES_COUNT) == 36,
"tests for new control flow are missing"); "tests for new control flow are missing");
} // namespace chromeos } // namespace chromeos
...@@ -28,5 +28,6 @@ ...@@ -28,5 +28,6 @@
<include src="enrollment_license_card.html"> <include src="enrollment_license_card.html">
<include src="sync_consent.html"> <include src="sync_consent.html">
<include src="demo_setup.html"> <include src="demo_setup.html">
<include src="recommend_apps.html">
<script src="chrome://oobe/custom_elements.js"></script> <script src="chrome://oobe/custom_elements.js"></script>
...@@ -32,3 +32,4 @@ ...@@ -32,3 +32,4 @@
// <include src="enrollment_license_card.js"> // <include src="enrollment_license_card.js">
// <include src="sync_consent.js"> // <include src="sync_consent.js">
// <include src="demo_setup.js"> // <include src="demo_setup.js">
// <include src="recommend_apps.js">
...@@ -35,5 +35,6 @@ ...@@ -35,5 +35,6 @@
<include src="enrollment_license_card.html"> <include src="enrollment_license_card.html">
<include src="sync_consent.html"> <include src="sync_consent.html">
<include src="demo_setup.html"> <include src="demo_setup.html">
<include src="recommend_apps.html">
<script src="chrome://oobe/custom_elements.js"></script> <script src="chrome://oobe/custom_elements.js"></script>
...@@ -45,3 +45,4 @@ ...@@ -45,3 +45,4 @@
// <include src="enrollment_license_card.js"> // <include src="enrollment_license_card.js">
// <include src="sync_consent.js"> // <include src="sync_consent.js">
// <include src="demo_setup.js"> // <include src="demo_setup.js">
// <include src="recommend_apps.js">
...@@ -45,6 +45,7 @@ cr.define('cr.ui.Oobe', function() { ...@@ -45,6 +45,7 @@ cr.define('cr.ui.Oobe', function() {
login.TermsOfServiceScreen.register(); login.TermsOfServiceScreen.register();
login.SyncConsentScreen.register(); login.SyncConsentScreen.register();
login.ArcTermsOfServiceScreen.register(); login.ArcTermsOfServiceScreen.register();
login.RecommendAppsScreen.register();
login.AppLaunchSplashScreen.register(); login.AppLaunchSplashScreen.register();
login.ArcKioskSplashScreen.register(); login.ArcKioskSplashScreen.register();
login.ConfirmPasswordScreen.register(); login.ConfirmPasswordScreen.register();
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
// <include src="screen_encryption_migration.js"> // <include src="screen_encryption_migration.js">
// <include src="screen_update_required.js"> // <include src="screen_update_required.js">
// <include src="screen_sync_consent.js"> // <include src="screen_sync_consent.js">
// <include src="screen_recommend_apps.js">
// <include src="../../gaia_auth_host/authenticator.js"> // <include src="../../gaia_auth_host/authenticator.js">
......
...@@ -24,3 +24,4 @@ ...@@ -24,3 +24,4 @@
<include src="screen_encryption_migration.html"> <include src="screen_encryption_migration.html">
<include src="screen_update_required.html"> <include src="screen_update_required.html">
<include src="screen_sync_consent.html"> <include src="screen_sync_consent.html">
<include src="screen_recommend_apps.html">
...@@ -45,6 +45,7 @@ cr.define('cr.ui.Oobe', function() { ...@@ -45,6 +45,7 @@ cr.define('cr.ui.Oobe', function() {
login.TermsOfServiceScreen.register(); login.TermsOfServiceScreen.register();
login.SyncConsentScreen.register(); login.SyncConsentScreen.register();
login.ArcTermsOfServiceScreen.register(); login.ArcTermsOfServiceScreen.register();
login.RecommendAppsScreen.register();
login.AppLaunchSplashScreen.register(); login.AppLaunchSplashScreen.register();
login.ArcKioskSplashScreen.register(); login.ArcKioskSplashScreen.register();
login.ConfirmPasswordScreen.register(); login.ConfirmPasswordScreen.register();
......
...@@ -24,3 +24,4 @@ ...@@ -24,3 +24,4 @@
<include src="screen_encryption_migration.html"> <include src="screen_encryption_migration.html">
<include src="screen_update_required.html"> <include src="screen_update_required.html">
<include src="screen_sync_consent.html"> <include src="screen_sync_consent.html">
<include src="screen_recommend_apps.html">
...@@ -47,6 +47,7 @@ cr.define('cr.ui.Oobe', function() { ...@@ -47,6 +47,7 @@ cr.define('cr.ui.Oobe', function() {
login.TermsOfServiceScreen.register(); login.TermsOfServiceScreen.register();
login.SyncConsentScreen.register(); login.SyncConsentScreen.register();
login.ArcTermsOfServiceScreen.register(); login.ArcTermsOfServiceScreen.register();
login.RecommendAppsScreen.register();
login.AppLaunchSplashScreen.register(); login.AppLaunchSplashScreen.register();
login.ArcKioskSplashScreen.register(); login.ArcKioskSplashScreen.register();
login.ConfirmPasswordScreen.register(); login.ConfirmPasswordScreen.register();
......
...@@ -30,3 +30,4 @@ ...@@ -30,3 +30,4 @@
<include src="screen_active_directory_password_change.html"> <include src="screen_active_directory_password_change.html">
<include src="screen_update_required.html"> <include src="screen_update_required.html">
<include src="screen_sync_consent.html"> <include src="screen_sync_consent.html">
<include src="screen_recommend_apps.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. */
:root {
color: #333;
font: 13px Roboto, sans-serif;
font-weight: 400; /* roboto-regular */
height: 640px;
width: 768px;
}
.footer {
padding: 18px 64px 0;
}
#recommend-apps-skip-button {
color: rgba(0, 0, 0, 0.54);
}
#recommend-apps-skip-button {
-webkit-padding-end: 6px;
}
#recommend-apps-install-button {
-webkit-padding-end: 18px;
}
#recommend-apps-container {
align-content: flex-start;
align-items: flex-start;
flex-wrap: wrap;
}
#recommend-apps-container .column {
flex-basis: 33.33%;
margin-bottom: 20px;
}
.checkbox-label {
display: table;
}
img.app-icon {
display: table-cell;
height: 24px;
margin-right: 4px;
vertical-align: middle;
width: 24px;
}
span.app-title {
display: table-cell;
vertical-align: middle;
}
\ 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. -->
<link rel="import" href="chrome://resources/html/polymer.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
<link rel="import" href="chrome://resources/polymer/v1_0/paper-checkbox/paper-checkbox.html">
<dom-module id="recommend-apps">
<template>
<link rel="stylesheet" href="recommend_apps.css">
<link rel="stylesheet" href="oobe_dialog_parameters.css">
<link rel="stylesheet" href="oobe_flex_layout.css">
<oobe-dialog id="recommendAppsOverviewDialog" role="dialog" has-buttons
aria-label$="[[i18nDynamic(locale, 'recommendAppsScreenTitle')]]"
no-footer-padding>
<iron-icon src="chrome://oobe/playstore.svg" class="oobe-icon">
</iron-icon>
<div class="header">
<h1 class="title">
[[i18nDynamic(locale, 'recommendAppsScreenTitle')]]
</h1>
<div class="subtitle">
[[i18nDynamic(locale, 'recommendAppsScreenDescription')]]
</div>
</div>
<div id="recommend-apps-container" class="footer flex layout horizontal">
<template is="dom-repeat" items="{{apps}}">
<div class="column">
<paper-checkbox>
<div class="checkbox-label">
<img class="app-icon" src="{{item.icon}}">
<span class="app-title">{{item.name}}</span>
</div>
</paper-checkbox>
</div>
</template>
</div>
<div class="bottom-buttons layout horizontal end-justified">
<oobe-text-button id="recommend-apps-skip-button" border on-tap="onSkip_">
<div>[[i18nDynamic(locale, 'recommendAppsSkip')]]</div>
</oobe-text-button>
<oobe-text-button id="recommend-apps-install-button"
on-tap="onInstall_" class="focus-on-show" inverse>
<div>[[i18nDynamic(locale, 'recommendAppsInstall')]]</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 Recommend Apps
* screen.
*/
Polymer({
is: 'recommend-apps',
behaviors: [I18nBehavior],
properties: {
apps: {
type: Array,
value: [] // TODO(rsgingerrs): add the function to fetch the list of apps
}
},
focus: function() {
this.$.recommendAppsOverviewDialog.focus();
},
onSkip_: function() {
chrome.send('login.RecommendAppsScreen.userActed', ['recommendAppsSkip']);
},
onInstall_: function() {
// TODO(rsgingerrs): Actions if the user selects some apps to install
},
});
<!-- 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 right hidden" id="recommend-apps" hidden>
<recommend-apps id="recommend-apps-screen"></recommend-apps>
</div>
// 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 First user log in Recommend Apps screen implementation.
*/
login.createScreen('RecommendAppsScreen', 'recommend-apps', function() {
return {
/**
* Returns the control which should receive initial focus.
*/
get defaultControl() {
return $('recommend-apps-screen');
},
};
});
...@@ -1997,6 +1997,8 @@ split_static_library("ui") { ...@@ -1997,6 +1997,8 @@ split_static_library("ui") {
"webui/chromeos/login/oobe_display_chooser.h", "webui/chromeos/login/oobe_display_chooser.h",
"webui/chromeos/login/oobe_ui.cc", "webui/chromeos/login/oobe_ui.cc",
"webui/chromeos/login/oobe_ui.h", "webui/chromeos/login/oobe_ui.h",
"webui/chromeos/login/recommend_apps_screen_handler.cc",
"webui/chromeos/login/recommend_apps_screen_handler.h",
"webui/chromeos/login/reset_screen_handler.cc", "webui/chromeos/login/reset_screen_handler.cc",
"webui/chromeos/login/reset_screen_handler.h", "webui/chromeos/login/reset_screen_handler.h",
"webui/chromeos/login/screenlock_icon_provider.cc", "webui/chromeos/login/screenlock_icon_provider.cc",
......
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
#include "chrome/browser/ui/webui/chromeos/login/network_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/network_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h" #include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h"
#include "chrome/browser/ui/webui/chromeos/login/oobe_display_chooser.h" #include "chrome/browser/ui/webui/chromeos/login/oobe_display_chooser.h"
#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/reset_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.h"
...@@ -294,6 +295,8 @@ OobeUI::OobeUI(content::WebUI* web_ui, const GURL& url) ...@@ -294,6 +295,8 @@ OobeUI::OobeUI(content::WebUI* web_ui, const GURL& url)
AddScreenHandler(std::make_unique<ArcTermsOfServiceScreenHandler>()); AddScreenHandler(std::make_unique<ArcTermsOfServiceScreenHandler>());
AddScreenHandler(std::make_unique<RecommendAppsScreenHandler>());
AddScreenHandler(std::make_unique<UserImageScreenHandler>()); AddScreenHandler(std::make_unique<UserImageScreenHandler>());
AddScreenHandler(std::make_unique<UserBoardScreenHandler>()); AddScreenHandler(std::make_unique<UserBoardScreenHandler>());
...@@ -440,6 +443,10 @@ ArcTermsOfServiceScreenView* OobeUI::GetArcTermsOfServiceScreenView() { ...@@ -440,6 +443,10 @@ ArcTermsOfServiceScreenView* OobeUI::GetArcTermsOfServiceScreenView() {
return GetView<ArcTermsOfServiceScreenHandler>(); return GetView<ArcTermsOfServiceScreenHandler>();
} }
RecommendAppsScreenView* OobeUI::GetRecommendAppsScreenView() {
return GetView<RecommendAppsScreenHandler>();
}
WrongHWIDScreenView* OobeUI::GetWrongHWIDScreenView() { WrongHWIDScreenView* OobeUI::GetWrongHWIDScreenView() {
return GetView<WrongHWIDScreenHandler>(); return GetView<WrongHWIDScreenHandler>();
} }
......
...@@ -50,6 +50,7 @@ class NetworkDropdownHandler; ...@@ -50,6 +50,7 @@ class NetworkDropdownHandler;
class NetworkStateInformer; class NetworkStateInformer;
class NetworkView; class NetworkView;
class OobeDisplayChooser; class OobeDisplayChooser;
class RecommendAppsScreenView;
class SigninScreenHandler; class SigninScreenHandler;
class SigninScreenHandlerDelegate; class SigninScreenHandlerDelegate;
class SupervisedUserCreationScreenHandler; class SupervisedUserCreationScreenHandler;
...@@ -111,6 +112,7 @@ class OobeUI : public content::WebUIController, ...@@ -111,6 +112,7 @@ class OobeUI : public content::WebUIController,
TermsOfServiceScreenView* GetTermsOfServiceScreenView(); TermsOfServiceScreenView* GetTermsOfServiceScreenView();
SyncConsentScreenView* GetSyncConsentScreenView(); SyncConsentScreenView* GetSyncConsentScreenView();
ArcTermsOfServiceScreenView* GetArcTermsOfServiceScreenView(); ArcTermsOfServiceScreenView* GetArcTermsOfServiceScreenView();
RecommendAppsScreenView* GetRecommendAppsScreenView();
UserImageView* GetUserImageView(); UserImageView* GetUserImageView();
ErrorScreen* GetErrorScreen(); ErrorScreen* GetErrorScreen();
WrongHWIDScreenView* GetWrongHWIDScreenView(); WrongHWIDScreenView* GetWrongHWIDScreenView();
......
// 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/recommend_apps_screen_handler.h"
#include "chrome/browser/chromeos/login/screens/recommend_apps_screen.h"
#include "chrome/grit/generated_resources.h"
#include "components/login/localized_values_builder.h"
namespace {
const char kJsScreenPath[] = "login.RecommendAppsScreen";
} // namespace
namespace chromeos {
RecommendAppsScreenHandler::RecommendAppsScreenHandler()
: BaseScreenHandler(kScreenId) {
set_call_js_prefix(kJsScreenPath);
}
RecommendAppsScreenHandler::~RecommendAppsScreenHandler() {}
void RecommendAppsScreenHandler::DeclareLocalizedValues(
::login::LocalizedValuesBuilder* builder) {
builder->Add("recommendAppsScreenTitle",
IDS_LOGIN_RECOMMEND_APPS_SCREEN_TITLE);
builder->Add("recommendAppsScreenDescription",
IDS_LOGIN_RECOMMEND_APPS_SCREEN_DESCRIPTION);
builder->Add("recommendAppsSkip", IDS_LOGIN_RECOMMEND_APPS_SKIP);
builder->Add("recommendAppsInstall", IDS_LOGIN_RECOMMEND_APPS_INSTALL);
}
void RecommendAppsScreenHandler::RegisterMessages() {
BaseScreenHandler::RegisterMessages();
}
void RecommendAppsScreenHandler::Bind(RecommendAppsScreen* screen) {
screen_ = screen;
BaseScreenHandler::SetBaseScreen(screen);
}
void RecommendAppsScreenHandler::Show() {
ShowScreen(kScreenId);
}
void RecommendAppsScreenHandler::Hide() {}
void RecommendAppsScreenHandler::Initialize() {}
} // 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_RECOMMEND_APPS_SCREEN_HANDLER_H_
#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_RECOMMEND_APPS_SCREEN_HANDLER_H_
#include "base/macros.h"
#include "chrome/browser/chromeos/login/screens/recommend_apps_screen_view.h"
#include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h"
namespace chromeos {
class RecommendAppsScreen;
// The sole implementation of the RecommendAppsScreenView, using WebUI.
class RecommendAppsScreenHandler : public BaseScreenHandler,
public RecommendAppsScreenView {
public:
RecommendAppsScreenHandler();
~RecommendAppsScreenHandler() override;
// BaseScreenHandler:
void DeclareLocalizedValues(
::login::LocalizedValuesBuilder* builder) override;
void RegisterMessages() override;
// RecommendAppsScreenView:
void Bind(RecommendAppsScreen* screen) override;
void Show() override;
void Hide() override;
private:
// BaseScreenHandler:
void Initialize() override;
RecommendAppsScreen* screen_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(RecommendAppsScreenHandler);
};
} // namespace chromeos
#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_RECOMMEND_APPS_SCREEN_HANDLER_H_
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
/** @const */ var SCREEN_ACTIVE_DIRECTORY_PASSWORD_CHANGE = /** @const */ var SCREEN_ACTIVE_DIRECTORY_PASSWORD_CHANGE =
'ad-password-change'; 'ad-password-change';
/** @const */ var SCREEN_SYNC_CONSENT = 'sync-consent'; /** @const */ var SCREEN_SYNC_CONSENT = 'sync-consent';
/** @const */ var SCREEN_RECOMMEND_APPS = 'recommend-apps';
/* Accelerator identifiers. Must be kept in sync with webui_login_view.cc. */ /* Accelerator identifiers. Must be kept in sync with webui_login_view.cc. */
/** @const */ var ACCELERATOR_CANCEL = 'cancel'; /** @const */ var ACCELERATOR_CANCEL = 'cancel';
...@@ -162,7 +163,8 @@ cr.define('cr.ui.login', function() { ...@@ -162,7 +163,8 @@ cr.define('cr.ui.login', function() {
SCREEN_CONFIRM_PASSWORD, SCREEN_CONFIRM_PASSWORD,
SCREEN_UPDATE_REQUIRED, SCREEN_UPDATE_REQUIRED,
SCREEN_FATAL_ERROR, SCREEN_FATAL_ERROR,
SCREEN_SYNC_CONSENT SCREEN_SYNC_CONSENT,
SCREEN_RECOMMEND_APPS
]; ];
/** /**
......
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