Skip to content

Commit

Permalink
[M116][Homepage] Record histograms for first-launch
Browse files Browse the repository at this point in the history
Records histograms after all the initial Tab and partner
customization is complete, including the case where the
homepage is not cached (likely chrome-first-launch
case).

BUG=1433079, 1455160

(cherry picked from commit a3b2275)

Change-Id: I0b49010019ea06497d98ba182815f04fe6134356
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4618807
Reviewed-by: Theresa Sullivan <twellington@chromium.org>
Reviewed-by: Wenyu Fu <wenyufu@chromium.org>
Reviewed-by: Sinan Sahin <sinansahin@google.com>
Commit-Queue: Donn Denman <donnd@chromium.org>
Code-Coverage: Findit <findit-for-me@appspot.gserviceaccount.com>
Cr-Original-Commit-Position: refs/heads/main@{#1162990}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4658980
Commit-Queue: Wenyu Fu <wenyufu@chromium.org>
Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
Cr-Commit-Position: refs/branch-heads/5845@{#315}
Cr-Branched-From: 5a5dff6-refs/heads/main@{#1160321}
  • Loading branch information
Donn Denman authored and Chromium LUCI CQ committed Jul 5, 2023
1 parent 4e4e68c commit dcaa017
Show file tree
Hide file tree
Showing 11 changed files with 1,434 additions and 79 deletions.
1 change: 1 addition & 0 deletions chrome/android/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,7 @@ if (current_toolchain == default_toolchain) {
"//chrome/browser/paint_preview/android:java",
"//chrome/browser/partnerbookmarks:delegate_java",
"//chrome/browser/partnercustomizations:delegate_java",
"//chrome/browser/partnercustomizations:helper_java",
"//chrome/browser/partnercustomizations:java",
"//chrome/browser/password_check:public_java",
"//chrome/browser/password_entry_edit:public_java",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1377,7 +1377,6 @@ && getTabModelSelector().getTotalTabCount() == 0)) {
PartnerBrowserCustomizations.logActivityFinishingOrDestroyed(
isActivityFinishingOrDestroyed);
if (!isActivityFinishingOrDestroyed) {
PartnerBrowserCustomizations.getInstance().onCreateInitialTab();
createInitialTab();
}
}, INITIAL_TAB_CREATION_TIMEOUT_MS);
Expand Down Expand Up @@ -1422,9 +1421,11 @@ private void createInitialTab() {

// If the start surface or grid tab switcher will be shown on start, do not create a new
// tab.
String url = null;
long createInitialTabStartTime = SystemClock.elapsedRealtime();
boolean shouldShowOverviewPageOnStart = shouldShowOverviewPageOnStart();
if (!shouldShowOverviewPageOnStart) {
String url = HomepageManager.getHomepageUri();
url = HomepageManager.getHomepageUri();
if (TextUtils.isEmpty(url)) {
url = UrlConstants.NTP_URL;
} else {
Expand All @@ -1436,6 +1437,9 @@ private void createInitialTab() {
}
getTabCreator(false).launchUrl(url, TabLaunchType.FROM_STARTUP);
}
PartnerBrowserCustomizations.getInstance().onCreateInitialTab(url,
createInitialTabStartTime, shouldShowOverviewPageOnStart, getLifecycleDispatcher(),
HomepageManager::getHomepageCharacterizationHelper);

// If we didn't call setInitialOverviewState() in onStartWithNative() because
// mPendingInitialTabCreation was true then do so now.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.browser.homepage.settings.HomepageMetricsEnums.HomepageLocationType;
import org.chromium.chrome.browser.homepage.settings.HomepageSettings;
import org.chromium.chrome.browser.partnercustomizations.HomepageCharacterizationHelper;
import org.chromium.chrome.browser.partnercustomizations.PartnerBrowserCustomizations;
import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
Expand Down Expand Up @@ -355,4 +356,42 @@ public void onHomepageUpdate() {
public void setSettingsLauncherForTesting(SettingsLauncher launcher) {
mSettingsLauncher = launcher;
}

/**
* Provides a helper for UMA reporting of partner customization and Homepage outcomes.
* @return A {@link HomepageCharacterizationHelper} that provides access to a few helpful
* methods.
*/
public static HomepageCharacterizationHelper getHomepageCharacterizationHelper() {
return new HomepageCharacterizationHelper() {
@Override
public boolean isUrlNtp(@Nullable String url) {
return UrlConstants.NTP_URL.equals(url) || UrlUtilities.isNTPUrl(url);
}

@Override
public boolean isPartner() {
switch (getInstance().getHomepageLocationType()) {
case HomepageLocationType.PARTNER_PROVIDED_OTHER:
case HomepageLocationType.PARTNER_PROVIDED_NTP:
return true;
default:
return false;
}
}

@Override
public boolean isNtp() {
switch (getInstance().getHomepageLocationType()) {
case HomepageLocationType.POLICY_NTP:
case HomepageLocationType.PARTNER_PROVIDED_NTP:
case HomepageLocationType.USER_CUSTOMIZED_NTP:
case HomepageLocationType.DEFAULT_NTP:
return true;
default:
return false;
}
}
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,13 @@ private HomepageMetricsEnums() {}
HomepageLocationType.USER_CUSTOMIZED_NTP, HomepageLocationType.USER_CUSTOMIZED_OTHER,
HomepageLocationType.DEFAULT_NTP, HomepageLocationType.NUM_ENTRIES})
@Retention(RetentionPolicy.SOURCE)

/**
Homepage types come in pairs - NTP + OTHER. NTP means the entity has provided a New Tab
Page. OTHER means the entity has provided a Homepage.
* A single Homepage URL can be supplied by one of three sources (with precedence between them).
* That Homepage is then categorized as being The Chrome NTP, or some "OTHER" URL.
* E.g. A partner can provide their own custom Homepage URL, which will be
* PARTNER_PROVIDED_OTHER. Some users may want to use something else, e.g. Chrome's NTP which
* will be USER_CUSTOMIZED_NTP or their own custom URL which will be USER_CUSTOMIZED_NTP.
*/
public @interface HomepageLocationType {
/** Enterprise policy provided New Tab Page. */
Expand Down
14 changes: 14 additions & 0 deletions chrome/browser/partnercustomizations/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,19 @@ generate_jni("jni_headers") {
android_library("uma_java") {
sources = [ "java/src/org/chromium/chrome/browser/partnercustomizations/PartnerCustomizationsUma.java" ]
deps = [
":helper_java",
"//base:base_java",
"//chrome/browser/android/lifecycle:java",
"//chrome/browser/flags:java",
"//chrome/browser/preferences:java",
"//third_party/androidx:androidx_annotation_annotation_java",
]
}

android_library("helper_java") {
sources = [ "java/src/org/chromium/chrome/browser/partnercustomizations/HomepageCharacterizationHelper.java" ]
deps = [
"//base:base_java",
"//third_party/androidx:androidx_annotation_annotation_java",
]
}
Expand All @@ -45,9 +55,11 @@ android_library("java") {
sources = [ "java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations.java" ]
deps = [
":delegate_java",
":helper_java",
":uma_java",
"//base:base_java",
"//base:jni_java",
"//chrome/browser/android/lifecycle:java",
"//chrome/browser/flags:java",
"//chrome/browser/preferences:java",
"//components/embedder_support/android:util_java",
Expand Down Expand Up @@ -106,6 +118,7 @@ robolectric_library("junit") {

deps = [
":delegate_public_impl_java",
":helper_java",
":java",
":test_support_java",
":uma_java",
Expand All @@ -116,6 +129,7 @@ robolectric_library("junit") {
"//chrome/browser/android/lifecycle:java",
"//chrome/browser/flags:java",
"//chrome/test/android:chrome_java_unit_test_support",
"//components/embedder_support/android:util_java",
"//third_party/androidx:androidx_annotation_annotation_java",
"//third_party/junit:junit",
"//third_party/mockito:mockito_java",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.chrome.browser.partnercustomizations;

import androidx.annotation.Nullable;

/**
* Provides helper methods that characterize a Homepage so they can be accessed from modules such
* as {@link PartnerBrowserCustomizations}.
* TODO(https://crbug.com/1456533) move this to the Homepage Manager when Homepage is modularized.
*/
public interface HomepageCharacterizationHelper {
/** @return whether the given URL is the NTP. An input of (@code null} returns {@code false}. */
boolean isUrlNtp(@Nullable String url);

/** @return whether the current Homepage is the Partner customized Homepage or NTP. */
boolean isPartner();

/** @return whether the current Homepage is any kind of NTP. */
boolean isNtp();
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,19 @@
import android.content.pm.ApplicationInfo;
import android.os.SystemClock;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;

import org.chromium.base.CommandLine;
import org.chromium.base.Log;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.supplier.Supplier;
import org.chromium.base.task.AsyncTask;
import org.chromium.base.task.PostTask;
import org.chromium.base.task.TaskTraits;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
import org.chromium.components.embedder_support.util.UrlConstants;
Expand Down Expand Up @@ -239,8 +242,8 @@ protected Void doInBackground() {

@Override
protected void onPostExecute(Void result) {
onFinalized();
partnerCustomizationsUma.logAsyncInitCompleted();
onFinalized();
}

@Override
Expand All @@ -265,8 +268,8 @@ private void onFinalized() {
if (mHomepageUriChanged && mListener != null) {
mListener.onHomepageUpdate();
}
PartnerCustomizationsUma.logPartnerBrowserCustomizationInitDurationWithCallbacks(
mStartTime, SystemClock.elapsedRealtime());
partnerCustomizationsUma.logAsyncInitFinalized(
mStartTime, SystemClock.elapsedRealtime(), mHomepageUriChanged);
}
};

Expand All @@ -287,13 +290,26 @@ public static void logActivityFinishingOrDestroyed(boolean isActivityFinishingOr
}

/**
* Called when Chrome is about to create an initial tab.
* This notifies the UMA instance so it tracks how much initialization has been done before new
* Tab creation.
* Called when Chrome creates an initial tab.
* This notifies the UMA instance so it tracks how much initialization progresses relative to
* initial Tab creation.
* @param homepageUrlCreated The URL of the initial Tab that was created or {@code null} if
* something other than a Homepage was used for an initial Tab.
* @param createInitialTabTime The timestamp when we started to create an initial tab.
* @param isOverviewPageOrStartSurface indicates that there was no created Homepage because some
* kind of overview page or Start Surface was presented in place of the initial Tab.
* @param activityLifecycleDispatcher The {@link ActivityLifecycleDispatcher} to use to wait for
* native initialization.
* @param homepageCharacterizationHelper A supplier to characterize a Homepage.
*/
public void onCreateInitialTab() {
public void onCreateInitialTab(@Nullable String homepageUrlCreated, long createInitialTabTime,
boolean isOverviewPageOrStartSurface,
@NonNull ActivityLifecycleDispatcher activityLifecycleDispatcher,
@NonNull Supplier<HomepageCharacterizationHelper> homepageCharacterizationHelper) {
if (mPartnerCustomizationsUma != null) {
mPartnerCustomizationsUma.onCreateInitialTab(isInitialized());
mPartnerCustomizationsUma.onCreateInitialTab(isInitialized(), homepageUrlCreated,
createInitialTabTime, isOverviewPageOrStartSurface, activityLifecycleDispatcher,
homepageCharacterizationHelper);
}
}

Expand Down

0 comments on commit dcaa017

Please sign in to comment.