diff --git a/base/android/build_info.cc b/base/android/build_info.cc index 14a7267410434..ff52fda854b1f 100644 --- a/base/android/build_info.cc +++ b/base/android/build_info.cc @@ -82,7 +82,10 @@ BuildInfo::BuildInfo(const std::vector& params) version_incremental_(StrDupParam(params, 24)), hardware_(StrDupParam(params, 25)), is_at_least_t_(GetIntParam(params, 26)), - is_automotive_(GetIntParam(params, 27)) {} + is_automotive_(GetIntParam(params, 27)), + is_at_least_u_(GetIntParam(params, 28)), + targets_at_least_u_(GetIntParam(params, 29)), + codename_(StrDupParam(params, 30)) {} // static BuildInfo* BuildInfo::GetInstance() { diff --git a/base/android/build_info.h b/base/android/build_info.h index b1aaa680c642c..d61b30607a650 100644 --- a/base/android/build_info.h +++ b/base/android/build_info.h @@ -146,6 +146,12 @@ class BASE_EXPORT BuildInfo { bool is_automotive() const { return is_automotive_; } + bool is_at_least_u() const { return is_at_least_u_; } + + bool targets_at_least_u() const { return targets_at_least_u_; } + + const char* codename() const { return codename_; } + private: friend struct BuildInfoSingletonTraits; @@ -184,6 +190,9 @@ class BASE_EXPORT BuildInfo { const char* const hardware_; const bool is_at_least_t_; const bool is_automotive_; + const bool is_at_least_u_; + const bool targets_at_least_u_; + const char* const codename_; }; } // namespace android diff --git a/base/android/java/src/org/chromium/base/BuildInfo.java b/base/android/java/src/org/chromium/base/BuildInfo.java index 60806106923fd..5ce5921818117 100644 --- a/base/android/java/src/org/chromium/base/BuildInfo.java +++ b/base/android/java/src/org/chromium/base/BuildInfo.java @@ -75,8 +75,10 @@ private static String[] getAll() { /** Returns a serialized string array of all properties of this class. */ @VisibleForTesting + @OptIn(markerClass = androidx.core.os.BuildCompat.PrereleaseSdkCheck.class) String[] getAllProperties() { String hostPackageName = ContextUtils.getApplicationContext().getPackageName(); + // This implementation needs to be kept in sync with the native BuildInfo constructor. return new String[] { Build.BRAND, Build.DEVICE, @@ -107,6 +109,9 @@ String[] getAllProperties() { Build.HARDWARE, isAtLeastT() ? "1" : "0", isAutomotive ? "1" : "0", + BuildCompat.isAtLeastU() ? "1" : "0", + targetsAtLeastU() ? "1" : "0", + Build.VERSION.CODENAME, }; } diff --git a/base/android/junit/src/org/chromium/base/BuildInfoTest.java b/base/android/junit/src/org/chromium/base/BuildInfoTest.java index a62f4c0eae544..fefedf6c057ad 100644 --- a/base/android/junit/src/org/chromium/base/BuildInfoTest.java +++ b/base/android/junit/src/org/chromium/base/BuildInfoTest.java @@ -10,6 +10,7 @@ import android.content.Context; import android.content.pm.PackageManager; +import android.os.Build.VERSION_CODES; import org.junit.Before; import org.junit.Test; @@ -24,6 +25,13 @@ @RunWith(BaseRobolectricTestRunner.class) @Config(manifest = Config.NONE) public class BuildInfoTest { + // These indexes match the values in the constructor of base/android/build_info.cc. + private static final int IS_AT_LEAST_T = 26; + private static final int IS_AUTOMOTIVE = 27; + private static final int IS_AT_LEAST_U = 28; + private static final int TARGETS_AT_LEAST_U = 29; + private static final int SDK_CODENAME = 30; + private ShadowPackageManager mShadowPackageManager; @Before @@ -37,9 +45,7 @@ public void testIsAutomotive_trueIfFeatureAutomotiveTrue() { mShadowPackageManager.setSystemFeature( PackageManager.FEATURE_AUTOMOTIVE, /* supported= */ true); - BuildInfo buildInfo = new BuildInfo(); - - assertTrue(buildInfo.isAutomotive); + assertTrue(new BuildInfo().isAutomotive); } @Test @@ -47,36 +53,42 @@ public void testIsAutomotive_falseIfFeatureAutomotiveFalse() { mShadowPackageManager.setSystemFeature( PackageManager.FEATURE_AUTOMOTIVE, /* supported= */ false); - BuildInfo buildInfo = new BuildInfo(); - - assertFalse(buildInfo.isAutomotive); + assertFalse(new BuildInfo().isAutomotive); } @Test public void testIsAutomotive_isTrue_setsGetAllPropertesTo1() { mShadowPackageManager.setSystemFeature( PackageManager.FEATURE_AUTOMOTIVE, /* supported= */ true); + String[] properties = new BuildInfo().getAllProperties(); - BuildInfo buildInfo = new BuildInfo(); - String[] properties = buildInfo.getAllProperties(); - - // This index matches the value in the constructor of base/android/build_info.cc. - int isAutomotiveIndex = 27; - - assertEquals("1", properties[isAutomotiveIndex]); + assertEquals("1", properties[IS_AUTOMOTIVE]); } @Test public void testIsAutomotive_isFalse_setsGetAllPropertesTo0() { mShadowPackageManager.setSystemFeature( PackageManager.FEATURE_AUTOMOTIVE, /* supported= */ false); + String[] properties = new BuildInfo().getAllProperties(); - BuildInfo buildInfo = new BuildInfo(); - String[] properties = buildInfo.getAllProperties(); - - // This index matches the value in the constructor of base/android/build_info.cc. - int isAutomotiveIndex = 27; + assertEquals("0", properties[IS_AUTOMOTIVE]); + } - assertEquals("0", properties[isAutomotiveIndex]); + /** + * TODO(donnd, https://crbug.com/1345962) Create useful tests for T and U. + * This test hardly tests anything, so this is mostly a placeholder and sanity check for the + * java constructor. + * It would be better to add tests to the native BuildInfo for these releases and to check that + * the native code and java code consistently interpret the array. + */ + @Test + @Config(sdk = VERSION_CODES.S_V2) + public void testIsAtLeastX_OnS() { + String[] properties = new BuildInfo().getAllProperties(); + + assertEquals("0", properties[IS_AT_LEAST_T]); + assertEquals("0", properties[IS_AT_LEAST_U]); + assertEquals("REL", properties[SDK_CODENAME]); + assertEquals("0", properties[TARGETS_AT_LEAST_U]); } } diff --git a/chrome/browser/ui/android/android_about_app_info.cc b/chrome/browser/ui/android/android_about_app_info.cc index 45f21c17ad44a..5cae5753d8c90 100644 --- a/chrome/browser/ui/android/android_about_app_info.cc +++ b/chrome/browser/ui/android/android_about_app_info.cc @@ -6,6 +6,7 @@ #include +#include "base/android/build_info.h" #include "base/android/jni_android.h" #include "base/android/jni_string.h" #include "base/system/sys_info.h" @@ -24,3 +25,14 @@ std::string AndroidAboutAppInfo::GetOsInfo() { content::GetAndroidOSInfo(content::IncludeAndroidBuildNumber::Include, content::IncludeAndroidModel::Include); } + +std::string AndroidAboutAppInfo::GetTargetsUInfo() { + std::string targets_u_info = + base::android::BuildInfo::GetInstance()->is_at_least_u() ? "true" + : "false"; + targets_u_info += "/"; + targets_u_info += + base::android::BuildInfo::GetInstance()->targets_at_least_u() ? "true" + : "false"; + return targets_u_info; +} diff --git a/chrome/browser/ui/android/android_about_app_info.h b/chrome/browser/ui/android/android_about_app_info.h index eef9d2b816e81..06bea07a9105b 100644 --- a/chrome/browser/ui/android/android_about_app_info.h +++ b/chrome/browser/ui/android/android_about_app_info.h @@ -15,6 +15,10 @@ class AndroidAboutAppInfo { // Returns a string containing detailed info about the os environment. static std::string GetOsInfo(); + + // Returns a string containing info about whether the device is at least + // Android U and whether Chrome targets at least U. + static std::string GetTargetsUInfo(); }; #endif // CHROME_BROWSER_UI_ANDROID_ANDROID_ABOUT_APP_INFO_H_ diff --git a/chrome/browser/ui/webui/version/version_ui.cc b/chrome/browser/ui/webui/version/version_ui.cc index 326d2768e9586..67545be033281 100644 --- a/chrome/browser/ui/webui/version/version_ui.cc +++ b/chrome/browser/ui/webui/version/version_ui.cc @@ -40,6 +40,7 @@ #include "v8/include/v8-version-string.h" #if BUILDFLAG(IS_ANDROID) +#include "base/android/build_info.h" #include "chrome/browser/ui/android/android_about_app_info.h" #else #include "chrome/browser/ui/webui/theme_source.h" @@ -232,8 +233,18 @@ void VersionUI::AddVersionDetailStrings(content::WebUIDataSource* html_source) { #endif // BUILDFLAG(IS_MAC) #if BUILDFLAG(IS_ANDROID) - html_source->AddString(version_ui::kOSVersion, - AndroidAboutAppInfo::GetOsInfo()); + std::string os_info = AndroidAboutAppInfo::GetOsInfo(); + os_info += "; " + base::NumberToString( + base::android::BuildInfo::GetInstance()->sdk_int()); + std::string code_name(base::android::BuildInfo::GetInstance()->codename()); + os_info += "; " + code_name; + html_source->AddString(version_ui::kOSVersion, os_info); + html_source->AddString( + version_ui::kTargetSdkVersion, + base::NumberToString( + base::android::BuildInfo::GetInstance()->target_sdk_version())); + html_source->AddString(version_ui::kTargetsU, + AndroidAboutAppInfo::GetTargetsUInfo()); html_source->AddString(version_ui::kGmsVersion, AndroidAboutAppInfo::GetGmsInfo()); #endif // BUILDFLAG(IS_ANDROID) diff --git a/components/version_ui/resources/about_version.html b/components/version_ui/resources/about_version.html index 51b3288e0385e..080e71ea053b2 100644 --- a/components/version_ui/resources/about_version.html +++ b/components/version_ui/resources/about_version.html @@ -104,6 +104,14 @@ + + targetSdkVersion + $i18n{target_sdk_version} + + + isAtLeastU/targetsAtLeastU + $i18n{targets_u} + $i18n{gms_name} diff --git a/components/version_ui/version_ui_constants.cc b/components/version_ui/version_ui_constants.cc index 811bdd5cf2244..c8eda8a9f0ded 100644 --- a/components/version_ui/version_ui_constants.cc +++ b/components/version_ui/version_ui_constants.cc @@ -65,6 +65,10 @@ const char kOSType[] = "os_type"; #endif #if BUILDFLAG(IS_ANDROID) const char kOSVersion[] = "os_version"; +const char kTargetSdkVersionName[] = "target_sdk_version_name"; +const char kTargetSdkVersion[] = "target_sdk_version"; +const char kTargetsUName[] = "targets_u_name"; +const char kTargetsU[] = "targets_u"; const char kGmsName[] = "gms_name"; const char kGmsVersion[] = "gms_version"; #endif diff --git a/components/version_ui/version_ui_constants.h b/components/version_ui/version_ui_constants.h index 031af48b0678c..4fe9af736cd13 100644 --- a/components/version_ui/version_ui_constants.h +++ b/components/version_ui/version_ui_constants.h @@ -68,6 +68,10 @@ extern const char kOSType[]; #endif #if BUILDFLAG(IS_ANDROID) extern const char kOSVersion[]; +extern const char kTargetSdkVersionName[]; +extern const char kTargetSdkVersion[]; +extern const char kTargetsUName[]; +extern const char kTargetsU[]; extern const char kGmsName[]; extern const char kGmsVersion[]; #endif