OSDN Git Service

Log search result click and its rank.
authorFan Zhang <zhfan@google.com>
Thu, 16 Feb 2017 01:12:12 +0000 (17:12 -0800)
committerFan Zhang <zhfan@google.com>
Thu, 16 Feb 2017 22:53:49 +0000 (14:53 -0800)
Bug: 34975477
Test: RunSettingsRoboTests
Change-Id: I86e72dbd27ac5daeafa4fb35ad55662de7b3eca9

src/com/android/settings/core/instrumentation/EventLogWriter.java
src/com/android/settings/core/instrumentation/LogWriter.java
src/com/android/settings/core/instrumentation/MetricsFeatureProvider.java
src/com/android/settings/core/instrumentation/SettingSuggestionsLogWriter.java
src/com/android/settings/search2/InstalledAppResultLoader.java
src/com/android/settings/search2/IntentSearchViewHolder.java
tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java

index 0a85649..2e0be30 100644 (file)
@@ -18,6 +18,7 @@ package com.android.settings.core.instrumentation;
 
 import android.content.Context;
 import android.metrics.LogMaker;
+import android.util.Pair;
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto;
@@ -59,8 +60,19 @@ public class EventLogWriter implements LogWriter {
         MetricsLogger.action(context, category, Boolean.toString(value));
     }
 
-    public void action(Context context, int category, String pkg) {
-        MetricsLogger.action(context, category, pkg);
+    public void action(Context context, int category, String pkg,
+            Pair<Integer, Object>... taggedData) {
+        if (taggedData == null || taggedData.length == 0) {
+            MetricsLogger.action(context, category, pkg);
+        } else {
+            final LogMaker logMaker = new LogMaker(category)
+                    .setType(MetricsProto.MetricsEvent.TYPE_ACTION)
+                    .setPackageName(pkg);
+            for (Pair<Integer, Object> pair : taggedData) {
+                logMaker.addTaggedData(pair.first, pair.second);
+            }
+            MetricsLogger.action(logMaker);
+        }
     }
 
     public void count(Context context, String name, int value) {
index 88dd4df..54ed1a8 100644 (file)
@@ -16,6 +16,7 @@
 package com.android.settings.core.instrumentation;
 
 import android.content.Context;
+import android.util.Pair;
 
 /**
  * Generic log writer interface.
@@ -55,7 +56,7 @@ public interface LogWriter {
     /**
      * Logs an user action.
      */
-    void action(Context context, int category, String pkg);
+    void action(Context context, int category, String pkg, Pair<Integer, Object>... taggedData);
 
     /**
      * Logs a count.
index 24c5e8c..66986d6 100644 (file)
@@ -16,6 +16,7 @@
 package com.android.settings.core.instrumentation;
 
 import android.content.Context;
+import android.util.Pair;
 
 import com.android.internal.logging.nano.MetricsProto;
 
@@ -74,9 +75,10 @@ public class MetricsFeatureProvider {
         }
     }
 
-    public void action(Context context, int category, String pkg) {
+    public void action(Context context, int category, String pkg,
+            Pair<Integer, Object>... taggedData) {
         for (LogWriter writer : mLoggerWriters) {
-            writer.action(context, category, pkg);
+            writer.action(context, category, pkg, taggedData);
         }
     }
 
index 44d2554..1c4e26e 100644 (file)
@@ -18,6 +18,7 @@ package com.android.settings.core.instrumentation;
 
 import android.content.Context;
 import android.metrics.LogMaker;
+import android.util.Pair;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.internal.logging.MetricsLogger;
@@ -55,7 +56,8 @@ public class SettingSuggestionsLogWriter implements LogWriter {
     }
 
     @Override
-    public void action(Context context, int category, String pkg) {
+    public void action(Context context, int category, String pkg,
+            Pair<Integer, Object>... taggedData) {
         if (mEventStore == null) {
             mEventStore = new EventStore(context);
         }
index c6a1b82..80378d7 100644 (file)
@@ -28,7 +28,9 @@ import android.os.UserManager;
 import android.provider.Settings;
 import android.text.TextUtils;
 
+import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
+import com.android.settings.SettingsActivity;
 import com.android.settings.applications.ManageApplications;
 import com.android.settings.applications.PackageManagerWrapper;
 import com.android.settings.dashboard.SiteMapManager;
@@ -87,7 +89,9 @@ public class InstalledAppResultLoader extends AsyncLoader<List<? extends SearchR
                 }
                 final Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
                         .setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
-                        .setData(Uri.fromParts("package", info.packageName, null));
+                        .setData(Uri.fromParts("package", info.packageName, null))
+                        .putExtra(SettingsActivity.EXTRA_SOURCE_METRICS_CATEGORY,
+                                MetricsProto.MetricsEvent.DASHBOARD_SEARCH_RESULTS);
 
                 final AppSearchResult.Builder builder = new AppSearchResult.Builder();
                 builder.setAppInfo(info)
index d02ef1c..79e1cc8 100644 (file)
  */
 package com.android.settings.search2;
 
+import android.content.ComponentName;
+import android.content.Intent;
+import android.text.TextUtils;
+import android.util.Pair;
 import android.view.View;
 
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.settings.SettingsActivity;
+import com.android.settings.core.instrumentation.MetricsFeatureProvider;
+import com.android.settings.overlay.FeatureFactory;
+
 /**
  * ViewHolder for intent based search results.
  * The DatabaseResultLoader is the primary use case for this ViewHolder.
  */
 public class IntentSearchViewHolder extends SearchViewHolder {
 
+    private final MetricsFeatureProvider mMetricsFeatureProvider;
+
     public IntentSearchViewHolder(View view) {
         super(view);
+        mMetricsFeatureProvider = FeatureFactory.getFactory(view.getContext())
+                .getMetricsFeatureProvider();
     }
 
     @Override
     public void onBind(final SearchFragment fragment, final SearchResult result) {
         super.onBind(fragment, result);
 
-        itemView.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                fragment.onSearchResultClicked();
-                fragment.startActivity(((IntentPayload) result.payload).intent);
+        itemView.setOnClickListener(v -> {
+            fragment.onSearchResultClicked();
+            final Intent intent = ((IntentPayload) result.payload).intent;
+            final ComponentName cn = intent.getComponent();
+            final Pair<Integer, Object> rank = Pair.create(
+                    MetricsEvent.FIELD_SETTINGS_SERACH_RESULT_RANK, getAdapterPosition());
+            String resultName = intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT);
+            if (TextUtils.isEmpty(resultName) && cn != null) {
+                resultName = cn.flattenToString();
             }
+            mMetricsFeatureProvider.action(v.getContext(),
+                    MetricsEvent.ACTION_CLICK_SETTINGS_SEARCH_RESULT,
+                    resultName, rank);
+            fragment.startActivity(intent);
         });
     }
 }
index 7a2499b..7ba77df 100644 (file)
 
 package com.android.settings.search;
 
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.drawable.Drawable;
+import android.util.Pair;
 import android.view.LayoutInflater;
 import android.view.View;
 
+import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
@@ -31,20 +34,23 @@ import com.android.settings.search2.IntentSearchViewHolder;
 import com.android.settings.search2.SearchFragment;
 import com.android.settings.search2.SearchResult;
 import com.android.settings.search2.SearchResult.Builder;
+import com.android.settings.testutils.FakeFeatureFactory;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowApplication;
 
 import java.util.ArrayList;
 import java.util.List;
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.verify;
 
 @RunWith(SettingsRobolectricTestRunner.class)
@@ -54,15 +60,21 @@ public class IntentSearchViewHolderTest {
     private static final String TITLE = "title";
     private static final String SUMMARY = "summary";
 
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private Context mContext;
     @Mock
     private SearchFragment mFragment;
+    private FakeFeatureFactory mFeatureFactory;
     private IntentSearchViewHolder mHolder;
     private Drawable mIcon;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        final Context context = ShadowApplication.getInstance().getApplicationContext();
+        FakeFeatureFactory.setupForTest(mContext);
+        mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
+
+        final Context context = RuntimeEnvironment.application;
         View view = LayoutInflater.from(context).inflate(R.layout.search_intent_item, null);
         mHolder = new IntentSearchViewHolder(view);
 
@@ -91,6 +103,10 @@ public class IntentSearchViewHolderTest {
 
         verify(mFragment).onSearchResultClicked();
         verify(mFragment).startActivity(any(Intent.class));
+        verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class),
+                eq(MetricsProto.MetricsEvent.ACTION_CLICK_SETTINGS_SEARCH_RESULT),
+                eq(((IntentPayload)result.payload).intent.getComponent().flattenToString()),
+                any(Pair.class));
     }
 
     @Test
@@ -128,7 +144,8 @@ public class IntentSearchViewHolderTest {
         builder.addTitle(TITLE)
                 .addSummary(SUMMARY)
                 .addRank(1)
-                .addPayload(new IntentPayload(null))
+                .addPayload(new IntentPayload(
+                        new Intent().setComponent(new ComponentName("pkg", "class"))))
                 .addBreadcrumbs(new ArrayList<>())
                 .addIcon(mIcon);