// Copyright 2023 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "components/metrics/gms_metrics_provider.h" #include "base/logging.h" #include "base/android/build_info.h" #include "base/metrics/histogram_functions.h" #include "base/strings/string_number_conversions.h" namespace metrics { namespace { enum class GmsShortVersionCode { kNotInstalled = 0, kNotParsable = 1, kOutOfRange = 2, kMaxValue = kOutOfRange, }; // Minimum valid GMS Core version. constexpr int kMinimumVersion = 200302000; // Maximum valid GMS Core version. constexpr int kMaxValidVersion = 301200000; void RecordGMSCoreVersionCode(int version) { base::UmaHistogramSparse("Android.PlayServices.ShortVersion", version); } } // namespace GmsMetricsProvider::GmsMetricsProvider() = default; GmsMetricsProvider::~GmsMetricsProvider() = default; bool GmsMetricsProvider::ProvideHistograms() { int current_gms_core_version; if (!base::StringToInt(GetGMSVersion(), ¤t_gms_core_version)) { RecordGMSCoreVersionCode( static_cast(GmsShortVersionCode::kNotParsable)); return true; } if (current_gms_core_version == 0) { RecordGMSCoreVersionCode( static_cast(GmsShortVersionCode::kNotInstalled)); return true; } // Get rid of old versions and garbage. if (current_gms_core_version < kMinimumVersion || current_gms_core_version > kMaxValidVersion) { RecordGMSCoreVersionCode( static_cast(GmsShortVersionCode::kOutOfRange)); return true; } // Get first four digits representing a year and a week. int year_weak_code = current_gms_core_version / 100000; // Get following two digits indicating build version, version greater or equal // to 12 are stable releases. bool is_stable_release = ((current_gms_core_version / 1000) % 100) >= 12; // Log the current version in a YYWWV format, where 24031 would indicate // 2024y03w stable release. RecordGMSCoreVersionCode(year_weak_code * 10 + is_stable_release); return true; } std::string GmsMetricsProvider::GetGMSVersion() { base::android::BuildInfo* info = base::android::BuildInfo::GetInstance(); return info->gms_version_code(); } } // namespace metrics