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 Workervoid 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 Workerbool GmsMetricsProvider::ProvideHistograms() { 39*6777b538SAndroid Build Coastguard Worker int current_gms_core_version; 40*6777b538SAndroid Build Coastguard Worker if (!base::StringToInt(GetGMSVersion(), ¤t_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 Workerstd::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