diff --git a/android/brave_java_sources.gni b/android/brave_java_sources.gni index a556f2c0125..e88f8d33b39 100644 --- a/android/brave_java_sources.gni +++ b/android/brave_java_sources.gni @@ -238,6 +238,7 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/local_database/DisplayAdsTable.java", "../../brave/android/java/org/chromium/chrome/browser/local_database/SavedBandwidthTable.java", "../../brave/android/java/org/chromium/chrome/browser/local_database/TopSiteTable.java", + "../../brave/android/java/org/chromium/chrome/browser/misc_metrics/PrivacyHubMetricsConnectionErrorHandler.java", "../../brave/android/java/org/chromium/chrome/browser/misc_metrics/PrivacyHubMetricsFactory.java", "../../brave/android/java/org/chromium/chrome/browser/night_mode/settings/BraveRadioButtonGroupThemePreference.java", "../../brave/android/java/org/chromium/chrome/browser/night_mode/settings/BraveThemePreferences.java", diff --git a/android/java/org/chromium/chrome/browser/app/BraveActivity.java b/android/java/org/chromium/chrome/browser/app/BraveActivity.java index 603062f69cb..6932fd062da 100644 --- a/android/java/org/chromium/chrome/browser/app/BraveActivity.java +++ b/android/java/org/chromium/chrome/browser/app/BraveActivity.java @@ -110,6 +110,7 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.fullscreen.BrowserControlsManager; import org.chromium.chrome.browser.informers.BraveAndroidSyncDisabledInformer; import org.chromium.chrome.browser.informers.BraveSyncAccountDeletedInformer; +import org.chromium.chrome.browser.misc_metrics.PrivacyHubMetricsConnectionErrorHandler; import org.chromium.chrome.browser.misc_metrics.PrivacyHubMetricsFactory; import org.chromium.chrome.browser.notifications.BraveNotificationWarningDialog; import org.chromium.chrome.browser.notifications.BravePermissionUtils; @@ -204,7 +205,9 @@ public abstract class BraveActivity extends ChromeActivity implements BrowsingDataBridge.OnClearBrowsingDataListener, BraveVpnObserver, OnBraveSetDefaultBrowserListener, ConnectionErrorHandler, PrefObserver, BraveSafeBrowsingApiHandler.BraveSafeBrowsingApiHandlerDelegate, - BraveNewsConnectionErrorHandler.BraveNewsConnectionErrorHandlerDelegate { + BraveNewsConnectionErrorHandler.BraveNewsConnectionErrorHandlerDelegate, + PrivacyHubMetricsConnectionErrorHandler + .PrivacyHubMetricsConnectionErrorHandlerDelegate { public static final String BRAVE_SEND_URL = "brave://wallet/send"; public static final String BRAVE_SWAP_URL = "brave://wallet/swap"; public static final String BRAVE_REWARDS_SETTINGS_URL = "brave://rewards/"; @@ -269,6 +272,7 @@ public abstract class BraveActivity extends ChromeActivity private NotificationPermissionController mNotificationPermissionController; private BraveNewsController mBraveNewsController; private BraveNewsConnectionErrorHandler mBraveNewsConnectionErrorHandler; + private PrivacyHubMetricsConnectionErrorHandler mPrivacyHubMetricsConnectionErrorHandler; /** * Serves as a general exception for failed attempts to get BraveActivity. @@ -427,6 +431,7 @@ public abstract class BraveActivity extends ChromeActivity super.onDestroyInternal(); cleanUpBraveNewsController(); cleanUpWalletNativeServices(); + cleanUpPrivacyHubMetrics(); } public WalletModel getWalletModel() { @@ -1990,12 +1995,19 @@ public abstract class BraveActivity extends ChromeActivity mAssetRatioService = AssetRatioServiceFactory.getInstance().getAssetRatioService(this); } - private void initPrivacyHubMetrics() { + @Override + public void initPrivacyHubMetrics() { if (mPrivacyHubMetrics != null) { return; } + if (mPrivacyHubMetricsConnectionErrorHandler == null) { + mPrivacyHubMetricsConnectionErrorHandler = + PrivacyHubMetricsConnectionErrorHandler.getInstance(); + mPrivacyHubMetricsConnectionErrorHandler.setDelegate(this); + } - mPrivacyHubMetrics = PrivacyHubMetricsFactory.getInstance().getMetricsService(this); + mPrivacyHubMetrics = PrivacyHubMetricsFactory.getInstance().getMetricsService( + mPrivacyHubMetricsConnectionErrorHandler); mPrivacyHubMetrics.recordEnabledStatus( OnboardingPrefManager.getInstance().isBraveStatsEnabled()); } @@ -2030,7 +2042,6 @@ public abstract class BraveActivity extends ChromeActivity if (mTxService != null) mTxService.close(); if (mEthTxManagerProxy != null) mEthTxManagerProxy.close(); if (mSolanaTxManagerProxy != null) mSolanaTxManagerProxy.close(); - if (mPrivacyHubMetrics != null) mPrivacyHubMetrics.close(); if (mBraveWalletService != null) mBraveWalletService.close(); mKeyringService = null; mBlockchainRegistry = null; @@ -2039,10 +2050,15 @@ public abstract class BraveActivity extends ChromeActivity mEthTxManagerProxy = null; mSolanaTxManagerProxy = null; mAssetRatioService = null; - mPrivacyHubMetrics = null; mBraveWalletService = null; } + @Override + public void cleanUpPrivacyHubMetrics() { + if (mPrivacyHubMetrics != null) mPrivacyHubMetrics.close(); + mPrivacyHubMetrics = null; + } + @NonNull private BraveToolbarLayoutImpl getBraveToolbarLayout() { BraveToolbarLayoutImpl layout = findViewById(R.id.toolbar); diff --git a/android/java/org/chromium/chrome/browser/brave_news/BraveNewsConnectionErrorHandler.java b/android/java/org/chromium/chrome/browser/brave_news/BraveNewsConnectionErrorHandler.java index 91ee94a69fb..7dbb4a6a063 100644 --- a/android/java/org/chromium/chrome/browser/brave_news/BraveNewsConnectionErrorHandler.java +++ b/android/java/org/chromium/chrome/browser/brave_news/BraveNewsConnectionErrorHandler.java @@ -13,7 +13,7 @@ import org.chromium.mojo.system.MojoException; */ public class BraveNewsConnectionErrorHandler implements ConnectionErrorHandler { /** - *This is a delegate that is implement in the object where the connection is created + *This is a delegate that is implemented in the object where the connection is created */ public interface BraveNewsConnectionErrorHandlerDelegate { default void initBraveNewsController() {} diff --git a/android/java/org/chromium/chrome/browser/misc_metrics/PrivacyHubMetricsConnectionErrorHandler.java b/android/java/org/chromium/chrome/browser/misc_metrics/PrivacyHubMetricsConnectionErrorHandler.java new file mode 100644 index 00000000000..8e0ff02c745 --- /dev/null +++ b/android/java/org/chromium/chrome/browser/misc_metrics/PrivacyHubMetricsConnectionErrorHandler.java @@ -0,0 +1,54 @@ +/* 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.misc_metrics; + +import org.chromium.mojo.bindings.ConnectionErrorHandler; +import org.chromium.mojo.system.MojoException; + +/** + * This is a handler for mojo connection failure for Privacy Hub Metrics + */ +public class PrivacyHubMetricsConnectionErrorHandler implements ConnectionErrorHandler { + /** + *This is a delegate that is implemented in the object where the connection is created + */ + public interface PrivacyHubMetricsConnectionErrorHandlerDelegate { + default void initPrivacyHubMetrics() {} + default void cleanUpPrivacyHubMetrics() {} + } + + private PrivacyHubMetricsConnectionErrorHandlerDelegate + mPrivacyHubMetricsConnectionErrorHandlerDelegate; + private static final Object sLock = new Object(); + private static PrivacyHubMetricsConnectionErrorHandler sInstance; + + public static PrivacyHubMetricsConnectionErrorHandler getInstance() { + synchronized (sLock) { + if (sInstance == null) { + sInstance = new PrivacyHubMetricsConnectionErrorHandler(); + } + } + return sInstance; + } + + public void setDelegate(PrivacyHubMetricsConnectionErrorHandlerDelegate + privacyHubMetricsConnectionErrorHandlerDelegate) { + mPrivacyHubMetricsConnectionErrorHandlerDelegate = + privacyHubMetricsConnectionErrorHandlerDelegate; + assert mPrivacyHubMetricsConnectionErrorHandlerDelegate + != null : "mPrivacyHubMetricsConnectionErrorHandlerDelegate has to be initialized"; + } + + @Override + public void onConnectionError(MojoException e) { + if (mPrivacyHubMetricsConnectionErrorHandlerDelegate == null) { + return; + } + + mPrivacyHubMetricsConnectionErrorHandlerDelegate.cleanUpPrivacyHubMetrics(); + mPrivacyHubMetricsConnectionErrorHandlerDelegate.initPrivacyHubMetrics(); + } +}