Skip to content

Commit

Permalink
Add Client Hint for Google Play Services version (#3762)
Browse files Browse the repository at this point in the history
b/348076343
  • Loading branch information
gbournou authored Jul 9, 2024
1 parent bf2e706 commit 2669bf0
Show file tree
Hide file tree
Showing 16 changed files with 113 additions and 20 deletions.
3 changes: 3 additions & 0 deletions cobalt/browser/client_hint_headers.cc
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@ std::vector<std::string> GetClientHintHeaders(
AddHeader(headers, "Android-OS-Experience",
platform_info.android_os_experience());

AddHeader(headers, "Android-Play-Services-Version",
platform_info.android_play_services_version());

return headers;
}

Expand Down
4 changes: 3 additions & 1 deletion cobalt/browser/client_hint_headers_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,14 @@ TEST(ClientHintHeadersTest, GetClientHintHeaders) {
UserAgentPlatformInfo platform_info;
platform_info.set_android_build_fingerprint("abc/def:123.456/xy-z");
platform_info.set_android_os_experience("Amati");
platform_info.set_android_play_services_version("123");

std::vector<std::string> headers = GetClientHintHeaders(platform_info);
EXPECT_THAT(headers,
UnorderedElementsAre(
"Sec-CH-UA-Co-Android-Build-Fingerprint:abc/def:123.456/xy-z",
"Sec-CH-UA-Co-Android-OS-Experience:Amati"));
"Sec-CH-UA-Co-Android-OS-Experience:Amati",
"Sec-CH-UA-Co-Android-Play-Services-Version:123"));
}

} // namespace
Expand Down
34 changes: 25 additions & 9 deletions cobalt/browser/user_agent_platform_info.cc
Original file line number Diff line number Diff line change
Expand Up @@ -280,16 +280,23 @@ void InitializeUserAgentPlatformInfoFields(UserAgentPlatformInfo& info) {
auto platform_info_extension =
static_cast<const CobaltExtensionPlatformInfoApi*>(
SbSystemGetExtension(kCobaltExtensionPlatformInfoName));
if (platform_info_extension &&
strcmp(platform_info_extension->name, kCobaltExtensionPlatformInfoName) ==
0 &&
platform_info_extension->version >= 1) {
result = platform_info_extension->GetFirmwareVersionDetails(
value, kSystemPropertyMaxLength);
if (result) {
info.set_android_build_fingerprint(value);
if (platform_info_extension) {
if (platform_info_extension->version >= 1) {
result = platform_info_extension->GetFirmwareVersionDetails(
value, kSystemPropertyMaxLength);
if (result) {
info.set_android_build_fingerprint(value);
}
info.set_android_os_experience(
platform_info_extension->GetOsExperience());
}
if (platform_info_extension->version >= 2) {
int64_t ver = platform_info_extension->GetCoreServicesVersion();
if (ver != 0) {
std::string sver = std::to_string(ver);
info.set_android_play_services_version(sver);
}
}
info.set_android_os_experience(platform_info_extension->GetOsExperience());
}

info.set_cobalt_version(COBALT_VERSION);
Expand Down Expand Up @@ -433,6 +440,9 @@ void InitializeUserAgentPlatformInfoFields(UserAgentPlatformInfo& info) {
} else if (!input.first.compare("android_os_experience")) {
info.set_android_os_experience(input.second);
LOG(INFO) << "Set android os experience to " << input.second;
} else if (!input.first.compare("android_play_services_version")) {
info.set_android_play_services_version(input.second);
LOG(INFO) << "Set android play services version to " << input.second;
} else if (!input.first.compare("cobalt_version")) {
info.set_cobalt_version(input.second);
LOG(INFO) << "Set cobalt type to " << input.second;
Expand Down Expand Up @@ -559,6 +569,12 @@ void UserAgentPlatformInfo::set_android_os_experience(
android_os_experience_ = Sanitize(android_os_experience, isTCHAR);
}

void UserAgentPlatformInfo::set_android_play_services_version(
const std::string& android_play_services_version) {
android_play_services_version_ =
Sanitize(android_play_services_version, base::IsAsciiDigit);
}

void UserAgentPlatformInfo::set_cobalt_version(
const std::string& cobalt_version) {
cobalt_version_ = Sanitize(cobalt_version, isTCHAR);
Expand Down
10 changes: 8 additions & 2 deletions cobalt/browser/user_agent_platform_info.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,9 @@ class UserAgentPlatformInfo : public web::UserAgentPlatformInfo {
const std::string& android_os_experience() const override {
return android_os_experience_;
}
const std::string& android_play_services_version() const override {
return android_play_services_version_;
}
const std::string& cobalt_version() const override { return cobalt_version_; }
const std::string& cobalt_build_version_number() const override {
return cobalt_build_version_number_;
Expand Down Expand Up @@ -118,6 +121,8 @@ class UserAgentPlatformInfo : public web::UserAgentPlatformInfo {
void set_android_build_fingerprint(
const std::string& android_build_fingerprint);
void set_android_os_experience(const std::string& android_os_experience);
void set_android_play_services_version(
const std::string& android_play_services_version);
void set_cobalt_version(const std::string& cobalt_version);
void set_cobalt_build_version_number(
const std::string& cobalt_build_version_number);
Expand All @@ -142,8 +147,9 @@ class UserAgentPlatformInfo : public web::UserAgentPlatformInfo {
std::string evergreen_type_;
std::string evergreen_file_type_;
std::string evergreen_version_;
std::string android_build_fingerprint_; // Only via Client Hints
std::string android_os_experience_; // Only via Client Hints
std::string android_build_fingerprint_; // Only via Client Hints
std::string android_os_experience_; // Only via Client Hints
std::string android_play_services_version_; // Only via Client Hints

std::string cobalt_version_;
std::string cobalt_build_version_number_;
Expand Down
1 change: 1 addition & 0 deletions cobalt/web/cobalt_ua_data_values.idl
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ dictionary CobaltUADataValues : UADataValues {
DOMString evergreenVersion;
DOMString androidBuildFingerprint;
DOMString androidOsExperience;
DOMString androidPlayServicesVersion;
DOMString starboardVersion;
DOMString originalDesignManufacturer;
DOMString deviceType;
Expand Down
3 changes: 3 additions & 0 deletions cobalt/web/cobalt_ua_data_values_interface.cc
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,9 @@ CobaltUADataValuesInterface::CobaltUADataValuesInterface(
if (init_dict.has_android_os_experience()) {
android_os_experience_ = init_dict.android_os_experience();
}
if (init_dict.has_android_play_services_version()) {
android_play_services_version_ = init_dict.android_play_services_version();
}
if (init_dict.has_starboard_version()) {
starboard_version_ = init_dict.starboard_version();
}
Expand Down
4 changes: 4 additions & 0 deletions cobalt/web/cobalt_ua_data_values_interface.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ class CobaltUADataValuesInterface : public script::Wrappable {
const std::string& android_os_experience() const {
return android_os_experience_;
}
const std::string& android_play_services_version() const {
return android_play_services_version_;
}
const std::string& starboard_version() const { return starboard_version_; }
const std::string& original_design_manufacturer() const {
return original_design_manufacturer_;
Expand Down Expand Up @@ -87,6 +90,7 @@ class CobaltUADataValuesInterface : public script::Wrappable {
std::string evergreen_version_;
std::string android_build_fingerprint_;
std::string android_os_experience_;
std::string android_play_services_version_;
std::string starboard_version_;
std::string original_design_manufacturer_;
std::string device_type_;
Expand Down
1 change: 1 addition & 0 deletions cobalt/web/cobalt_ua_data_values_interface.idl
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ interface CobaltUADataValuesInterface {
readonly attribute DOMString evergreenVersion;
readonly attribute DOMString androidBuildFingerprint;
readonly attribute DOMString androidOsExperience;
readonly attribute DOMString androidPlayServicesVersion;
readonly attribute DOMString starboardVersion;
readonly attribute DOMString originalDesignManufacturer;
readonly attribute DOMString deviceType;
Expand Down
2 changes: 2 additions & 0 deletions cobalt/web/navigator_ua_data.cc
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ NavigatorUAData::NavigatorUAData(
platform_info->android_build_fingerprint());
all_high_entropy_values_.set_android_os_experience(
platform_info->android_os_experience());
all_high_entropy_values_.set_android_play_services_version(
platform_info->android_play_services_version());
all_high_entropy_values_.set_starboard_version(
platform_info->starboard_version());
all_high_entropy_values_.set_original_design_manufacturer(
Expand Down
5 changes: 4 additions & 1 deletion cobalt/web/testing/mock_user_agent_platform_info.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ namespace testing {
class MockUserAgentPlatformInfo : public web::UserAgentPlatformInfo {
public:
MockUserAgentPlatformInfo() {}
~MockUserAgentPlatformInfo() override{};
~MockUserAgentPlatformInfo() override {};

// From: dom:UserAgentPlatformInfo
//
Expand Down Expand Up @@ -81,6 +81,9 @@ class MockUserAgentPlatformInfo : public web::UserAgentPlatformInfo {
const std::string& android_os_experience() const override {
return empty_string_;
}
const std::string& android_play_services_version() const override {
return empty_string_;
}
const std::string& cobalt_version() const override { return empty_string_; }
const std::string& cobalt_build_version_number() const override {
return empty_string_;
Expand Down
1 change: 1 addition & 0 deletions cobalt/web/user_agent_platform_info.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ class UserAgentPlatformInfo {
virtual const std::string& evergreen_version() const = 0;
virtual const std::string& android_build_fingerprint() const = 0;
virtual const std::string& android_os_experience() const = 0;
virtual const std::string& android_play_services_version() const = 0;

virtual const std::string& cobalt_version() const = 0;
virtual const std::string& cobalt_build_version_number() const = 0;
Expand Down
11 changes: 7 additions & 4 deletions starboard/android/apk/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ apply plugin: 'com.android.application'

final DEFAULT_COBALT_TARGET = 'cobalt'
final String[] SUPPORTED_ABIS = [ 'x86', 'armeabi-v7a', 'arm64-v8a' ]
final MIN_SUPPORTED_SDK_VERSION = 24
final LATEST_SUPPORTED_SDK_VERSION = 34

// Parse the NDK_VERSION and CMAKE_VERSION defined in sdk_utils.py
final SDK_UTILS = project.rootProject.file('../shared/sdk_utils.py')
Expand Down Expand Up @@ -45,8 +47,8 @@ println "TARGET: ${cobaltTarget}"

android {
namespace "dev.cobalt.coat"
compileSdkVersion 'android-31'
buildToolsVersion '31.0.0'
compileSdkVersion "android-${LATEST_SUPPORTED_SDK_VERSION}"
buildToolsVersion "${LATEST_SUPPORTED_SDK_VERSION}.0.0"
ndkVersion NDK_VERSION

compileOptions {
Expand Down Expand Up @@ -75,8 +77,9 @@ android {
}
defaultConfig {
applicationId "dev.cobalt.coat"
minSdkVersion 24
targetSdkVersion 34
minSdkVersion MIN_SUPPORTED_SDK_VERSION
targetSdkVersion LATEST_SUPPORTED_SDK_VERSION
compileSdkVersion LATEST_SUPPORTED_SDK_VERSION
versionCode 1
versionName "${buildId}"
manifestPlaceholders = [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ public void run() {
private final HashMap<String, CobaltService> cobaltServices = new HashMap<>();
private final HashMap<String, String> crashContext = new HashMap<>();

private static final String GOOGLE_PLAY_SERVICES_PACKAGE = "com.google.android.gms";
private static final String AMATI_EXPERIENCE_FEATURE =
"com.google.android.feature.AMATI_EXPERIENCE";
private final boolean isAmatiDevice;
Expand Down Expand Up @@ -620,7 +621,15 @@ protected String getUserAgentAuxField() {
sb.append('/');

try {
sb.append(appContext.getPackageManager().getPackageInfo(packageName, 0).versionName);
if (android.os.Build.VERSION.SDK_INT < 33) {
sb.append(appContext.getPackageManager().getPackageInfo(packageName, 0).versionName);
} else {
sb.append(
appContext
.getPackageManager()
.getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(0))
.versionName);
}
} catch (PackageManager.NameNotFoundException ex) {
// Should never happen
Log.e(TAG, "Can't find our own package", ex);
Expand Down Expand Up @@ -799,4 +808,30 @@ protected boolean getIsAmatiDevice() {
protected String getBuildFingerprint() {
return Build.FINGERPRINT;
}

@SuppressWarnings("unused")
@UsedByNative
protected long getPlayServicesVersion() {
try {
if (android.os.Build.VERSION.SDK_INT < 28) {
return appContext
.getPackageManager()
.getPackageInfo(GOOGLE_PLAY_SERVICES_PACKAGE, 0)
.versionCode;
} else if (android.os.Build.VERSION.SDK_INT < 33) {
return appContext
.getPackageManager()
.getPackageInfo(GOOGLE_PLAY_SERVICES_PACKAGE, 0)
.getLongVersionCode();
} else {
return appContext
.getPackageManager()
.getPackageInfo(GOOGLE_PLAY_SERVICES_PACKAGE, PackageManager.PackageInfoFlags.of(0))
.getLongVersionCode();
}
} catch (Exception e) {
Log.w(TAG, "Unable to query Google Play Services package version", e);
return 0;
}
}
}
10 changes: 9 additions & 1 deletion starboard/android/shared/platform_info.cc
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,20 @@ const char* GetOsExperience() {
return "Watson";
}

int64_t GetCoreServicesVersion() {
return JniEnvExt::Get()->CallStarboardLongMethodOrAbort(
"getPlayServicesVersion", "()J");
}

// clang-format off
const CobaltExtensionPlatformInfoApi kPlatformInfoApi = {
kCobaltExtensionPlatformInfoName,
1,
2,
&GetFirmwareVersionDetails,
&GetOsExperience,
&GetCoreServicesVersion,
};
// clang-format on

} // namespace

Expand Down
3 changes: 2 additions & 1 deletion starboard/extension/extension_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -435,9 +435,10 @@ TEST(ExtensionTest, PlatformInfo) {
}

EXPECT_STREQ(extension_api->name, kExtensionName);
EXPECT_EQ(extension_api->version, 1u);
EXPECT_EQ(extension_api->version, 2u);
EXPECT_NE(extension_api->GetFirmwareVersionDetails, nullptr);
EXPECT_NE(extension_api->GetOsExperience, nullptr);
EXPECT_NE(extension_api->GetCoreServicesVersion, nullptr);

const ExtensionApi* second_extension_api =
static_cast<const ExtensionApi*>(SbSystemGetExtension(kExtensionName));
Expand Down
4 changes: 4 additions & 0 deletions starboard/extension/platform_info.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ typedef struct CobaltExtensionPlatformInfoApi {

// Returns the OS experience. (e.g. Amati or Watson on an Android device).
const char* (*GetOsExperience)();

// Returns the Core Services version (e.g. the Google Play Services package
// version on an Android device).
int64_t (*GetCoreServicesVersion)();
} CobaltExtensionPlatformInfoApi;

#ifdef __cplusplus
Expand Down

0 comments on commit 2669bf0

Please sign in to comment.