diff --git a/android/android_browser_tests.gni b/android/android_browser_tests.gni index 699f6cd6844..4bb6890a41e 100644 --- a/android/android_browser_tests.gni +++ b/android/android_browser_tests.gni @@ -132,6 +132,7 @@ android_only_test_deps = [ "//brave/browser/partnercustomizations:delegate_public_impl_java", "//brave/components/brave_wallet/browser:test_support", "//brave/components/cosmetic_filters/browser:browser", + "//brave/components/language/android:java", "//brave/third_party/android_deps:com_android_installreferrer_java", "//chrome:chrome_android_core", "//chrome/android:app_hooks_java", diff --git a/android/brave_java_sources.gni b/android/brave_java_sources.gni index 72eb6b63537..0b344bfa735 100644 --- a/android/brave_java_sources.gni +++ b/android/brave_java_sources.gni @@ -518,6 +518,7 @@ brave_java_base_module_sources = [ ] brave_java_base_module_deps = [ + "//brave/components/language/android:java", "//brave/third_party/android_deps:com_wireguard_android_java", "//third_party/androidx:androidx_core_core_java", "//third_party/androidx:androidx_lifecycle_lifecycle_livedata_core_java", diff --git a/android/java/apk_for_test.flags b/android/java/apk_for_test.flags index 1bbecd643f4..7e7ee9e249c 100644 --- a/android/java/apk_for_test.flags +++ b/android/java/apk_for_test.flags @@ -823,3 +823,15 @@ -keep class org.chromium.chrome.browser.customtabs.features.partialcustomtab.BravePartialCustomTabBottomSheetStrategy { public (...); } + +-keep class org.chromium.components.language.LocaleManagerDelegateImpl { + public (...); + *** getApplicationLocale(...); + *** setApplicationLocale(...); +} + +-keep class org.chromium.components.language.BraveLocaleManagerDelegateImpl { + public (...); + *** getApplicationLocale(...); + *** setApplicationLocale(...); +} diff --git a/android/javatests/org/chromium/chrome/browser/BytecodeTest.java b/android/javatests/org/chromium/chrome/browser/BytecodeTest.java index 15d7dc8b5cb..e2915fafdd5 100644 --- a/android/javatests/org/chromium/chrome/browser/BytecodeTest.java +++ b/android/javatests/org/chromium/chrome/browser/BytecodeTest.java @@ -384,6 +384,10 @@ public class BytecodeTest { Assert.assertTrue(classExists("org/chromium/chrome/browser/bookmarks/BookmarkUiPrefs")); Assert.assertTrue( classExists("org/chromium/chrome/browser/bookmarks/BraveBookmarkUiPrefs")); + Assert.assertTrue( + classExists("org/chromium/components/language/LocaleManagerDelegateImpl")); + Assert.assertTrue( + classExists("org/chromium/components/language/BraveLocaleManagerDelegateImpl")); } @Test @@ -1284,6 +1288,10 @@ public class BytecodeTest { boolean.class, boolean.class, PartialCustomTabHandleStrategyFactory.class)); + Assert.assertTrue( + constructorsMatch( + "org/chromium/components/language/LocaleManagerDelegateImpl", + "org/chromium/components/language/BraveLocaleManagerDelegateImpl")); } @Test diff --git a/build/android/bytecode/BUILD.gn b/build/android/bytecode/BUILD.gn index 66833ed1952..cd0808a685c 100644 --- a/build/android/bytecode/BUILD.gn +++ b/build/android/bytecode/BUILD.gn @@ -52,6 +52,7 @@ java_binary("java_bytecode_rewriter") { "//brave/build/android/bytecode/java/org/brave/bytecode/BraveIntentHandlerClassAdapter.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveLaunchIntentDispatcherClassAdapter.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveLauncherActivityClassAdapter.java", + "//brave/build/android/bytecode/java/org/brave/bytecode/BraveLocaleManagerDelegateImplClassAdapter.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveLocationBarCoordinatorClassAdapter.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveLocationBarLayoutClassAdapter.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveLocationBarMediatorClassAdapter.java", diff --git a/build/android/bytecode/bytecode_rewriter.gni b/build/android/bytecode/bytecode_rewriter.gni index a053b4aa071..861786d1c99 100644 --- a/build/android/bytecode/bytecode_rewriter.gni +++ b/build/android/bytecode/bytecode_rewriter.gni @@ -44,6 +44,7 @@ brave_bytecode_jars = [ "obj/components/permissions/android/java.javac.jar", "obj/components/sync/android/sync_java.javac.jar", "obj/components/variations/android/variations_java.javac.jar", + "obj/chrome/browser/language/android/base_module_java.javac.jar", ] template("brave_bytecode_rewriter") { diff --git a/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java b/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java index 3461c0c9170..f3fa60215f2 100644 --- a/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java +++ b/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java @@ -51,6 +51,7 @@ public class BraveClassAdapter { chain = new BraveIntentHandlerClassAdapter(chain); chain = new BraveLauncherActivityClassAdapter(chain); chain = new BraveLaunchIntentDispatcherClassAdapter(chain); + chain = new BraveLocaleManagerDelegateImplClassAdapter(chain); chain = new BraveLocationBarCoordinatorClassAdapter(chain); chain = new BraveLocationBarLayoutClassAdapter(chain); chain = new BraveLocationBarMediatorClassAdapter(chain); diff --git a/build/android/bytecode/java/org/brave/bytecode/BraveLocaleManagerDelegateImplClassAdapter.java b/build/android/bytecode/java/org/brave/bytecode/BraveLocaleManagerDelegateImplClassAdapter.java new file mode 100644 index 00000000000..047fc0c1344 --- /dev/null +++ b/build/android/bytecode/java/org/brave/bytecode/BraveLocaleManagerDelegateImplClassAdapter.java @@ -0,0 +1,21 @@ +/* Copyright (c) 2024 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. */ + +package org.brave.bytecode; + +import org.objectweb.asm.ClassVisitor; + +public class BraveLocaleManagerDelegateImplClassAdapter extends BraveClassVisitor { + static String sLocaleManagerDelegateImpl = + "org/chromium/components/language/LocaleManagerDelegateImpl"; + static String sBraveLocaleManagerDelegateImpl = + "org/chromium/components/language/BraveLocaleManagerDelegateImpl"; + + public BraveLocaleManagerDelegateImplClassAdapter(ClassVisitor visitor) { + super(visitor); + + redirectConstructor(sLocaleManagerDelegateImpl, sBraveLocaleManagerDelegateImpl); + } +} diff --git a/components/language/android/BUILD.gn b/components/language/android/BUILD.gn new file mode 100644 index 00000000000..65a377950f9 --- /dev/null +++ b/components/language/android/BUILD.gn @@ -0,0 +1,16 @@ +# Copyright (c) 2024 The Brave Authors. All rights reserved. +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at https://mozilla.org/MPL/2.0/. + +import("//build/config/android/rules.gni") + +android_library("java") { + sources = [ "java/src/org/chromium/components/language/BraveLocaleManagerDelegateImpl.java" ] + + deps = [ + "//base:base_java", + "//components/language/android:ulp_delegate_java", + "//third_party/androidx:androidx_annotation_annotation_java", + ] +} diff --git a/components/language/android/java/src/org/chromium/components/language/BraveLocaleManagerDelegateImpl.java b/components/language/android/java/src/org/chromium/components/language/BraveLocaleManagerDelegateImpl.java new file mode 100644 index 00000000000..ae79149a00f --- /dev/null +++ b/components/language/android/java/src/org/chromium/components/language/BraveLocaleManagerDelegateImpl.java @@ -0,0 +1,39 @@ +/* Copyright (c) 2024 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. */ + +package org.chromium.components.language; + +import android.app.LocaleManager; +import android.os.Build; +import android.os.LocaleList; + +import androidx.annotation.RequiresApi; + +import org.chromium.base.ContextUtils; + +import java.util.Locale; + +public class BraveLocaleManagerDelegateImpl extends LocaleManagerDelegateImpl { + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + @Override + public Locale getApplicationLocale() { + LocaleList currentAppLocales = + ContextUtils.getApplicationContext() + .getSystemService(LocaleManager.class) + .getApplicationLocales(); + if (!currentAppLocales.isEmpty()) { + return currentAppLocales.get(0); + } + return null; + } + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + @Override + public void setApplicationLocale(String languageName) { + ContextUtils.getApplicationContext() + .getSystemService(LocaleManager.class) + .setApplicationLocales(new LocaleList(Locale.forLanguageTag(languageName))); + } +}