| // 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<int>(GmsShortVersionCode::kNotParsable)); |
| return true; |
| } |
| |
| if (current_gms_core_version == 0) { |
| RecordGMSCoreVersionCode( |
| static_cast<int>(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<int>(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 |