diff --git a/src/com/android/settings/core/instrumentation/EventLogWriter.java b/src/com/android/settings/core/instrumentation/EventLogWriter.java index 0a85649a8e7..2e0be30fb8e 100644 --- a/src/com/android/settings/core/instrumentation/EventLogWriter.java +++ b/src/com/android/settings/core/instrumentation/EventLogWriter.java @@ -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... 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 pair : taggedData) { + logMaker.addTaggedData(pair.first, pair.second); + } + MetricsLogger.action(logMaker); + } } public void count(Context context, String name, int value) { diff --git a/src/com/android/settings/core/instrumentation/LogWriter.java b/src/com/android/settings/core/instrumentation/LogWriter.java index 88dd4df78d0..54ed1a8d52b 100644 --- a/src/com/android/settings/core/instrumentation/LogWriter.java +++ b/src/com/android/settings/core/instrumentation/LogWriter.java @@ -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... taggedData); /** * Logs a count. diff --git a/src/com/android/settings/core/instrumentation/MetricsFeatureProvider.java b/src/com/android/settings/core/instrumentation/MetricsFeatureProvider.java index 24c5e8cd107..66986d68564 100644 --- a/src/com/android/settings/core/instrumentation/MetricsFeatureProvider.java +++ b/src/com/android/settings/core/instrumentation/MetricsFeatureProvider.java @@ -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... taggedData) { for (LogWriter writer : mLoggerWriters) { - writer.action(context, category, pkg); + writer.action(context, category, pkg, taggedData); } } diff --git a/src/com/android/settings/core/instrumentation/SettingSuggestionsLogWriter.java b/src/com/android/settings/core/instrumentation/SettingSuggestionsLogWriter.java index 44d2554501e..1c4e26eb67f 100644 --- a/src/com/android/settings/core/instrumentation/SettingSuggestionsLogWriter.java +++ b/src/com/android/settings/core/instrumentation/SettingSuggestionsLogWriter.java @@ -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... taggedData) { if (mEventStore == null) { mEventStore = new EventStore(context); } diff --git a/src/com/android/settings/search2/InstalledAppResultLoader.java b/src/com/android/settings/search2/InstalledAppResultLoader.java index c6a1b821135..80378d70ca2 100644 --- a/src/com/android/settings/search2/InstalledAppResultLoader.java +++ b/src/com/android/settings/search2/InstalledAppResultLoader.java @@ -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 { + fragment.onSearchResultClicked(); + final Intent intent = ((IntentPayload) result.payload).intent; + final ComponentName cn = intent.getComponent(); + final Pair 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); }); } } diff --git a/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java b/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java index 7a2499b5934..7ba77dff24b 100644 --- a/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java +++ b/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java @@ -17,12 +17,15 @@ 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);