| 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/common/shelf/shelf_delegate.h" | 9 #include "ash/common/shelf/shelf_delegate.h" |
| 10 #include "ash/common/wm_shell.h" | 10 #include "ash/common/wm_shell.h" |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 | 57 |
| 58 // The Android management check is disabled by default, it's used only for | 58 // The Android management check is disabled by default, it's used only for |
| 59 // testing. | 59 // testing. |
| 60 bool g_enable_check_android_management_for_testing = false; | 60 bool g_enable_check_android_management_for_testing = false; |
| 61 | 61 |
| 62 // Maximum amount of time we'll wait for ARC to finish booting up. Once this | 62 // Maximum amount of time we'll wait for ARC to finish booting up. Once this |
| 63 // timeout expires, keep ARC running in case the user wants to file feedback, | 63 // timeout expires, keep ARC running in case the user wants to file feedback, |
| 64 // but present the UI to try again. | 64 // but present the UI to try again. |
| 65 constexpr base::TimeDelta kArcSignInTimeout = base::TimeDelta::FromMinutes(5); | 65 constexpr base::TimeDelta kArcSignInTimeout = base::TimeDelta::FromMinutes(5); |
| 66 | 66 |
| 67 // Updates UMA with user cancel only if error is not currently shown. |
| 68 void MaybeUpdateOptInCancelUMA(const ArcSupportHost* support_host) { |
| 69 if (!support_host || |
| 70 support_host->ui_page() == ArcSupportHost::UIPage::NO_PAGE || |
| 71 support_host->ui_page() == ArcSupportHost::UIPage::ERROR) { |
| 72 return; |
| 73 } |
| 74 |
| 75 UpdateOptInCancelUMA(OptInCancelReason::USER_CANCEL); |
| 76 } |
| 77 |
| 67 } // namespace | 78 } // namespace |
| 68 | 79 |
| 69 ArcSessionManager::ArcSessionManager( | 80 ArcSessionManager::ArcSessionManager( |
| 70 std::unique_ptr<ArcSessionRunner> arc_session_runner) | 81 std::unique_ptr<ArcSessionRunner> arc_session_runner) |
| 71 : arc_session_runner_(std::move(arc_session_runner)), | 82 : arc_session_runner_(std::move(arc_session_runner)), |
| 72 attempt_user_exit_callback_(base::Bind(chrome::AttemptUserExit)), | 83 attempt_user_exit_callback_(base::Bind(chrome::AttemptUserExit)), |
| 73 weak_ptr_factory_(this) { | 84 weak_ptr_factory_(this) { |
| 74 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 85 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 75 DCHECK(!g_arc_session_manager); | 86 DCHECK(!g_arc_session_manager); |
| 76 g_arc_session_manager = this; | 87 g_arc_session_manager = this; |
| (...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 515 | 526 |
| 516 if (state_ == State::NOT_INITIALIZED) { | 527 if (state_ == State::NOT_INITIALIZED) { |
| 517 NOTREACHED(); | 528 NOTREACHED(); |
| 518 return; | 529 return; |
| 519 } | 530 } |
| 520 | 531 |
| 521 // If ARC failed to boot normally, stop ARC. Similarly, if the current page is | 532 // If ARC failed to boot normally, stop ARC. Similarly, if the current page is |
| 522 // LSO, closing the window should stop ARC since the user activity chooses to | 533 // LSO, closing the window should stop ARC since the user activity chooses to |
| 523 // not sign in. In any other case, ARC is booting normally and the instance | 534 // not sign in. In any other case, ARC is booting normally and the instance |
| 524 // should not be stopped. | 535 // should not be stopped. |
| 525 if ((state_ != State::SHOWING_TERMS_OF_SERVICE && | 536 if ((state_ != State::NEGOTIATING_TERMS_OF_SERVICE && |
| 526 state_ != State::CHECKING_ANDROID_MANAGEMENT) && | 537 state_ != State::CHECKING_ANDROID_MANAGEMENT) && |
| 527 (!support_host_ || | 538 (!support_host_ || |
| 528 (support_host_->ui_page() != ArcSupportHost::UIPage::ERROR && | 539 (support_host_->ui_page() != ArcSupportHost::UIPage::ERROR && |
| 529 support_host_->ui_page() != ArcSupportHost::UIPage::LSO))) { | 540 support_host_->ui_page() != ArcSupportHost::UIPage::LSO))) { |
| 530 return; | 541 return; |
| 531 } | 542 } |
| 532 | 543 |
| 533 // Update UMA with user cancel only if error is not currently shown. | 544 MaybeUpdateOptInCancelUMA(support_host_.get()); |
| 534 if (support_host_ && | |
| 535 support_host_->ui_page() != ArcSupportHost::UIPage::NO_PAGE && | |
| 536 support_host_->ui_page() != ArcSupportHost::UIPage::ERROR) { | |
| 537 UpdateOptInCancelUMA(OptInCancelReason::USER_CANCEL); | |
| 538 } | |
| 539 | |
| 540 StopArc(); | 545 StopArc(); |
| 541 SetArcPlayStoreEnabledForProfile(profile_, false); | 546 SetArcPlayStoreEnabledForProfile(profile_, false); |
| 542 } | 547 } |
| 543 | 548 |
| 544 void ArcSessionManager::RecordArcState() { | 549 void ArcSessionManager::RecordArcState() { |
| 545 // Only record Enabled state if ARC is allowed in the first place, so we do | 550 // Only record Enabled state if ARC is allowed in the first place, so we do |
| 546 // not split the ARC population by devices that cannot run ARC. | 551 // not split the ARC population by devices that cannot run ARC. |
| 547 if (IsAllowed()) | 552 if (IsAllowed()) |
| 548 UpdateEnabledStateUMA(enable_requested_); | 553 UpdateEnabledStateUMA(enable_requested_); |
| 549 } | 554 } |
| (...skipping 23 matching lines...) Expand all Loading... |
| 573 | 578 |
| 574 if (state_ == State::REMOVING_DATA_DIR) { | 579 if (state_ == State::REMOVING_DATA_DIR) { |
| 575 // Data removal request is in progress. Set flag to re-enable ARC once it | 580 // Data removal request is in progress. Set flag to re-enable ARC once it |
| 576 // is finished. | 581 // is finished. |
| 577 reenable_arc_ = true; | 582 reenable_arc_ = true; |
| 578 return; | 583 return; |
| 579 } | 584 } |
| 580 | 585 |
| 581 PrefService* const prefs = profile_->GetPrefs(); | 586 PrefService* const prefs = profile_->GetPrefs(); |
| 582 | 587 |
| 583 // For ARC Kiosk we skip ToS because it is very likely that near the device | |
| 584 // there will be no one who is eligible to accept them. | |
| 585 // TODO(poromov): Move to more Kiosk dedicated set-up phase. | |
| 586 if (IsArcKioskMode()) | |
| 587 prefs->SetBoolean(prefs::kArcTermsAccepted, true); | |
| 588 | |
| 589 // Skip to show UI asking users to set up ARC OptIn preferences, if all of | |
| 590 // them are managed by the admin policy. Note that the ToS agreement is anyway | |
| 591 // not shown in the case of the managed ARC. | |
| 592 if (IsArcPlayStoreEnabledPreferenceManagedForProfile(profile_) && | |
| 593 AreArcAllOptInPreferencesManagedForProfile(profile_)) { | |
| 594 prefs->SetBoolean(prefs::kArcTermsAccepted, true); | |
| 595 } | |
| 596 | |
| 597 // If it is marked that sign in has been successfully done, if ARC has been | 588 // If it is marked that sign in has been successfully done, if ARC has been |
| 598 // set up to always start, then directly start ARC. | 589 // set up to always start, then directly start ARC. |
| 599 // For testing, and for Kiosk mode, we also skip ToS negotiation procedure. | 590 // For Kiosk mode, skip ToS because it is very likely that near the device |
| 600 // For backward compatibility, this check needs to be prior to the | 591 // there will be no one who is eligible to accept them. |
| 601 // kArcTermsAccepted check below. | 592 // If opt-in verification is disabled, skip negotiation, too. This is for |
| 593 // testing purpose. |
| 602 if (prefs->GetBoolean(prefs::kArcSignedIn) || ShouldArcAlwaysStart() || | 594 if (prefs->GetBoolean(prefs::kArcSignedIn) || ShouldArcAlwaysStart() || |
| 603 IsArcOptInVerificationDisabled() || IsArcKioskMode()) { | 595 IsArcKioskMode() || IsArcOptInVerificationDisabled()) { |
| 604 StartArc(); | 596 StartArc(); |
| 605 // Check Android management in parallel. | 597 // Check Android management in parallel. |
| 606 // Note: StartBackgroundAndroidManagementCheck() may call | 598 // Note: StartBackgroundAndroidManagementCheck() may call |
| 607 // OnBackgroundAndroidManagementChecked() synchronously (or | 599 // OnBackgroundAndroidManagementChecked() synchronously (or |
| 608 // asynchornously). In the callback, Google Play Store enabled preference | 600 // asynchornously). In the callback, Google Play Store enabled preference |
| 609 // can be set to false if managed, and it triggers RequestDisable() via | 601 // can be set to false if managed, and it triggers RequestDisable() via |
| 610 // ArcPlayStoreEnabledPreferenceHandler. | 602 // ArcPlayStoreEnabledPreferenceHandler. |
| 611 // Thus, StartArc() should be called so that disabling should work even | 603 // Thus, StartArc() should be called so that disabling should work even |
| 612 // if synchronous call case. | 604 // if synchronous call case. |
| 613 StartBackgroundAndroidManagementCheck(); | 605 StartBackgroundAndroidManagementCheck(); |
| 614 return; | 606 return; |
| 615 } | 607 } |
| 616 | 608 |
| 617 // If it is marked that the Terms of service is accepted already, | |
| 618 // just skip the negotiation with user, and start Android management | |
| 619 // check directly. | |
| 620 // This happens, e.g., when; | |
| 621 // 1) User accepted the Terms of service on OOBE flow. | |
| 622 // 2) User accepted the Terms of service on Opt-in flow, but logged out | |
| 623 // before ARC sign in procedure was done. Then, logs in again. | |
| 624 if (prefs->GetBoolean(prefs::kArcTermsAccepted)) { | |
| 625 // Don't show UI for this progress if it was not shown. | |
| 626 if (support_host_ && | |
| 627 support_host_->ui_page() != ArcSupportHost::UIPage::NO_PAGE) { | |
| 628 support_host_->ShowArcLoading(); | |
| 629 } | |
| 630 StartAndroidManagementCheck(); | |
| 631 return; | |
| 632 } | |
| 633 | |
| 634 StartTermsOfServiceNegotiation(); | 609 StartTermsOfServiceNegotiation(); |
| 635 } | 610 } |
| 636 | 611 |
| 637 void ArcSessionManager::RequestDisable() { | 612 void ArcSessionManager::RequestDisable() { |
| 638 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 613 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 639 DCHECK(profile_); | 614 DCHECK(profile_); |
| 640 | 615 |
| 641 if (!enable_requested_) { | 616 if (!enable_requested_) { |
| 642 VLOG(1) << "ARC is already disabled. Do nothing."; | 617 VLOG(1) << "ARC is already disabled. Do nothing."; |
| 643 return; | 618 return; |
| 644 } | 619 } |
| 645 enable_requested_ = false; | 620 enable_requested_ = false; |
| 646 | 621 |
| 647 // Reset any pending request to re-enable ARC. | 622 // Reset any pending request to re-enable ARC. |
| 648 VLOG(1) << "ARC opt-out. Removing user data."; | 623 VLOG(1) << "ARC opt-out. Removing user data."; |
| 649 reenable_arc_ = false; | 624 reenable_arc_ = false; |
| 650 StopArc(); | 625 StopArc(); |
| 651 RemoveArcData(); | 626 RemoveArcData(); |
| 652 } | 627 } |
| 653 | 628 |
| 654 void ArcSessionManager::StartTermsOfServiceNegotiation() { | 629 void ArcSessionManager::StartTermsOfServiceNegotiation() { |
| 655 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 630 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 631 DCHECK(profile_); |
| 656 DCHECK(!terms_of_service_negotiator_); | 632 DCHECK(!terms_of_service_negotiator_); |
| 633 // In Kiosk-mode, Terms of Service negotiation should be skipped. |
| 634 // See also RequestEnableImpl(). |
| 635 DCHECK(!IsArcKioskMode()); |
| 636 // If opt-in verification is disabled, Terms of Service negotiation should |
| 637 // be skipped, too. See also RequestEnableImpl(). |
| 638 DCHECK(!IsArcOptInVerificationDisabled()); |
| 657 | 639 |
| 640 // TODO(hidehiko): Remove this condition, when the state machine is fixed. |
| 658 if (!arc_session_runner_->IsStopped()) { | 641 if (!arc_session_runner_->IsStopped()) { |
| 659 // If the user attempts to re-enable ARC while the ARC instance is still | 642 // If the user attempts to re-enable ARC while the ARC instance is still |
| 660 // running the user should not be able to continue until the ARC instance | 643 // running the user should not be able to continue until the ARC instance |
| 661 // has stopped. | 644 // has stopped. |
| 662 if (support_host_) { | 645 if (support_host_) { |
| 663 support_host_->ShowError( | 646 support_host_->ShowError( |
| 664 ArcSupportHost::Error::SIGN_IN_SERVICE_UNAVAILABLE_ERROR, false); | 647 ArcSupportHost::Error::SIGN_IN_SERVICE_UNAVAILABLE_ERROR, false); |
| 665 } | 648 } |
| 666 return; | 649 return; |
| 667 } | 650 } |
| 668 | 651 |
| 669 SetState(State::SHOWING_TERMS_OF_SERVICE); | 652 // TODO(hidehiko): DCHECK if |state_| is STOPPED, when the state machine |
| 653 // is fixed. |
| 654 SetState(State::NEGOTIATING_TERMS_OF_SERVICE); |
| 655 |
| 656 if (!IsArcTermsOfServiceNegotiationNeeded()) { |
| 657 // Moves to next state, Android management check, immediately, as if |
| 658 // Terms of Service negotiation is done successfully. |
| 659 StartAndroidManagementCheck(); |
| 660 return; |
| 661 } |
| 662 |
| 670 if (IsOobeOptInActive()) { | 663 if (IsOobeOptInActive()) { |
| 671 VLOG(1) << "Use OOBE negotiator."; | 664 VLOG(1) << "Use OOBE negotiator."; |
| 672 terms_of_service_negotiator_ = | 665 terms_of_service_negotiator_ = |
| 673 base::MakeUnique<ArcTermsOfServiceOobeNegotiator>(); | 666 base::MakeUnique<ArcTermsOfServiceOobeNegotiator>(); |
| 674 } else if (support_host_) { | 667 } else if (support_host_) { |
| 675 VLOG(1) << "Use default negotiator."; | 668 VLOG(1) << "Use default negotiator."; |
| 676 terms_of_service_negotiator_ = | 669 terms_of_service_negotiator_ = |
| 677 base::MakeUnique<ArcTermsOfServiceDefaultNegotiator>( | 670 base::MakeUnique<ArcTermsOfServiceDefaultNegotiator>( |
| 678 profile_->GetPrefs(), support_host_.get()); | 671 profile_->GetPrefs(), support_host_.get()); |
| 672 } else { |
| 673 // The only case reached here is when g_disable_ui_for_testing is set |
| 674 // so ARC support host is not created in SetProfile(), for testing purpose. |
| 675 DCHECK(g_disable_ui_for_testing) |
| 676 << "Negotiator is not created on production."; |
| 677 return; |
| 679 } | 678 } |
| 680 | 679 |
| 681 if (terms_of_service_negotiator_) { | 680 terms_of_service_negotiator_->StartNegotiation( |
| 682 terms_of_service_negotiator_->StartNegotiation( | 681 base::Bind(&ArcSessionManager::OnTermsOfServiceNegotiated, |
| 683 base::Bind(&ArcSessionManager::OnTermsOfServiceNegotiated, | 682 weak_ptr_factory_.GetWeakPtr())); |
| 684 weak_ptr_factory_.GetWeakPtr())); | |
| 685 } | |
| 686 } | 683 } |
| 687 | 684 |
| 688 void ArcSessionManager::OnTermsOfServiceNegotiated(bool accepted) { | 685 void ArcSessionManager::OnTermsOfServiceNegotiated(bool accepted) { |
| 686 DCHECK_EQ(state_, State::NEGOTIATING_TERMS_OF_SERVICE); |
| 687 DCHECK(profile_); |
| 689 DCHECK(terms_of_service_negotiator_); | 688 DCHECK(terms_of_service_negotiator_); |
| 690 terms_of_service_negotiator_.reset(); | 689 terms_of_service_negotiator_.reset(); |
| 691 | 690 |
| 692 if (!accepted) { | 691 if (!accepted) { |
| 693 // To cancel, user needs to close the window. Note that clicking "Cancel" | 692 // User does not accept the Terms of Service. Disable Google Play Store. |
| 694 // button effectively just closes the window. | 693 MaybeUpdateOptInCancelUMA(support_host_.get()); |
| 695 CancelAuthCode(); | 694 SetArcPlayStoreEnabledForProfile(profile_, false); |
| 696 return; | 695 return; |
| 697 } | 696 } |
| 698 | 697 |
| 699 // Terms were accepted. | 698 // Terms were accepted. |
| 700 profile_->GetPrefs()->SetBoolean(prefs::kArcTermsAccepted, true); | 699 profile_->GetPrefs()->SetBoolean(prefs::kArcTermsAccepted, true); |
| 700 StartAndroidManagementCheck(); |
| 701 } |
| 701 | 702 |
| 702 // Don't show UI for this progress if it was not shown. | 703 bool ArcSessionManager::IsArcTermsOfServiceNegotiationNeeded() const { |
| 703 if (support_host_ && | 704 DCHECK(profile_); |
| 704 support_host_->ui_page() != ArcSupportHost::UIPage::NO_PAGE) | 705 |
| 705 support_host_->ShowArcLoading(); | 706 // Skip to show UI asking users to set up ARC OptIn preferences, if all of |
| 706 StartAndroidManagementCheck(); | 707 // them are managed by the admin policy. Note that the ToS agreement is anyway |
| 708 // not shown in the case of the managed ARC. |
| 709 if (AreArcAllOptInPreferencesManagedForProfile(profile_)) { |
| 710 VLOG(1) << "All opt-in preferences are under managed. " |
| 711 << "Skip ARC Terms of Service negotiation."; |
| 712 return false; |
| 713 } |
| 714 |
| 715 // If it is marked that the Terms of service is accepted already, |
| 716 // just skip the negotiation with user, and start Android management |
| 717 // check directly. |
| 718 // This happens, e.g., when a user accepted the Terms of service on Opt-in |
| 719 // flow, but logged out before ARC sign in procedure was done. Then, logs |
| 720 // in again. |
| 721 if (profile_->GetPrefs()->GetBoolean(prefs::kArcTermsAccepted)) { |
| 722 VLOG(1) << "The user already accepts ARC Terms of Service."; |
| 723 return false; |
| 724 } |
| 725 |
| 726 return true; |
| 707 } | 727 } |
| 708 | 728 |
| 709 void ArcSessionManager::StartAndroidManagementCheck() { | 729 void ArcSessionManager::StartAndroidManagementCheck() { |
| 710 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 730 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 711 DCHECK(arc_session_runner_->IsStopped()); | 731 DCHECK(arc_session_runner_->IsStopped()); |
| 712 DCHECK(state_ == State::SHOWING_TERMS_OF_SERVICE || | 732 DCHECK(state_ == State::NEGOTIATING_TERMS_OF_SERVICE || |
| 713 state_ == State::CHECKING_ANDROID_MANAGEMENT || | 733 state_ == State::CHECKING_ANDROID_MANAGEMENT); |
| 714 (state_ == State::STOPPED && | |
| 715 profile_->GetPrefs()->GetBoolean(prefs::kArcTermsAccepted))); | |
| 716 DCHECK(!android_management_checker_); | |
| 717 SetState(State::CHECKING_ANDROID_MANAGEMENT); | 734 SetState(State::CHECKING_ANDROID_MANAGEMENT); |
| 718 | 735 |
| 736 // Show loading UI only if ARC support app's window is already shown. |
| 737 // User may not see any ARC support UI if everything needed is done in |
| 738 // background. In such a case, showing loading UI here (then closed sometime |
| 739 // soon later) would look just noisy. |
| 740 if (support_host_ && |
| 741 support_host_->ui_page() != ArcSupportHost::UIPage::NO_PAGE) { |
| 742 support_host_->ShowArcLoading(); |
| 743 } |
| 744 |
| 719 android_management_checker_ = base::MakeUnique<ArcAndroidManagementChecker>( | 745 android_management_checker_ = base::MakeUnique<ArcAndroidManagementChecker>( |
| 720 profile_, context_->token_service(), context_->account_id(), | 746 profile_, context_->token_service(), context_->account_id(), |
| 721 false /* retry_on_error */); | 747 false /* retry_on_error */); |
| 722 android_management_checker_->StartCheck( | 748 android_management_checker_->StartCheck( |
| 723 base::Bind(&ArcSessionManager::OnAndroidManagementChecked, | 749 base::Bind(&ArcSessionManager::OnAndroidManagementChecked, |
| 724 weak_ptr_factory_.GetWeakPtr())); | 750 weak_ptr_factory_.GetWeakPtr())); |
| 725 } | 751 } |
| 726 | 752 |
| 727 void ArcSessionManager::OnAndroidManagementChecked( | 753 void ArcSessionManager::OnAndroidManagementChecked( |
| 728 policy::AndroidManagementClient::Result result) { | 754 policy::AndroidManagementClient::Result result) { |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 862 support_host_->ShowArcLoading(); | 888 support_host_->ShowArcLoading(); |
| 863 ShutdownSession(); | 889 ShutdownSession(); |
| 864 reenable_arc_ = true; | 890 reenable_arc_ = true; |
| 865 } else if (state_ == State::ACTIVE) { | 891 } else if (state_ == State::ACTIVE) { |
| 866 // This case is handled in ArcAuthService. | 892 // This case is handled in ArcAuthService. |
| 867 // Do nothing. | 893 // Do nothing. |
| 868 } else { | 894 } else { |
| 869 // Otherwise, we restart ARC. Note: this is the first boot case. | 895 // Otherwise, we restart ARC. Note: this is the first boot case. |
| 870 // For second or later boot, either ERROR_WITH_FEEDBACK case or ACTIVE | 896 // For second or later boot, either ERROR_WITH_FEEDBACK case or ACTIVE |
| 871 // case must hit. | 897 // case must hit. |
| 872 support_host_->ShowArcLoading(); | |
| 873 StartAndroidManagementCheck(); | 898 StartAndroidManagementCheck(); |
| 874 } | 899 } |
| 875 } | 900 } |
| 876 | 901 |
| 877 void ArcSessionManager::OnSendFeedbackClicked() { | 902 void ArcSessionManager::OnSendFeedbackClicked() { |
| 878 DCHECK(support_host_); | 903 DCHECK(support_host_); |
| 879 chrome::OpenFeedbackDialog(nullptr); | 904 chrome::OpenFeedbackDialog(nullptr); |
| 880 } | 905 } |
| 881 | 906 |
| 882 void ArcSessionManager::SetArcSessionRunnerForTesting( | 907 void ArcSessionManager::SetArcSessionRunnerForTesting( |
| (...skipping 14 matching lines...) Expand all Loading... |
| 897 | 922 |
| 898 std::ostream& operator<<(std::ostream& os, | 923 std::ostream& operator<<(std::ostream& os, |
| 899 const ArcSessionManager::State& state) { | 924 const ArcSessionManager::State& state) { |
| 900 #define MAP_STATE(name) \ | 925 #define MAP_STATE(name) \ |
| 901 case ArcSessionManager::State::name: \ | 926 case ArcSessionManager::State::name: \ |
| 902 return os << #name | 927 return os << #name |
| 903 | 928 |
| 904 switch (state) { | 929 switch (state) { |
| 905 MAP_STATE(NOT_INITIALIZED); | 930 MAP_STATE(NOT_INITIALIZED); |
| 906 MAP_STATE(STOPPED); | 931 MAP_STATE(STOPPED); |
| 907 MAP_STATE(SHOWING_TERMS_OF_SERVICE); | 932 MAP_STATE(NEGOTIATING_TERMS_OF_SERVICE); |
| 908 MAP_STATE(CHECKING_ANDROID_MANAGEMENT); | 933 MAP_STATE(CHECKING_ANDROID_MANAGEMENT); |
| 909 MAP_STATE(REMOVING_DATA_DIR); | 934 MAP_STATE(REMOVING_DATA_DIR); |
| 910 MAP_STATE(ACTIVE); | 935 MAP_STATE(ACTIVE); |
| 911 } | 936 } |
| 912 | 937 |
| 913 #undef MAP_STATE | 938 #undef MAP_STATE |
| 914 | 939 |
| 915 // Some compilers report an error even if all values of an enum-class are | 940 // Some compilers report an error even if all values of an enum-class are |
| 916 // covered exhaustively in a switch statement. | 941 // covered exhaustively in a switch statement. |
| 917 NOTREACHED() << "Invalid value " << static_cast<int>(state); | 942 NOTREACHED() << "Invalid value " << static_cast<int>(state); |
| 918 return os; | 943 return os; |
| 919 } | 944 } |
| 920 | 945 |
| 921 } // namespace arc | 946 } // namespace arc |
| OLD | NEW |