From ceff26d476c245acfb7d73ebdb186960e24a2a63 Mon Sep 17 00:00:00 2001 From: AlexeyBarabash Date: Mon, 1 Aug 2022 23:28:11 +0300 Subject: [PATCH] Override SearchEngineAdapter.didSearchEnginesChange This allows to refresh DSE chenged by sync in browser settings UI on Android Bytecode asm test for SearchEngineAdapter.didSearchEnginesChange override --- .../BraveBaseSearchEngineAdapter.java | 59 +++++++++++++++++++ android/java/proguard.flags | 8 +++ .../chromium/chrome/browser/BytecodeTest.java | 17 ++++++ .../BraveSearchEngineAdapterClassAdapter.java | 3 + 4 files changed, 87 insertions(+) diff --git a/android/java/org/chromium/chrome/browser/search_engines/settings/BraveBaseSearchEngineAdapter.java b/android/java/org/chromium/chrome/browser/search_engines/settings/BraveBaseSearchEngineAdapter.java index acdfbbabd61..261c2fb7594 100644 --- a/android/java/org/chromium/chrome/browser/search_engines/settings/BraveBaseSearchEngineAdapter.java +++ b/android/java/org/chromium/chrome/browser/search_engines/settings/BraveBaseSearchEngineAdapter.java @@ -12,9 +12,13 @@ import android.widget.BaseAdapter; import androidx.annotation.StringRes; +import org.chromium.base.BraveReflectionUtil; +import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.chrome.browser.search_engines.settings.SearchEngineAdapter; import org.chromium.components.search_engines.TemplateUrl; +import org.chromium.components.search_engines.TemplateUrlService; +import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -82,4 +86,59 @@ public class BraveBaseSearchEngineAdapter extends BaseAdapter { return SearchEngineAdapter.TemplateUrlSourceType.RECENT; } } + + public boolean didSearchEnginesChange(List templateUrls) { + boolean chromiumDidSearchEnginesChange = + (boolean) BraveReflectionUtil.InvokeMethod(SearchEngineAdapter.class, this, + "didSearchEnginesChange", java.util.List.class, templateUrls); + + if (chromiumDidSearchEnginesChange) { + return true; + } + + // The original SearchEngineAdapter.didSearchEnginesChange method does + // not give true when the set of engines wasn't + // changed, but was changed the selected default search engine. + // This happens because Chromium does not sync the DSE. + // The code below is in fact part of SearchEngineAdapter.refreshData + // which detects new mSelectedSearchEnginePosition. + // We use it to detect the change of the selected DSE. + + List mPrepopulatedSearchEngines = + (List) BraveReflectionUtil.getField( + SearchEngineAdapter.class, "mPrepopulatedSearchEngines", this); + List mRecentSearchEngines = (List) BraveReflectionUtil.getField( + SearchEngineAdapter.class, "mRecentSearchEngines", this); + int mSelectedSearchEnginePosition = (int) BraveReflectionUtil.getField( + SearchEngineAdapter.class, "mSelectedSearchEnginePosition", this); + + if (mSelectedSearchEnginePosition == -1) { + return false; + } + + TemplateUrlService templateUrlService = TemplateUrlServiceFactory.get(); + assert templateUrlService.isLoaded(); + TemplateUrl defaultSearchEngineTemplateUrl = + templateUrlService.getDefaultSearchEngineTemplateUrl(); + + // Convert the TemplateUrl index into an index of mSearchEngines. + int selectedSearchEnginePosition = -1; + for (int i = 0; i < mPrepopulatedSearchEngines.size(); ++i) { + if (mPrepopulatedSearchEngines.get(i).equals(defaultSearchEngineTemplateUrl)) { + selectedSearchEnginePosition = i; + } + } + + for (int i = 0; i < mRecentSearchEngines.size(); ++i) { + if (mRecentSearchEngines.get(i).equals(defaultSearchEngineTemplateUrl)) { + // Add one to offset the title for the recent search engine list. + int chromiumStartIndexForRecentSearchEngines = + (int) BraveReflectionUtil.InvokeMethod(SearchEngineAdapter.class, this, + "computeStartIndexForRecentSearchEngines"); + selectedSearchEnginePosition = i + chromiumStartIndexForRecentSearchEngines; + } + } + + return selectedSearchEnginePosition != mSelectedSearchEnginePosition; + } } diff --git a/android/java/proguard.flags b/android/java/proguard.flags index dcd2dbc2211..1355760b92d 100644 --- a/android/java/proguard.flags +++ b/android/java/proguard.flags @@ -18,6 +18,14 @@ *** getProcessorForSuggestion(...); } +-keep class org.chromium.chrome.browser.search_engines.settings.SearchEngineAdapter { + *** didSearchEnginesChange(...); + *** computeStartIndexForRecentSearchEngines(...); + *** mPrepopulatedSearchEngines; + *** mRecentSearchEngines; + *** mSelectedSearchEnginePosition; +} + -keep class org.chromium.components.browser_ui.site_settings.ContentSettingsResources { *** getResourceItem(...); } diff --git a/android/javatests/org/chromium/chrome/browser/BytecodeTest.java b/android/javatests/org/chromium/chrome/browser/BytecodeTest.java index 5747d11265e..be517991b4b 100644 --- a/android/javatests/org/chromium/chrome/browser/BytecodeTest.java +++ b/android/javatests/org/chromium/chrome/browser/BytecodeTest.java @@ -453,6 +453,12 @@ public class BytecodeTest { Assert.assertTrue(methodExists("org/chromium/components/browser_ui/site_settings/Website", "setContentSetting", true, void.class, BrowserContextHandle.class, int.class, int.class)); + Assert.assertTrue(methodExists( + "org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapter", + "didSearchEnginesChange", true, boolean.class, List.class)); + Assert.assertTrue(methodExists( + "org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapter", + "computeStartIndexForRecentSearchEngines", true, int.class)); // NOTE: Add new checks above. For each new check in this method add proguard exception in // `brave/android/java/proguard.flags` file under `Add methods for invocation below` // section. Both test and regular apks should have the same exceptions. @@ -771,12 +777,23 @@ public class BytecodeTest { "org/chromium/chrome/browser/ntp/NewTabPageLayout", "mMvTilesContainerLayout")); Assert.assertTrue( fieldExists("org/chromium/chrome/browser/dom_distiller/ReaderModeManager", "mTab")); + Assert.assertTrue(fieldExists( "org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder", "mDropdownHeight")); Assert.assertTrue(fieldExists( "org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder", "mPriorityOrderedSuggestionProcessors")); + + Assert.assertTrue(fieldExists( + "org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapter", + "mPrepopulatedSearchEngines")); + Assert.assertTrue(fieldExists( + "org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapter", + "mRecentSearchEngines")); + Assert.assertTrue(fieldExists( + "org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapter", + "mSelectedSearchEnginePosition")); } @Test diff --git a/build/android/bytecode/java/org/brave/bytecode/BraveSearchEngineAdapterClassAdapter.java b/build/android/bytecode/java/org/brave/bytecode/BraveSearchEngineAdapterClassAdapter.java index f1f8c1188a9..0ff758acd16 100644 --- a/build/android/bytecode/java/org/brave/bytecode/BraveSearchEngineAdapterClassAdapter.java +++ b/build/android/bytecode/java/org/brave/bytecode/BraveSearchEngineAdapterClassAdapter.java @@ -41,5 +41,8 @@ public class BraveSearchEngineAdapterClassAdapter extends BraveClassVisitor { makePublicMethod(sSearchEngineSettingsClassName, "createAdapterIfNecessary"); addMethodAnnotation(sBraveSearchEnginePreferenceClassName, "createAdapterIfNecessary", "Ljava/lang/Override;"); + + changeMethodOwner(sSearchEngineAdapterClassName, "didSearchEnginesChange", + sBraveSearchEngineAdapterBaseClassName); } }