Commit 847f1bdd authored by Roman Aleksandrov's avatar Roman Aleksandrov Committed by Commit Bot

BaseScreen: Create new method to skip screens.

Create new method which helps to move showing condition from
wizard_controller to dedicated screen classes.

Bug: 1064561
Change-Id: I6f48ff86b959b91f3330e6e4d7512ced5061186b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2120500
Commit-Queue: Roman Aleksandrov <raleksandrov@google.com>
Reviewed-by: default avatarDenis Kuznetsov [CET] <antrim@chromium.org>
Cr-Commit-Position: refs/heads/master@{#756554}
parent 0cc82500
...@@ -8,6 +8,8 @@ ...@@ -8,6 +8,8 @@
namespace chromeos { namespace chromeos {
constexpr char BaseScreen::kNotApplicable[];
BaseScreen::BaseScreen(OobeScreenId screen_id, BaseScreen::BaseScreen(OobeScreenId screen_id,
OobeScreenPriority screen_priority) OobeScreenPriority screen_priority)
: screen_id_(screen_id), screen_priority_(screen_priority) {} : screen_id_(screen_id), screen_priority_(screen_priority) {}
...@@ -24,6 +26,14 @@ void BaseScreen::Hide() { ...@@ -24,6 +26,14 @@ void BaseScreen::Hide() {
is_hidden_ = true; is_hidden_ = true;
} }
bool BaseScreen::ShouldSkipScreen() {
return false;
}
void BaseScreen::Skip() {
NOTREACHED() << "Skip methog should be overriden along with ShouldSkipScreen";
}
void BaseScreen::HandleUserAction(const std::string& action_id) { void BaseScreen::HandleUserAction(const std::string& action_id) {
if (is_hidden_) { if (is_hidden_) {
LOG(WARNING) << "User action came when screen is hidden: action_id=" LOG(WARNING) << "User action came when screen is hidden: action_id="
......
...@@ -21,6 +21,10 @@ namespace chromeos { ...@@ -21,6 +21,10 @@ namespace chromeos {
// method called just once. // method called just once.
class BaseScreen { class BaseScreen {
public: public:
// String which represents not applicable exit code. This exit code refers to
// skipping the screen due to specific unmet condition.
constexpr static const char kNotApplicable[] = "NotApplicable";
BaseScreen(OobeScreenId screen_id, OobeScreenPriority screen_priority); BaseScreen(OobeScreenId screen_id, OobeScreenPriority screen_priority);
virtual ~BaseScreen(); virtual ~BaseScreen();
...@@ -30,6 +34,13 @@ class BaseScreen { ...@@ -30,6 +34,13 @@ class BaseScreen {
// Makes wizard screen invisible. // Makes wizard screen invisible.
void Hide(); void Hide();
// Returns whether the screen should be skipped i. e. should be exited due to
// specific unmet conditions. Override along with Skip method.
virtual bool ShouldSkipScreen();
// Skips the screen. Override along with ShouldSkipScreen method.
virtual void Skip();
// Forwards user action if screen is shown. // Forwards user action if screen is shown.
void HandleUserAction(const std::string& action_id); void HandleUserAction(const std::string& action_id);
......
...@@ -5,7 +5,10 @@ ...@@ -5,7 +5,10 @@
#include "chrome/browser/chromeos/login/screens/recommend_apps_screen.h" #include "chrome/browser/chromeos/login/screens/recommend_apps_screen.h"
#include "chrome/browser/chromeos/login/screens/recommend_apps/recommend_apps_fetcher.h" #include "chrome/browser/chromeos/login/screens/recommend_apps/recommend_apps_fetcher.h"
#include "chrome/browser/policy/profile_policy_connector.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.h"
#include "components/user_manager/user_manager.h"
namespace chromeos { namespace chromeos {
...@@ -16,6 +19,8 @@ std::string RecommendAppsScreen::GetResultString(Result result) { ...@@ -16,6 +19,8 @@ std::string RecommendAppsScreen::GetResultString(Result result) {
return "Selected"; return "Selected";
case Result::SKIPPED: case Result::SKIPPED:
return "Skipped"; return "Skipped";
case Result::NOT_APPLICABLE:
return BaseScreen::kNotApplicable;
} }
} }
...@@ -53,6 +58,22 @@ void RecommendAppsScreen::OnViewDestroyed(RecommendAppsScreenView* view) { ...@@ -53,6 +58,22 @@ void RecommendAppsScreen::OnViewDestroyed(RecommendAppsScreenView* view) {
view_ = nullptr; view_ = nullptr;
} }
bool RecommendAppsScreen::ShouldSkipScreen() {
const user_manager::UserManager* user_manager =
user_manager::UserManager::Get();
DCHECK(user_manager->IsUserLoggedIn());
bool is_managed_account = ProfileManager::GetActiveUserProfile()
->GetProfilePolicyConnector()
->IsManaged();
bool is_child_account = user_manager->IsLoggedInAsChildUser();
return is_managed_account || is_child_account;
}
void RecommendAppsScreen::Skip() {
DCHECK(ShouldSkipScreen());
exit_callback_.Run(Result::NOT_APPLICABLE);
}
void RecommendAppsScreen::ShowImpl() { void RecommendAppsScreen::ShowImpl() {
view_->Show(); view_->Show();
......
...@@ -27,7 +27,7 @@ class RecommendAppsScreenView; ...@@ -27,7 +27,7 @@ class RecommendAppsScreenView;
class RecommendAppsScreen : public BaseScreen, class RecommendAppsScreen : public BaseScreen,
public RecommendAppsFetcherDelegate { public RecommendAppsFetcherDelegate {
public: public:
enum class Result { SELECTED, SKIPPED }; enum class Result { SELECTED, SKIPPED, NOT_APPLICABLE };
static std::string GetResultString(Result result); static std::string GetResultString(Result result);
...@@ -53,6 +53,10 @@ class RecommendAppsScreen : public BaseScreen, ...@@ -53,6 +53,10 @@ class RecommendAppsScreen : public BaseScreen,
void OnLoadError() override; void OnLoadError() override;
void OnParseResponseError() override; void OnParseResponseError() override;
// BaseScreen:
bool ShouldSkipScreen() override;
void Skip() override;
private: private:
// BaseScreen: // BaseScreen:
void ShowImpl() override; void ShowImpl() override;
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h" #include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
#include "chrome/browser/chromeos/login/ui/login_display_host.h" #include "chrome/browser/chromeos/login/ui/login_display_host.h"
#include "chrome/browser/chromeos/login/wizard_controller.h" #include "chrome/browser/chromeos/login/wizard_controller.h"
#include "chrome/browser/policy/profile_policy_connector.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
...@@ -132,6 +133,12 @@ class RecommendAppsScreenTest : public InProcessBrowserTest { ...@@ -132,6 +133,12 @@ class RecommendAppsScreenTest : public InProcessBrowserTest {
InProcessBrowserTest::SetUpOnMainThread(); InProcessBrowserTest::SetUpOnMainThread();
} }
void ShowRecommendAppsScreen() {
WizardController::default_controller()->AdvanceToScreen(
RecommendAppsScreenView::kScreenId);
}
void TearDownOnMainThread() override { void TearDownOnMainThread() override {
recommend_apps_fetcher_ = nullptr; recommend_apps_fetcher_ = nullptr;
recommend_apps_fetcher_factory_.reset(); recommend_apps_fetcher_factory_.reset();
...@@ -202,6 +209,10 @@ class RecommendAppsScreenTest : public InProcessBrowserTest { ...@@ -202,6 +209,10 @@ class RecommendAppsScreenTest : public InProcessBrowserTest {
result; result;
} }
policy::ProfilePolicyConnector* GetProfilePolicyConnector() {
return ProfileManager::GetActiveUserProfile()->GetProfilePolicyConnector();
}
RecommendAppsScreen* recommend_apps_screen_; RecommendAppsScreen* recommend_apps_screen_;
base::Optional<RecommendAppsScreen::Result> screen_result_; base::Optional<RecommendAppsScreen::Result> screen_result_;
FakeRecommendAppsFetcher* recommend_apps_fetcher_ = nullptr; FakeRecommendAppsFetcher* recommend_apps_fetcher_ = nullptr;
...@@ -743,4 +754,13 @@ IN_PROC_BROWSER_TEST_F(RecommendAppsScreenTest, RetryOnLoadError) { ...@@ -743,4 +754,13 @@ IN_PROC_BROWSER_TEST_F(RecommendAppsScreenTest, RetryOnLoadError) {
EXPECT_EQ(base::Value(base::Value::Type::LIST), *fast_reinstall_packages); EXPECT_EQ(base::Value(base::Value::Type::LIST), *fast_reinstall_packages);
} }
IN_PROC_BROWSER_TEST_F(RecommendAppsScreenTest, SkipDueToManagedUser) {
GetProfilePolicyConnector()->OverrideIsManagedForTesting(true);
ShowRecommendAppsScreen();
WaitForScreenExit();
EXPECT_EQ(screen_result_.value(),
RecommendAppsScreen::Result::NOT_APPLICABLE);
}
} // namespace chromeos } // namespace chromeos
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
#include "chrome/browser/chromeos/login/screens/app_downloading_screen.h" #include "chrome/browser/chromeos/login/screens/app_downloading_screen.h"
#include "chrome/browser/chromeos/login/screens/arc_terms_of_service_screen.h" #include "chrome/browser/chromeos/login/screens/arc_terms_of_service_screen.h"
#include "chrome/browser/chromeos/login/screens/assistant_optin_flow_screen.h" #include "chrome/browser/chromeos/login/screens/assistant_optin_flow_screen.h"
#include "chrome/browser/chromeos/login/screens/base_screen.h"
#include "chrome/browser/chromeos/login/screens/demo_preferences_screen.h" #include "chrome/browser/chromeos/login/screens/demo_preferences_screen.h"
#include "chrome/browser/chromeos/login/screens/demo_setup_screen.h" #include "chrome/browser/chromeos/login/screens/demo_setup_screen.h"
#include "chrome/browser/chromeos/login/screens/device_disabled_screen.h" #include "chrome/browser/chromeos/login/screens/device_disabled_screen.h"
...@@ -301,19 +302,6 @@ bool IsRemoraRequisition() { ...@@ -301,19 +302,6 @@ bool IsRemoraRequisition() {
return policy_manager && policy_manager->IsRemoraRequisition(); return policy_manager && policy_manager->IsRemoraRequisition();
} }
// Return false if the logged in user is a managed or child account. Otherwise,
// return true if the feature flag for recommend app screen is on.
bool ShouldShowRecommendAppsScreen() {
const user_manager::UserManager* user_manager =
user_manager::UserManager::Get();
DCHECK(user_manager->IsUserLoggedIn());
bool is_managed_account = ProfileManager::GetActiveUserProfile()
->GetProfilePolicyConnector()
->IsManaged();
bool is_child_account = user_manager->IsLoggedInAsChildUser();
return !is_managed_account && !is_child_account;
}
chromeos::LoginDisplayHost* GetLoginDisplayHost() { chromeos::LoginDisplayHost* GetLoginDisplayHost() {
return chromeos::LoginDisplayHost::default_host(); return chromeos::LoginDisplayHost::default_host();
} }
...@@ -808,10 +796,12 @@ void WizardController::SkipUpdateEnrollAfterEula() { ...@@ -808,10 +796,12 @@ void WizardController::SkipUpdateEnrollAfterEula() {
void WizardController::OnScreenExit(OobeScreenId screen, void WizardController::OnScreenExit(OobeScreenId screen,
const std::string& exit_reason) { const std::string& exit_reason) {
DCHECK(current_screen_->screen_id() == screen);
VLOG(1) << "Wizard screen " << screen VLOG(1) << "Wizard screen " << screen
<< " exited with reason: " << exit_reason; << " exited with reason: " << exit_reason;
// Do not perform checks and record stats for the skipped screen.
if (exit_reason == chromeos::BaseScreen::kNotApplicable)
return;
DCHECK(current_screen_->screen_id() == screen);
RecordUMAHistogramForOOBEStepCompletionTime( RecordUMAHistogramForOOBEStepCompletionTime(
screen, exit_reason, base::Time::Now() - screen_show_times_[screen]); screen, exit_reason, base::Time::Now() - screen_show_times_[screen]);
...@@ -1172,16 +1162,7 @@ void WizardController::OnArcTermsOfServiceAccepted() { ...@@ -1172,16 +1162,7 @@ void WizardController::OnArcTermsOfServiceAccepted() {
} }
return; return;
} }
ShowRecommendAppsScreen();
// If the recommend app screen should be shown, show it after the user
// accepted the Arc TOS. Otherwise, advance to the assistant opt-in flow
// screen.
if (ShouldShowRecommendAppsScreen()) {
ShowRecommendAppsScreen();
return;
}
ShowAssistantOptInFlowScreen();
} }
void WizardController::OnRecommendAppsScreenExit( void WizardController::OnRecommendAppsScreenExit(
...@@ -1194,6 +1175,7 @@ void WizardController::OnRecommendAppsScreenExit( ...@@ -1194,6 +1175,7 @@ void WizardController::OnRecommendAppsScreenExit(
ShowAppDownloadingScreen(); ShowAppDownloadingScreen();
break; break;
case RecommendAppsScreen::Result::SKIPPED: case RecommendAppsScreen::Result::SKIPPED:
case RecommendAppsScreen::Result::NOT_APPLICABLE:
ShowAssistantOptInFlowScreen(); ShowAssistantOptInFlowScreen();
break; break;
} }
...@@ -1427,6 +1409,11 @@ void WizardController::SetCurrentScreen(BaseScreen* new_current) { ...@@ -1427,6 +1409,11 @@ void WizardController::SetCurrentScreen(BaseScreen* new_current) {
if (current_screen_ == new_current || GetOobeUI() == nullptr) if (current_screen_ == new_current || GetOobeUI() == nullptr)
return; return;
if (new_current && new_current->ShouldSkipScreen()) {
new_current->Skip();
return;
}
if (current_screen_) { if (current_screen_) {
current_screen_->Hide(); current_screen_->Hide();
current_screen_->SetConfiguration(nullptr); current_screen_->SetConfiguration(nullptr);
......
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