| // Copyright 2025 The Chromium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "chrome/browser/metrics/class_management_enabled_metrics_provider.h" | 
 |  | 
 | #include "base/check_is_test.h" | 
 | #include "base/metrics/histogram_functions.h" | 
 | #include "chrome/browser/ash/login/demo_mode/demo_session.h" | 
 | #include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h" | 
 | #include "chrome/browser/ash/policy/core/user_cloud_policy_manager_ash.h" | 
 | #include "chrome/browser/ash/profiles/profile_helper.h" | 
 | #include "chrome/browser/policy/profile_policy_connector.h" | 
 | #include "chrome/browser/profiles/profile.h" | 
 | #include "chrome/browser/profiles/profiles_state.h" | 
 | #include "chromeos/components/kiosk/kiosk_utils.h" | 
 | #include "chromeos/components/mgs/managed_guest_session_utils.h" | 
 | #include "components/session_manager/core/session_manager.h" | 
 | #include "components/user_manager/user.h" | 
 | #include "components/user_manager/user_manager.h" | 
 |  | 
 | namespace { | 
 |  | 
 | constexpr std::string_view kClassManagementStudent = "student"; | 
 | constexpr std::string_view kClassManagementTeacher = "teacher"; | 
 | constexpr std::string_view kHistogramName = "ChromeOS.ClassManagementEnabled"; | 
 | constexpr std::string_view kClassManagementEnabledName = | 
 |     "ClassManagementEnabled"; | 
 |  | 
 | ClassManagementEnabledMetricsProvider::ClassManagementEnabled | 
 | GetClassManagementEnabled(Profile* profile) { | 
 |   const policy::UserCloudPolicyManagerAsh* const user_cloud_policy_manager = | 
 |       profile->GetUserCloudPolicyManagerAsh(); | 
 |   if (!user_cloud_policy_manager) { | 
 |     return ClassManagementEnabledMetricsProvider::ClassManagementEnabled:: | 
 |         kDisabled; | 
 |   } | 
 |  | 
 |   const base::Value* const policy = | 
 |       user_cloud_policy_manager->core()->store()->policy_map().GetValue( | 
 |           std::string(kClassManagementEnabledName), base::Value::Type::STRING); | 
 |  | 
 |   if (!policy) { | 
 |     return ClassManagementEnabledMetricsProvider::ClassManagementEnabled:: | 
 |         kDisabled; | 
 |   } | 
 |   const std::string& policy_str = policy->GetString(); | 
 |   if (policy_str == kClassManagementStudent) { | 
 |     return ClassManagementEnabledMetricsProvider::ClassManagementEnabled:: | 
 |         kStudent; | 
 |   } | 
 |   if (policy_str == kClassManagementTeacher) { | 
 |     return ClassManagementEnabledMetricsProvider::ClassManagementEnabled:: | 
 |         kTeacher; | 
 |   } | 
 |   return ClassManagementEnabledMetricsProvider::ClassManagementEnabled:: | 
 |       kDisabled; | 
 | } | 
 | }  // namespace | 
 |  | 
 | ClassManagementEnabledMetricsProvider::ClassManagementEnabledMetricsProvider() { | 
 |   auto* const session_manager = session_manager::SessionManager::Get(); | 
 |   // The `session_manager` is nullptr only for unit tests. | 
 |   if (session_manager) { | 
 |     session_manager->AddObserver(this); | 
 |   } else { | 
 |     CHECK_IS_TEST(); | 
 |   } | 
 | } | 
 |  | 
 | ClassManagementEnabledMetricsProvider:: | 
 |     ~ClassManagementEnabledMetricsProvider() { | 
 |   auto* const session_manager = session_manager::SessionManager::Get(); | 
 |   // The `session_manager` is nullptr only for unit tests. | 
 |   if (session_manager) { | 
 |     session_manager->RemoveObserver(this); | 
 |   } else { | 
 |     CHECK_IS_TEST(); | 
 |   } | 
 | } | 
 |  | 
 | bool ClassManagementEnabledMetricsProvider::ProvideHistograms() { | 
 |   if (!segment_.has_value()) { | 
 |     return false; | 
 |   } | 
 |  | 
 |   base::UmaHistogramEnumeration(kHistogramName, segment_.value()); | 
 |   return true; | 
 | } | 
 |  | 
 | void ClassManagementEnabledMetricsProvider::OnUserSessionStarted( | 
 |     bool is_primary_user) { | 
 |   // Skip non-primary, demo, managed guest and kiosk users. | 
 |   if (!is_primary_user || profiles::IsDemoSession() || | 
 |       chromeos::IsManagedGuestSession() || chromeos::IsKioskSession()) { | 
 |     return; | 
 |   } | 
 |  | 
 |   const user_manager::User* const primary_user = | 
 |       user_manager::UserManager::Get()->GetPrimaryUser(); | 
 |   CHECK(primary_user); | 
 |   CHECK(primary_user->is_profile_created()); | 
 |   Profile* const profile = | 
 |       ash::ProfileHelper::Get()->GetProfileByUser(primary_user); | 
 |   CHECK(profile); | 
 |  | 
 |   // Skip unmanaged and unaffiliated users. | 
 |   if (profile->IsOffTheRecord() || primary_user->IsAffiliated()) { | 
 |     return; | 
 |   } | 
 |  | 
 |   segment_ = GetClassManagementEnabled(profile); | 
 | } |