xref: /aosp_15_r20/external/cronet/components/metrics/gms_metrics_provider.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2023 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "components/metrics/gms_metrics_provider.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include "base/logging.h"
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include "base/android/build_info.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/metrics/histogram_functions.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker namespace metrics {
14*6777b538SAndroid Build Coastguard Worker namespace {
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker enum class GmsShortVersionCode {
17*6777b538SAndroid Build Coastguard Worker   kNotInstalled = 0,
18*6777b538SAndroid Build Coastguard Worker   kNotParsable = 1,
19*6777b538SAndroid Build Coastguard Worker   kOutOfRange = 2,
20*6777b538SAndroid Build Coastguard Worker   kMaxValue = kOutOfRange,
21*6777b538SAndroid Build Coastguard Worker };
22*6777b538SAndroid Build Coastguard Worker 
23*6777b538SAndroid Build Coastguard Worker // Minimum valid GMS Core version.
24*6777b538SAndroid Build Coastguard Worker constexpr int kMinimumVersion = 200302000;
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker // Maximum valid GMS Core version.
27*6777b538SAndroid Build Coastguard Worker constexpr int kMaxValidVersion = 301200000;
28*6777b538SAndroid Build Coastguard Worker 
RecordGMSCoreVersionCode(int version)29*6777b538SAndroid Build Coastguard Worker void RecordGMSCoreVersionCode(int version) {
30*6777b538SAndroid Build Coastguard Worker   base::UmaHistogramSparse("Android.PlayServices.ShortVersion", version);
31*6777b538SAndroid Build Coastguard Worker }
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker }  // namespace
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker GmsMetricsProvider::GmsMetricsProvider() = default;
36*6777b538SAndroid Build Coastguard Worker GmsMetricsProvider::~GmsMetricsProvider() = default;
37*6777b538SAndroid Build Coastguard Worker 
ProvideHistograms()38*6777b538SAndroid Build Coastguard Worker bool GmsMetricsProvider::ProvideHistograms() {
39*6777b538SAndroid Build Coastguard Worker   int current_gms_core_version;
40*6777b538SAndroid Build Coastguard Worker   if (!base::StringToInt(GetGMSVersion(), &current_gms_core_version)) {
41*6777b538SAndroid Build Coastguard Worker     RecordGMSCoreVersionCode(
42*6777b538SAndroid Build Coastguard Worker         static_cast<int>(GmsShortVersionCode::kNotParsable));
43*6777b538SAndroid Build Coastguard Worker     return true;
44*6777b538SAndroid Build Coastguard Worker   }
45*6777b538SAndroid Build Coastguard Worker 
46*6777b538SAndroid Build Coastguard Worker   if (current_gms_core_version == 0) {
47*6777b538SAndroid Build Coastguard Worker     RecordGMSCoreVersionCode(
48*6777b538SAndroid Build Coastguard Worker         static_cast<int>(GmsShortVersionCode::kNotInstalled));
49*6777b538SAndroid Build Coastguard Worker     return true;
50*6777b538SAndroid Build Coastguard Worker   }
51*6777b538SAndroid Build Coastguard Worker 
52*6777b538SAndroid Build Coastguard Worker   // Get rid of old versions and garbage.
53*6777b538SAndroid Build Coastguard Worker   if (current_gms_core_version < kMinimumVersion ||
54*6777b538SAndroid Build Coastguard Worker       current_gms_core_version > kMaxValidVersion) {
55*6777b538SAndroid Build Coastguard Worker     RecordGMSCoreVersionCode(
56*6777b538SAndroid Build Coastguard Worker         static_cast<int>(GmsShortVersionCode::kOutOfRange));
57*6777b538SAndroid Build Coastguard Worker     return true;
58*6777b538SAndroid Build Coastguard Worker   }
59*6777b538SAndroid Build Coastguard Worker   // Get first four digits representing a year and a week.
60*6777b538SAndroid Build Coastguard Worker   int year_weak_code = current_gms_core_version / 100000;
61*6777b538SAndroid Build Coastguard Worker   // Get following two digits indicating build version, version greater or equal
62*6777b538SAndroid Build Coastguard Worker   // to 12 are stable releases.
63*6777b538SAndroid Build Coastguard Worker   bool is_stable_release = ((current_gms_core_version / 1000) % 100) >= 12;
64*6777b538SAndroid Build Coastguard Worker 
65*6777b538SAndroid Build Coastguard Worker   // Log the current version in a YYWWV format, where 24031 would indicate
66*6777b538SAndroid Build Coastguard Worker   // 2024y03w stable release.
67*6777b538SAndroid Build Coastguard Worker   RecordGMSCoreVersionCode(year_weak_code * 10 + is_stable_release);
68*6777b538SAndroid Build Coastguard Worker   return true;
69*6777b538SAndroid Build Coastguard Worker }
70*6777b538SAndroid Build Coastguard Worker 
GetGMSVersion()71*6777b538SAndroid Build Coastguard Worker std::string GmsMetricsProvider::GetGMSVersion() {
72*6777b538SAndroid Build Coastguard Worker   base::android::BuildInfo* info = base::android::BuildInfo::GetInstance();
73*6777b538SAndroid Build Coastguard Worker   return info->gms_version_code();
74*6777b538SAndroid Build Coastguard Worker }
75*6777b538SAndroid Build Coastguard Worker 
76*6777b538SAndroid Build Coastguard Worker }  // namespace metrics