[SendTabToSelf] Added metrics to all Android flows
(cherry picked from commit 5d2de4af31e088410ba0e44331363f82d7875901)
Bug: 942177
Change-Id: I2012b3d192a0772a7fe1057ccc582d44b440937c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1648976
Commit-Queue: Tanya Gupta <tgupta@chromium.org>
Reviewed-by: Steven Holte <holte@chromium.org>
Reviewed-by: Jeffrey Cohen <jeffreycohen@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#667605}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1654388
Reviewed-by: Tanya Gupta <tgupta@chromium.org>
Cr-Commit-Position: refs/branch-heads/3809@{#242}
Cr-Branched-From: d82dec1a818f378c464ba307ddd9c92133eac355-refs/heads/master@{#665002}
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index 7792a21d..b841e1e 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -1374,6 +1374,7 @@
"java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfInfoBarController.java",
"java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfModelObserverBridge.java",
"java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivity.java",
+ "java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfMetrics.java",
"java/src/org/chromium/chrome/browser/send_tab_to_self/TargetDeviceInfo.java",
"java/src/org/chromium/chrome/browser/services/AccountsChangedReceiver.java",
"java/src/org/chromium/chrome/browser/services/AndroidEduAndChildAccountHelper.java",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/DevicePickerBottomSheetContent.java b/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/DevicePickerBottomSheetContent.java
index 88f1d8a..8c2185a2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/DevicePickerBottomSheetContent.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/DevicePickerBottomSheetContent.java
@@ -14,8 +14,10 @@
import android.widget.ListView;
import android.widget.TextView;
+import org.chromium.base.metrics.RecordHistogram;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.send_tab_to_self.SendTabToSelfMetrics.SendTabToSelfShareClickResult;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet.BottomSheetContent;
@@ -44,6 +46,13 @@
createToolbarView();
createContentView();
+ recordNumberOfDevicesDisplayed();
+ }
+
+ private void recordNumberOfDevicesDisplayed() {
+ // This histogram is used across multiple platforms and should be
+ // kept consistent.
+ RecordHistogram.recordCount100Histogram("SendTabToSelf.DeviceCount", mAdapter.getCount());
}
private void createToolbarView() {
@@ -127,6 +136,8 @@
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ SendTabToSelfShareClickResult.recordClickResult(
+ SendTabToSelfShareClickResult.ClickType.CLICK_ITEM);
TargetDeviceInfo targetDeviceInfo = mAdapter.getItem(position);
Tab tab = mActivity.getActivityTabProvider().get();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/NotificationManager.java b/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/NotificationManager.java
index f63b590..fa7db92 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/NotificationManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/NotificationManager.java
@@ -34,6 +34,8 @@
import org.chromium.chrome.browser.notifications.PendingIntentProvider;
import org.chromium.chrome.browser.notifications.channels.ChannelDefinitions;
import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.send_tab_to_self.SendTabToSelfMetrics.SendTabToSelfShareNotificationInteraction;
+import org.chromium.chrome.browser.send_tab_to_self.SendTabToSelfMetrics.SendTabToSelfShareNotificationInteraction.InteractionType;
/**
* Manages all SendTabToSelf related notifications for Android. This includes displaying, handling
@@ -47,7 +49,7 @@
@Override
public void onReceive(Context context, Intent intent) {
String guid = intent.getStringExtra(NOTIFICATION_GUID_EXTRA);
- hideNotification(guid);
+ hideNotification(guid, InteractionType.DISMISSED);
SendTabToSelfAndroidBridge.dismissEntry(Profile.getLastUsedProfile(), guid);
}
}
@@ -58,7 +60,7 @@
public void onReceive(Context context, Intent intent) {
openUrl(intent.getData());
String guid = intent.getStringExtra(NOTIFICATION_GUID_EXTRA);
- hideNotification(guid);
+ hideNotification(guid, InteractionType.OPENED);
SendTabToSelfAndroidBridge.deleteEntry(Profile.getLastUsedProfile(), guid);
}
}
@@ -68,7 +70,7 @@
@Override
public void onReceive(Context context, Intent intent) {
String guid = intent.getStringExtra(NOTIFICATION_GUID_EXTRA);
- hideNotification(guid);
+ hideNotification(guid, InteractionType.DISMISSED_REMOTELY);
SendTabToSelfAndroidBridge.dismissEntry(Profile.getLastUsedProfile(), guid);
}
}
@@ -99,17 +101,31 @@
*
* @param guid The GUID of the notification to hide.
*/
+ private static void hideNotification(@Nullable String guid, @InteractionType int type) {
+ if (hideNotification(guid)) {
+ SendTabToSelfShareNotificationInteraction.recordClickResult(type);
+ }
+ }
+
+ /**
+ * Hides a notification.
+ *
+ * @param guid The GUID of the notification to hide.
+ * @return whether the notification was hidden. False if there is corresponding notification to
+ * hide.
+ */
@CalledByNative
- private static void hideNotification(@Nullable String guid) {
+ private static boolean hideNotification(@Nullable String guid) {
NotificationSharedPrefManager.ActiveNotification activeNotification =
NotificationSharedPrefManager.findActiveNotification(guid);
if (!NotificationSharedPrefManager.removeActiveNotification(guid)) {
- return;
+ return false;
}
Context context = ContextUtils.getApplicationContext();
NotificationManagerProxy manager = new NotificationManagerProxyImpl(context);
manager.cancel(
NotificationConstants.GROUP_SEND_TAB_TO_SELF, activeNotification.notificationId);
+ return true;
}
/**
@@ -130,6 +146,8 @@
}
// Post notification.
+ SendTabToSelfShareNotificationInteraction.recordClickResult(
+ SendTabToSelfShareNotificationInteraction.InteractionType.SHOWN);
Context context = ContextUtils.getApplicationContext();
NotificationManagerProxy manager = new NotificationManagerProxyImpl(context);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfMetrics.java b/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfMetrics.java
new file mode 100644
index 0000000..48114ab
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfMetrics.java
@@ -0,0 +1,63 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// 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.send_tab_to_self;
+
+import android.support.annotation.IntDef;
+
+import org.chromium.base.metrics.RecordHistogram;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Class that captures all the metrics needed for Send Tab To Self on Android.
+ */
+public class SendTabToSelfMetrics {
+ /**
+ * Metrics captured when a user initiates and completes the sending flow.
+ */
+ public static class SendTabToSelfShareClickResult {
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({ClickType.SHOW_ITEM, ClickType.CLICK_ITEM, ClickType.SHOW_DEVICE_LIST})
+ @interface ClickType {
+ // These values are used for UMA. Don't reuse or reorder values.
+ // If you add something, update NUM_ENTRIES.This must be kept in sync with
+ // send_tab_to_self_desktop_util.h
+ int SHOW_ITEM = 0;
+ int CLICK_ITEM = 1;
+ int SHOW_DEVICE_LIST = 2;
+ int NUM_ENTRIES = 3;
+ }
+
+ public static void recordClickResult(@ClickType int result) {
+ RecordHistogram.recordEnumeratedHistogram(
+ "SendTabToSelf.AndroidShareSheet.ClickResult", result, ClickType.NUM_ENTRIES);
+ }
+ }
+
+ /**
+ * Metrics captured when a user completes the receiving flow.
+ */
+ public static class SendTabToSelfShareNotificationInteraction {
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({InteractionType.OPENED, InteractionType.DISMISSED, InteractionType.SHOWN,
+ InteractionType.DISMISSED_REMOTELY})
+ @interface InteractionType {
+ // These values are used for UMA. Don't reuse or reorder values.
+ // If you add something, update NUM_ENTRIES. This must be kept in sync with
+ // send_tab_to_self_metrics.h
+ int OPENED = 0;
+ int DISMISSED = 1;
+ int SHOWN = 2;
+ int DISMISSED_REMOTELY = 3;
+ int NUM_ENTRIES = 4;
+ }
+
+ public static void recordClickResult(@InteractionType int result) {
+ RecordHistogram.recordEnumeratedHistogram(
+ "SendTabToSelf.Notification", result, InteractionType.NUM_ENTRIES);
+ }
+ }
+}
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivity.java
index 923f9ec..5958b59a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivity.java
@@ -6,6 +6,7 @@
import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.send_tab_to_self.SendTabToSelfMetrics.SendTabToSelfShareClickResult;
import org.chromium.chrome.browser.share.ShareActivity;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet.BottomSheetContent;
@@ -25,6 +26,8 @@
return;
}
+ SendTabToSelfShareClickResult.recordClickResult(
+ SendTabToSelfShareClickResult.ClickType.SHOW_DEVICE_LIST);
triggeringActivity.getBottomSheetController().requestShowContent(
createBottomSheetContent(triggeringActivity, entry), true);
// TODO(crbug.com/968246): Remove the need to call this explicitly and instead have it
@@ -38,6 +41,12 @@
}
public static boolean featureIsAvailable(Tab currentTab) {
- return SendTabToSelfAndroidBridge.isFeatureAvailable(currentTab.getWebContents());
+ boolean shouldShow =
+ SendTabToSelfAndroidBridge.isFeatureAvailable(currentTab.getWebContents());
+ if (shouldShow) {
+ SendTabToSelfShareClickResult.recordClickResult(
+ SendTabToSelfShareClickResult.ClickType.SHOW_ITEM);
+ }
+ return shouldShow;
}
}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivityTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivityTest.java
index 44fcc27..c8fa8bf4 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivityTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivityTest.java
@@ -11,6 +11,7 @@
import android.support.test.filters.SmallTest;
+import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
@@ -20,6 +21,7 @@
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
+import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.JniMocker;
import org.chromium.chrome.browser.ActivityTabProvider;
@@ -72,6 +74,12 @@
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mocker.mock(SendTabToSelfAndroidBridgeJni.TEST_HOOKS, mNativeMock);
+ RecordHistogram.setDisabledForTests(true);
+ }
+
+ @After
+ public void tearDown() {
+ RecordHistogram.setDisabledForTests(false);
}
@Test
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index c8c9d364..caa5ece 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -115044,6 +115044,19 @@
</summary>
</histogram>
+<histogram name="SendTabToSelf.AndroidShareSheet.ClickResult"
+ enum="SendTabToSelfNotification" expires_after="M78">
+ <owner>tgupta@chromium.org</owner>
+ <summary>
+ The use of Android notification for SendTabToSelf.
+
+ These notifications are tied to a sync type so there is a distinction
+ between user initiated actions (Opened, Dismissed) and actions that are
+ initiated by changes to the sync model or Android (Shown,
+ DismissedRemotely).
+ </summary>
+</histogram>
+
<histogram base="true" name="SendTabToSelf.ClickResult"
enum="SendTabToSelfClickResult" expires_after="M78">
<owner>jeffreycohen@chromium.org</owner>