Create AutocompleteMediator super class instead of patching, for capturing Android URL events in P3A

This commit is contained in:
Darnell Andries
2023-09-12 13:19:55 -07:00
parent 5f450f32da
commit 0576c813d2
13 changed files with 91 additions and 31 deletions
+1
View File
@@ -282,6 +282,7 @@ brave_java_sources = [
"../../brave/android/java/org/chromium/chrome/browser/omnibox/BraveLocationBarMediator.java",
"../../brave/android/java/org/chromium/chrome/browser/omnibox/BraveLocationBarQRDialogFragment.java",
"../../brave/android/java/org/chromium/chrome/browser/omnibox/suggestions/BraveAutocompleteMediator.java",
"../../brave/android/java/org/chromium/chrome/browser/omnibox/suggestions/BraveAutocompleteMediatorBase.java",
"../../brave/android/java/org/chromium/chrome/browser/onboarding/BraveRewardsOnboardingFragment.java",
"../../brave/android/java/org/chromium/chrome/browser/onboarding/OnViewPagerAction.java",
"../../brave/android/java/org/chromium/chrome/browser/onboarding/OnboardingActivity.java",
+4
View File
@@ -541,6 +541,10 @@
public <init>(...);
}
-keep class org.chromium.chrome.browser.omnibox.suggestions.BraveAutocompleteMediatorBase {
public <init>(...);
}
-keep class org.chromium.chrome.browser.notifications.permissions.NotificationPermissionRationaleDialogController {
*** wrapDialogDismissalCallback(...);
public <init>(...);
@@ -13,7 +13,6 @@ import androidx.annotation.Nullable;
import org.chromium.base.Callback;
import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.browser.app.BraveActivity;
import org.chromium.chrome.browser.omnibox.LocationBarDataProvider;
import org.chromium.chrome.browser.omnibox.UrlBarEditingTextStateProvider;
import org.chromium.chrome.browser.omnibox.suggestions.basic.BasicSuggestionProcessor.BookmarkState;
@@ -24,13 +23,10 @@ import org.chromium.chrome.browser.profiles.ProfileManager;
import org.chromium.chrome.browser.share.ShareDelegate;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tabmodel.TabWindowManager;
import org.chromium.components.omnibox.AutocompleteMatch;
import org.chromium.components.omnibox.OmniboxSuggestionType;
import org.chromium.components.omnibox.action.OmniboxActionDelegate;
import org.chromium.components.user_prefs.UserPrefs;
import org.chromium.ui.modaldialog.ModalDialogManager;
import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.url.GURL;
class BraveAutocompleteMediator extends AutocompleteMediator implements BraveSuggestionHost {
private static final String AUTOCOMPLETE_ENABLED = "brave.autocomplete_enabled";
@@ -78,19 +74,6 @@ class BraveAutocompleteMediator extends AutocompleteMediator implements BraveSug
super.onUrlFocusChange(hasFocus);
}
@Override
void loadUrlForOmniboxMatch(int matchIndex, @NonNull AutocompleteMatch suggestion,
@NonNull GURL url, long inputStart, boolean inVisibleSuggestionList) {
super.loadUrlForOmniboxMatch(
matchIndex, suggestion, url, inputStart, inVisibleSuggestionList);
if (suggestion.getType() == OmniboxSuggestionType.SEARCH_WHAT_YOU_TYPED
|| suggestion.getType() == OmniboxSuggestionType.SEARCH_SUGGEST) {
if (mContext != null && mContext instanceof BraveActivity) {
((BraveActivity) mContext).getMiscAndroidMetrics().recordLocationBarQuery();
}
}
}
@Override
public void removeBraveSearchSuggestion() {
if (mDropdownViewInfoListManager instanceof BraveDropdownItemViewInfoListManager) {
@@ -0,0 +1,33 @@
/* Copyright (c) 2023 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.chrome.browser.omnibox.suggestions;
import android.content.Context;
import androidx.annotation.NonNull;
import org.chromium.base.BraveReflectionUtil;
import org.chromium.chrome.browser.app.BraveActivity;
import org.chromium.components.omnibox.AutocompleteMatch;
import org.chromium.components.omnibox.OmniboxSuggestionType;
import org.chromium.url.GURL;
class BraveAutocompleteMediatorBase {
void loadUrlForOmniboxMatch(int matchIndex, @NonNull AutocompleteMatch suggestion,
@NonNull GURL url, long inputStart, boolean inVisibleSuggestionList) {
BraveReflectionUtil.InvokeMethod(AutocompleteMediator.class, this, "loadUrlForOmniboxMatch",
int.class, matchIndex, AutocompleteMatch.class, suggestion, GURL.class, url,
long.class, inputStart, boolean.class, inVisibleSuggestionList);
if (suggestion.getType() == OmniboxSuggestionType.SEARCH_WHAT_YOU_TYPED
|| suggestion.getType() == OmniboxSuggestionType.SEARCH_SUGGEST) {
Context context = (Context) BraveReflectionUtil.getField(
AutocompleteMediator.class, "mContext", this);
if (context != null && context instanceof BraveActivity) {
((BraveActivity) context).getMiscAndroidMetrics().recordLocationBarQuery();
}
}
}
}
+5
View File
@@ -15,6 +15,11 @@
*** createViewProvider(...);
}
-keep class org.chromium.chrome.browser.omnibox.suggestions.AutocompleteMediator {
*** mContext;
*** loadUrlForOmniboxMatch(...);
}
-keep class org.chromium.components.browser_ui.site_settings.ContentSettingsResources {
*** getResourceItem(...);
}
@@ -128,6 +128,7 @@ import org.chromium.components.embedder_support.contextmenu.ContextMenuParams;
import org.chromium.components.external_intents.ExternalNavigationDelegate;
import org.chromium.components.externalauth.ExternalAuthUtils;
import org.chromium.components.favicon.LargeIconBridge;
import org.chromium.components.omnibox.AutocompleteMatch;
import org.chromium.components.omnibox.action.OmniboxActionDelegate;
import org.chromium.components.permissions.PermissionDialogController;
import org.chromium.content_public.browser.BrowserContextHandle;
@@ -140,6 +141,7 @@ import org.chromium.ui.modaldialog.ModalDialogManager;
import org.chromium.ui.modelutil.MVCListAdapter;
import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.url.GURL;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
@@ -292,6 +294,8 @@ public class BytecodeTest {
"org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator"));
Assert.assertTrue(classExists(
"org/chromium/chrome/browser/omnibox/suggestions/BraveAutocompleteCoordinator"));
Assert.assertTrue(classExists(
"org/chromium/chrome/browser/omnibox/suggestions/BraveAutocompleteMediatorBase"));
Assert.assertTrue(classExists(
"org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder"));
Assert.assertTrue(classExists(
@@ -534,6 +538,10 @@ public class BytecodeTest {
"org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator",
"createViewProvider", true, ViewProvider.class, Context.class,
MVCListAdapter.ModelList.class));
Assert.assertTrue(
methodExists("org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator",
"loadUrlForOmniboxMatch", true, void.class, int.class,
AutocompleteMatch.class, GURL.class, long.class, boolean.class));
// Check for method type declaration changes here
Assert.assertTrue(methodExists(
@@ -1015,6 +1023,9 @@ public class BytecodeTest {
Assert.assertTrue(
fieldExists("org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator",
"mDropdownViewInfoListManager"));
Assert.assertTrue(
fieldExists("org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator",
"mContext"));
Assert.assertTrue(fieldExists(
"org/chromium/chrome/browser/ntp/NewTabPageLayout", "mMvTilesContainerLayout"));
Assert.assertTrue(fieldExists(
@@ -1126,6 +1137,9 @@ public class BytecodeTest {
Assert.assertTrue(checkSuperName(
"org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator",
"org/chromium/chrome/browser/omnibox/suggestions/BraveAutocompleteCoordinator"));
Assert.assertTrue(checkSuperName(
"org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator",
"org/chromium/chrome/browser/omnibox/suggestions/BraveAutocompleteMediatorBase"));
Assert.assertTrue(checkSuperName("org/chromium/chrome/browser/omnibox/LocationBarPhone",
"org/chromium/chrome/browser/omnibox/BraveLocationBarLayout"));
Assert.assertTrue(checkSuperName("org/chromium/chrome/browser/omnibox/LocationBarTablet",
@@ -60,6 +60,7 @@
#else
#include "brave/browser/brave_shields/cookie_list_opt_in_service_factory.h"
#include "brave/browser/brave_shields/filter_list_service_factory.h"
#include "brave/browser/misc_metrics/misc_android_metrics_factory.h"
#include "brave/browser/ntp_background/android/ntp_background_images_bridge.h"
#endif
@@ -201,6 +202,10 @@ void EnsureBrowserContextKeyedServiceFactoriesBuilt() {
#if BUILDFLAG(ENABLE_SPEEDREADER)
speedreader::SpeedreaderServiceFactory::GetInstance();
#endif
#if BUILDFLAG(IS_ANDROID)
misc_metrics::MiscAndroidMetricsFactory::GetInstance();
#endif
}
} // namespace brave
+1
View File
@@ -14,6 +14,7 @@ java_binary("java_bytecode_rewriter") {
"//brave/build/android/bytecode/java/org/brave/bytecode/BraveAppMenuClassAdapter.java",
"//brave/build/android/bytecode/java/org/brave/bytecode/BraveApplicationImplBaseClassAdapter.java",
"//brave/build/android/bytecode/java/org/brave/bytecode/BraveAutocompleteCoordinatorClassAdapter.java",
"//brave/build/android/bytecode/java/org/brave/bytecode/BraveAutocompleteMediatorBaseClassAdapter.java",
"//brave/build/android/bytecode/java/org/brave/bytecode/BraveAutocompleteMediatorClassAdapter.java",
"//brave/build/android/bytecode/java/org/brave/bytecode/BraveAutofillPopupBridgeClassAdapter.java",
"//brave/build/android/bytecode/java/org/brave/bytecode/BraveBookmarkActivityClassAdapter.java",
@@ -0,0 +1,25 @@
/* Copyright (c) 2023 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 BraveAutocompleteMediatorBaseClassAdapter extends BraveClassVisitor {
static String sAutocompleteMediator =
"org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator";
static String sBraveAutocompleteMediatorBase =
"org/chromium/chrome/browser/omnibox/suggestions/BraveAutocompleteMediatorBase";
public BraveAutocompleteMediatorBaseClassAdapter(ClassVisitor visitor) {
super(visitor);
changeSuperName(sAutocompleteMediator, sBraveAutocompleteMediatorBase);
makeProtectedField(sAutocompleteMediator, "mContext");
changeMethodOwner(
sAutocompleteMediator, "loadUrlForOmniboxMatch", sBraveAutocompleteMediatorBase);
}
}
@@ -14,6 +14,7 @@ public class BraveClassAdapter {
chain = new BraveAppMenuClassAdapter(chain);
chain = new BraveApplicationImplBaseClassAdapter(chain);
chain = new BraveAutocompleteCoordinatorClassAdapter(chain);
chain = new BraveAutocompleteMediatorBaseClassAdapter(chain);
chain = new BraveAutocompleteMediatorClassAdapter(chain);
chain = new BraveAutofillPopupBridgeClassAdapter(chain);
chain = new BraveBookmarkActivityClassAdapter(chain);
+1 -1
View File
@@ -124,7 +124,7 @@ brave_jni_headers_sources = [
"//brave/android/java/org/chromium/chrome/browser/crypto_wallet/util/WalletDataFilesInstaller.java",
"//brave/android/java/org/chromium/chrome/browser/crypto_wallet/util/WalletNativeUtils.java",
"//brave/android/java/org/chromium/chrome/browser/informers/BraveSyncAccountDeletedInformer.java",
"//brave/android/java/org/chromium/chrome/browser/misc_metrics/PrivacyHubMetricsFactory.java",
"//brave/android/java/org/chromium/chrome/browser/misc_metrics/MiscAndroidMetricsFactory.java",
"//brave/android/java/org/chromium/chrome/browser/notifications/BraveNotificationPlatformBridge.java",
"//brave/android/java/org/chromium/chrome/browser/notifications/BraveNotificationSettingsBridge.java",
"//brave/android/java/org/chromium/chrome/browser/ntp_background_images/NTPBackgroundImagesBridge.java",
@@ -1,13 +0,0 @@
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
index f7bcce140aca2638651b13cfb77c2e9bf71e866a..c8b1773894aa20f27125f76d3806ba1977b002dc 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
@@ -809,7 +809,7 @@ class AutocompleteMediator implements OnSuggestionsReceivedListener,
* @param inputStart The timestamp the input was started.
* @param inVisibleSuggestionList Whether the suggestion is in the visible suggestion list.
*/
- private void loadUrlForOmniboxMatch(int matchIndex, @NonNull AutocompleteMatch suggestion,
+ void loadUrlForOmniboxMatch(int matchIndex, @NonNull AutocompleteMatch suggestion,
@NonNull GURL url, long inputStart, boolean inVisibleSuggestionList) {
try (TraceEvent e = TraceEvent.scoped("AutocompleteMediator.loadUrlFromOmniboxMatch")) {
OmniboxMetrics.recordFocusToOpenTime(System.currentTimeMillis() - mUrlFocusTime);
+1
View File
@@ -1282,6 +1282,7 @@ if (is_android) {
"//third_party/androidx:androidx_test_runner_java",
"//third_party/junit",
"//ui/android:ui_no_recycler_view_java",
"//url:gurl_java",
"//url/mojom:url_mojom_gurl_java",
]
}