File: magic_boost_state.cc

package info (click to toggle)
chromium 138.0.7204.183-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 6,071,908 kB
  • sloc: cpp: 34,937,088; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,953; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,806; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (137 lines) | stat: -rw-r--r-- 4,123 bytes parent folder | download | duplicates (5)
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
// Copyright 2024 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/components/magic_boost/public/cpp/magic_boost_state.h"

#include <cstdint>

#include "base/check.h"
#include "base/logging.h"
#include "chromeos/constants/chromeos_features.h"

namespace {
chromeos::MagicBoostState* g_magic_boost_state = nullptr;
}

namespace chromeos {

// static
MagicBoostState* MagicBoostState::Get() {
  return g_magic_boost_state;
}

MagicBoostState::MagicBoostState() {
  CHECK(!g_magic_boost_state);
  g_magic_boost_state = this;
}

MagicBoostState::~MagicBoostState() {
  NotifyOnIsDeleting();

  CHECK_EQ(g_magic_boost_state, this);
  g_magic_boost_state = nullptr;
}

void MagicBoostState::AddObserver(MagicBoostState::Observer* observer) {
  observers_.AddObserver(observer);
}

void MagicBoostState::RemoveObserver(MagicBoostState::Observer* observer) {
  observers_.RemoveObserver(observer);
}

bool MagicBoostState::ShouldShowHmrCard() {
  // Should not show if consent_status is `kDeclined` (users explicitly decline
  // in the opt-in flow). In case the consent status is `kUnset` (both Quick
  // Answers and Mahi is not consented to show yet), we would see the HMR card
  // when using the Magic Boost revamped logic.
  if (hmr_consent_status_ == HMRConsentStatus::kDeclined) {
    return false;
  }

  if (hmr_consent_status_ == HMRConsentStatus::kUnset) {
    return chromeos::features::IsMagicBoostRevampEnabled();
  }

  if (hmr_consent_status_.has_value()) {
    CHECK(hmr_consent_status_ == HMRConsentStatus::kApproved ||
          hmr_consent_status_ == HMRConsentStatus::kPendingDisclaimer);
  }

  return true;
}

bool MagicBoostState::IsMagicBoostAvailable() {
  if (!magic_boost_available_.has_value()) {
    // If the value is not loaded yet, try loading it now as it might be
    // available now. To determine eligibility, extended account info is
    // required, which is loaded as an async operation. We read the value after
    // refresh tokens are loaded in `IdentityManager`. But it turned out that
    // it's not enough for after-OOBE case. The correct fix will monitor updates
    // of extended account info, update and propagate availability properly.
    //
    // As a quick fix, we try re-loading availability as it gets requested by a
    // client. The value should be loaded soon after refresh tokens are loaded.
    // So there is a high-chance that the value is available at the time this
    // method is called from a client side code.
    //
    // See crbug.com/429501088 for details.
    magic_boost_available_ = IsMagicBoostAvailableExpected();
    if (magic_boost_available_.has_value()) {
      UpdateMagicBoostAvailable(magic_boost_available_.value());
    }
  }

  // Returns false if value is not available for fail-safe.
  return magic_boost_available_.value_or(false);
}

void MagicBoostState::UpdateMagicBoostAvailable(bool available) {
  if (magic_boost_available_ == available) {
    return;
  }

  magic_boost_available_ = available;

  for (auto& observer : observers_) {
    observer.OnMagicBoostAvailableUpdated(magic_boost_available_.value());
  }
}

void MagicBoostState::UpdateMagicBoostEnabled(bool enabled) {
  magic_boost_enabled_ = enabled;

  for (auto& observer : observers_) {
    observer.OnMagicBoostEnabledUpdated(magic_boost_enabled_.value());
  }
}

void MagicBoostState::UpdateHMREnabled(bool enabled) {
  hmr_enabled_ = enabled;

  for (auto& observer : observers_) {
    observer.OnHMREnabledUpdated(hmr_enabled_.value());
  }
}

void MagicBoostState::UpdateHMRConsentStatus(HMRConsentStatus consent_status) {
  hmr_consent_status_ = consent_status;

  for (auto& observer : observers_) {
    observer.OnHMRConsentStatusUpdated(hmr_consent_status_.value());
  }
}

void MagicBoostState::UpdateHMRConsentWindowDismissCount(
    int32_t dismiss_count) {
  hmr_consent_window_dismiss_count_ = dismiss_count;
}

void MagicBoostState::NotifyOnIsDeleting() {
  for (auto& observer : observers_) {
    observer.OnIsDeleting();
  }
}

}  // namespace chromeos