Merge pull request #20159 from brave/android-tab-p3a-metrics
Add Android tab usage metrics
This commit is contained in:
@@ -27,6 +27,7 @@ import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.MainThread;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.coordinatorlayout.widget.CoordinatorLayout;
|
||||
import androidx.core.content.ContextCompat;
|
||||
@@ -97,6 +98,7 @@ import org.chromium.chrome.browser.brave_stats.BraveStatsUtil;
|
||||
import org.chromium.chrome.browser.browsing_data.BrowsingDataBridge;
|
||||
import org.chromium.chrome.browser.browsing_data.BrowsingDataType;
|
||||
import org.chromium.chrome.browser.browsing_data.TimePeriod;
|
||||
import org.chromium.chrome.browser.compositor.layouts.LayoutManagerChrome;
|
||||
import org.chromium.chrome.browser.crypto_wallet.AssetRatioServiceFactory;
|
||||
import org.chromium.chrome.browser.crypto_wallet.BlockchainRegistryFactory;
|
||||
import org.chromium.chrome.browser.crypto_wallet.BraveWalletServiceFactory;
|
||||
@@ -676,6 +678,23 @@ public abstract class BraveActivity extends ChromeActivity
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(int itemId, @Nullable Bundle menuItemData) {
|
||||
if (itemId == R.id.new_tab_menu_id) {
|
||||
LayoutManagerChrome layoutManager =
|
||||
(LayoutManagerChrome)
|
||||
BraveReflectionUtil.getField(
|
||||
ChromeTabbedActivity.class, "mLayoutManager", this);
|
||||
if (layoutManager != null
|
||||
&& layoutManager.getOverviewLayout() != null
|
||||
&& !layoutManager.getOverviewLayout().isActive()
|
||||
&& mMiscAndroidMetrics != null) {
|
||||
mMiscAndroidMetrics.recordAppMenuNewTab();
|
||||
}
|
||||
}
|
||||
return super.onOptionsItemSelected(itemId, menuItemData);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onVerifyPurchaseToken(String jsonResponse, boolean isSuccess) {
|
||||
if (isSuccess) {
|
||||
|
||||
+25
-8
@@ -11,25 +11,42 @@ import androidx.annotation.NonNull;
|
||||
|
||||
import org.chromium.base.BraveReflectionUtil;
|
||||
import org.chromium.chrome.browser.app.BraveActivity;
|
||||
import org.chromium.chrome.browser.omnibox.LocationBarDataProvider;
|
||||
import org.chromium.components.omnibox.AutocompleteMatch;
|
||||
import org.chromium.components.omnibox.OmniboxSuggestionType;
|
||||
import org.chromium.misc_metrics.mojom.MiscAndroidMetrics;
|
||||
import org.chromium.url.GURL;
|
||||
|
||||
class BraveAutocompleteMediatorBase {
|
||||
void loadUrlForOmniboxMatch(int matchIndex, @NonNull AutocompleteMatch suggestion,
|
||||
@NonNull GURL url, long inputStart, boolean inVisibleSuggestionList,
|
||||
boolean openInNewTab) {
|
||||
Context context =
|
||||
(Context)
|
||||
BraveReflectionUtil.getField(AutocompleteMediator.class, "mContext", this);
|
||||
LocationBarDataProvider dataProvider =
|
||||
(LocationBarDataProvider)
|
||||
BraveReflectionUtil.getField(
|
||||
AutocompleteMediator.class, "mDataProvider", this);
|
||||
|
||||
if (dataProvider != null
|
||||
&& !dataProvider.isIncognito()
|
||||
&& context != null
|
||||
&& context instanceof BraveActivity) {
|
||||
MiscAndroidMetrics miscAndroidMetrics =
|
||||
((BraveActivity) context).getMiscAndroidMetrics();
|
||||
if (miscAndroidMetrics != null) {
|
||||
boolean isNewTab = dataProvider.getNewTabPageDelegate().isCurrentlyVisible();
|
||||
boolean isSearchQuery =
|
||||
suggestion.getType() == OmniboxSuggestionType.SEARCH_WHAT_YOU_TYPED
|
||||
|| suggestion.getType() == OmniboxSuggestionType.SEARCH_SUGGEST;
|
||||
miscAndroidMetrics.recordLocationBarChange(isNewTab, isSearchQuery);
|
||||
}
|
||||
}
|
||||
|
||||
BraveReflectionUtil.InvokeMethod(AutocompleteMediator.class, this, "loadUrlForOmniboxMatch",
|
||||
int.class, matchIndex, AutocompleteMatch.class, suggestion, GURL.class, url,
|
||||
long.class, inputStart, boolean.class, inVisibleSuggestionList, boolean.class,
|
||||
openInNewTab);
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,6 +71,7 @@ import org.chromium.chrome.features.start_surface.StartSurface;
|
||||
import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
|
||||
import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator;
|
||||
import org.chromium.components.omnibox.action.OmniboxActionDelegate;
|
||||
import org.chromium.misc_metrics.mojom.MiscAndroidMetrics;
|
||||
import org.chromium.ui.base.WindowAndroid;
|
||||
import org.chromium.ui.modaldialog.ModalDialogManager;
|
||||
|
||||
@@ -244,8 +245,18 @@ public class BraveToolbarManager extends ToolbarManager {
|
||||
OnClickListener tabSwitcherClickHandler, OnClickListener newTabClickHandler,
|
||||
OnClickListener bookmarkClickHandler, OnClickListener customTabsBackClickHandler,
|
||||
Supplier<Boolean> showStartSurfaceSupplier) {
|
||||
super.initializeWithNative(layoutManager, tabSwitcherClickHandler, newTabClickHandler,
|
||||
bookmarkClickHandler, customTabsBackClickHandler, showStartSurfaceSupplier);
|
||||
OnClickListener wrappedNewTabClickHandler =
|
||||
v -> {
|
||||
recordNewTabClick();
|
||||
newTabClickHandler.onClick(v);
|
||||
};
|
||||
super.initializeWithNative(
|
||||
layoutManager,
|
||||
tabSwitcherClickHandler,
|
||||
wrappedNewTabClickHandler,
|
||||
bookmarkClickHandler,
|
||||
customTabsBackClickHandler,
|
||||
showStartSurfaceSupplier);
|
||||
|
||||
if (isToolbarPhone() && BottomToolbarConfiguration.isBottomToolbarEnabled()) {
|
||||
enableBottomControls();
|
||||
@@ -256,10 +267,16 @@ public class BraveToolbarManager extends ToolbarManager {
|
||||
assert (mBottomControlsCoordinatorSupplier.get()
|
||||
instanceof BraveBottomControlsCoordinator);
|
||||
((BraveBottomControlsCoordinator) mBottomControlsCoordinatorSupplier.get())
|
||||
.initializeWithNative(mActivity, mCompositorViewHolder.getResourceManager(),
|
||||
mCompositorViewHolder.getLayoutManager(), tabSwitcherClickHandler,
|
||||
newTabClickHandler, mWindowAndroid, mTabCountProvider,
|
||||
mIncognitoStateProvider, mActivity.findViewById(R.id.control_container),
|
||||
.initializeWithNative(
|
||||
mActivity,
|
||||
mCompositorViewHolder.getResourceManager(),
|
||||
mCompositorViewHolder.getLayoutManager(),
|
||||
tabSwitcherClickHandler,
|
||||
wrappedNewTabClickHandler,
|
||||
mWindowAndroid,
|
||||
mTabCountProvider,
|
||||
mIncognitoStateProvider,
|
||||
mActivity.findViewById(R.id.control_container),
|
||||
closeAllTabsAction);
|
||||
mLocationBar.getContainerView().setAccessibilityTraversalBefore(R.id.bottom_toolbar);
|
||||
}
|
||||
@@ -285,6 +302,18 @@ public class BraveToolbarManager extends ToolbarManager {
|
||||
}
|
||||
}
|
||||
|
||||
private void recordNewTabClick() {
|
||||
if (!mIncognitoStateProvider.isIncognitoSelected()) {
|
||||
if (mActivity instanceof BraveActivity) {
|
||||
MiscAndroidMetrics miscAndroidMetrics =
|
||||
((BraveActivity) mActivity).getMiscAndroidMetrics();
|
||||
if (miscAndroidMetrics != null) {
|
||||
miscAndroidMetrics.recordTabSwitcherNewTab();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void onOrientationChange(int newOrientation) {
|
||||
if (mActionModeController != null) mActionModeController.showControlsOnOrientationChange();
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
# Add methods for invocation below
|
||||
-keep class org.chromium.chrome.browser.ChromeTabbedActivity {
|
||||
*** mLayoutManager;
|
||||
*** hideOverview(...);
|
||||
*** maybeHandleUrlIntent(...);
|
||||
}
|
||||
@@ -16,6 +17,7 @@
|
||||
|
||||
-keep class org.chromium.chrome.browser.omnibox.suggestions.AutocompleteMediator {
|
||||
*** mContext;
|
||||
*** mDataProvider;
|
||||
*** loadUrlForOmniboxMatch(...);
|
||||
}
|
||||
|
||||
|
||||
@@ -958,6 +958,8 @@ public class BytecodeTest {
|
||||
"org/chromium/chrome/browser/feed/FeedSurfaceMediator", "mSnapScrollHelper"));
|
||||
Assert.assertTrue(fieldExists(
|
||||
"org/chromium/chrome/browser/ntp/NewTabPage", "mBrowserControlsStateProvider"));
|
||||
Assert.assertTrue(
|
||||
fieldExists("org/chromium/chrome/browser/ChromeTabbedActivity", "mLayoutManager"));
|
||||
Assert.assertTrue(
|
||||
fieldExists("org/chromium/chrome/browser/ntp/NewTabPage", "mNewTabPageLayout"));
|
||||
Assert.assertTrue(
|
||||
@@ -1119,6 +1121,10 @@ public class BytecodeTest {
|
||||
fieldExists(
|
||||
"org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator",
|
||||
"mDropdownViewInfoListBuilder"));
|
||||
Assert.assertTrue(
|
||||
fieldExists(
|
||||
"org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator",
|
||||
"mDataProvider"));
|
||||
Assert.assertTrue(
|
||||
fieldExists("org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator",
|
||||
"mContext"));
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "brave/browser/misc_metrics/uptime_monitor.h"
|
||||
#include "brave/browser/search_engines/search_engine_tracker.h"
|
||||
#include "brave/components/misc_metrics/privacy_hub_metrics.h"
|
||||
#include "brave/components/misc_metrics/tab_metrics.h"
|
||||
|
||||
namespace misc_metrics {
|
||||
|
||||
@@ -34,8 +35,20 @@ void MiscAndroidMetrics::RecordPrivacyHubEnabledStatus(bool is_enabled) {
|
||||
misc_metrics_->privacy_hub_metrics()->RecordEnabledStatus(is_enabled);
|
||||
}
|
||||
|
||||
void MiscAndroidMetrics::RecordLocationBarQuery() {
|
||||
search_engine_tracker_->RecordLocationBarQuery();
|
||||
void MiscAndroidMetrics::RecordLocationBarChange(bool is_new_tab,
|
||||
bool is_search_query) {
|
||||
if (is_search_query) {
|
||||
search_engine_tracker_->RecordLocationBarQuery();
|
||||
}
|
||||
misc_metrics_->tab_metrics()->RecordLocationBarChange(is_new_tab);
|
||||
}
|
||||
|
||||
void MiscAndroidMetrics::RecordAppMenuNewTab() {
|
||||
misc_metrics_->tab_metrics()->RecordAppMenuNewTab();
|
||||
}
|
||||
|
||||
void MiscAndroidMetrics::RecordTabSwitcherNewTab() {
|
||||
misc_metrics_->tab_metrics()->RecordTabSwitcherNewTab();
|
||||
}
|
||||
|
||||
void MiscAndroidMetrics::RecordBrowserUsageDuration(base::TimeDelta duration) {
|
||||
|
||||
@@ -33,8 +33,10 @@ class MiscAndroidMetrics : public KeyedService,
|
||||
// mojom::MiscAndroidMetrics:
|
||||
void RecordPrivacyHubView() override;
|
||||
void RecordPrivacyHubEnabledStatus(bool is_enabled) override;
|
||||
void RecordLocationBarQuery() override;
|
||||
void RecordBrowserUsageDuration(base::TimeDelta duration) override;
|
||||
void RecordLocationBarChange(bool is_new_tab, bool is_search_query) override;
|
||||
void RecordAppMenuNewTab() override;
|
||||
void RecordTabSwitcherNewTab() override;
|
||||
|
||||
private:
|
||||
raw_ptr<ProcessMiscMetrics> misc_metrics_;
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include "brave/components/misc_metrics/menu_metrics.h"
|
||||
#else
|
||||
#include "brave/components/misc_metrics/privacy_hub_metrics.h"
|
||||
#include "brave/components/misc_metrics/tab_metrics.h"
|
||||
#endif
|
||||
#if BUILDFLAG(ENABLE_AI_CHAT)
|
||||
#include "brave/components/ai_chat/core/browser/ai_chat_metrics.h"
|
||||
@@ -29,6 +30,7 @@ ProcessMiscMetrics::ProcessMiscMetrics(PrefService* local_state) {
|
||||
#else
|
||||
privacy_hub_metrics_ =
|
||||
std::make_unique<misc_metrics::PrivacyHubMetrics>(local_state);
|
||||
tab_metrics_ = std::make_unique<misc_metrics::TabMetrics>(local_state);
|
||||
#endif
|
||||
#if BUILDFLAG(ENABLE_AI_CHAT)
|
||||
ai_chat_metrics_ = std::make_unique<ai_chat::AIChatMetrics>(local_state);
|
||||
@@ -55,6 +57,10 @@ PrivacyHubMetrics* ProcessMiscMetrics::privacy_hub_metrics() {
|
||||
UptimeMonitor* ProcessMiscMetrics::uptime_monitor() {
|
||||
return uptime_monitor_.get();
|
||||
}
|
||||
|
||||
TabMetrics* ProcessMiscMetrics::tab_metrics() {
|
||||
return tab_metrics_.get();
|
||||
}
|
||||
#endif
|
||||
|
||||
#if BUILDFLAG(ENABLE_AI_CHAT)
|
||||
@@ -69,6 +75,7 @@ void ProcessMiscMetrics::RegisterPrefs(PrefRegistrySimple* registry) {
|
||||
VerticalTabMetrics::RegisterPrefs(registry);
|
||||
#else
|
||||
PrivacyHubMetrics::RegisterPrefs(registry);
|
||||
TabMetrics::RegisterPrefs(registry);
|
||||
#endif
|
||||
#if BUILDFLAG(ENABLE_AI_CHAT)
|
||||
ai_chat::AIChatMetrics::RegisterPrefs(registry);
|
||||
|
||||
@@ -27,6 +27,7 @@ class MenuMetrics;
|
||||
class VerticalTabMetrics;
|
||||
#else
|
||||
class PrivacyHubMetrics;
|
||||
class TabMetrics;
|
||||
#endif
|
||||
class DohMetrics;
|
||||
class UptimeMonitor;
|
||||
@@ -46,8 +47,9 @@ class ProcessMiscMetrics {
|
||||
VerticalTabMetrics* vertical_tab_metrics();
|
||||
#else
|
||||
PrivacyHubMetrics* privacy_hub_metrics();
|
||||
#endif
|
||||
TabMetrics* tab_metrics();
|
||||
UptimeMonitor* uptime_monitor();
|
||||
#endif
|
||||
#if BUILDFLAG(ENABLE_AI_CHAT)
|
||||
ai_chat::AIChatMetrics* ai_chat_metrics();
|
||||
#endif
|
||||
@@ -58,6 +60,7 @@ class ProcessMiscMetrics {
|
||||
std::unique_ptr<VerticalTabMetrics> vertical_tab_metrics_;
|
||||
#else
|
||||
std::unique_ptr<PrivacyHubMetrics> privacy_hub_metrics_;
|
||||
std::unique_ptr<TabMetrics> tab_metrics_;
|
||||
#endif
|
||||
#if BUILDFLAG(ENABLE_AI_CHAT)
|
||||
std::unique_ptr<ai_chat::AIChatMetrics> ai_chat_metrics_;
|
||||
|
||||
+1
@@ -19,6 +19,7 @@ public class BraveAutocompleteMediatorBaseClassAdapter extends BraveClassVisitor
|
||||
changeSuperName(sAutocompleteMediator, sBraveAutocompleteMediatorBase);
|
||||
|
||||
makeProtectedField(sAutocompleteMediator, "mContext");
|
||||
makeProtectedField(sAutocompleteMediator, "mDataProvider");
|
||||
changeMethodOwner(
|
||||
sAutocompleteMediator, "loadUrlForOmniboxMatch", sBraveAutocompleteMediatorBase);
|
||||
}
|
||||
|
||||
@@ -54,5 +54,6 @@ public class BraveTabbedActivityClassAdapter extends BraveClassVisitor {
|
||||
makePublicMethod(sChromeTabbedActivityClassName, "maybeHandleUrlIntent");
|
||||
changeMethodOwner(
|
||||
sChromeTabbedActivityClassName, "maybeHandleUrlIntent", sBraveActivityClassName);
|
||||
makeProtectedField(sChromeTabbedActivityClassName, "mLayoutManager");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,8 @@ static_library("misc_metrics") {
|
||||
"pref_names.h",
|
||||
"privacy_hub_metrics.cc",
|
||||
"privacy_hub_metrics.h",
|
||||
"tab_metrics.cc",
|
||||
"tab_metrics.h",
|
||||
]
|
||||
|
||||
deps = [
|
||||
@@ -37,6 +39,7 @@ source_set("unit_tests") {
|
||||
"general_browser_usage_unittest.cc",
|
||||
"menu_metrics_unittest.cc",
|
||||
"privacy_hub_metrics_unittest.cc",
|
||||
"tab_metrics_unittest.cc",
|
||||
]
|
||||
|
||||
deps = [
|
||||
|
||||
@@ -15,9 +15,17 @@ interface MiscAndroidMetrics {
|
||||
// Records enabled status of Privacy Hub report.
|
||||
RecordPrivacyHubEnabledStatus(bool isEnabled);
|
||||
|
||||
// Records a location bar search query event, for measuring "queries before churn".
|
||||
RecordLocationBarQuery();
|
||||
|
||||
// Records browser usage duration, for measuring usage time per day.
|
||||
RecordBrowserUsageDuration(mojo_base.mojom.TimeDelta duration);
|
||||
|
||||
// Records a location bar change (search query or direct URL entry), and
|
||||
// whether the change was made on a new tab.
|
||||
RecordLocationBarChange(bool isNewTab, bool isSearchQuery);
|
||||
|
||||
// Records the creation of a new tab via the tab app menu.
|
||||
RecordAppMenuNewTab();
|
||||
|
||||
// Records the creation of a new tab via the bottom toolbar button
|
||||
// in the tab switcher.
|
||||
RecordTabSwitcherNewTab();
|
||||
};
|
||||
|
||||
@@ -27,6 +27,7 @@ const char kMiscMetricsSearchSwitchedAwayFromBrave[] =
|
||||
"brave.misc_metrics.search_switched_from_brave";
|
||||
const char kMiscMetricsSearchBraveQueryCount[] =
|
||||
"brave.misc_metrics.search_brave_query_count";
|
||||
|
||||
const char kMiscMetricsTotalDnsRequestStorage[] =
|
||||
"brave.misc_metrics.total_dns_requests";
|
||||
const char kMiscMetricsUpgradedDnsRequestStorage[] =
|
||||
@@ -37,4 +38,12 @@ const char kDailyUptimeSumPrefName[] = "brave.misc_metrics.uptime_sum";
|
||||
const char kDailyUptimeFrameStartTimePrefName[] =
|
||||
"brave.misc_metrics.uptime_frame_start_time";
|
||||
|
||||
const char kMiscMetricsTabSwitcherNewTabsStorage[] =
|
||||
"brave.misc_metrics.tab_switcher_new_tabs_storage";
|
||||
const char kMiscMetricsTotalNewTabsStorage[] =
|
||||
"brave.misc_metrics.total_new_tabs_storage";
|
||||
const char kMiscMetricsNewTabLocationBarEntriesStorage[] =
|
||||
"brave.misc_metrics.new_tab_location_bar_entries_storage";
|
||||
const char kMiscMetricsTotalLocationBarEntriesStorage[] =
|
||||
"brave.misc_metrics.total_location_bar_entries_storage";
|
||||
} // namespace misc_metrics
|
||||
|
||||
@@ -22,6 +22,7 @@ extern const char kMiscMetricsPinnedTabsStorage[];
|
||||
|
||||
extern const char kMiscMetricsSearchSwitchedAwayFromBrave[];
|
||||
extern const char kMiscMetricsSearchBraveQueryCount[];
|
||||
|
||||
extern const char kMiscMetricsTotalDnsRequestStorage[];
|
||||
extern const char kMiscMetricsUpgradedDnsRequestStorage[];
|
||||
|
||||
@@ -29,6 +30,10 @@ extern const char kDailyUptimesListPrefName[]; // DEPRECATED
|
||||
extern const char kDailyUptimeSumPrefName[];
|
||||
extern const char kDailyUptimeFrameStartTimePrefName[];
|
||||
|
||||
extern const char kMiscMetricsTabSwitcherNewTabsStorage[];
|
||||
extern const char kMiscMetricsTotalNewTabsStorage[];
|
||||
extern const char kMiscMetricsNewTabLocationBarEntriesStorage[];
|
||||
extern const char kMiscMetricsTotalLocationBarEntriesStorage[];
|
||||
} // namespace misc_metrics
|
||||
|
||||
#endif // BRAVE_COMPONENTS_MISC_METRICS_PREF_NAMES_H_
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
/* 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/. */
|
||||
|
||||
#include "brave/components/misc_metrics/tab_metrics.h"
|
||||
|
||||
#include "base/metrics/histogram_macros.h"
|
||||
#include "brave/components/misc_metrics/pref_names.h"
|
||||
#include "brave/components/p3a_utils/bucket.h"
|
||||
#include "components/prefs/pref_registry_simple.h"
|
||||
#include "components/prefs/pref_service.h"
|
||||
|
||||
namespace misc_metrics {
|
||||
|
||||
namespace {
|
||||
const int kPercentBucketValues[] = {25, 50, 75};
|
||||
} // namespace
|
||||
|
||||
const char kLocationNewEntriesHistogramName[] = "Brave.Core.LocationNewEntries";
|
||||
const char kNewTabMethodsHistogramName[] = "Brave.Core.NewTabMethods";
|
||||
const base::TimeDelta kReportUpdateInterval = base::Days(1);
|
||||
|
||||
TabMetrics::TabMetrics(PrefService* local_state)
|
||||
: tab_switcher_new_tabs_storage_(local_state,
|
||||
kMiscMetricsTabSwitcherNewTabsStorage),
|
||||
total_new_tabs_storage_(local_state, kMiscMetricsTotalNewTabsStorage),
|
||||
new_tab_location_bar_entries_storage_(
|
||||
local_state,
|
||||
kMiscMetricsNewTabLocationBarEntriesStorage),
|
||||
total_location_bar_entries_storage_(
|
||||
local_state,
|
||||
kMiscMetricsTotalLocationBarEntriesStorage) {
|
||||
UpdateMetrics();
|
||||
}
|
||||
|
||||
TabMetrics::~TabMetrics() = default;
|
||||
|
||||
void TabMetrics::RegisterPrefs(PrefRegistrySimple* registry) {
|
||||
registry->RegisterListPref(kMiscMetricsTabSwitcherNewTabsStorage);
|
||||
registry->RegisterListPref(kMiscMetricsTotalNewTabsStorage);
|
||||
registry->RegisterListPref(kMiscMetricsNewTabLocationBarEntriesStorage);
|
||||
registry->RegisterListPref(kMiscMetricsTotalLocationBarEntriesStorage);
|
||||
}
|
||||
|
||||
void TabMetrics::RecordLocationBarChange(bool is_new_tab) {
|
||||
if (is_new_tab) {
|
||||
new_tab_location_bar_entries_storage_.AddDelta(1u);
|
||||
}
|
||||
total_location_bar_entries_storage_.AddDelta(1u);
|
||||
RecordLocationEntries();
|
||||
}
|
||||
|
||||
void TabMetrics::RecordAppMenuNewTab() {
|
||||
total_new_tabs_storage_.AddDelta(1);
|
||||
RecordNewTabMethods();
|
||||
}
|
||||
|
||||
void TabMetrics::RecordTabSwitcherNewTab() {
|
||||
tab_switcher_new_tabs_storage_.AddDelta(1);
|
||||
total_new_tabs_storage_.AddDelta(1);
|
||||
RecordNewTabMethods();
|
||||
}
|
||||
|
||||
void TabMetrics::RecordLocationEntries() {
|
||||
auto total = total_location_bar_entries_storage_.GetWeeklySum();
|
||||
if (total == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
int percent = static_cast<int>(
|
||||
static_cast<double>(
|
||||
new_tab_location_bar_entries_storage_.GetWeeklySum()) /
|
||||
total * 100);
|
||||
p3a_utils::RecordToHistogramBucket(kLocationNewEntriesHistogramName,
|
||||
kPercentBucketValues, percent);
|
||||
}
|
||||
|
||||
void TabMetrics::RecordNewTabMethods() {
|
||||
auto total = total_new_tabs_storage_.GetWeeklySum();
|
||||
if (total == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
int percent = static_cast<int>(
|
||||
static_cast<double>(tab_switcher_new_tabs_storage_.GetWeeklySum()) /
|
||||
total * 100);
|
||||
p3a_utils::RecordToHistogramBucket(kNewTabMethodsHistogramName,
|
||||
kPercentBucketValues, percent);
|
||||
}
|
||||
|
||||
void TabMetrics::UpdateMetrics() {
|
||||
RecordLocationEntries();
|
||||
RecordNewTabMethods();
|
||||
|
||||
SetUpTimer();
|
||||
}
|
||||
|
||||
void TabMetrics::SetUpTimer() {
|
||||
report_timer_.Start(
|
||||
FROM_HERE, base::Time::Now() + kReportUpdateInterval,
|
||||
base::BindOnce(&TabMetrics::UpdateMetrics, base::Unretained(this)));
|
||||
}
|
||||
|
||||
} // namespace misc_metrics
|
||||
@@ -0,0 +1,53 @@
|
||||
/* 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/. */
|
||||
|
||||
#ifndef BRAVE_COMPONENTS_MISC_METRICS_TAB_METRICS_H_
|
||||
#define BRAVE_COMPONENTS_MISC_METRICS_TAB_METRICS_H_
|
||||
|
||||
#include "base/timer/wall_clock_timer.h"
|
||||
|
||||
#include "brave/components/time_period_storage/weekly_storage.h"
|
||||
|
||||
class PrefRegistrySimple;
|
||||
class PrefService;
|
||||
|
||||
namespace misc_metrics {
|
||||
|
||||
extern const char kLocationNewEntriesHistogramName[];
|
||||
extern const char kNewTabMethodsHistogramName[];
|
||||
|
||||
class TabMetrics {
|
||||
public:
|
||||
explicit TabMetrics(PrefService* local_state);
|
||||
~TabMetrics();
|
||||
|
||||
TabMetrics(const TabMetrics&) = delete;
|
||||
TabMetrics& operator=(const TabMetrics&) = delete;
|
||||
|
||||
static void RegisterPrefs(PrefRegistrySimple* registry);
|
||||
|
||||
void RecordLocationBarChange(bool is_new_tab);
|
||||
void RecordAppMenuNewTab();
|
||||
void RecordTabSwitcherNewTab();
|
||||
|
||||
private:
|
||||
void RecordLocationEntries();
|
||||
void RecordNewTabMethods();
|
||||
|
||||
void UpdateMetrics();
|
||||
void SetUpTimer();
|
||||
|
||||
WeeklyStorage tab_switcher_new_tabs_storage_;
|
||||
WeeklyStorage total_new_tabs_storage_;
|
||||
|
||||
WeeklyStorage new_tab_location_bar_entries_storage_;
|
||||
WeeklyStorage total_location_bar_entries_storage_;
|
||||
|
||||
base::WallClockTimer report_timer_;
|
||||
};
|
||||
|
||||
} // namespace misc_metrics
|
||||
|
||||
#endif // BRAVE_COMPONENTS_MISC_METRICS_TAB_METRICS_H_
|
||||
@@ -0,0 +1,113 @@
|
||||
/* 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/. */
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "base/test/metrics/histogram_tester.h"
|
||||
#include "brave/components/misc_metrics/tab_metrics.h"
|
||||
#include "components/prefs/testing_pref_service.h"
|
||||
#include "content/public/test/browser_task_environment.h"
|
||||
#include "testing/gtest/include/gtest/gtest.h"
|
||||
|
||||
namespace misc_metrics {
|
||||
|
||||
class TabMetricsUnitTest : public testing::Test {
|
||||
public:
|
||||
TabMetricsUnitTest()
|
||||
: task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
|
||||
|
||||
void SetUp() override {
|
||||
misc_metrics::TabMetrics::RegisterPrefs(local_state_.registry());
|
||||
tab_metrics_ = std::make_unique<TabMetrics>(&local_state_);
|
||||
}
|
||||
|
||||
protected:
|
||||
content::BrowserTaskEnvironment task_environment_;
|
||||
TestingPrefServiceSimple local_state_;
|
||||
base::HistogramTester histogram_tester_;
|
||||
std::unique_ptr<TabMetrics> tab_metrics_;
|
||||
};
|
||||
|
||||
TEST_F(TabMetricsUnitTest, NewTabMethods) {
|
||||
histogram_tester_.ExpectTotalCount(kNewTabMethodsHistogramName, 0);
|
||||
|
||||
for (size_t i = 0; i < 6; i++) {
|
||||
tab_metrics_->RecordAppMenuNewTab();
|
||||
}
|
||||
|
||||
histogram_tester_.ExpectBucketCount(kNewTabMethodsHistogramName, 0, 6);
|
||||
|
||||
for (size_t i = 0; i < 2; i++) {
|
||||
tab_metrics_->RecordTabSwitcherNewTab();
|
||||
}
|
||||
|
||||
histogram_tester_.ExpectBucketCount(kNewTabMethodsHistogramName, 0, 8);
|
||||
|
||||
tab_metrics_->RecordTabSwitcherNewTab();
|
||||
|
||||
histogram_tester_.ExpectBucketCount(kNewTabMethodsHistogramName, 1, 1);
|
||||
|
||||
for (size_t i = 0; i < 4; i++) {
|
||||
tab_metrics_->RecordTabSwitcherNewTab();
|
||||
}
|
||||
|
||||
histogram_tester_.ExpectBucketCount(kNewTabMethodsHistogramName, 2, 1);
|
||||
|
||||
for (size_t i = 0; i < 12; i++) {
|
||||
tab_metrics_->RecordTabSwitcherNewTab();
|
||||
}
|
||||
|
||||
histogram_tester_.ExpectBucketCount(kNewTabMethodsHistogramName, 3, 1);
|
||||
|
||||
task_environment_.FastForwardBy(base::Days(7));
|
||||
|
||||
histogram_tester_.ExpectBucketCount(kNewTabMethodsHistogramName, 3, 7);
|
||||
|
||||
task_environment_.FastForwardBy(base::Days(3));
|
||||
|
||||
histogram_tester_.ExpectBucketCount(kNewTabMethodsHistogramName, 3, 7);
|
||||
}
|
||||
|
||||
TEST_F(TabMetricsUnitTest, LocationNewEntries) {
|
||||
histogram_tester_.ExpectTotalCount(kLocationNewEntriesHistogramName, 0);
|
||||
|
||||
for (size_t i = 0; i < 6; i++) {
|
||||
tab_metrics_->RecordLocationBarChange(false);
|
||||
}
|
||||
|
||||
histogram_tester_.ExpectBucketCount(kLocationNewEntriesHistogramName, 0, 6);
|
||||
|
||||
for (size_t i = 0; i < 2; i++) {
|
||||
tab_metrics_->RecordLocationBarChange(true);
|
||||
}
|
||||
|
||||
histogram_tester_.ExpectBucketCount(kLocationNewEntriesHistogramName, 0, 8);
|
||||
|
||||
tab_metrics_->RecordLocationBarChange(true);
|
||||
|
||||
histogram_tester_.ExpectBucketCount(kLocationNewEntriesHistogramName, 1, 1);
|
||||
|
||||
for (size_t i = 0; i < 4; i++) {
|
||||
tab_metrics_->RecordLocationBarChange(true);
|
||||
}
|
||||
|
||||
histogram_tester_.ExpectBucketCount(kLocationNewEntriesHistogramName, 2, 1);
|
||||
|
||||
for (size_t i = 0; i < 12; i++) {
|
||||
tab_metrics_->RecordLocationBarChange(true);
|
||||
}
|
||||
|
||||
histogram_tester_.ExpectBucketCount(kLocationNewEntriesHistogramName, 3, 1);
|
||||
|
||||
task_environment_.FastForwardBy(base::Days(7));
|
||||
|
||||
histogram_tester_.ExpectBucketCount(kLocationNewEntriesHistogramName, 3, 7);
|
||||
|
||||
task_environment_.FastForwardBy(base::Days(3));
|
||||
|
||||
histogram_tester_.ExpectBucketCount(kLocationNewEntriesHistogramName, 3, 7);
|
||||
}
|
||||
|
||||
} // namespace misc_metrics
|
||||
@@ -36,6 +36,8 @@ constexpr inline auto kCollectedTypicalHistograms =
|
||||
"Brave.Core.DomainsLoaded",
|
||||
"Brave.Core.IsDefault",
|
||||
"Brave.Core.LastTimeIncognitoUsed",
|
||||
"Brave.Core.LocationNewEntries",
|
||||
"Brave.Core.NewTabMethods",
|
||||
"Brave.Core.NumberOfExtensions",
|
||||
"Brave.Core.PagesLoaded",
|
||||
"Brave.Core.TabCount",
|
||||
|
||||
Reference in New Issue
Block a user