// 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.
#ifndef CHROME_BROWSER_METRICS_FAMILY_USER_METRICS_PROVIDER_H_
#define CHROME_BROWSER_METRICS_FAMILY_USER_METRICS_PROVIDER_H_
#include <optional>
#include "base/scoped_multi_source_observation.h"
#include "components/metrics/metrics_provider.h"
#include "components/session_manager/core/session_manager_observer.h"
#include "components/signin/public/identity_manager/identity_manager.h"
class Profile;
// Categorizes the current user into a family user type for UMA dashboard
// filtering. This metrics provider is ChromeOS specific.
class FamilyUserMetricsProvider
: public metrics::MetricsProvider,
public session_manager::SessionManagerObserver,
public signin::IdentityManager::Observer {
public:
// These enum values represent the current user's log segment for the Family
// Experiences team's metrics.
// These values are logged to UMA. Entries should not be renumbered and
// numeric values should never be reused. Please keep in sync with
// "FamilyUserLogSegment" in src/tools/metrics/histograms/enums.xml.
enum class FamilyUserLogSegment {
// User does not fall into any of the below categories.
kOther = 0,
// Supervised primary account with no secondary accounts.
kSupervisedUser = 1,
// Supervised primary account with EDU secondary account. If the primary
// account is supervised, then the secondary account must be EDU if one
// exists.
kSupervisedStudent = 2,
// Kindergarten-12th grade (K-12) EDU primary account on an unmanaged
// device, regardless of the secondary account.
kStudentAtHome = 3,
// Regular unmanaged user on any device, regardless of the secondary
// account.
kRegularUser = 4,
// Add future entries above this comment, in sync with
// "FamilyUserLogSegment" in src/tools/metrics/histograms/enums.xml.
// Update kMaxValue to the last value.
kMaxValue = kRegularUser
};
FamilyUserMetricsProvider();
FamilyUserMetricsProvider(const FamilyUserMetricsProvider&) = delete;
FamilyUserMetricsProvider& operator=(const FamilyUserMetricsProvider&) =
delete;
~FamilyUserMetricsProvider() override;
// MetricsProvider:
bool ProvideHistograms() override;
// session_manager::SessionManagerObserver:
void OnUserSessionStarted(bool is_primary_user) override;
// signin::IdentityManager::Observer:
void OnRefreshTokensLoaded() override;
void OnRefreshTokenUpdatedForAccount(
const CoreAccountInfo& account_info) override;
void OnRefreshTokenRemovedForAccount(
const CoreAccountId& account_id) override;
static const char* GetFamilyUserLogSegmentHistogramNameForTesting();
static const char* GetNumSecondaryAccountsHistogramNameForTesting();
private:
void ObserveIdentityManager(Profile* profile);
bool IsSupervisedUser(Profile* profile);
bool IsSupervisedStudent(Profile* profile);
// The only way the |family_user_log_segment_| can change during a ChromeOS
// session is if a child user adds or removes an EDU secondary account. Since
// this action doesn't happen often, cache the log segment.
std::optional<FamilyUserLogSegment> family_user_log_segment_;
int num_secondary_accounts_ = -1;
base::ScopedMultiSourceObservation<signin::IdentityManager,
signin::IdentityManager::Observer>
identity_manager_observations_{this};
};
#endif // CHROME_BROWSER_METRICS_FAMILY_USER_METRICS_PROVIDER_H_