[go: up one dir, main page]

[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>