Chromium Code Reviews| 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 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 411 // TODO(hidehiko): Revisit to think about lazy initialization. | 411 // TODO(hidehiko): Revisit to think about lazy initialization. |
| 412 // | 412 // |
| 413 // Don't show UI for ARC Kiosk because the only one UI in kiosk mode must | 413 // Don't show UI for ARC Kiosk because the only one UI in kiosk mode must |
| 414 // be the kiosk app. In case of error the UI will be useless as well, because | 414 // be the kiosk app. In case of error the UI will be useless as well, because |
| 415 // in typical use case there will be no one nearby the kiosk device, who can | 415 // in typical use case there will be no one nearby the kiosk device, who can |
| 416 // do some action to solve the problem be means of UI. | 416 // do some action to solve the problem be means of UI. |
| 417 if (!g_disable_ui_for_testing && !IsArcOptInVerificationDisabled() && | 417 if (!g_disable_ui_for_testing && !IsArcOptInVerificationDisabled() && |
| 418 !IsArcKioskMode()) { | 418 !IsArcKioskMode()) { |
| 419 DCHECK(!support_host_); | 419 DCHECK(!support_host_); |
| 420 support_host_ = base::MakeUnique<ArcSupportHost>(profile_); | 420 support_host_ = base::MakeUnique<ArcSupportHost>(profile_); |
| 421 support_host_->SetArcManaged(IsArcManaged()); | 421 support_host_->SetArcManaged(IsArcPlayStoreEnabledForProfile(profile_)); |
|
Yusuke Sato
2017/02/17 22:27:08
This contradicts with the description of the CL yo
hidehiko
2017/02/20 18:18:44
Good catch! Fixed.
| |
| 422 support_host_->AddObserver(this); | 422 support_host_->AddObserver(this); |
| 423 } | 423 } |
| 424 | 424 |
| 425 DCHECK_EQ(State::NOT_INITIALIZED, state_); | 425 DCHECK_EQ(State::NOT_INITIALIZED, state_); |
| 426 SetState(State::STOPPED); | 426 SetState(State::STOPPED); |
| 427 | 427 |
| 428 context_.reset(new ArcAuthContext(profile_)); | 428 context_.reset(new ArcAuthContext(profile_)); |
| 429 | 429 |
| 430 if (!g_disable_ui_for_testing || | 430 if (!g_disable_ui_for_testing || |
| 431 g_enable_check_android_management_for_testing) { | 431 g_enable_check_android_management_for_testing) { |
| 432 ArcAndroidManagementChecker::StartClient(); | 432 ArcAndroidManagementChecker::StartClient(); |
| 433 } | 433 } |
| 434 | 434 |
| 435 pref_change_registrar_.Init(profile_->GetPrefs()); | 435 pref_change_registrar_.Init(profile_->GetPrefs()); |
| 436 pref_change_registrar_.Add( | 436 pref_change_registrar_.Add( |
| 437 prefs::kArcEnabled, | 437 prefs::kArcEnabled, |
| 438 base::Bind(&ArcSessionManager::OnOptInPreferenceChanged, | 438 base::Bind(&ArcSessionManager::OnOptInPreferenceChanged, |
| 439 weak_ptr_factory_.GetWeakPtr())); | 439 weak_ptr_factory_.GetWeakPtr())); |
| 440 | 440 |
| 441 // Chrome may be shut down before completing ARC data removal. | 441 // Chrome may be shut down before completing ARC data removal. |
| 442 // In such a case, start removing the data now. | 442 // In such a case, start removing the data now. |
| 443 if (profile_->GetPrefs()->GetBoolean(prefs::kArcDataRemoveRequested)) { | 443 if (profile_->GetPrefs()->GetBoolean(prefs::kArcDataRemoveRequested)) { |
| 444 VLOG(1) << "ARC data removal requested in previous session."; | 444 VLOG(1) << "ARC data removal requested in previous session."; |
| 445 RemoveArcData(); | 445 RemoveArcData(); |
| 446 } | 446 } |
| 447 | 447 |
| 448 if (IsArcPlayStoreEnabled()) { | 448 if (IsArcPlayStoreEnabledForProfile(profile_)) { |
| 449 VLOG(1) << "ARC is already enabled."; | 449 VLOG(1) << "ARC is already enabled."; |
| 450 DCHECK(!enable_requested_); | 450 DCHECK(!enable_requested_); |
| 451 RequestEnable(); | 451 RequestEnable(); |
| 452 } else { | 452 } else { |
| 453 VLOG(1) << "ARC is initially disabled. Removing data."; | 453 VLOG(1) << "ARC is initially disabled. Removing data."; |
| 454 RemoveArcData(); | 454 RemoveArcData(); |
| 455 PrefServiceSyncableFromProfile(profile_)->AddObserver(this); | 455 PrefServiceSyncableFromProfile(profile_)->AddObserver(this); |
| 456 OnIsSyncingChanged(); | 456 OnIsSyncingChanged(); |
| 457 } | 457 } |
| 458 } | 458 } |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 502 } | 502 } |
| 503 ShutdownSession(); | 503 ShutdownSession(); |
| 504 if (support_host_) | 504 if (support_host_) |
| 505 support_host_->Close(); | 505 support_host_->Close(); |
| 506 } | 506 } |
| 507 | 507 |
| 508 void ArcSessionManager::OnOptInPreferenceChanged() { | 508 void ArcSessionManager::OnOptInPreferenceChanged() { |
| 509 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 509 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 510 DCHECK(profile_); | 510 DCHECK(profile_); |
| 511 | 511 |
| 512 const bool arc_enabled = IsArcPlayStoreEnabled(); | 512 const bool is_play_store_enabled = IsArcPlayStoreEnabledForProfile(profile_); |
| 513 if (!IsArcManaged()) { | 513 const bool is_play_store_managed = |
| 514 IsArcPlayStoreEnabledPreferenceManagedForProfile(profile_); | |
| 515 if (!is_play_store_managed) { | |
| 514 // Update UMA only for non-Managed cases. | 516 // Update UMA only for non-Managed cases. |
| 515 UpdateOptInActionUMA(arc_enabled ? OptInActionType::OPTED_IN | 517 UpdateOptInActionUMA(is_play_store_enabled ? OptInActionType::OPTED_IN |
| 516 : OptInActionType::OPTED_OUT); | 518 : OptInActionType::OPTED_OUT); |
| 517 | 519 |
| 518 if (!arc_enabled) { | 520 if (!is_play_store_enabled) { |
| 519 // Remove the pinned Play Store icon launcher in Shelf. | 521 // Remove the pinned Play Store icon launcher in Shelf. |
| 520 // This is only for non-Managed cases. In managed cases, it is expected | 522 // This is only for non-Managed cases. In managed cases, it is expected |
| 521 // to be "disabled" rather than "removed", so keep it here. | 523 // to be "disabled" rather than "removed", so keep it here. |
| 522 ash::ShelfDelegate* shelf_delegate = GetShelfDelegate(); | 524 ash::ShelfDelegate* shelf_delegate = GetShelfDelegate(); |
| 523 if (shelf_delegate) | 525 if (shelf_delegate) |
| 524 shelf_delegate->UnpinAppWithID(ArcSupportHost::kHostAppId); | 526 shelf_delegate->UnpinAppWithID(ArcSupportHost::kHostAppId); |
| 525 } | 527 } |
| 526 } | 528 } |
| 527 | 529 |
| 528 if (support_host_) | 530 if (support_host_) |
| 529 support_host_->SetArcManaged(IsArcManaged()); | 531 support_host_->SetArcManaged(is_play_store_managed); |
| 530 | 532 |
| 531 // Hide auth notification if it was opened before and arc.enabled pref was | 533 // Hide auth notification if it was opened before and arc.enabled pref was |
| 532 // explicitly set to true or false. | 534 // explicitly set to true or false. |
| 533 if (!g_disable_ui_for_testing && | 535 if (!g_disable_ui_for_testing && |
| 534 profile_->GetPrefs()->HasPrefPath(prefs::kArcEnabled)) { | 536 profile_->GetPrefs()->HasPrefPath(prefs::kArcEnabled)) { |
| 535 ArcAuthNotification::Hide(); | 537 ArcAuthNotification::Hide(); |
| 536 } | 538 } |
| 537 | 539 |
| 538 if (arc_enabled) | 540 if (is_play_store_enabled) |
| 539 RequestEnable(); | 541 RequestEnable(); |
| 540 else | 542 else |
| 541 RequestDisable(); | 543 RequestDisable(); |
| 542 | 544 |
| 543 for (auto& observer : observer_list_) | 545 for (auto& observer : observer_list_) |
| 544 observer.OnArcPlayStoreEnabledChanged(arc_enabled); | 546 observer.OnArcPlayStoreEnabledChanged(is_play_store_enabled); |
| 545 } | 547 } |
| 546 | 548 |
| 547 void ArcSessionManager::ShutdownSession() { | 549 void ArcSessionManager::ShutdownSession() { |
| 548 arc_sign_in_timer_.Stop(); | 550 arc_sign_in_timer_.Stop(); |
| 549 playstore_launcher_.reset(); | 551 playstore_launcher_.reset(); |
| 550 terms_of_service_negotiator_.reset(); | 552 terms_of_service_negotiator_.reset(); |
| 551 android_management_checker_.reset(); | 553 android_management_checker_.reset(); |
| 552 arc_session_runner_->RequestStop(); | 554 arc_session_runner_->RequestStop(); |
| 553 // TODO(hidehiko): The ARC instance's stopping is asynchronous, so it might | 555 // TODO(hidehiko): The ARC instance's stopping is asynchronous, so it might |
| 554 // still be running when we return from this function. Do not set the | 556 // still be running when we return from this function. Do not set the |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 636 } | 638 } |
| 637 | 639 |
| 638 // Update UMA with user cancel only if error is not currently shown. | 640 // Update UMA with user cancel only if error is not currently shown. |
| 639 if (support_host_ && | 641 if (support_host_ && |
| 640 support_host_->ui_page() != ArcSupportHost::UIPage::NO_PAGE && | 642 support_host_->ui_page() != ArcSupportHost::UIPage::NO_PAGE && |
| 641 support_host_->ui_page() != ArcSupportHost::UIPage::ERROR) { | 643 support_host_->ui_page() != ArcSupportHost::UIPage::ERROR) { |
| 642 UpdateOptInCancelUMA(OptInCancelReason::USER_CANCEL); | 644 UpdateOptInCancelUMA(OptInCancelReason::USER_CANCEL); |
| 643 } | 645 } |
| 644 | 646 |
| 645 StopArc(); | 647 StopArc(); |
| 646 SetArcPlayStoreEnabled(false); | 648 SetArcPlayStoreEnabledForProfile(profile_, false); |
| 647 } | |
| 648 | |
| 649 bool ArcSessionManager::IsArcManaged() const { | |
| 650 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | |
| 651 DCHECK(profile_); | |
| 652 return profile_->GetPrefs()->IsManagedPreference(prefs::kArcEnabled); | |
| 653 } | |
| 654 | |
| 655 bool ArcSessionManager::IsArcPlayStoreEnabled() const { | |
| 656 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | |
| 657 if (!IsAllowed()) | |
| 658 return false; | |
| 659 | |
| 660 DCHECK(profile_); | |
| 661 return profile_->GetPrefs()->GetBoolean(prefs::kArcEnabled); | |
| 662 } | |
| 663 | |
| 664 void ArcSessionManager::SetArcPlayStoreEnabled(bool enabled) { | |
| 665 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | |
| 666 DCHECK(profile_); | |
| 667 | |
| 668 if (IsArcManaged()) { | |
| 669 VLOG(1) << "Whether Google Play Store is enabled is managed. Do nothing."; | |
| 670 return; | |
| 671 } | |
| 672 | |
| 673 profile_->GetPrefs()->SetBoolean(prefs::kArcEnabled, enabled); | |
| 674 } | 649 } |
| 675 | 650 |
| 676 void ArcSessionManager::RecordArcState() { | 651 void ArcSessionManager::RecordArcState() { |
| 677 // Only record Enabled state if ARC is allowed in the first place, so we do | 652 // Only record Enabled state if ARC is allowed in the first place, so we do |
| 678 // not split the ARC population by devices that cannot run ARC. | 653 // not split the ARC population by devices that cannot run ARC. |
| 679 if (IsAllowed()) | 654 if (IsAllowed()) |
| 680 UpdateEnabledStateUMA(enable_requested_); | 655 UpdateEnabledStateUMA(enable_requested_); |
| 681 } | 656 } |
| 682 | 657 |
| 683 void ArcSessionManager::RequestEnable() { | 658 void ArcSessionManager::RequestEnable() { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 726 // because there are no managed human users for Kiosk exist. | 701 // because there are no managed human users for Kiosk exist. |
| 727 if (IsArcOptInVerificationDisabled() || IsArcKioskMode() || | 702 if (IsArcOptInVerificationDisabled() || IsArcKioskMode() || |
| 728 (g_disable_ui_for_testing && | 703 (g_disable_ui_for_testing && |
| 729 !g_enable_check_android_management_for_testing)) { | 704 !g_enable_check_android_management_for_testing)) { |
| 730 return; | 705 return; |
| 731 } | 706 } |
| 732 | 707 |
| 733 // Check Android management in parallel. | 708 // Check Android management in parallel. |
| 734 // Note: Because the callback may be called in synchronous way (i.e. called | 709 // Note: Because the callback may be called in synchronous way (i.e. called |
| 735 // on the same stack), StartCheck() needs to be called *after* StartArc(). | 710 // on the same stack), StartCheck() needs to be called *after* StartArc(). |
| 736 // Otherwise, SetArcPlayStoreEnabled() which may be called in | 711 // Otherwise, SetArcPlayStoreEnabledForProfile() which may be called in |
| 737 // OnBackgroundAndroidManagementChecked() could be ignored. | 712 // OnBackgroundAndroidManagementChecked() could be ignored. |
| 738 android_management_checker_ = base::MakeUnique<ArcAndroidManagementChecker>( | 713 android_management_checker_ = base::MakeUnique<ArcAndroidManagementChecker>( |
| 739 profile_, context_->token_service(), context_->account_id(), | 714 profile_, context_->token_service(), context_->account_id(), |
| 740 true /* retry_on_error */); | 715 true /* retry_on_error */); |
| 741 android_management_checker_->StartCheck( | 716 android_management_checker_->StartCheck( |
| 742 base::Bind(&ArcSessionManager::OnBackgroundAndroidManagementChecked, | 717 base::Bind(&ArcSessionManager::OnBackgroundAndroidManagementChecked, |
| 743 weak_ptr_factory_.GetWeakPtr())); | 718 weak_ptr_factory_.GetWeakPtr())); |
| 744 return; | 719 return; |
| 745 } | 720 } |
| 746 | 721 |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 886 } | 861 } |
| 887 | 862 |
| 888 void ArcSessionManager::OnBackgroundAndroidManagementChecked( | 863 void ArcSessionManager::OnBackgroundAndroidManagementChecked( |
| 889 policy::AndroidManagementClient::Result result) { | 864 policy::AndroidManagementClient::Result result) { |
| 890 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 865 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 891 switch (result) { | 866 switch (result) { |
| 892 case policy::AndroidManagementClient::Result::UNMANAGED: | 867 case policy::AndroidManagementClient::Result::UNMANAGED: |
| 893 // Do nothing. ARC should be started already. | 868 // Do nothing. ARC should be started already. |
| 894 break; | 869 break; |
| 895 case policy::AndroidManagementClient::Result::MANAGED: | 870 case policy::AndroidManagementClient::Result::MANAGED: |
| 896 SetArcPlayStoreEnabled(false); | 871 SetArcPlayStoreEnabledForProfile(profile_, false); |
| 897 break; | 872 break; |
| 898 case policy::AndroidManagementClient::Result::ERROR: | 873 case policy::AndroidManagementClient::Result::ERROR: |
| 899 // This code should not be reached. For background check, | 874 // This code should not be reached. For background check, |
| 900 // retry_on_error should be set. | 875 // retry_on_error should be set. |
| 901 NOTREACHED(); | 876 NOTREACHED(); |
| 902 } | 877 } |
| 903 } | 878 } |
| 904 | 879 |
| 905 void ArcSessionManager::OnWindowClosed() { | 880 void ArcSessionManager::OnWindowClosed() { |
| 906 DCHECK(support_host_); | 881 DCHECK(support_host_); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 990 | 965 |
| 991 #undef MAP_STATE | 966 #undef MAP_STATE |
| 992 | 967 |
| 993 // Some compilers report an error even if all values of an enum-class are | 968 // Some compilers report an error even if all values of an enum-class are |
| 994 // covered exhaustively in a switch statement. | 969 // covered exhaustively in a switch statement. |
| 995 NOTREACHED() << "Invalid value " << static_cast<int>(state); | 970 NOTREACHED() << "Invalid value " << static_cast<int>(state); |
| 996 return os; | 971 return os; |
| 997 } | 972 } |
| 998 | 973 |
| 999 } // namespace arc | 974 } // namespace arc |
| OLD | NEW |