Commit beea44ce authored by Eric Stevenson's avatar Eric Stevenson Committed by Commit Bot

Trichrome Proguard: Fix locale pak selection.

This CL moves the arrays of locale pak files out of BuildConfig.java
into a new file, LocaleConfig.java.

This file is generated with a unique package which allows Chrome
and Webview to have different versions in Trichrome.

Bug: 960025
Change-Id: I906d0c7e6c1540bfaa5f89e7bd9adbd9f97c8262
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1610255
Commit-Queue: Eric Stevenson <estevenson@chromium.org>
Reviewed-by: default avatarDavid Trainor <dtrainor@chromium.org>
Reviewed-by: default avatarRichard Coles <torne@chromium.org>
Reviewed-by: default avatarAndrew Grieve <agrieve@chromium.org>
Cr-Commit-Position: refs/heads/master@{#662209}
parent 400adf34
...@@ -1098,6 +1098,22 @@ android_library("android_webview_services_java") { ...@@ -1098,6 +1098,22 @@ android_library("android_webview_services_java") {
android_manifest_for_lint = system_webview_android_manifest android_manifest_for_lint = system_webview_android_manifest
} }
# Generate LocaleConfig.java for android_webview_locale_config_java's
# compile step works.
generate_locale_config_srcjar("webview_locale_config") {
java_package = "org.chromium.android_webview"
}
# LocaleConfig.java is excluded from the generated .jar
# (via. jar_excluded_patterns) and the final version is inserted at the APK
# level - with the list of pak locales populated by looking at the assets that
# are listed in the final APK's .build_config.
android_library("android_webview_locale_config_java") {
java_files = [ "java/src/org/chromium/android_webview/AwLocaleConfig.java" ]
srcjar_deps = [ ":webview_locale_config" ]
jar_excluded_patterns = [ "*/LocaleConfig.class" ]
}
android_aidl("crash_receiver_aidl") { android_aidl("crash_receiver_aidl") {
import_include = [ "java/src" ] import_include = [ "java/src" ]
sources = [ sources = [
......
...@@ -31,7 +31,9 @@ android_library("apk_java") { ...@@ -31,7 +31,9 @@ android_library("apk_java") {
"java/src/com/android/webview/chromium/WebViewApkApplication.java", "java/src/com/android/webview/chromium/WebViewApkApplication.java",
] ]
deps = [ deps = [
"//android_webview:android_webview_locale_config_java",
"//base:base_java", "//base:base_java",
"//components/embedder_support/android:application_java", "//components/embedder_support/android:application_java",
"//ui/android:ui_java",
] ]
} }
...@@ -7,10 +7,12 @@ package com.android.webview.chromium; ...@@ -7,10 +7,12 @@ package com.android.webview.chromium;
import android.app.Application; import android.app.Application;
import android.content.Context; import android.content.Context;
import org.chromium.android_webview.AwLocaleConfig;
import org.chromium.base.ContextUtils; import org.chromium.base.ContextUtils;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.library_loader.LibraryLoader; import org.chromium.base.library_loader.LibraryLoader;
import org.chromium.components.embedder_support.application.FontPreloadingWorkaround; import org.chromium.components.embedder_support.application.FontPreloadingWorkaround;
import org.chromium.ui.base.ResourceBundle;
/** /**
* Application subclass for SystemWebView and Trichrome. * Application subclass for SystemWebView and Trichrome.
...@@ -50,6 +52,8 @@ public class WebViewApkApplication extends Application { ...@@ -50,6 +52,8 @@ public class WebViewApkApplication extends Application {
return false; return false;
} }
LibraryLoader.getInstance().switchCommandLineForWebView(); LibraryLoader.getInstance().switchCommandLineForWebView();
ResourceBundle.setAvailablePakLocales(
new String[] {}, AwLocaleConfig.getWebViewSupportedPakLocales());
nativeInitializePakResources(); nativeInitializePakResources();
return true; return true;
} }
......
...@@ -5,8 +5,9 @@ ...@@ -5,8 +5,9 @@
# This variable shared between 'glue' and 'glue_resource_rewriter' because # This variable shared between 'glue' and 'glue_resource_rewriter' because
# ResourceRewrite.java need to be generated according 'glue' deps. # ResourceRewrite.java need to be generated according 'glue' deps.
glue_library_deps = [ glue_library_deps = [
"//android_webview:android_webview_java",
"//android_webview:android_webview_commandline_java", "//android_webview:android_webview_commandline_java",
"//android_webview:android_webview_java",
"//android_webview:android_webview_locale_config_java",
"//android_webview:android_webview_platform_services_java", "//android_webview:android_webview_platform_services_java",
"//android_webview:system_webview_manifest", "//android_webview:system_webview_manifest",
"//android_webview/support_library/boundary_interfaces:boundary_interface_java", "//android_webview/support_library/boundary_interfaces:boundary_interface_java",
......
...@@ -25,6 +25,7 @@ import org.chromium.android_webview.AwContents; ...@@ -25,6 +25,7 @@ import org.chromium.android_webview.AwContents;
import org.chromium.android_webview.AwContentsStatics; import org.chromium.android_webview.AwContentsStatics;
import org.chromium.android_webview.AwCookieManager; import org.chromium.android_webview.AwCookieManager;
import org.chromium.android_webview.AwFirebaseConfig; import org.chromium.android_webview.AwFirebaseConfig;
import org.chromium.android_webview.AwLocaleConfig;
import org.chromium.android_webview.AwNetworkChangeNotifierRegistrationPolicy; import org.chromium.android_webview.AwNetworkChangeNotifierRegistrationPolicy;
import org.chromium.android_webview.AwProxyController; import org.chromium.android_webview.AwProxyController;
import org.chromium.android_webview.AwQuotaManagerBridge; import org.chromium.android_webview.AwQuotaManagerBridge;
...@@ -53,6 +54,7 @@ import org.chromium.base.task.PostTask; ...@@ -53,6 +54,7 @@ import org.chromium.base.task.PostTask;
import org.chromium.base.task.TaskTraits; import org.chromium.base.task.TaskTraits;
import org.chromium.content_public.browser.UiThreadTaskTraits; import org.chromium.content_public.browser.UiThreadTaskTraits;
import org.chromium.net.NetworkChangeNotifier; import org.chromium.net.NetworkChangeNotifier;
import org.chromium.ui.base.ResourceBundle;
/** /**
* Class controlling the Chromium initialization for WebView. * Class controlling the Chromium initialization for WebView.
...@@ -140,6 +142,9 @@ public class WebViewChromiumAwInit { ...@@ -140,6 +142,9 @@ public class WebViewChromiumAwInit {
JNIUtils.setClassLoader(WebViewChromiumAwInit.class.getClassLoader()); JNIUtils.setClassLoader(WebViewChromiumAwInit.class.getClassLoader());
ResourceBundle.setAvailablePakLocales(
new String[] {}, AwLocaleConfig.getWebViewSupportedPakLocales());
// We are rewriting Java resources in the background. // We are rewriting Java resources in the background.
// NOTE: Any reference to Java resources will cause a crash. // NOTE: Any reference to Java resources will cause a crash.
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.android_webview;
/**
* Simple class that provides access to the array of uncompressed pak locales. See
* //android_webview/BUILD.gn for more details.
*/
public final class AwLocaleConfig {
private AwLocaleConfig() {}
public static String[] getWebViewSupportedPakLocales() {
return LocaleConfig.UNCOMPRESSED_LOCALES;
}
}
...@@ -35,6 +35,7 @@ import org.chromium.content_public.browser.test.util.CriteriaHelper; ...@@ -35,6 +35,7 @@ import org.chromium.content_public.browser.test.util.CriteriaHelper;
import org.chromium.content_public.browser.test.util.TestCallbackHelperContainer.OnPageFinishedHelper; import org.chromium.content_public.browser.test.util.TestCallbackHelperContainer.OnPageFinishedHelper;
import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.net.test.util.TestWebServer; import org.chromium.net.test.util.TestWebServer;
import org.chromium.ui.base.ResourceBundle;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import java.util.Map; import java.util.Map;
...@@ -83,6 +84,7 @@ public class AwActivityTestRule extends ActivityTestRule<AwTestRunnerActivity> { ...@@ -83,6 +84,7 @@ public class AwActivityTestRule extends ActivityTestRule<AwTestRunnerActivity> {
} }
public void setUp() throws Exception { public void setUp() throws Exception {
ResourceBundle.setAvailablePakLocales(new String[] {}, LocaleConfig.UNCOMPRESSED_LOCALES);
if (needsAwBrowserContextCreated()) { if (needsAwBrowserContextCreated()) {
createAwBrowserContext(); createAwBrowserContext();
} }
......
...@@ -32,6 +32,8 @@ template("system_webview_apk_tmpl") { ...@@ -32,6 +32,8 @@ template("system_webview_apk_tmpl") {
"//base:base_java", "//base:base_java",
] ]
locale_config_java_packages = [ "org.chromium.android_webview" ]
if (!defined(alternative_android_sdk_dep)) { if (!defined(alternative_android_sdk_dep)) {
alternative_android_sdk_dep = webview_framework_dep alternative_android_sdk_dep = webview_framework_dep
} }
......
...@@ -73,6 +73,7 @@ android_apk("webview_instrumentation_apk") { ...@@ -73,6 +73,7 @@ android_apk("webview_instrumentation_apk") {
"shell/src/org/chromium/android_webview/test/OnlyRunIn.java", "shell/src/org/chromium/android_webview/test/OnlyRunIn.java",
"shell/src/org/chromium/android_webview/test/TestContentProvider.java", "shell/src/org/chromium/android_webview/test/TestContentProvider.java",
] ]
locale_config_java_packages = [ "org.chromium.android_webview.test" ]
shared_libraries = [ ":libstandalonelibwebviewchromium" ] shared_libraries = [ ":libstandalonelibwebviewchromium" ]
......
...@@ -184,16 +184,6 @@ public class LocaleUtils { ...@@ -184,16 +184,6 @@ public class LocaleUtils {
return languageTag.substring(0, pos); return languageTag.substring(0, pos);
} }
/** @return true if the language is supported by Chrome. */
public static boolean isLanguageSupported(String language) {
for (String languageTag : BuildConfig.COMPRESSED_LOCALES) {
if (toLanguage(languageTag).equals(language)) {
return true;
}
}
return false;
}
/** /**
* @return a language tag string that represents the default locale. * @return a language tag string that represents the default locale.
* The language tag is well-formed IETF BCP 47 language tag with language and country * The language tag is well-formed IETF BCP 47 language tag with language and country
......
...@@ -46,22 +46,6 @@ public class BuildConfig { ...@@ -46,22 +46,6 @@ public class BuildConfig {
public static MAYBE_FINAL boolean IS_CHROME_BRANDED MAYBE_FALSE; public static MAYBE_FINAL boolean IS_CHROME_BRANDED MAYBE_FALSE;
#endif #endif
// Sorted list of locales that have a compressed .pak within assets.
// Stored as an array because AssetManager.list() is slow.
#if defined(COMPRESSED_LOCALE_LIST)
public static MAYBE_FINAL String[] COMPRESSED_LOCALES = COMPRESSED_LOCALE_LIST;
#else
public static MAYBE_FINAL String[] COMPRESSED_LOCALES = {};
#endif
// Sorted list of locales that have an uncompressed .pak within assets.
// Stored as an array because AssetManager.list() is slow.
#if defined(UNCOMPRESSED_LOCALE_LIST)
public static MAYBE_FINAL String[] UNCOMPRESSED_LOCALES = UNCOMPRESSED_LOCALE_LIST;
#else
public static MAYBE_FINAL String[] UNCOMPRESSED_LOCALES = {};
#endif
// The ID of the android string resource that stores the product version. // The ID of the android string resource that stores the product version.
// This layer of indirection is necessary to make the resource dependency // This layer of indirection is necessary to make the resource dependency
// optional for android_apk targets/base_java (ex. for cronet). // optional for android_apk targets/base_java (ex. for cronet).
......
...@@ -931,14 +931,6 @@ def main(argv): ...@@ -931,14 +931,6 @@ def main(argv):
'--resource-ids-provider', '--resource-ids-provider',
help='Path to the .build_config for the APK that this static library ' help='Path to the .build_config for the APK that this static library '
'target uses to generate stable resource IDs.') 'target uses to generate stable resource IDs.')
parser.add_option(
'--compressed-locales-provider',
help='Path to the .build_config that contains the compressed locales '
'Java list for this static library target.')
parser.add_option(
'--uncompressed-locales-provider',
help='Path to the .build_config that contains the uncompressed locales '
'Java list for this static library target.')
parser.add_option('--tested-apk-config', parser.add_option('--tested-apk-config',
help='Path to the build config of the tested apk (for an instrumentation ' help='Path to the build config of the tested apk (for an instrumentation '
...@@ -1722,27 +1714,11 @@ def main(argv): ...@@ -1722,27 +1714,11 @@ def main(argv):
config['assets'], config['uncompressed_assets'], locale_paks = ( config['assets'], config['uncompressed_assets'], locale_paks = (
_MergeAssets(deps.All('android_assets'))) _MergeAssets(deps.All('android_assets')))
if options.compressed_locales_provider: deps_info['compressed_locales_java_list'] = _CreateJavaLocaleListFromAssets(
dep_config = GetDepConfig(options.compressed_locales_provider) config['assets'], locale_paks)
if dep_config['type'] == 'android_app_bundle': deps_info[
dep_config = GetDepConfig(dep_config['base_module_config']) 'uncompressed_locales_java_list'] = _CreateJavaLocaleListFromAssets(
deps_info['compressed_locales_java_list'] = dep_config[ config['uncompressed_assets'], locale_paks)
'compressed_locales_java_list']
else:
deps_info[
'compressed_locales_java_list'] = _CreateJavaLocaleListFromAssets(
config['assets'], locale_paks)
if options.uncompressed_locales_provider:
dep_config = GetDepConfig(options.uncompressed_locales_provider)
if dep_config['type'] == 'android_app_bundle':
dep_config = GetDepConfig(dep_config['base_module_config'])
deps_info['uncompressed_locales_java_list'] = dep_config[
'uncompressed_locales_java_list']
else:
deps_info[
'uncompressed_locales_java_list'] = _CreateJavaLocaleListFromAssets(
config['uncompressed_assets'], locale_paks)
config['extra_android_manifests'] = filter(None, ( config['extra_android_manifests'] = filter(None, (
d.get('android_manifest') for d in all_resources_deps)) d.get('android_manifest') for d in all_resources_deps))
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package PACKAGE;
/**
* Locale configuration. Generated on a per-target basis.
*/
public class LocaleConfig {
// Sorted list of locales that have a compressed .pak within assets.
// Stored as an array because AssetManager.list() is slow.
#if defined(COMPRESSED_LOCALE_LIST)
public static final String[] COMPRESSED_LOCALES = COMPRESSED_LOCALE_LIST;
#else
public static final String[] COMPRESSED_LOCALES = {};
#endif
// Sorted list of locales that have an uncompressed .pak within assets.
// Stored as an array because AssetManager.list() is slow.
#if defined(UNCOMPRESSED_LOCALE_LIST)
public static final String[] UNCOMPRESSED_LOCALES = UNCOMPRESSED_LOCALE_LIST;
#else
public static final String[] UNCOMPRESSED_LOCALES = {};
#endif
}
...@@ -487,12 +487,6 @@ template("write_build_config") { ...@@ -487,12 +487,6 @@ template("write_build_config") {
if (_target.is_resource_ids_provider) { if (_target.is_resource_ids_provider) {
args += [ "--resource-ids-provider=$_config" ] args += [ "--resource-ids-provider=$_config" ]
} }
if (_target.is_compressed_locales_provider) {
args += [ "--compressed-locales-provider=$_config" ]
}
if (_target.is_uncompressed_locales_provider) {
args += [ "--uncompressed-locales-provider=$_config" ]
}
} }
args += [ "--static-library-dependent-configs=$_dependent_configs" ] args += [ "--static-library-dependent-configs=$_dependent_configs" ]
} }
......
...@@ -1919,7 +1919,6 @@ if (enable_java_templates) { ...@@ -1919,7 +1919,6 @@ if (enable_java_templates) {
# Variables: # Variables:
# use_final_fields: True to use final fields. All other variables are # use_final_fields: True to use final fields. All other variables are
# ignored when this is false. # ignored when this is false.
# build_config: Path to build_config used for locale list
# enable_multidex: Value for ENABLE_MULTIDEX. # enable_multidex: Value for ENABLE_MULTIDEX.
# min_sdk_version: Value for MIN_SDK_VERSION. # min_sdk_version: Value for MIN_SDK_VERSION.
# #
...@@ -1956,15 +1955,6 @@ if (enable_java_templates) { ...@@ -1956,15 +1955,6 @@ if (enable_java_templates) {
if (invoker.enable_multidex) { if (invoker.enable_multidex) {
defines += [ "ENABLE_MULTIDEX" ] defines += [ "ENABLE_MULTIDEX" ]
} }
inputs = [
invoker.build_config,
]
_rebased_build_config =
rebase_path(invoker.build_config, root_build_dir)
defines += [
"COMPRESSED_LOCALE_LIST=" + "@FileArg($_rebased_build_config:deps_info:compressed_locales_java_list)",
"UNCOMPRESSED_LOCALE_LIST=" + "@FileArg($_rebased_build_config:deps_info:uncompressed_locales_java_list)",
]
if (defined(invoker.min_sdk_version)) { if (defined(invoker.min_sdk_version)) {
defines += [ "_MIN_SDK_VERSION=${invoker.min_sdk_version}" ] defines += [ "_MIN_SDK_VERSION=${invoker.min_sdk_version}" ]
} }
...@@ -1977,6 +1967,35 @@ if (enable_java_templates) { ...@@ -1977,6 +1967,35 @@ if (enable_java_templates) {
} }
} }
# Creates LocaleConfig.java, a file containing the list of compressed and
# uncompressed locale .pak files in an APK.
#
# Variables:
# build_config: Path to build_config used for locale lists.
# java_package: Java package for the generated class.
template("generate_locale_config_srcjar") {
java_cpp_template(target_name) {
package_path = string_replace(invoker.java_package, ".", "/")
sources = [
"//build/android/java/templates/LocaleConfig.template",
]
defines = [ "PACKAGE=${invoker.java_package}" ]
if (defined(invoker.build_config)) {
forward_variables_from(invoker,
[
"deps",
"testonly",
])
_rebased_build_config =
rebase_path(invoker.build_config, root_build_dir)
defines += [
"COMPRESSED_LOCALE_LIST=" + "@FileArg($_rebased_build_config:deps_info:compressed_locales_java_list)",
"UNCOMPRESSED_LOCALE_LIST=" + "@FileArg($_rebased_build_config:deps_info:uncompressed_locales_java_list)",
]
}
}
}
# Declare an Android app module target, which is used as the basis for an # Declare an Android app module target, which is used as the basis for an
# Android APK or an Android app bundle module. # Android APK or an Android app bundle module.
# #
...@@ -2055,14 +2074,16 @@ if (enable_java_templates) { ...@@ -2055,14 +2074,16 @@ if (enable_java_templates) {
# static_library_dependent_targets: A list of scopes describing targets that # static_library_dependent_targets: A list of scopes describing targets that
# use this target as a static library. Common Java code from the targets # use this target as a static library. Common Java code from the targets
# listed in static_library_dependent_targets will be moved into this # listed in static_library_dependent_targets will be moved into this
# target. Scope members are name, is_resource_ids_provider, # target. Scope members are name and is_resource_ids_provider.
# is_compressed_locales_provider, is_uncompressed_locales_provider.
# TODO(estevenson): Add a README for static library targets and document # TODO(estevenson): Add a README for static library targets and document
# additions to "deps_info" in write_build_config.py. # additions to "deps_info" in write_build_config.py.
# static_library_provider: Specifies a single target that this target will # static_library_provider: Specifies a single target that this target will
# use as a static library APK. When proguard is enabled, the # use as a static library APK. When proguard is enabled, the
# static_library_provider target will provide the dex file(s) for this # static_library_provider target will provide the dex file(s) for this
# target. # target.
# locale_config_java_packages: Optional list of java packages. If given, a
# LocaleConfig.java file will be generated for each package, and will
# contain the list of compressed and uncompressed locale pak files.
template("android_apk_or_module") { template("android_apk_or_module") {
forward_variables_from(invoker, [ "testonly" ]) forward_variables_from(invoker, [ "testonly" ])
...@@ -2275,6 +2296,8 @@ if (enable_java_templates) { ...@@ -2275,6 +2296,8 @@ if (enable_java_templates) {
_generate_buildconfig_java = invoker.generate_buildconfig_java _generate_buildconfig_java = invoker.generate_buildconfig_java
} }
_generate_localeconfig_java = defined(invoker.locale_config_java_packages)
# JNI generation usually goes hand-in-hand with buildconfig generation. # JNI generation usually goes hand-in-hand with buildconfig generation.
_generate_final_jni = _generate_buildconfig_java _generate_final_jni = _generate_buildconfig_java
if (defined(invoker.generate_final_jni)) { if (defined(invoker.generate_final_jni)) {
...@@ -2646,7 +2669,6 @@ if (enable_java_templates) { ...@@ -2646,7 +2669,6 @@ if (enable_java_templates) {
generate_build_config_srcjar("${_template_name}__build_config_srcjar") { generate_build_config_srcjar("${_template_name}__build_config_srcjar") {
forward_variables_from(invoker, [ "min_sdk_version" ]) forward_variables_from(invoker, [ "min_sdk_version" ])
use_final_fields = true use_final_fields = true
build_config = _build_config
enable_multidex = _enable_multidex enable_multidex = _enable_multidex
if (defined(invoker.product_version_resources_dep)) { if (defined(invoker.product_version_resources_dep)) {
resources_version_variable = resources_version_variable =
...@@ -2659,6 +2681,21 @@ if (enable_java_templates) { ...@@ -2659,6 +2681,21 @@ if (enable_java_templates) {
_srcjar_deps += [ ":${_template_name}__build_config_srcjar" ] _srcjar_deps += [ ":${_template_name}__build_config_srcjar" ]
} }
if (_generate_localeconfig_java) {
foreach(_package, invoker.locale_config_java_packages) {
_locale_target_name =
"${_template_name}_${_package}__locale_config_srcjar"
generate_locale_config_srcjar("$_locale_target_name") {
build_config = _build_config
java_package = _package
deps = [
":$_build_config_target",
]
}
_srcjar_deps += [ ":$_locale_target_name" ]
}
}
if (_generate_final_jni) { if (_generate_final_jni) {
generate_jni_registration("${_template_name}__final_jni") { generate_jni_registration("${_template_name}__final_jni") {
target = ":$_template_name" target = ":$_template_name"
...@@ -3285,6 +3322,7 @@ if (enable_java_templates) { ...@@ -3285,6 +3322,7 @@ if (enable_java_templates) {
"keystore_path", "keystore_path",
"load_library_from_apk", "load_library_from_apk",
"loadable_modules", "loadable_modules",
"locale_config_java_packages",
"min_sdk_version", "min_sdk_version",
"native_lib_placeholders", "native_lib_placeholders",
"native_lib_version_arg", "native_lib_version_arg",
...@@ -3401,6 +3439,7 @@ if (enable_java_templates) { ...@@ -3401,6 +3439,7 @@ if (enable_java_templates) {
"jni_registration_header", "jni_registration_header",
"jni_sources_blacklist", "jni_sources_blacklist",
"load_library_from_apk", "load_library_from_apk",
"locale_config_java_packages",
"min_sdk_version", "min_sdk_version",
"native_lib_version_arg", "native_lib_version_arg",
"native_lib_version_rule", "native_lib_version_rule",
......
...@@ -384,6 +384,7 @@ android_library("chrome_java") { ...@@ -384,6 +384,7 @@ android_library("chrome_java") {
":chrome_android_java_enums_srcjar", ":chrome_android_java_enums_srcjar",
":chrome_android_java_switches_srcjar", ":chrome_android_java_switches_srcjar",
":chrome_android_java_google_api_keys_srcjar", ":chrome_android_java_google_api_keys_srcjar",
":chrome_locale_config",
":photo_picker_aidl", ":photo_picker_aidl",
":resource_id_javagen", ":resource_id_javagen",
"//chrome:assist_ranker_prediction_enum_javagen", "//chrome:assist_ranker_prediction_enum_javagen",
...@@ -451,7 +452,10 @@ android_library("chrome_java") { ...@@ -451,7 +452,10 @@ android_library("chrome_java") {
# Add the actual implementation where necessary so that downstream targets # Add the actual implementation where necessary so that downstream targets
# can provide their own implementations. # can provide their own implementations.
jar_excluded_patterns = [ "*/AppHooksImpl.class" ] jar_excluded_patterns = [
"*/AppHooksImpl.class",
"*/LocaleConfig.class",
]
annotation_processor_deps = [ annotation_processor_deps = [
"//base/android/jni_generator:jni_processor", "//base/android/jni_generator:jni_processor",
...@@ -473,6 +477,10 @@ android_library("chrome_java") { ...@@ -473,6 +477,10 @@ android_library("chrome_java") {
processor_args_javac = [ "dagger.fastInit=enabled" ] processor_args_javac = [ "dagger.fastInit=enabled" ]
} }
generate_locale_config_srcjar("chrome_locale_config") {
java_package = "org.chromium.chrome.browser"
}
# This is a list of all base module java dependencies. New features should be # This is a list of all base module java dependencies. New features should be
# added to this list. # added to this list.
java_group("chrome_all_java") { java_group("chrome_all_java") {
...@@ -1838,14 +1846,10 @@ if (public_android_sdk) { ...@@ -1838,14 +1846,10 @@ if (public_android_sdk) {
{ {
name = "//android_webview:trichrome_webview_apk" name = "//android_webview:trichrome_webview_apk"
is_resource_ids_provider = true is_resource_ids_provider = true
is_compressed_locales_provider = false
is_uncompressed_locales_provider = true
}, },
{ {
name = ":trichrome_chrome_apk" name = ":trichrome_chrome_apk"
is_resource_ids_provider = false is_resource_ids_provider = false
is_compressed_locales_provider = true
is_uncompressed_locales_provider = false
}, },
] ]
} }
...@@ -1862,14 +1866,10 @@ if (public_android_sdk) { ...@@ -1862,14 +1866,10 @@ if (public_android_sdk) {
{ {
name = "//android_webview:trichrome_webview_for_bundle_apk" name = "//android_webview:trichrome_webview_for_bundle_apk"
is_resource_ids_provider = true is_resource_ids_provider = true
is_compressed_locales_provider = false
is_uncompressed_locales_provider = true
}, },
{ {
name = ":trichrome_chrome_bundle" name = ":trichrome_chrome_bundle"
is_resource_ids_provider = false is_resource_ids_provider = false
is_compressed_locales_provider = true
is_uncompressed_locales_provider = false
}, },
] ]
} }
......
...@@ -135,6 +135,10 @@ template("chrome_public_common_apk_or_module_tmpl") { ...@@ -135,6 +135,10 @@ template("chrome_public_common_apk_or_module_tmpl") {
"*ic_lock.*", # Bottom edge seems misaligned. "*ic_lock.*", # Bottom edge seems misaligned.
] ]
if (!_is_monochrome) {
locale_config_java_packages = [ "org.chromium.chrome.browser" ]
}
# Use zh-TW strings for zh-HK (https://crbug.com/780847). # Use zh-TW strings for zh-HK (https://crbug.com/780847).
if (!defined(support_zh_hk)) { if (!defined(support_zh_hk)) {
support_zh_hk = true support_zh_hk = true
...@@ -307,6 +311,11 @@ template("monochrome_public_common_apk_or_module_tmpl") { ...@@ -307,6 +311,11 @@ template("monochrome_public_common_apk_or_module_tmpl") {
] ]
if (is_monochrome) { if (is_monochrome) {
locale_config_java_packages = [
"org.chromium.chrome.browser",
"com.android.webview.chromium",
]
if (invoker.target_type == "android_app_bundle_module") { if (invoker.target_type == "android_app_bundle_module") {
_suffix = bundle_library_suffix _suffix = bundle_library_suffix
} else { } else {
......
...@@ -33,6 +33,7 @@ import org.chromium.chrome.browser.profiles.ProfileManagerUtils; ...@@ -33,6 +33,7 @@ import org.chromium.chrome.browser.profiles.ProfileManagerUtils;
import org.chromium.chrome.browser.share.ShareHelper; import org.chromium.chrome.browser.share.ShareHelper;
import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.util.FeatureUtilities; import org.chromium.chrome.browser.util.FeatureUtilities;
import org.chromium.ui.base.ResourceBundle;
import java.util.Locale; import java.util.Locale;
...@@ -260,11 +261,21 @@ public class ChromeActivitySessionTracker { ...@@ -260,11 +261,21 @@ public class ChromeActivitySessionTracker {
String systemLanguage = String systemLanguage =
LocaleUtils.toLanguage(LocaleUtils.toLanguageTag(Locale.getDefault())); LocaleUtils.toLanguage(LocaleUtils.toLanguageTag(Locale.getDefault()));
boolean isWrongLanguage = !systemLanguage.equals(uiLanguage) boolean isWrongLanguage = !systemLanguage.equals(uiLanguage)
&& LocaleUtils.isLanguageSupported(systemLanguage); && isLanguageSupported(
systemLanguage, ResourceBundle.getAvailableCompressedPakLocales());
RecordHistogram.recordBooleanHistogram( RecordHistogram.recordBooleanHistogram(
"Android.Language.WrongLanguageAfterResume", isWrongLanguage); "Android.Language.WrongLanguageAfterResume", isWrongLanguage);
} }
private static boolean isLanguageSupported(String language, String[] compressedLocales) {
for (String languageTag : compressedLocales) {
if (LocaleUtils.toLanguage(languageTag).equals(language)) {
return true;
}
}
return false;
}
/** /**
* @return The PowerBroadcastReceiver for the browser process. * @return The PowerBroadcastReceiver for the browser process.
*/ */
......
...@@ -50,6 +50,7 @@ import org.chromium.chrome.browser.vr.OnExitVrRequestListener; ...@@ -50,6 +50,7 @@ import org.chromium.chrome.browser.vr.OnExitVrRequestListener;
import org.chromium.chrome.browser.vr.VrModuleProvider; import org.chromium.chrome.browser.vr.VrModuleProvider;
import org.chromium.components.embedder_support.application.FontPreloadingWorkaround; import org.chromium.components.embedder_support.application.FontPreloadingWorkaround;
import org.chromium.components.module_installer.ModuleInstaller; import org.chromium.components.module_installer.ModuleInstaller;
import org.chromium.ui.base.ResourceBundle;
/** /**
* Basic application functionality that should be shared among all browser applications that use * Basic application functionality that should be shared among all browser applications that use
...@@ -154,6 +155,8 @@ public class ChromeApplication extends Application { ...@@ -154,6 +155,8 @@ public class ChromeApplication extends Application {
} }
AsyncTask.takeOverAndroidThreadPool(); AsyncTask.takeOverAndroidThreadPool();
JNIUtils.setClassLoader(getClassLoader()); JNIUtils.setClassLoader(getClassLoader());
ResourceBundle.setAvailablePakLocales(
LocaleConfig.COMPRESSED_LOCALES, LocaleConfig.UNCOMPRESSED_LOCALES);
sFirstTraceEvent.end(); sFirstTraceEvent.end();
} }
......
...@@ -23,6 +23,7 @@ import org.chromium.base.task.PostTask; ...@@ -23,6 +23,7 @@ import org.chromium.base.task.PostTask;
import org.chromium.content.app.ContentMain; import org.chromium.content.app.ContentMain;
import org.chromium.content_public.browser.BrowserStartupController; import org.chromium.content_public.browser.BrowserStartupController;
import org.chromium.content_public.browser.UiThreadTaskTraits; import org.chromium.content_public.browser.UiThreadTaskTraits;
import org.chromium.ui.base.ResourceBundle;
import org.chromium.ui.resources.ResourceExtractor; import org.chromium.ui.resources.ResourceExtractor;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
...@@ -450,6 +451,7 @@ public class BrowserStartupControllerImpl implements BrowserStartupController { ...@@ -450,6 +451,7 @@ public class BrowserStartupControllerImpl implements BrowserStartupController {
*/ */
@Override @Override
public void initChromiumBrowserProcessForTests() { public void initChromiumBrowserProcessForTests() {
ResourceBundle.setNoAvailableLocalePaks();
ResourceExtractor resourceExtractor = ResourceExtractor.get(); ResourceExtractor resourceExtractor = ResourceExtractor.get();
resourceExtractor.setResultTraits(UiThreadTaskTraits.BOOTSTRAP); resourceExtractor.setResultTraits(UiThreadTaskTraits.BOOTSTRAP);
resourceExtractor.startExtractingResources("en"); resourceExtractor.startExtractingResources("en");
......
...@@ -23,6 +23,7 @@ import org.chromium.content_public.browser.WebContents; ...@@ -23,6 +23,7 @@ import org.chromium.content_public.browser.WebContents;
import org.chromium.content_shell.Shell; import org.chromium.content_shell.Shell;
import org.chromium.content_shell.ShellManager; import org.chromium.content_shell.ShellManager;
import org.chromium.ui.base.ActivityWindowAndroid; import org.chromium.ui.base.ActivityWindowAndroid;
import org.chromium.ui.base.ResourceBundle;
/** /**
* Activity for managing the Content Shell. * Activity for managing the Content Shell.
...@@ -55,6 +56,7 @@ public class ContentShellActivity extends Activity { ...@@ -55,6 +56,7 @@ public class ContentShellActivity extends Activity {
} }
} }
ResourceBundle.setNoAvailableLocalePaks();
DeviceUtils.addDeviceSpecificUserAgentSwitch(); DeviceUtils.addDeviceSpecificUserAgentSwitch();
try { try {
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
package org.chromium.ui.base; package org.chromium.ui.base;
import org.chromium.base.BuildConfig;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
...@@ -13,14 +12,52 @@ import java.util.Arrays; ...@@ -13,14 +12,52 @@ import java.util.Arrays;
/** /**
* This class provides the resource bundle related methods for the native * This class provides the resource bundle related methods for the native
* library. * library.
*
* IMPORTANT: Clients that use {@link ResourceBundle} and/or
* {@link org.chromium.ui.resources.ResourceExtractor} MUST call either
* {@link ResourceBundle#setAvailablePakLocales(String[], String[])} or
* {@link ResourceBundle#setNoAvailableLocalePaks()} before calling the getters in this class.
*/ */
@JNINamespace("ui") @JNINamespace("ui")
final class ResourceBundle { public final class ResourceBundle {
private static String[] sCompressedLocales;
private static String[] sUncompressedLocales;
private ResourceBundle() {} private ResourceBundle() {}
/**
* Called when there are no locale pak files available.
*/
public static void setNoAvailableLocalePaks() {
assert sCompressedLocales == null && sUncompressedLocales == null;
sCompressedLocales = new String[] {};
sUncompressedLocales = new String[] {};
}
/**
* Sets the available compressed and uncompressed locale pak files.
* @param compressed Locales that have compressed pak files.
* @param uncompressed Locales that have uncompressed pak files.
*/
public static void setAvailablePakLocales(String[] compressed, String[] uncompressed) {
assert sCompressedLocales == null && sUncompressedLocales == null;
sCompressedLocales = compressed;
sUncompressedLocales = uncompressed;
}
/**
* Return the array of locales that have compressed pak files. Do not modify the array.
* @return The locales that have compressed pak files.
*/
public static String[] getAvailableCompressedPakLocales() {
assert sCompressedLocales != null;
return sCompressedLocales;
}
@CalledByNative @CalledByNative
private static String getLocalePakResourcePath(String locale) { private static String getLocalePakResourcePath(String locale) {
if (Arrays.binarySearch(BuildConfig.UNCOMPRESSED_LOCALES, locale) >= 0) { assert sUncompressedLocales != null;
if (Arrays.binarySearch(sUncompressedLocales, locale) >= 0) {
return "assets/stored-locales/" + locale + ".pak"; return "assets/stored-locales/" + locale + ".pak";
} }
return null; return null;
......
...@@ -6,7 +6,6 @@ package org.chromium.ui.resources; ...@@ -6,7 +6,6 @@ package org.chromium.ui.resources;
import android.content.res.AssetManager; import android.content.res.AssetManager;
import org.chromium.base.BuildConfig;
import org.chromium.base.BuildInfo; import org.chromium.base.BuildInfo;
import org.chromium.base.ContextUtils; import org.chromium.base.ContextUtils;
import org.chromium.base.FileUtils; import org.chromium.base.FileUtils;
...@@ -18,6 +17,7 @@ import org.chromium.base.TraceEvent; ...@@ -18,6 +17,7 @@ import org.chromium.base.TraceEvent;
import org.chromium.base.task.PostTask; import org.chromium.base.task.PostTask;
import org.chromium.base.task.TaskTraits; import org.chromium.base.task.TaskTraits;
import org.chromium.ui.base.LocalizationUtils; import org.chromium.ui.base.LocalizationUtils;
import org.chromium.ui.base.ResourceBundle;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
...@@ -158,14 +158,15 @@ public class ResourceExtractor { ...@@ -158,14 +158,15 @@ public class ResourceExtractor {
// Currenty (Apr 2018), this array can be as big as 6 entries, so using a capacity // Currenty (Apr 2018), this array can be as big as 6 entries, so using a capacity
// that allows a bit of growth, but is still in the right ballpark.. // that allows a bit of growth, but is still in the right ballpark..
ArrayList<String> activeLocales = new ArrayList<String>(6); ArrayList<String> activeLocales = new ArrayList<String>(6);
for (String locale : BuildConfig.COMPRESSED_LOCALES) { String[] compressedLocales = ResourceBundle.getAvailableCompressedPakLocales();
for (String locale : compressedLocales) {
if (LocalizationUtils.chromiumLocaleMatchesLanguage(locale, uiLanguage)) { if (LocalizationUtils.chromiumLocaleMatchesLanguage(locale, uiLanguage)) {
activeLocales.add(locale); activeLocales.add(locale);
} }
} }
if (activeLocales.isEmpty()) { if (activeLocales.isEmpty()) {
assert BuildConfig.COMPRESSED_LOCALES.length > 0; assert compressedLocales.length > 0;
assert Arrays.asList(BuildConfig.COMPRESSED_LOCALES).contains(FALLBACK_LOCALE); assert Arrays.asList(compressedLocales).contains(FALLBACK_LOCALE);
activeLocales.add(FALLBACK_LOCALE); activeLocales.add(FALLBACK_LOCALE);
} }
...@@ -357,6 +358,6 @@ public class ResourceExtractor { ...@@ -357,6 +358,6 @@ public class ResourceExtractor {
private static boolean shouldSkipPakExtraction() { private static boolean shouldSkipPakExtraction() {
// Certain apks like ContentShell.apk don't have any compressed locale // Certain apks like ContentShell.apk don't have any compressed locale
// assets however, so skip extraction entirely for them. // assets however, so skip extraction entirely for them.
return BuildConfig.COMPRESSED_LOCALES.length == 0; return ResourceBundle.getAvailableCompressedPakLocales().length == 0;
} }
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment