From ce7395bd11d219cf0c3459335634e6fd043c7b6e Mon Sep 17 00:00:00 2001 From: samartnik Date: Wed, 8 Apr 2020 15:52:30 -0400 Subject: [PATCH 1/3] Moved from tabs to core option to control opening pages in custom tabs --- android/brave_java_sources.gni | 2 + .../browser/BraveLaunchIntentDispatcher.java | 18 ++++++++ .../preferences/BravePreferenceKeys.java | 1 + .../settings/BraveCustomTabsPreference.java | 42 +++++++++++++++++++ .../settings/BraveMainPreferencesBase.java | 4 ++ .../java/res/xml/brave_main_preferences.xml | 9 +++- .../xml/use_custom_tabs_brave_preference.xml | 14 +++++++ .../android/strings/android_brave_strings.grd | 3 ++ ...-browser-LaunchIntentDispatcher.java.patch | 12 ++++++ 9 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 android/java/org/chromium/chrome/browser/BraveLaunchIntentDispatcher.java create mode 100644 android/java/org/chromium/chrome/browser/settings/BraveCustomTabsPreference.java create mode 100644 android/java/res/xml/use_custom_tabs_brave_preference.xml create mode 100644 patches/chrome-android-java-src-org-chromium-chrome-browser-LaunchIntentDispatcher.java.patch diff --git a/android/brave_java_sources.gni b/android/brave_java_sources.gni index 6cdb01b94c1b..b8d853d128d2 100644 --- a/android/brave_java_sources.gni +++ b/android/brave_java_sources.gni @@ -15,6 +15,7 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/BraveFeatureList.java", "../../brave/android/java/org/chromium/chrome/browser/BraveHelper.java", "../../brave/android/java/org/chromium/chrome/browser/BraveIntentHandler.java", + "../../brave/android/java/org/chromium/chrome/browser/BraveLaunchIntentDispatcher.java", "../../brave/android/java/org/chromium/chrome/browser/BraveRelaunchUtils.java", "../../brave/android/java/org/chromium/chrome/browser/BraveSyncWorker.java", "../../brave/android/java/org/chromium/chrome/browser/BraveRewardsNativeWorker.java", @@ -78,6 +79,7 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/settings/AppearancePreferences.java", "../../brave/android/java/org/chromium/chrome/browser/settings/BackgroundImagesPreferences.java", "../../brave/android/java/org/chromium/chrome/browser/settings/BackgroundVideoPlaybackPreference.java", + "../../brave/android/java/org/chromium/chrome/browser/settings/BraveCustomTabsPreference.java", "../../brave/android/java/org/chromium/chrome/browser/settings/BraveLicensePreferences.java", "../../brave/android/java/org/chromium/chrome/browser/settings/BraveMainPreferencesBase.java", "../../brave/android/java/org/chromium/chrome/browser/settings/BravePreferenceFragment.java", diff --git a/android/java/org/chromium/chrome/browser/BraveLaunchIntentDispatcher.java b/android/java/org/chromium/chrome/browser/BraveLaunchIntentDispatcher.java new file mode 100644 index 000000000000..5e321f389a7c --- /dev/null +++ b/android/java/org/chromium/chrome/browser/BraveLaunchIntentDispatcher.java @@ -0,0 +1,18 @@ +/* Copyright (c) 2020 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 http://mozilla.org/MPL/2.0/. */ + +package org.chromium.chrome.browser; + +import android.content.SharedPreferences; + +import org.chromium.base.ContextUtils; +import org.chromium.chrome.browser.preferences.BravePreferenceKeys; + +public class BraveLaunchIntentDispatcher { + public static boolean useCustomTabs() { + SharedPreferences sharedPreferences = ContextUtils.getAppSharedPreferences(); + return sharedPreferences.getBoolean(BravePreferenceKeys.BRAVE_USE_CUSTOM_TABS, true); + } +} diff --git a/android/java/org/chromium/chrome/browser/preferences/BravePreferenceKeys.java b/android/java/org/chromium/chrome/browser/preferences/BravePreferenceKeys.java index caa66990c3c2..ee0b9d028bff 100644 --- a/android/java/org/chromium/chrome/browser/preferences/BravePreferenceKeys.java +++ b/android/java/org/chromium/chrome/browser/preferences/BravePreferenceKeys.java @@ -8,4 +8,5 @@ public final class BravePreferenceKeys { public static final String BRAVE_BOTTOM_TOOLBAR_ENABLED_KEY = "brave_bottom_toolbar_enabled_key"; public static final String BRAVE_BOTTOM_TOOLBAR_SET_KEY = "brave_bottom_toolbar_enabled"; + public static final String BRAVE_USE_CUSTOM_TABS = "use_custom_tabs"; } \ No newline at end of file diff --git a/android/java/org/chromium/chrome/browser/settings/BraveCustomTabsPreference.java b/android/java/org/chromium/chrome/browser/settings/BraveCustomTabsPreference.java new file mode 100644 index 000000000000..6c9a5961b0ac --- /dev/null +++ b/android/java/org/chromium/chrome/browser/settings/BraveCustomTabsPreference.java @@ -0,0 +1,42 @@ +/* Copyright (c) 2020 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 http://mozilla.org/MPL/2.0/. */ + +package org.chromium.chrome.browser.settings; + +import android.os.Bundle; +import android.content.SharedPreferences; +import android.support.v7.preference.Preference; + +import org.chromium.base.ContextUtils; +import org.chromium.chrome.browser.BraveLaunchIntentDispatcher; +import org.chromium.chrome.browser.preferences.BravePreferenceKeys; +import org.chromium.chrome.browser.settings.BravePreferenceFragment; +import org.chromium.chrome.R; + +public class BraveCustomTabsPreference extends BravePreferenceFragment + implements Preference.OnPreferenceChangeListener { + public static int getPreferenceSummary() { + return BraveLaunchIntentDispatcher.useCustomTabs() ? R.string.text_on : R.string.text_off; + } + + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + getActivity().setTitle(R.string.prefs_use_custom_tabs); + SettingsUtils.addPreferencesFromResource(this, R.xml.use_custom_tabs_brave_preference); + + ChromeSwitchPreference pref = (ChromeSwitchPreference) findPreference( + BravePreferenceKeys.BRAVE_USE_CUSTOM_TABS); + pref.setChecked(BraveLaunchIntentDispatcher.useCustomTabs()); + pref.setOnPreferenceChangeListener(this); + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + SharedPreferences.Editor sharedPreferencesEditor = ContextUtils.getAppSharedPreferences().edit(); + sharedPreferencesEditor.putBoolean(BravePreferenceKeys.BRAVE_USE_CUSTOM_TABS, (boolean) newValue); + sharedPreferencesEditor.apply(); + return true; + } +} diff --git a/android/java/org/chromium/chrome/browser/settings/BraveMainPreferencesBase.java b/android/java/org/chromium/chrome/browser/settings/BraveMainPreferencesBase.java index 9daed64ff629..858fbbbd4f86 100644 --- a/android/java/org/chromium/chrome/browser/settings/BraveMainPreferencesBase.java +++ b/android/java/org/chromium/chrome/browser/settings/BraveMainPreferencesBase.java @@ -49,6 +49,7 @@ public class BraveMainPreferencesBase extends BravePreferenceFragment { private static final String PREF_BACKGROUND_IMAGES = "backgroud_images"; private static final String PREF_BRAVE_REWARDS = "brave_rewards"; private static final String PREF_HOMEPAGE = "homepage"; + private static final String PREF_USE_CUSTOM_TABS = "use_custom_tabs"; private final HashMap mRemovedPreferences = new HashMap<>(); @@ -122,6 +123,7 @@ private void rearrangePreferenceOrders() { // and we deleted original 0 ~ 2 ordered preferences. // Advanced section will be located below our controls section. int order = findPreference(PREF_CLOSING_ALL_TABS_CLOSES_BRAVE).getOrder(); + findPreference(PREF_USE_CUSTOM_TABS).setOrder(++order); findPreference(PREF_ADVANCED_SECTION).setOrder(++order); findPreference(PREF_PRIVACY).setOrder(++order); findPreference(PREF_BRAVE_REWARDS).setOrder(++order); @@ -168,6 +170,8 @@ private void updateControlSectionPreferences() { p.setSummary(BackgroundVideoPlaybackPreference.getPreferenceSummary()); p = findPreference(PREF_CLOSING_ALL_TABS_CLOSES_BRAVE); p.setSummary(ClosingAllTabsClosesBravePreference.getPreferenceSummary()); + p = findPreference(PREF_USE_CUSTOM_TABS); + p.setSummary(BraveCustomTabsPreference.getPreferenceSummary()); } private void overrideChromiumPreferences() { diff --git a/android/java/res/xml/brave_main_preferences.xml b/android/java/res/xml/brave_main_preferences.xml index b18dcb4c22be..f1ddd309b7d5 100644 --- a/android/java/res/xml/brave_main_preferences.xml +++ b/android/java/res/xml/brave_main_preferences.xml @@ -53,14 +53,19 @@ android:key="closing_all_tabs_closes_brave" android:order="17" android:title="@string/prefs_closing_all_tabs_closes_brave"/> + diff --git a/android/java/res/xml/use_custom_tabs_brave_preference.xml b/android/java/res/xml/use_custom_tabs_brave_preference.xml new file mode 100644 index 000000000000..295bf47a9164 --- /dev/null +++ b/android/java/res/xml/use_custom_tabs_brave_preference.xml @@ -0,0 +1,14 @@ + + + + + + diff --git a/browser/ui/android/strings/android_brave_strings.grd b/browser/ui/android/strings/android_brave_strings.grd index 78245d7ea11f..d1581c94cd73 100644 --- a/browser/ui/android/strings/android_brave_strings.grd +++ b/browser/ui/android/strings/android_brave_strings.grd @@ -924,6 +924,9 @@ until they verify, or until 90 days have passed. Get paid to see this background image. Turn on Brave Ads to claim your share. + + Open tabs in Custom Tabs + diff --git a/patches/chrome-android-java-src-org-chromium-chrome-browser-LaunchIntentDispatcher.java.patch b/patches/chrome-android-java-src-org-chromium-chrome-browser-LaunchIntentDispatcher.java.patch new file mode 100644 index 000000000000..887af665fdb5 --- /dev/null +++ b/patches/chrome-android-java-src-org-chromium-chrome-browser-LaunchIntentDispatcher.java.patch @@ -0,0 +1,12 @@ +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java b/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java +index 9e614cdb61a591ab8bd7f33c686aa5c5a9ec7e8b..ad5411038b468041038f30904f27e56f0f439995 100644 +--- a/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java +@@ -250,6 +250,7 @@ public class LaunchIntentDispatcher implements IntentHandler.IntentHandlerDelega + * @return Whether the intent is for launching a Custom Tab. + */ + public static boolean isCustomTabIntent(Intent intent) { ++ if(!BraveLaunchIntentDispatcher.useCustomTabs()) return false; + if (intent == null) return false; + if (CustomTabsIntent.shouldAlwaysUseBrowserUI(intent) + || !intent.hasExtra(CustomTabsIntent.EXTRA_SESSION)) { From 19ec7778d8349d1cf64c2febac9eb33c6bc6d10f Mon Sep 17 00:00:00 2001 From: samartnik Date: Thu, 9 Apr 2020 18:29:39 -0400 Subject: [PATCH 2/3] Replaced patch with asm --- .../browser/BraveLaunchIntentDispatcher.java | 8 +++++ .../org/brave/bytecode/BraveClassAdapter.java | 1 + .../org/brave/bytecode/BraveClassVisitor.java | 30 +++++++++++++++++++ ...aveLaunchIntentDispatcherClassAdapter.java | 18 +++++++++++ build/android/bytecode/java_sources.gni | 1 + ...-browser-LaunchIntentDispatcher.java.patch | 12 -------- 6 files changed, 58 insertions(+), 12 deletions(-) create mode 100644 build/android/bytecode/java/org/brave/bytecode/BraveLaunchIntentDispatcherClassAdapter.java delete mode 100644 patches/chrome-android-java-src-org-chromium-chrome-browser-LaunchIntentDispatcher.java.patch diff --git a/android/java/org/chromium/chrome/browser/BraveLaunchIntentDispatcher.java b/android/java/org/chromium/chrome/browser/BraveLaunchIntentDispatcher.java index 5e321f389a7c..a5bb43de7aef 100644 --- a/android/java/org/chromium/chrome/browser/BraveLaunchIntentDispatcher.java +++ b/android/java/org/chromium/chrome/browser/BraveLaunchIntentDispatcher.java @@ -5,12 +5,20 @@ package org.chromium.chrome.browser; +import android.content.Intent; import android.content.SharedPreferences; import org.chromium.base.ContextUtils; import org.chromium.chrome.browser.preferences.BravePreferenceKeys; public class BraveLaunchIntentDispatcher { + public static boolean isCustomTabIntent(Intent intent) { + if (!useCustomTabs()) { + return false; + } + return LaunchIntentDispatcher.isCustomTabIntent(intent); + } + public static boolean useCustomTabs() { SharedPreferences sharedPreferences = ContextUtils.getAppSharedPreferences(); return sharedPreferences.getBoolean(BravePreferenceKeys.BRAVE_USE_CUSTOM_TABS, true); diff --git a/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java b/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java index a8d84444e38d..4789555a46bb 100644 --- a/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java +++ b/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java @@ -12,6 +12,7 @@ public static ClassVisitor createAdapter(ClassVisitor chain) { chain = new BraveBookmarkModelClassAdapter(chain); chain = new BraveMainPreferenceBaseClassAdapter(chain); chain = new BraveAndroidSyncSettingsClassAdapter(chain); + chain = new BraveLaunchIntentDispatcherClassAdapter(chain); return chain; } } diff --git a/build/android/bytecode/java/org/brave/bytecode/BraveClassVisitor.java b/build/android/bytecode/java/org/brave/bytecode/BraveClassVisitor.java index ce8716f57aa7..eba75a28d165 100644 --- a/build/android/bytecode/java/org/brave/bytecode/BraveClassVisitor.java +++ b/build/android/bytecode/java/org/brave/bytecode/BraveClassVisitor.java @@ -73,6 +73,12 @@ public void visitMethodInsn(int opcode, // the method now opcode = INVOKEVIRTUAL; } + String newOwner = shouldChangeOwner(owner, name); + if (!newOwner.isEmpty()) { + System.out.println("changing owner for " + mName + "." + name + + " - new owner " + newOwner); + owner = newOwner; + } super.visitMethodInsn(opcode, owner, name, descriptor, isInterface); } } @@ -87,6 +93,8 @@ public void visitMethodInsn(int opcode, new HashMap>(); private Map> mMakePublicMethods = new HashMap>(); + private Map> mChangeOwnerMethods = + new HashMap>(); private Map> mMakeProtectedFields = new HashMap>(); private Map>> mAddAnnotations = @@ -147,6 +155,28 @@ protected void makePublicMethod(String className, String methodName) { methods.add(methodName); } + private String shouldChangeOwner(String owner, String methodName) { + if (mChangeOwnerMethods.containsKey(owner)) { + Map methods = mChangeOwnerMethods.get(owner); + if (methods.containsKey(methodName)) { + String newOwner = methods.get(methodName); + if (!newOwner.equals(mName)) { + return newOwner; + } + } + } + return ""; + } + + protected void changeMethodOwner(String currentOwner, String methodName, String newOwner) { + Map methods = mChangeOwnerMethods.get(currentOwner); + if (methods == null) { + methods = new HashMap(); + mChangeOwnerMethods.put(currentOwner, methods); + } + methods.put(methodName, newOwner); + } + private boolean shouldDeleteField(String fieldName) { for(Map.Entry> entry : mDeleteFields.entrySet()) { diff --git a/build/android/bytecode/java/org/brave/bytecode/BraveLaunchIntentDispatcherClassAdapter.java b/build/android/bytecode/java/org/brave/bytecode/BraveLaunchIntentDispatcherClassAdapter.java new file mode 100644 index 000000000000..5d17073c083c --- /dev/null +++ b/build/android/bytecode/java/org/brave/bytecode/BraveLaunchIntentDispatcherClassAdapter.java @@ -0,0 +1,18 @@ +/* Copyright (c) 2020 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 http://mozilla.org/MPL/2.0/. */ + +package org.brave.bytecode; + +import org.objectweb.asm.ClassVisitor; + +public class BraveLaunchIntentDispatcherClassAdapter extends BraveClassVisitor { + static String sLaunchIntentDispatcherClassName = "org/chromium/chrome/browser/LaunchIntentDispatcher"; + static String sBraveLaunchIntentDispatcherClassName = "org/chromium/chrome/browser/BraveLaunchIntentDispatcher"; + + public BraveLaunchIntentDispatcherClassAdapter(ClassVisitor visitor) { + super(visitor); + changeMethodOwner(sLaunchIntentDispatcherClassName, "isCustomTabIntent", sBraveLaunchIntentDispatcherClassName); + } +} diff --git a/build/android/bytecode/java_sources.gni b/build/android/bytecode/java_sources.gni index 8e7c684d9245..fa66db6e85ef 100644 --- a/build/android/bytecode/java_sources.gni +++ b/build/android/bytecode/java_sources.gni @@ -1,6 +1,7 @@ brave_java_bytecode_files = [ "../../../brave/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java", "../../../brave/build/android/bytecode/java/org/brave/bytecode/BraveClassVisitor.java", + "../../../brave/build/android/bytecode/java/org/brave/bytecode/BraveLaunchIntentDispatcherClassAdapter.java", "../../../brave/build/android/bytecode/java/org/brave/bytecode/BraveAndroidSyncSettingsClassAdapter.java", "../../../brave/build/android/bytecode/java/org/brave/bytecode/BraveBookmarkModelClassAdapter.java", "../../../brave/build/android/bytecode/java/org/brave/bytecode/BraveMainPreferenceBaseClassAdapter.java", diff --git a/patches/chrome-android-java-src-org-chromium-chrome-browser-LaunchIntentDispatcher.java.patch b/patches/chrome-android-java-src-org-chromium-chrome-browser-LaunchIntentDispatcher.java.patch deleted file mode 100644 index 887af665fdb5..000000000000 --- a/patches/chrome-android-java-src-org-chromium-chrome-browser-LaunchIntentDispatcher.java.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java b/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java -index 9e614cdb61a591ab8bd7f33c686aa5c5a9ec7e8b..ad5411038b468041038f30904f27e56f0f439995 100644 ---- a/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java -+++ b/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java -@@ -250,6 +250,7 @@ public class LaunchIntentDispatcher implements IntentHandler.IntentHandlerDelega - * @return Whether the intent is for launching a Custom Tab. - */ - public static boolean isCustomTabIntent(Intent intent) { -+ if(!BraveLaunchIntentDispatcher.useCustomTabs()) return false; - if (intent == null) return false; - if (CustomTabsIntent.shouldAlwaysUseBrowserUI(intent) - || !intent.hasExtra(CustomTabsIntent.EXTRA_SESSION)) { From e193f31bf36cd2fd7347faed372077bcfde718ad Mon Sep 17 00:00:00 2001 From: samartnik Date: Fri, 10 Apr 2020 13:24:24 -0400 Subject: [PATCH 3/3] Code review changes --- .../chrome/browser/BraveLaunchIntentDispatcher.java | 1 + .../java/org/brave/bytecode/BraveClassVisitor.java | 13 +++++-------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/BraveLaunchIntentDispatcher.java b/android/java/org/chromium/chrome/browser/BraveLaunchIntentDispatcher.java index a5bb43de7aef..4df9173263f7 100644 --- a/android/java/org/chromium/chrome/browser/BraveLaunchIntentDispatcher.java +++ b/android/java/org/chromium/chrome/browser/BraveLaunchIntentDispatcher.java @@ -11,6 +11,7 @@ import org.chromium.base.ContextUtils; import org.chromium.chrome.browser.preferences.BravePreferenceKeys; +// see org.brave.bytecode.BraveLaunchIntentDispatcherClassAdapter public class BraveLaunchIntentDispatcher { public static boolean isCustomTabIntent(Intent intent) { if (!useCustomTabs()) { diff --git a/build/android/bytecode/java/org/brave/bytecode/BraveClassVisitor.java b/build/android/bytecode/java/org/brave/bytecode/BraveClassVisitor.java index eba75a28d165..b5699fa485d5 100644 --- a/build/android/bytecode/java/org/brave/bytecode/BraveClassVisitor.java +++ b/build/android/bytecode/java/org/brave/bytecode/BraveClassVisitor.java @@ -73,12 +73,7 @@ public void visitMethodInsn(int opcode, // the method now opcode = INVOKEVIRTUAL; } - String newOwner = shouldChangeOwner(owner, name); - if (!newOwner.isEmpty()) { - System.out.println("changing owner for " + mName + "." + name + - " - new owner " + newOwner); - owner = newOwner; - } + owner = maybeChangeOwner(owner, name); super.visitMethodInsn(opcode, owner, name, descriptor, isInterface); } } @@ -155,17 +150,19 @@ protected void makePublicMethod(String className, String methodName) { methods.add(methodName); } - private String shouldChangeOwner(String owner, String methodName) { + private String maybeChangeOwner(String owner, String methodName) { if (mChangeOwnerMethods.containsKey(owner)) { Map methods = mChangeOwnerMethods.get(owner); if (methods.containsKey(methodName)) { String newOwner = methods.get(methodName); if (!newOwner.equals(mName)) { + System.out.println("changing owner for " + mName + "." + methodName + + " - new owner " + newOwner); return newOwner; } } } - return ""; + return owner; } protected void changeMethodOwner(String currentOwner, String methodName, String newOwner) {