Chromium Code Reviews| 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 f82e67c428a728954a8bffa79a62274fdc35d1e6..9969660d41666b905a3193feff59d4edada142ba 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); |
| +// Update UMA with user cancel only if error is not currently shown. |
|
Yusuke Sato
2017/03/06 20:52:16
Updates
hidehiko
2017/03/07 14:52:20
Done.
|
| +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( |
| @@ -510,7 +521,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 && |
| @@ -518,13 +529,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); |
| } |
| @@ -568,18 +573,6 @@ 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 (AreArcAllOptInPreferencesManaged()) |
| - 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. |
| @@ -612,23 +605,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(); |
| - } |
| - StartArcAndroidManagementCheck(); |
| - return; |
| - } |
| - |
| StartTermsOfServiceNegotiation(); |
| } |
| @@ -651,8 +627,10 @@ void ArcSessionManager::RequestDisable() { |
| void ArcSessionManager::StartTermsOfServiceNegotiation() { |
| DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| + DCHECK(profile_); |
| DCHECK(!terms_of_service_negotiator_); |
| + // 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 +642,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. |
| + StartArcAndroidManagementCheck(); |
| + return; |
| + } |
| + |
| if (IsOobeOptInActive()) { |
| VLOG(1) << "Use OOBE negotiator."; |
| terms_of_service_negotiator_ = |
| @@ -684,26 +672,56 @@ void ArcSessionManager::StartTermsOfServiceNegotiation() { |
| } |
| 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(); |
| StartArcAndroidManagementCheck(); |
| } |
| +bool ArcSessionManager::IsArcTermsOfServiceNegotiationNeeded() const { |
| + DCHECK(profile_); |
| + |
| + // 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. |
| + if (IsArcKioskMode()) { |
|
Yusuke Sato
2017/03/06 20:52:16
When is this check necessary? Because of the IsArc
hidehiko
2017/03/07 14:52:20
Good catch!
So, I removed this from here, and adde
|
| + VLOG(1) << "In Kiosk mode. Skip ARC Terms of Service negotiation."; |
| + return false; |
| + } |
| + |
| + // 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 (AreArcAllOptInPreferencesManaged()) { |
|
hidehiko
2017/03/06 13:38:39
Note: crrev.com/2731453003 moves the utility to c/
|
| + 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 |
|
hidehiko
2017/03/06 13:38:39
Note: 1) of the original comment is obsolete. khme
|
| + // 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; |
| +} |
| + |
| bool ArcSessionManager::AreArcAllOptInPreferencesManaged() const { |
| return IsArcPlayStoreEnabledPreferenceManagedForProfile(profile_) && |
| profile_->GetPrefs()->IsManagedPreference( |
| @@ -715,12 +733,16 @@ bool ArcSessionManager::AreArcAllOptInPreferencesManaged() const { |
| void ArcSessionManager::StartArcAndroidManagementCheck() { |
| 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(state_ == State::NEGOTIATING_TERMS_OF_SERVICE || |
| + state_ == State::CHECKING_ANDROID_MANAGEMENT); |
| SetState(State::CHECKING_ANDROID_MANAGEMENT); |
| + // Don't show UI for this progress if it was not shown. |
|
victorhsieh
2017/03/06 23:11:52
optional: I'm doing the same thing locally, and I
hidehiko
2017/03/07 14:52:20
Rephrased for positive case, with its background.
|
| + if (support_host_ && |
| + support_host_->ui_page() != ArcSupportHost::UIPage::NO_PAGE) { |
| + support_host_->ShowArcLoading(); |
| + } |
| + |
| android_management_checker_.reset(new ArcAndroidManagementChecker( |
|
Yusuke Sato
2017/03/06 20:52:16
MakeUnique? (L317 too)
hidehiko
2017/03/07 14:52:20
Done in another CL. As for L317, I'm making anothe
|
| profile_, context_->token_service(), context_->account_id(), |
| false /* retry_on_error */)); |
| @@ -849,7 +871,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(); |
| StartArcAndroidManagementCheck(); |
| } |
| } |
| @@ -884,7 +905,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); |