onboarding_ui_tracker_impl.cc 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ash/components/phonehub/onboarding_ui_tracker_impl.h"
  5. #include "ash/components/phonehub/feature_status.h"
  6. #include "ash/components/phonehub/pref_names.h"
  7. #include "ash/components/phonehub/util/histogram_util.h"
  8. #include "ash/services/multidevice_setup/public/cpp/multidevice_setup_client.h"
  9. #include "components/prefs/pref_registry_simple.h"
  10. #include "components/prefs/pref_service.h"
  11. namespace ash {
  12. namespace phonehub {
  13. void OnboardingUiTrackerImpl::RegisterPrefs(PrefRegistrySimple* registry) {
  14. registry->RegisterBooleanPref(prefs::kHideOnboardingUi, false);
  15. }
  16. OnboardingUiTrackerImpl::OnboardingUiTrackerImpl(
  17. PrefService* pref_service,
  18. FeatureStatusProvider* feature_status_provider,
  19. multidevice_setup::MultiDeviceSetupClient* multidevice_setup_client,
  20. const base::RepeatingClosure& show_multidevice_setup_dialog_callback)
  21. : pref_service_(pref_service),
  22. feature_status_provider_(feature_status_provider),
  23. multidevice_setup_client_(multidevice_setup_client),
  24. show_multidevice_setup_dialog_callback_(
  25. std::move(show_multidevice_setup_dialog_callback)) {
  26. feature_status_provider_->AddObserver(this);
  27. multidevice_setup_client_->AddObserver(this);
  28. should_show_onboarding_ui_ = ComputeShouldShowOnboardingUi();
  29. }
  30. OnboardingUiTrackerImpl::~OnboardingUiTrackerImpl() {
  31. feature_status_provider_->RemoveObserver(this);
  32. multidevice_setup_client_->RemoveObserver(this);
  33. }
  34. bool OnboardingUiTrackerImpl::ShouldShowOnboardingUi() const {
  35. return should_show_onboarding_ui_;
  36. }
  37. void OnboardingUiTrackerImpl::DismissSetupUi() {
  38. pref_service_->SetBoolean(prefs::kHideOnboardingUi, true);
  39. UpdateShouldShowOnboardingUi();
  40. }
  41. void OnboardingUiTrackerImpl::HandleGetStarted() {
  42. FeatureStatus status = feature_status_provider_->GetStatus();
  43. // The user is not opted into Better Together yet.
  44. if (status == FeatureStatus::kEligiblePhoneButNotSetUp) {
  45. show_multidevice_setup_dialog_callback_.Run();
  46. return;
  47. }
  48. // The user is already opted into Better Together, but not Phone Hub.
  49. if (status == FeatureStatus::kDisabled) {
  50. multidevice_setup_client_->SetFeatureEnabledState(
  51. multidevice_setup::mojom::Feature::kPhoneHub,
  52. /*enabled=*/true, /*auth_token=*/absl::nullopt, base::DoNothing());
  53. util::LogFeatureOptInEntryPoint(util::OptInEntryPoint::kOnboardingFlow);
  54. return;
  55. }
  56. LOG(ERROR)
  57. << "Cannot handle a GetStarted request because the current state is "
  58. << status;
  59. }
  60. void OnboardingUiTrackerImpl::OnFeatureStatusChanged() {
  61. UpdateShouldShowOnboardingUi();
  62. }
  63. void OnboardingUiTrackerImpl::OnFeatureStatesChanged(
  64. const multidevice_setup::MultiDeviceSetupClient::FeatureStatesMap&
  65. feature_states_map) {
  66. const multidevice_setup::mojom::FeatureState phonehub_state =
  67. feature_states_map.find(multidevice_setup::mojom::Feature::kPhoneHub)
  68. ->second;
  69. // User has gone through the onboarding process, prevent the UI from
  70. // displaying again.
  71. if (phonehub_state ==
  72. multidevice_setup::mojom::FeatureState::kEnabledByUser) {
  73. pref_service_->SetBoolean(prefs::kHideOnboardingUi, true);
  74. UpdateShouldShowOnboardingUi();
  75. }
  76. }
  77. bool OnboardingUiTrackerImpl::ComputeShouldShowOnboardingUi() {
  78. FeatureStatus status = feature_status_provider_->GetStatus();
  79. if (status == FeatureStatus::kEligiblePhoneButNotSetUp ||
  80. status == FeatureStatus::kDisabled) {
  81. return !pref_service_->GetBoolean(prefs::kHideOnboardingUi);
  82. }
  83. return false;
  84. }
  85. void OnboardingUiTrackerImpl::UpdateShouldShowOnboardingUi() {
  86. bool should_show_onboarding_ui = ComputeShouldShowOnboardingUi();
  87. if (should_show_onboarding_ui_ == should_show_onboarding_ui)
  88. return;
  89. should_show_onboarding_ui_ = should_show_onboarding_ui;
  90. NotifyShouldShowOnboardingUiChanged();
  91. }
  92. } // namespace phonehub
  93. } // namespace ash