File: onboarding_ui_tracker_impl.cc

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (117 lines) | stat: -rw-r--r-- 4,377 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chromeos/ash/components/phonehub/onboarding_ui_tracker_impl.h"

#include "chromeos/ash/components/phonehub/feature_status.h"
#include "chromeos/ash/components/phonehub/pref_names.h"
#include "chromeos/ash/components/phonehub/util/histogram_util.h"
#include "chromeos/ash/services/multidevice_setup/public/cpp/multidevice_setup_client.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/pref_service.h"

namespace ash::phonehub {

void OnboardingUiTrackerImpl::RegisterPrefs(PrefRegistrySimple* registry) {
  registry->RegisterBooleanPref(prefs::kHideOnboardingUi, false);
}

OnboardingUiTrackerImpl::OnboardingUiTrackerImpl(
    PrefService* pref_service,
    FeatureStatusProvider* feature_status_provider,
    multidevice_setup::MultiDeviceSetupClient* multidevice_setup_client,
    const base::RepeatingClosure& show_multidevice_setup_dialog_callback)
    : pref_service_(pref_service),
      feature_status_provider_(feature_status_provider),
      multidevice_setup_client_(multidevice_setup_client),
      show_multidevice_setup_dialog_callback_(
          std::move(show_multidevice_setup_dialog_callback)) {
  feature_status_provider_->AddObserver(this);
  multidevice_setup_client_->AddObserver(this);

  should_show_onboarding_ui_ = ComputeShouldShowOnboardingUi();
}

OnboardingUiTrackerImpl::~OnboardingUiTrackerImpl() {
  feature_status_provider_->RemoveObserver(this);
  multidevice_setup_client_->RemoveObserver(this);
}

bool OnboardingUiTrackerImpl::ShouldShowOnboardingUi() const {
  return should_show_onboarding_ui_;
}

void OnboardingUiTrackerImpl::DismissSetupUi() {
  pref_service_->SetBoolean(prefs::kHideOnboardingUi, true);
  UpdateShouldShowOnboardingUi();
}

void OnboardingUiTrackerImpl::HandleGetStarted(
    bool is_icon_clicked_when_nudge_visible) {
  FeatureStatus status = feature_status_provider_->GetStatus();

  // The user is not opted into Better Together yet.
  if (status == FeatureStatus::kEligiblePhoneButNotSetUp) {
    show_multidevice_setup_dialog_callback_.Run();
    if (is_icon_clicked_when_nudge_visible) {
      util::LogMultiDeviceSetupDialogEntryPoint(
          util::MultiDeviceSetupDialogEntrypoint::kPhoneHubBubbleAferNudge);
    } else {
      util::LogMultiDeviceSetupDialogEntryPoint(
          util::MultiDeviceSetupDialogEntrypoint::kPhoneHubBubble);
    }
    return;
  }

  // The user is already opted into Better Together, but not Phone Hub.
  if (status == FeatureStatus::kDisabled) {
    multidevice_setup_client_->SetFeatureEnabledState(
        multidevice_setup::mojom::Feature::kPhoneHub,
        /*enabled=*/true, /*auth_token=*/std::nullopt, base::DoNothing());
    util::LogFeatureOptInEntryPoint(util::OptInEntryPoint::kOnboardingFlow);
    return;
  }
  LOG(ERROR)
      << "Cannot handle a GetStarted request because the current state is "
      << status;
}

void OnboardingUiTrackerImpl::OnFeatureStatusChanged() {
  UpdateShouldShowOnboardingUi();
}

void OnboardingUiTrackerImpl::OnFeatureStatesChanged(
    const multidevice_setup::MultiDeviceSetupClient::FeatureStatesMap&
        feature_states_map) {
  const multidevice_setup::mojom::FeatureState phonehub_state =
      feature_states_map.find(multidevice_setup::mojom::Feature::kPhoneHub)
          ->second;
  // User has gone through the onboarding process, prevent the UI from
  // displaying again.
  if (phonehub_state ==
      multidevice_setup::mojom::FeatureState::kEnabledByUser) {
    pref_service_->SetBoolean(prefs::kHideOnboardingUi, true);
    UpdateShouldShowOnboardingUi();
  }
}

bool OnboardingUiTrackerImpl::ComputeShouldShowOnboardingUi() {
  FeatureStatus status = feature_status_provider_->GetStatus();

  if (status == FeatureStatus::kEligiblePhoneButNotSetUp ||
      status == FeatureStatus::kDisabled) {
    return !pref_service_->GetBoolean(prefs::kHideOnboardingUi);
  }
  return false;
}

void OnboardingUiTrackerImpl::UpdateShouldShowOnboardingUi() {
  bool should_show_onboarding_ui = ComputeShouldShowOnboardingUi();
  if (should_show_onboarding_ui_ == should_show_onboarding_ui)
    return;
  should_show_onboarding_ui_ = should_show_onboarding_ui;
  NotifyShouldShowOnboardingUiChanged();
}

}  // namespace ash::phonehub