Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(997)

Unified Diff: chrome/browser/chromeos/arc/arc_session_manager.cc

Issue 2737453003: Fix ArcSessionManager state machine, part 1. (Closed)
Patch Set: Address comments. Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/arc/arc_session_manager.cc
diff --git a/chrome/browser/chromeos/arc/arc_session_manager.cc b/chrome/browser/chromeos/arc/arc_session_manager.cc
index a5863c56215a62f389574e292f12193282346b1f..a9130c25078fc17a911dc48934888fc933e0888b 100644
--- a/chrome/browser/chromeos/arc/arc_session_manager.cc
+++ b/chrome/browser/chromeos/arc/arc_session_manager.cc
@@ -64,6 +64,17 @@ bool g_enable_check_android_management_for_testing = false;
// but present the UI to try again.
constexpr base::TimeDelta kArcSignInTimeout = base::TimeDelta::FromMinutes(5);
+// Updates UMA with user cancel only if error is not currently shown.
+void MaybeUpdateOptInCancelUMA(const ArcSupportHost* support_host) {
+ if (!support_host ||
+ support_host->ui_page() == ArcSupportHost::UIPage::NO_PAGE ||
+ support_host->ui_page() == ArcSupportHost::UIPage::ERROR) {
+ return;
+ }
+
+ UpdateOptInCancelUMA(OptInCancelReason::USER_CANCEL);
+}
+
} // namespace
ArcSessionManager::ArcSessionManager(
@@ -520,7 +531,7 @@ void ArcSessionManager::CancelAuthCode() {
// LSO, closing the window should stop ARC since the user activity chooses to
// not sign in. In any other case, ARC is booting normally and the instance
// should not be stopped.
- if ((state_ != State::SHOWING_TERMS_OF_SERVICE &&
+ if ((state_ != State::NEGOTIATING_TERMS_OF_SERVICE &&
state_ != State::CHECKING_ANDROID_MANAGEMENT) &&
(!support_host_ ||
(support_host_->ui_page() != ArcSupportHost::UIPage::ERROR &&
@@ -528,13 +539,7 @@ void ArcSessionManager::CancelAuthCode() {
return;
}
- // Update UMA with user cancel only if error is not currently shown.
- if (support_host_ &&
- support_host_->ui_page() != ArcSupportHost::UIPage::NO_PAGE &&
- support_host_->ui_page() != ArcSupportHost::UIPage::ERROR) {
- UpdateOptInCancelUMA(OptInCancelReason::USER_CANCEL);
- }
-
+ MaybeUpdateOptInCancelUMA(support_host_.get());
StopArc();
SetArcPlayStoreEnabledForProfile(profile_, false);
}
@@ -578,27 +583,14 @@ void ArcSessionManager::RequestEnableImpl() {
PrefService* const prefs = profile_->GetPrefs();
- // For ARC Kiosk we skip ToS because it is very likely that near the device
- // there will be no one who is eligible to accept them.
- // TODO(poromov): Move to more Kiosk dedicated set-up phase.
- if (IsArcKioskMode())
- prefs->SetBoolean(prefs::kArcTermsAccepted, true);
-
- // Skip to show UI asking users to set up ARC OptIn preferences, if all of
- // them are managed by the admin policy. Note that the ToS agreement is anyway
- // not shown in the case of the managed ARC.
- if (IsArcPlayStoreEnabledPreferenceManagedForProfile(profile_) &&
- AreArcAllOptInPreferencesManagedForProfile(profile_)) {
- prefs->SetBoolean(prefs::kArcTermsAccepted, true);
- }
-
// If it is marked that sign in has been successfully done, then directly
// start ARC.
- // For testing, and for Kiosk mode, we also skip ToS negotiation procedure.
- // For backward compatibility, this check needs to be prior to the
- // kArcTermsAccepted check below.
- if (prefs->GetBoolean(prefs::kArcSignedIn) ||
- IsArcOptInVerificationDisabled() || IsArcKioskMode()) {
+ // For Kiosk mode, skip ToS because it is very likely that near the device
+ // there will be no one who is eligible to accept them.
+ // If opt-in verification is disabled, skip negotiation, too. This is for
+ // testing purpose.
+ if (prefs->GetBoolean(prefs::kArcSignedIn) || IsArcKioskMode() ||
+ IsArcOptInVerificationDisabled()) {
StartArc();
// Check Android management in parallel.
// Note: StartBackgroundAndroidManagementCheck() may call
@@ -612,23 +604,6 @@ void ArcSessionManager::RequestEnableImpl() {
return;
}
- // If it is marked that the Terms of service is accepted already,
- // just skip the negotiation with user, and start Android management
- // check directly.
- // This happens, e.g., when;
- // 1) User accepted the Terms of service on OOBE flow.
- // 2) User accepted the Terms of service on Opt-in flow, but logged out
- // before ARC sign in procedure was done. Then, logs in again.
- if (prefs->GetBoolean(prefs::kArcTermsAccepted)) {
- // Don't show UI for this progress if it was not shown.
- if (support_host_ &&
- support_host_->ui_page() != ArcSupportHost::UIPage::NO_PAGE) {
- support_host_->ShowArcLoading();
- }
- StartAndroidManagementCheck();
- return;
- }
-
StartTermsOfServiceNegotiation();
}
@@ -651,8 +626,16 @@ void ArcSessionManager::RequestDisable() {
void ArcSessionManager::StartTermsOfServiceNegotiation() {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ DCHECK(profile_);
DCHECK(!terms_of_service_negotiator_);
-
+ // In Kiosk-mode, Terms of Service negotiation should be skipped.
+ // See also RequestEnableImpl().
+ DCHECK(!IsArcKioskMode());
+ // If opt-in verification is disabled, Terms of Service negotiation should
+ // be skipped, too. See also RequestEnableImpl().
+ DCHECK(!IsArcOptInVerificationDisabled());
+
+ // TODO(hidehiko): Remove this condition, when the state machine is fixed.
if (!arc_session_runner_->IsStopped()) {
// If the user attempts to re-enable ARC while the ARC instance is still
// running the user should not be able to continue until the ARC instance
@@ -664,7 +647,17 @@ void ArcSessionManager::StartTermsOfServiceNegotiation() {
return;
}
- SetState(State::SHOWING_TERMS_OF_SERVICE);
+ // TODO(hidehiko): DCHECK if |state_| is STOPPED, when the state machine
+ // is fixed.
+ SetState(State::NEGOTIATING_TERMS_OF_SERVICE);
+
+ if (!IsArcTermsOfServiceNegotiationNeeded()) {
+ // Moves to next state, Android management check, immediately, as if
+ // Terms of Service negotiation is done successfully.
+ StartAndroidManagementCheck();
+ return;
+ }
+
if (IsOobeOptInActive()) {
VLOG(1) << "Use OOBE negotiator.";
terms_of_service_negotiator_ =
@@ -674,46 +667,79 @@ void ArcSessionManager::StartTermsOfServiceNegotiation() {
terms_of_service_negotiator_ =
base::MakeUnique<ArcTermsOfServiceDefaultNegotiator>(
profile_->GetPrefs(), support_host_.get());
+ } else {
+ // The only case reached here is when g_disable_ui_for_testing is set
+ // so ARC support host is not created in SetProfile(), for testing purpose.
+ DCHECK(g_disable_ui_for_testing)
+ << "Negotiator is not created on production.";
+ return;
}
- if (terms_of_service_negotiator_) {
- terms_of_service_negotiator_->StartNegotiation(
- base::Bind(&ArcSessionManager::OnTermsOfServiceNegotiated,
- weak_ptr_factory_.GetWeakPtr()));
- }
+ terms_of_service_negotiator_->StartNegotiation(
+ base::Bind(&ArcSessionManager::OnTermsOfServiceNegotiated,
+ weak_ptr_factory_.GetWeakPtr()));
}
void ArcSessionManager::OnTermsOfServiceNegotiated(bool accepted) {
+ DCHECK_EQ(state_, State::NEGOTIATING_TERMS_OF_SERVICE);
+ DCHECK(profile_);
DCHECK(terms_of_service_negotiator_);
terms_of_service_negotiator_.reset();
if (!accepted) {
- // To cancel, user needs to close the window. Note that clicking "Cancel"
- // button effectively just closes the window.
- CancelAuthCode();
+ // User does not accept the Terms of Service. Disable Google Play Store.
+ MaybeUpdateOptInCancelUMA(support_host_.get());
+ SetArcPlayStoreEnabledForProfile(profile_, false);
return;
}
// Terms were accepted.
profile_->GetPrefs()->SetBoolean(prefs::kArcTermsAccepted, true);
-
- // Don't show UI for this progress if it was not shown.
- if (support_host_ &&
- support_host_->ui_page() != ArcSupportHost::UIPage::NO_PAGE)
- support_host_->ShowArcLoading();
StartAndroidManagementCheck();
}
+bool ArcSessionManager::IsArcTermsOfServiceNegotiationNeeded() const {
+ DCHECK(profile_);
+
+ // Skip to show UI asking users to set up ARC OptIn preferences, if all of
+ // them are managed by the admin policy. Note that the ToS agreement is anyway
+ // not shown in the case of the managed ARC.
+ if (AreArcAllOptInPreferencesManagedForProfile(profile_)) {
+ VLOG(1) << "All opt-in preferences are under managed. "
+ << "Skip ARC Terms of Service negotiation.";
+ return false;
+ }
+
+ // If it is marked that the Terms of service is accepted already,
+ // just skip the negotiation with user, and start Android management
+ // check directly.
+ // This happens, e.g., when a user accepted the Terms of service on Opt-in
+ // flow, but logged out before ARC sign in procedure was done. Then, logs
+ // in again.
+ if (profile_->GetPrefs()->GetBoolean(prefs::kArcTermsAccepted)) {
+ VLOG(1) << "The user already accepts ARC Terms of Service.";
+ return false;
+ }
+
+ return true;
+}
+
void ArcSessionManager::StartAndroidManagementCheck() {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
DCHECK(arc_session_runner_->IsStopped());
- DCHECK(state_ == State::SHOWING_TERMS_OF_SERVICE ||
- state_ == State::CHECKING_ANDROID_MANAGEMENT ||
- (state_ == State::STOPPED &&
- profile_->GetPrefs()->GetBoolean(prefs::kArcTermsAccepted)));
- DCHECK(!android_management_checker_);
+ DCHECK(state_ == State::NEGOTIATING_TERMS_OF_SERVICE ||
+ state_ == State::CHECKING_ANDROID_MANAGEMENT);
SetState(State::CHECKING_ANDROID_MANAGEMENT);
+ // Show loading UI only if ARC support app's window is already shown.
+ // User may not see any ARC support UI if everything needed is done in
+ // background. In such a case, showing loading UI here (then closed sometime
+ // soon later) would look just noisy.
+ if (support_host_ &&
+ support_host_->ui_page() != ArcSupportHost::UIPage::NO_PAGE) {
+ support_host_->ShowArcLoading();
+ }
+
android_management_checker_ = base::MakeUnique<ArcAndroidManagementChecker>(
profile_, context_->token_service(), context_->account_id(),
false /* retry_on_error */);
@@ -867,7 +893,6 @@ void ArcSessionManager::OnRetryClicked() {
// Otherwise, we restart ARC. Note: this is the first boot case.
// For second or later boot, either ERROR_WITH_FEEDBACK case or ACTIVE
// case must hit.
- support_host_->ShowArcLoading();
StartAndroidManagementCheck();
}
}
@@ -902,7 +927,7 @@ std::ostream& operator<<(std::ostream& os,
switch (state) {
MAP_STATE(NOT_INITIALIZED);
MAP_STATE(STOPPED);
- MAP_STATE(SHOWING_TERMS_OF_SERVICE);
+ MAP_STATE(NEGOTIATING_TERMS_OF_SERVICE);
MAP_STATE(CHECKING_ANDROID_MANAGEMENT);
MAP_STATE(REMOVING_DATA_DIR);
MAP_STATE(ACTIVE);
« no previous file with comments | « chrome/browser/chromeos/arc/arc_session_manager.h ('k') | chrome/browser/chromeos/arc/arc_session_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698