Override SearchEngineAdapter.didSearchEnginesChange

This allows to refresh DSE chenged by sync in browser settings UI on Android

Bytecode asm test for SearchEngineAdapter.didSearchEnginesChange override
This commit is contained in:
AlexeyBarabash
2022-08-12 15:35:32 +03:00
parent d87b312325
commit ceff26d476
4 changed files with 87 additions and 0 deletions
@@ -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<TemplateUrl> 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<TemplateUrl> mPrepopulatedSearchEngines =
(List<TemplateUrl>) BraveReflectionUtil.getField(
SearchEngineAdapter.class, "mPrepopulatedSearchEngines", this);
List<TemplateUrl> mRecentSearchEngines = (List<TemplateUrl>) 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;
}
}
+8
View File
@@ -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(...);
}