| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/chromeos/arc/arc_session_manager.h" | 5 #include "chrome/browser/chromeos/arc/arc_session_manager.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "ash/shelf/shelf_delegate.h" | 9 #include "ash/shelf/shelf_delegate.h" |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 default: | 366 default: |
| 367 error = ArcSupportHost::Error::SIGN_IN_UNKNOWN_ERROR; | 367 error = ArcSupportHost::Error::SIGN_IN_UNKNOWN_ERROR; |
| 368 break; | 368 break; |
| 369 } | 369 } |
| 370 | 370 |
| 371 if (result == ProvisioningResult::ARC_STOPPED || | 371 if (result == ProvisioningResult::ARC_STOPPED || |
| 372 result == ProvisioningResult::CHROME_SERVER_COMMUNICATION_ERROR) { | 372 result == ProvisioningResult::CHROME_SERVER_COMMUNICATION_ERROR) { |
| 373 if (profile_->GetPrefs()->HasPrefPath(prefs::kArcSignedIn)) | 373 if (profile_->GetPrefs()->HasPrefPath(prefs::kArcSignedIn)) |
| 374 profile_->GetPrefs()->SetBoolean(prefs::kArcSignedIn, false); | 374 profile_->GetPrefs()->SetBoolean(prefs::kArcSignedIn, false); |
| 375 ShutdownSession(); | 375 ShutdownSession(); |
| 376 if (support_host_) | 376 ShowArcSupportHostError(error, true); |
| 377 support_host_->ShowError(error, true); | |
| 378 return; | 377 return; |
| 379 } | 378 } |
| 380 | 379 |
| 381 if (result == ProvisioningResult::CLOUD_PROVISION_FLOW_FAILED || | 380 if (result == ProvisioningResult::CLOUD_PROVISION_FLOW_FAILED || |
| 382 result == ProvisioningResult::CLOUD_PROVISION_FLOW_TIMEOUT || | 381 result == ProvisioningResult::CLOUD_PROVISION_FLOW_TIMEOUT || |
| 383 result == ProvisioningResult::CLOUD_PROVISION_FLOW_INTERNAL_ERROR || | 382 result == ProvisioningResult::CLOUD_PROVISION_FLOW_INTERNAL_ERROR || |
| 384 // OVERALL_SIGN_IN_TIMEOUT might be an indication that ARC believes it is | 383 // OVERALL_SIGN_IN_TIMEOUT might be an indication that ARC believes it is |
| 385 // fully setup, but Chrome does not. | 384 // fully setup, but Chrome does not. |
| 386 result == ProvisioningResult::OVERALL_SIGN_IN_TIMEOUT || | 385 result == ProvisioningResult::OVERALL_SIGN_IN_TIMEOUT || |
| 387 // Just to be safe, remove data if we don't know the cause. | 386 // Just to be safe, remove data if we don't know the cause. |
| 388 result == ProvisioningResult::UNKNOWN_ERROR) { | 387 result == ProvisioningResult::UNKNOWN_ERROR) { |
| 389 VLOG(1) << "ARC provisioning failed permanently. Removing user data"; | 388 VLOG(1) << "ARC provisioning failed permanently. Removing user data"; |
| 390 RequestArcDataRemoval(); | 389 RequestArcDataRemoval(); |
| 391 } | 390 } |
| 392 | 391 |
| 393 // We'll delay shutting down the ARC instance in this case to allow people | 392 // We'll delay shutting down the ARC instance in this case to allow people |
| 394 // to send feedback. | 393 // to send feedback. |
| 395 if (support_host_) | 394 ShowArcSupportHostError(error, true /* = show send feedback button */); |
| 396 support_host_->ShowError(error, true /* = show send feedback button */); | |
| 397 } | 395 } |
| 398 | 396 |
| 399 void ArcSessionManager::SetState(State state) { | 397 void ArcSessionManager::SetState(State state) { |
| 400 state_ = state; | 398 state_ = state; |
| 401 } | 399 } |
| 402 | 400 |
| 403 bool ArcSessionManager::IsAllowed() const { | 401 bool ArcSessionManager::IsAllowed() const { |
| 404 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 402 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 405 return profile_ != nullptr; | 403 return profile_ != nullptr; |
| 406 } | 404 } |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 587 // For Kiosk mode, skip ToS because it is very likely that near the device | 585 // For Kiosk mode, skip ToS because it is very likely that near the device |
| 588 // there will be no one who is eligible to accept them. | 586 // there will be no one who is eligible to accept them. |
| 589 // If opt-in verification is disabled, skip negotiation, too. This is for | 587 // If opt-in verification is disabled, skip negotiation, too. This is for |
| 590 // testing purpose. | 588 // testing purpose. |
| 591 if (prefs->GetBoolean(prefs::kArcSignedIn) || ShouldArcAlwaysStart() || | 589 if (prefs->GetBoolean(prefs::kArcSignedIn) || ShouldArcAlwaysStart() || |
| 592 IsArcKioskMode() || IsArcOptInVerificationDisabled()) { | 590 IsArcKioskMode() || IsArcOptInVerificationDisabled()) { |
| 593 StartArc(); | 591 StartArc(); |
| 594 // Check Android management in parallel. | 592 // Check Android management in parallel. |
| 595 // Note: StartBackgroundAndroidManagementCheck() may call | 593 // Note: StartBackgroundAndroidManagementCheck() may call |
| 596 // OnBackgroundAndroidManagementChecked() synchronously (or | 594 // OnBackgroundAndroidManagementChecked() synchronously (or |
| 597 // asynchornously). In the callback, Google Play Store enabled preference | 595 // asynchronously). In the callback, Google Play Store enabled preference |
| 598 // can be set to false if managed, and it triggers RequestDisable() via | 596 // can be set to false if managed, and it triggers RequestDisable() via |
| 599 // ArcPlayStoreEnabledPreferenceHandler. | 597 // ArcPlayStoreEnabledPreferenceHandler. |
| 600 // Thus, StartArc() should be called so that disabling should work even | 598 // Thus, StartArc() should be called so that disabling should work even |
| 601 // if synchronous call case. | 599 // if synchronous call case. |
| 602 StartBackgroundAndroidManagementCheck(); | 600 StartBackgroundAndroidManagementCheck(); |
| 603 return; | 601 return; |
| 604 } | 602 } |
| 605 | 603 |
| 606 MaybeStartTermsOfServiceNegotiation(); | 604 MaybeStartTermsOfServiceNegotiation(); |
| 607 } | 605 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 620 // Reset any pending request to re-enable ARC. | 618 // Reset any pending request to re-enable ARC. |
| 621 reenable_arc_ = false; | 619 reenable_arc_ = false; |
| 622 StopArc(); | 620 StopArc(); |
| 623 VLOG(1) << "ARC opt-out. Removing user data."; | 621 VLOG(1) << "ARC opt-out. Removing user data."; |
| 624 RequestArcDataRemoval(); | 622 RequestArcDataRemoval(); |
| 625 } | 623 } |
| 626 | 624 |
| 627 void ArcSessionManager::RequestArcDataRemoval() { | 625 void ArcSessionManager::RequestArcDataRemoval() { |
| 628 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 626 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 629 DCHECK(profile_); | 627 DCHECK(profile_); |
| 630 // TODO(hidehiko): DCHECK the previous state. This is called for three cases; | 628 // TODO(hidehiko): DCHECK the previous state. This is called for four cases; |
| 631 // 1) Supporting managed user initial disabled case (Please see also | 629 // 1) Supporting managed user initial disabled case (Please see also |
| 632 // ArcPlayStoreEnabledPreferenceHandler::Start() for details). | 630 // ArcPlayStoreEnabledPreferenceHandler::Start() for details). |
| 633 // 2) Supporting enterprise triggered data removal. | 631 // 2) Supporting enterprise triggered data removal. |
| 634 // 3) One called in OnProvisioningFinished(). | 632 // 3) One called in OnProvisioningFinished(). |
| 635 // 4) On request disabling. | 633 // 4) On request disabling. |
| 636 // After the state machine is fixed, 2) should be replaced by | 634 // After the state machine is fixed, 2) should be replaced by |
| 637 // RequestDisable() immediately followed by RequestEnable(). | 635 // RequestDisable() immediately followed by RequestEnable(). |
| 638 // 3) and 4) are internal state transition. So, as for public interface, 1) | 636 // 3) and 4) are internal state transition. So, as for public interface, 1) |
| 639 // should be the only use case, and the |state_| should be limited to | 637 // should be the only use case, and the |state_| should be limited to |
| 640 // STOPPED, then. | 638 // STOPPED, then. |
| (...skipping 18 matching lines...) Expand all Loading... |
| 659 DCHECK(!IsArcKioskMode()); | 657 DCHECK(!IsArcKioskMode()); |
| 660 // If opt-in verification is disabled, Terms of Service negotiation should | 658 // If opt-in verification is disabled, Terms of Service negotiation should |
| 661 // be skipped, too. See also RequestEnableImpl(). | 659 // be skipped, too. See also RequestEnableImpl(). |
| 662 DCHECK(!IsArcOptInVerificationDisabled()); | 660 DCHECK(!IsArcOptInVerificationDisabled()); |
| 663 | 661 |
| 664 // TODO(hidehiko): Remove this condition, when the state machine is fixed. | 662 // TODO(hidehiko): Remove this condition, when the state machine is fixed. |
| 665 if (!arc_session_runner_->IsStopped()) { | 663 if (!arc_session_runner_->IsStopped()) { |
| 666 // If the user attempts to re-enable ARC while the ARC instance is still | 664 // If the user attempts to re-enable ARC while the ARC instance is still |
| 667 // running the user should not be able to continue until the ARC instance | 665 // running the user should not be able to continue until the ARC instance |
| 668 // has stopped. | 666 // has stopped. |
| 669 if (support_host_) { | 667 ShowArcSupportHostError( |
| 670 support_host_->ShowError( | 668 ArcSupportHost::Error::SIGN_IN_SERVICE_UNAVAILABLE_ERROR, false); |
| 671 ArcSupportHost::Error::SIGN_IN_SERVICE_UNAVAILABLE_ERROR, false); | |
| 672 } | |
| 673 UpdateOptInCancelUMA(OptInCancelReason::SESSION_BUSY); | 669 UpdateOptInCancelUMA(OptInCancelReason::SESSION_BUSY); |
| 674 return; | 670 return; |
| 675 } | 671 } |
| 676 | 672 |
| 677 // TODO(hidehiko): DCHECK if |state_| is STOPPED, when the state machine | 673 // TODO(hidehiko): DCHECK if |state_| is STOPPED, when the state machine |
| 678 // is fixed. | 674 // is fixed. |
| 679 SetState(State::NEGOTIATING_TERMS_OF_SERVICE); | 675 SetState(State::NEGOTIATING_TERMS_OF_SERVICE); |
| 680 | 676 |
| 681 if (!scoped_opt_in_tracker_ && | 677 if (!scoped_opt_in_tracker_ && |
| 682 !profile_->GetPrefs()->GetBoolean(prefs::kArcSignedIn)) { | 678 !profile_->GetPrefs()->GetBoolean(prefs::kArcSignedIn)) { |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 766 | 762 |
| 767 // Show loading UI only if ARC support app's window is already shown. | 763 // Show loading UI only if ARC support app's window is already shown. |
| 768 // User may not see any ARC support UI if everything needed is done in | 764 // User may not see any ARC support UI if everything needed is done in |
| 769 // background. In such a case, showing loading UI here (then closed sometime | 765 // background. In such a case, showing loading UI here (then closed sometime |
| 770 // soon later) would look just noisy. | 766 // soon later) would look just noisy. |
| 771 if (support_host_ && | 767 if (support_host_ && |
| 772 support_host_->ui_page() != ArcSupportHost::UIPage::NO_PAGE) { | 768 support_host_->ui_page() != ArcSupportHost::UIPage::NO_PAGE) { |
| 773 support_host_->ShowArcLoading(); | 769 support_host_->ShowArcLoading(); |
| 774 } | 770 } |
| 775 | 771 |
| 772 for (auto& observer : observer_list_) |
| 773 observer.OnArcOptInManagementCheckStarted(); |
| 774 |
| 776 android_management_checker_ = base::MakeUnique<ArcAndroidManagementChecker>( | 775 android_management_checker_ = base::MakeUnique<ArcAndroidManagementChecker>( |
| 777 profile_, context_->token_service(), context_->account_id(), | 776 profile_, context_->token_service(), context_->account_id(), |
| 778 false /* retry_on_error */); | 777 false /* retry_on_error */); |
| 779 android_management_checker_->StartCheck( | 778 android_management_checker_->StartCheck( |
| 780 base::Bind(&ArcSessionManager::OnAndroidManagementChecked, | 779 base::Bind(&ArcSessionManager::OnAndroidManagementChecked, |
| 781 weak_ptr_factory_.GetWeakPtr())); | 780 weak_ptr_factory_.GetWeakPtr())); |
| 782 } | 781 } |
| 783 | 782 |
| 784 void ArcSessionManager::OnAndroidManagementChecked( | 783 void ArcSessionManager::OnAndroidManagementChecked( |
| 785 policy::AndroidManagementClient::Result result) { | 784 policy::AndroidManagementClient::Result result) { |
| 786 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 785 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 787 DCHECK_EQ(state_, State::CHECKING_ANDROID_MANAGEMENT); | 786 DCHECK_EQ(state_, State::CHECKING_ANDROID_MANAGEMENT); |
| 788 DCHECK(android_management_checker_); | 787 DCHECK(android_management_checker_); |
| 789 android_management_checker_.reset(); | 788 android_management_checker_.reset(); |
| 790 | 789 |
| 791 switch (result) { | 790 switch (result) { |
| 792 case policy::AndroidManagementClient::Result::UNMANAGED: | 791 case policy::AndroidManagementClient::Result::UNMANAGED: |
| 793 VLOG(1) << "Starting ARC for first sign in."; | 792 VLOG(1) << "Starting ARC for first sign in."; |
| 794 sign_in_start_time_ = base::Time::Now(); | 793 sign_in_start_time_ = base::Time::Now(); |
| 795 arc_sign_in_timer_.Start( | 794 arc_sign_in_timer_.Start( |
| 796 FROM_HERE, kArcSignInTimeout, | 795 FROM_HERE, kArcSignInTimeout, |
| 797 base::Bind(&ArcSessionManager::OnArcSignInTimeout, | 796 base::Bind(&ArcSessionManager::OnArcSignInTimeout, |
| 798 weak_ptr_factory_.GetWeakPtr())); | 797 weak_ptr_factory_.GetWeakPtr())); |
| 799 StartArc(); | 798 StartArc(); |
| 800 break; | 799 break; |
| 801 case policy::AndroidManagementClient::Result::MANAGED: | 800 case policy::AndroidManagementClient::Result::MANAGED: |
| 802 if (support_host_) { | 801 ShowArcSupportHostError( |
| 803 support_host_->ShowError( | 802 ArcSupportHost::Error::ANDROID_MANAGEMENT_REQUIRED_ERROR, false); |
| 804 ArcSupportHost::Error::ANDROID_MANAGEMENT_REQUIRED_ERROR, false); | |
| 805 } | |
| 806 UpdateOptInCancelUMA(OptInCancelReason::ANDROID_MANAGEMENT_REQUIRED); | 803 UpdateOptInCancelUMA(OptInCancelReason::ANDROID_MANAGEMENT_REQUIRED); |
| 807 break; | 804 break; |
| 808 case policy::AndroidManagementClient::Result::ERROR: | 805 case policy::AndroidManagementClient::Result::ERROR: |
| 809 if (support_host_) { | 806 ShowArcSupportHostError(ArcSupportHost::Error::SERVER_COMMUNICATION_ERROR, |
| 810 support_host_->ShowError( | 807 true); |
| 811 ArcSupportHost::Error::SERVER_COMMUNICATION_ERROR, true); | |
| 812 } | |
| 813 UpdateOptInCancelUMA(OptInCancelReason::NETWORK_ERROR); | 808 UpdateOptInCancelUMA(OptInCancelReason::NETWORK_ERROR); |
| 814 break; | 809 break; |
| 815 } | 810 } |
| 816 } | 811 } |
| 817 | 812 |
| 818 void ArcSessionManager::StartBackgroundAndroidManagementCheck() { | 813 void ArcSessionManager::StartBackgroundAndroidManagementCheck() { |
| 819 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 814 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 820 DCHECK_EQ(state_, State::ACTIVE); | 815 DCHECK_EQ(state_, State::ACTIVE); |
| 821 DCHECK(!android_management_checker_); | 816 DCHECK(!android_management_checker_); |
| 822 | 817 |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1023 arc_session_runner_ = std::move(arc_session_runner); | 1018 arc_session_runner_ = std::move(arc_session_runner); |
| 1024 arc_session_runner_->AddObserver(this); | 1019 arc_session_runner_->AddObserver(this); |
| 1025 } | 1020 } |
| 1026 | 1021 |
| 1027 void ArcSessionManager::SetAttemptUserExitCallbackForTesting( | 1022 void ArcSessionManager::SetAttemptUserExitCallbackForTesting( |
| 1028 const base::Closure& callback) { | 1023 const base::Closure& callback) { |
| 1029 DCHECK(!callback.is_null()); | 1024 DCHECK(!callback.is_null()); |
| 1030 attempt_user_exit_callback_ = callback; | 1025 attempt_user_exit_callback_ = callback; |
| 1031 } | 1026 } |
| 1032 | 1027 |
| 1028 void ArcSessionManager::ShowArcSupportHostError( |
| 1029 ArcSupportHost::Error error, |
| 1030 bool should_show_send_feedback) { |
| 1031 if (support_host_) |
| 1032 support_host_->ShowError(error, should_show_send_feedback); |
| 1033 for (auto& observer : observer_list_) |
| 1034 observer.OnArcErrorShowRequested(error); |
| 1035 } |
| 1036 |
| 1033 std::ostream& operator<<(std::ostream& os, | 1037 std::ostream& operator<<(std::ostream& os, |
| 1034 const ArcSessionManager::State& state) { | 1038 const ArcSessionManager::State& state) { |
| 1035 #define MAP_STATE(name) \ | 1039 #define MAP_STATE(name) \ |
| 1036 case ArcSessionManager::State::name: \ | 1040 case ArcSessionManager::State::name: \ |
| 1037 return os << #name | 1041 return os << #name |
| 1038 | 1042 |
| 1039 switch (state) { | 1043 switch (state) { |
| 1040 MAP_STATE(NOT_INITIALIZED); | 1044 MAP_STATE(NOT_INITIALIZED); |
| 1041 MAP_STATE(STOPPED); | 1045 MAP_STATE(STOPPED); |
| 1042 MAP_STATE(NEGOTIATING_TERMS_OF_SERVICE); | 1046 MAP_STATE(NEGOTIATING_TERMS_OF_SERVICE); |
| 1043 MAP_STATE(CHECKING_ANDROID_MANAGEMENT); | 1047 MAP_STATE(CHECKING_ANDROID_MANAGEMENT); |
| 1044 MAP_STATE(REMOVING_DATA_DIR); | 1048 MAP_STATE(REMOVING_DATA_DIR); |
| 1045 MAP_STATE(ACTIVE); | 1049 MAP_STATE(ACTIVE); |
| 1046 } | 1050 } |
| 1047 | 1051 |
| 1048 #undef MAP_STATE | 1052 #undef MAP_STATE |
| 1049 | 1053 |
| 1050 // Some compilers report an error even if all values of an enum-class are | 1054 // Some compilers report an error even if all values of an enum-class are |
| 1051 // covered exhaustively in a switch statement. | 1055 // covered exhaustively in a switch statement. |
| 1052 NOTREACHED() << "Invalid value " << static_cast<int>(state); | 1056 NOTREACHED() << "Invalid value " << static_cast<int>(state); |
| 1053 return os; | 1057 return os; |
| 1054 } | 1058 } |
| 1055 | 1059 |
| 1056 } // namespace arc | 1060 } // namespace arc |
| OLD | NEW |