diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java index a08711c160c..d3617ef8869 100644 --- a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java +++ b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java @@ -23,11 +23,11 @@ import android.app.DialogFragment; import android.app.Fragment; import android.content.Context; import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; import android.os.Bundle; import android.text.TextUtils; +import android.util.Pair; -import com.android.internal.logging.nano.MetricsProto; +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.applications.PackageManagerWrapper; import com.android.settings.applications.PackageManagerWrapperImpl; @@ -62,6 +62,16 @@ public abstract class DefaultAppPickerFragment extends RadioButtonPickerFragment } } + @Override + protected void onRadioButtonConfirmed(String selectedKey) { + mMetricsFeatureProvider.action(getContext(), + MetricsEvent.ACTION_SETTINGS_UPDATE_DEFAULT_APP, + selectedKey, + Pair.create(MetricsEvent.FIELD_CONTEXT, getMetricsCategory())); + + super.onRadioButtonConfirmed(selectedKey); + } + @Override public void bindPreferenceExtra(RadioButtonPreference pref, String key, CandidateInfo info, String defaultKey, String systemDefaultKey) { @@ -97,7 +107,7 @@ public abstract class DefaultAppPickerFragment extends RadioButtonPickerFragment @Override public int getMetricsCategory() { - return MetricsProto.MetricsEvent.DEFAULT_APP_PICKER_CONFIRMATION_DIALOG; + return MetricsEvent.DEFAULT_APP_PICKER_CONFIRMATION_DIALOG; } /** diff --git a/src/com/android/settings/search/InlineSwitchViewHolder.java b/src/com/android/settings/search/InlineSwitchViewHolder.java index 2b3642f2f7b..82d33d80362 100644 --- a/src/com/android/settings/search/InlineSwitchViewHolder.java +++ b/src/com/android/settings/search/InlineSwitchViewHolder.java @@ -40,6 +40,11 @@ public class InlineSwitchViewHolder extends SearchViewHolder { switchView = view.findViewById(R.id.switchView); } + @Override + public int getClickActionMetricName() { + return MetricsEvent.ACTION_CLICK_SETTINGS_SEARCH_INLINE_RESULT; + } + @Override public void onBind(SearchFragment fragment, SearchResult result) { super.onBind(fragment, result); @@ -49,19 +54,10 @@ public class InlineSwitchViewHolder extends SearchViewHolder { final InlineSwitchPayload payload = (InlineSwitchPayload) result.payload; switchView.setChecked(payload.getSwitchValue(mContext)); switchView.setOnCheckedChangeListener((buttonView, isChecked) -> { - final Pair name = Pair.create( - MetricsEvent.FIELD_SETTINGS_SEARCH_INLINE_RESULT_NAME, payload.settingsUri); final Pair value = Pair.create( MetricsEvent.FIELD_SETTINGS_SEARCH_INLINE_RESULT_VALUE, isChecked - ? "checked" - : "not-checked"); - final Pair rank = Pair.create( - MetricsEvent.FIELD_SETTINGS_SERACH_RESULT_RANK, getAdapterPosition()); - mMetricsFeatureProvider.action(mContext, - MetricsEvent.ACTION_CLICK_SETTINGS_SEARCH_INLINE_RESULT, - name, value, rank); - - fragment.onSearchResultClicked(); + ? 1L : 0L); + fragment.onSearchResultClicked(this, payload.settingsUri, value); payload.setSwitchValue(mContext, isChecked); }); } diff --git a/src/com/android/settings/search/IntentSearchViewHolder.java b/src/com/android/settings/search/IntentSearchViewHolder.java index 68129b695cc..17ff9815c3c 100644 --- a/src/com/android/settings/search/IntentSearchViewHolder.java +++ b/src/com/android/settings/search/IntentSearchViewHolder.java @@ -19,7 +19,6 @@ package com.android.settings.search; 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; @@ -35,24 +34,23 @@ public class IntentSearchViewHolder extends SearchViewHolder { super(view); } + @Override + public int getClickActionMetricName() { + return MetricsEvent.ACTION_CLICK_SETTINGS_SEARCH_RESULT; + } + @Override public void onBind(final SearchFragment fragment, final SearchResult result) { super.onBind(fragment, result); itemView.setOnClickListener(v -> { - fragment.onSearchResultClicked(); final Intent intent = result.payload.getIntent(); 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); - mSearchFeatureProvider.searchResultClicked(fragment.mQuery, result); + fragment.onSearchResultClicked(this, resultName); fragment.startActivity(intent); }); } diff --git a/src/com/android/settings/search/SavedQueryViewHolder.java b/src/com/android/settings/search/SavedQueryViewHolder.java index 158f698868e..14509b6f9c5 100644 --- a/src/com/android/settings/search/SavedQueryViewHolder.java +++ b/src/com/android/settings/search/SavedQueryViewHolder.java @@ -20,6 +20,8 @@ package com.android.settings.search; import android.view.View; import android.widget.TextView; +import com.android.internal.logging.nano.MetricsProto; + public class SavedQueryViewHolder extends SearchViewHolder { public final TextView titleView; @@ -31,6 +33,11 @@ public class SavedQueryViewHolder extends SearchViewHolder { removeButton = view.findViewById(android.R.id.icon); } + @Override + public int getClickActionMetricName() { + return MetricsProto.MetricsEvent.ACTION_CLICK_SETTINGS_SEARCH_SAVED_QUERY; + } + @Override public void onBind(SearchFragment fragment, SearchResult result) { titleView.setText(result.title); diff --git a/src/com/android/settings/search/SearchFeatureProvider.java b/src/com/android/settings/search/SearchFeatureProvider.java index 8e30826ec6f..67d4ef134de 100644 --- a/src/com/android/settings/search/SearchFeatureProvider.java +++ b/src/com/android/settings/search/SearchFeatureProvider.java @@ -19,8 +19,8 @@ package com.android.settings.search; import android.app.Activity; import android.content.Context; import android.view.Menu; - import android.view.View; + import com.android.settings.dashboard.SiteMapManager; import java.util.List; diff --git a/src/com/android/settings/search/SearchFragment.java b/src/com/android/settings/search/SearchFragment.java index e50558bad6e..ee97334e0da 100644 --- a/src/com/android/settings/search/SearchFragment.java +++ b/src/com/android/settings/search/SearchFragment.java @@ -28,6 +28,7 @@ import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.util.Log; +import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -36,13 +37,15 @@ import android.widget.LinearLayout; import android.widget.LinearLayout.LayoutParams; import android.widget.SearchView; -import com.android.internal.logging.nano.MetricsProto; +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.core.InstrumentedFragment; import com.android.settings.core.instrumentation.MetricsFeatureProvider; import com.android.settings.overlay.FeatureFactory; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; @@ -118,7 +121,7 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O @Override public int getMetricsCategory() { - return MetricsProto.MetricsEvent.DASHBOARD_SEARCH_RESULTS; + return MetricsEvent.DASHBOARD_SEARCH_RESULTS; } @Override @@ -191,7 +194,7 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O mMetricsFeatureProvider.histogram(activity, RESULT_CLICK_COUNT, mResultClickCount); if (mNeverEnteredQuery) { mMetricsFeatureProvider.action(activity, - MetricsProto.MetricsEvent.ACTION_LEAVE_SEARCH_RESULT_WITHOUT_QUERY); + MetricsEvent.ACTION_LEAVE_SEARCH_RESULT_WITHOUT_QUERY); } } } @@ -306,7 +309,26 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O requery(); } - public void onSearchResultClicked() { + public void onSearchResultClicked(SearchViewHolder result, String settingName, + Pair... logTaggedData) { + final List> taggedData = new ArrayList<>(); + if (logTaggedData != null) { + taggedData.addAll(Arrays.asList(logTaggedData)); + } + taggedData.add(Pair.create( + MetricsEvent.FIELD_SETTINGS_SERACH_RESULT_COUNT, + mSearchAdapter.getItemCount())); + taggedData.add(Pair.create( + MetricsEvent.FIELD_SETTINGS_SERACH_RESULT_RANK, + result.getAdapterPosition())); + taggedData.add(Pair.create( + MetricsEvent.FIELD_SETTINGS_SERACH_QUERY_LENGTH, + TextUtils.isEmpty(mQuery) ? 0 : mQuery.length())); + + mMetricsFeatureProvider.action(getContext(), + MetricsEvent.ACTION_CLICK_SETTINGS_SEARCH_RESULT, + settingName, + taggedData.toArray(new Pair[0])); mSavedQueryController.saveQuery(mQuery); mResultClickCount++; } @@ -314,7 +336,7 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O public void onSavedQueryClicked(CharSequence query) { final String queryString = query.toString(); mMetricsFeatureProvider.action(getContext(), - MetricsProto.MetricsEvent.ACTION_CLICK_SETTINGS_SEARCH_SAVED_QUERY); + MetricsEvent.ACTION_CLICK_SETTINGS_SEARCH_SAVED_QUERY); mSearchView.setQuery(queryString, false /* submit */); onQueryTextChange(queryString); } diff --git a/src/com/android/settings/search/SearchViewHolder.java b/src/com/android/settings/search/SearchViewHolder.java index 93409eec0cb..55fd5943d6a 100644 --- a/src/com/android/settings/search/SearchViewHolder.java +++ b/src/com/android/settings/search/SearchViewHolder.java @@ -59,6 +59,8 @@ public abstract class SearchViewHolder extends RecyclerView.ViewHolder { mPlaceholderSummary = view.getContext().getString(R.string.summary_placeholder); } + public abstract int getClickActionMetricName(); + public void onBind(SearchFragment fragment, SearchResult result) { titleView.setText(result.title); if (TextUtils.isEmpty(result.summary) diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java index 2d9ae9be6c9..c138070e9db 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java @@ -17,18 +17,16 @@ package com.android.settings.applications.defaultapps; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.when; - import android.app.Activity; import android.content.Context; import android.os.UserManager; import android.support.v7.preference.PreferenceScreen; +import android.util.Pair; +import com.android.internal.logging.nano.MetricsProto; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; +import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.widget.RadioButtonPreference; import org.junit.Before; @@ -43,6 +41,13 @@ import org.robolectric.annotation.Config; import java.util.ArrayList; import java.util.List; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class DefaultAppPickerFragmentTest { @@ -54,11 +59,13 @@ public class DefaultAppPickerFragmentTest { @Mock private UserManager mUserManager; + private FakeFeatureFactory mFeatureFactory; private TestFragment mFragment; @Before public void setUp() { MockitoAnnotations.initMocks(this); + mFeatureFactory = FakeFeatureFactory.setupForTest(mActivity); mFragment = spy(new TestFragment()); when(mActivity.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); @@ -68,6 +75,7 @@ public class DefaultAppPickerFragmentTest { @Test public void clickPreference_hasConfirmation_shouldShowConfirmation() { + mFragment.onAttach((Context) mActivity); final RadioButtonPreference pref = new RadioButtonPreference(RuntimeEnvironment.application); pref.setKey("TEST"); @@ -78,6 +86,17 @@ public class DefaultAppPickerFragmentTest { mFragment.onRadioButtonClicked(pref); } + @Test + public void onRadioButtonConfirmed_shouldLog() { + mFragment.onAttach((Context) mActivity); + mFragment.onRadioButtonConfirmed("test_pkg"); + + verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class), + eq(MetricsProto.MetricsEvent.ACTION_SETTINGS_UPDATE_DEFAULT_APP), + eq("test_pkg"), + any(Pair.class)); + } + public static class TestFragment extends DefaultAppPickerFragment { boolean setDefaultAppKeyCalled; diff --git a/tests/robotests/src/com/android/settings/search/DatabaseIndexingManagerTest.java b/tests/robotests/src/com/android/settings/search/DatabaseIndexingManagerTest.java index ab8891b2c69..dda5c286bba 100644 --- a/tests/robotests/src/com/android/settings/search/DatabaseIndexingManagerTest.java +++ b/tests/robotests/src/com/android/settings/search/DatabaseIndexingManagerTest.java @@ -33,19 +33,14 @@ import android.net.Uri; import android.os.Build; import android.provider.SearchIndexableResource; import android.util.ArrayMap; + import com.android.settings.R; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -import com.android.settings.search.DatabaseIndexingManager; -import com.android.settings.search.IndexDatabaseHelper; -import com.android.settings.search.IndexingCallback; -import com.android.settings.search.ResultPayload; -import com.android.settings.search.ResultPayloadUtils; -import com.android.settings.search.SearchFeatureProviderImpl; -import com.android.settings.search.SearchIndexableRaw; import com.android.settings.testutils.DatabaseTestUtils; import com.android.settings.testutils.shadow.ShadowDatabaseIndexingUtils; import com.android.settings.testutils.shadow.ShadowRunnableAsyncTask; + import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -140,7 +135,7 @@ public class DatabaseIndexingManagerTest { @After public void cleanUp() { - DatabaseTestUtils.clearDb(); + DatabaseTestUtils.clearDb(mContext); } @Test diff --git a/tests/robotests/src/com/android/settings/search/DatabaseResultLoaderTest.java b/tests/robotests/src/com/android/settings/search/DatabaseResultLoaderTest.java index bcd33715c08..e29f811bf7e 100644 --- a/tests/robotests/src/com/android/settings/search/DatabaseResultLoaderTest.java +++ b/tests/robotests/src/com/android/settings/search/DatabaseResultLoaderTest.java @@ -25,13 +25,6 @@ import android.database.sqlite.SQLiteDatabase; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.dashboard.SiteMapManager; -import com.android.settings.search.DatabaseIndexingUtils; -import com.android.settings.search.DatabaseResultLoader; -import com.android.settings.search.IndexDatabaseHelper; -import com.android.settings.search.InlineSwitchPayload; -import com.android.settings.search.ResultPayload; -import com.android.settings.search.ResultPayloadUtils; -import com.android.settings.search.SearchResult; import com.android.settings.testutils.DatabaseTestUtils; import com.android.settings.testutils.FakeFeatureFactory; @@ -81,7 +74,7 @@ public class DatabaseResultLoaderTest { @After public void cleanUp() { - DatabaseTestUtils.clearDb(); + DatabaseTestUtils.clearDb(mContext); } @Test diff --git a/tests/robotests/src/com/android/settings/search/DynamicIndexableContentMonitorTest.java b/tests/robotests/src/com/android/settings/search/DynamicIndexableContentMonitorTest.java index 8d585e515de..753a512a57a 100644 --- a/tests/robotests/src/com/android/settings/search/DynamicIndexableContentMonitorTest.java +++ b/tests/robotests/src/com/android/settings/search/DynamicIndexableContentMonitorTest.java @@ -16,20 +16,6 @@ package com.android.settings.search; -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyBoolean; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.only; -import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - import android.accessibilityservice.AccessibilityServiceInfo; import android.app.Activity; import android.app.Application; @@ -91,6 +77,19 @@ import java.util.Collection; import java.util.Collections; import java.util.List; +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyBoolean; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.only; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + @RunWith(SettingsRobolectricTestRunner.class) @Config( manifest = TestConfig.MANIFEST_PATH, @@ -163,7 +162,7 @@ public class DynamicIndexableContentMonitorTest { DynamicIndexableContentMonitor.resetForTesting(); mRobolectricPackageManager.reset(); - DatabaseTestUtils.clearDb(); + DatabaseTestUtils.clearDb(mActivity); } @Test diff --git a/tests/robotests/src/com/android/settings/search/InlineSwitchViewHolderTest.java b/tests/robotests/src/com/android/settings/search/InlineSwitchViewHolderTest.java index 65d99f4256e..ce483a42e85 100644 --- a/tests/robotests/src/com/android/settings/search/InlineSwitchViewHolderTest.java +++ b/tests/robotests/src/com/android/settings/search/InlineSwitchViewHolderTest.java @@ -19,10 +19,8 @@ package com.android.settings.search; import android.content.Context; import android.graphics.drawable.Drawable; -import android.util.Pair; import android.view.LayoutInflater; -import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; @@ -42,8 +40,6 @@ import java.util.ArrayList; 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; import static org.mockito.Mockito.when; @RunWith(SettingsRobolectricTestRunner.class) @@ -98,10 +94,6 @@ public class InlineSwitchViewHolderTest { mHolder.switchView.performClick(); - verify(mFeatureFactory.metricsFeatureProvider).action( - any(Context.class), - eq(MetricsProto.MetricsEvent.ACTION_CLICK_SETTINGS_SEARCH_INLINE_RESULT), - any(Pair.class), any(Pair.class), any(Pair.class)); assertThat(mHolder.titleView.getText()).isEqualTo(TITLE); assertThat(mHolder.summaryView.getText()).isEqualTo(SUMMARY); assertThat(mHolder.iconView.getDrawable()).isEqualTo(mIcon); diff --git a/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java b/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java index ee1c913b699..ba1408f7759 100644 --- a/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java +++ b/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java @@ -21,18 +21,12 @@ 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; -import com.android.settings.search.IntentSearchViewHolder; -import com.android.settings.search.ResultPayload; -import com.android.settings.search.SearchFragment; -import com.android.settings.search.SearchResult; import com.android.settings.search.SearchResult.Builder; import com.android.settings.testutils.FakeFeatureFactory; @@ -51,6 +45,7 @@ import java.util.Objects; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.verify; @@ -102,12 +97,8 @@ public class IntentSearchViewHolderTest { assertThat(mHolder.summaryView.getVisibility()).isEqualTo(View.VISIBLE); assertThat(mHolder.breadcrumbView.getVisibility()).isEqualTo(View.GONE); - verify(mFragment).onSearchResultClicked(); + verify(mFragment).onSearchResultClicked(eq(mHolder), anyString()); verify(mFragment).startActivity(any(Intent.class)); - verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class), - eq(MetricsProto.MetricsEvent.ACTION_CLICK_SETTINGS_SEARCH_RESULT), - eq(((ResultPayload)result.payload).getIntent().getComponent().flattenToString()), - any(Pair.class)); } @Test diff --git a/tests/robotests/src/com/android/settings/search/SavedQueryLoaderTest.java b/tests/robotests/src/com/android/settings/search/SavedQueryLoaderTest.java index 522236063d3..943fa7e7e08 100644 --- a/tests/robotests/src/com/android/settings/search/SavedQueryLoaderTest.java +++ b/tests/robotests/src/com/android/settings/search/SavedQueryLoaderTest.java @@ -59,7 +59,7 @@ public class SavedQueryLoaderTest { @After public void cleanUp() { - DatabaseTestUtils.clearDb(); + DatabaseTestUtils.clearDb(mContext); } @Test diff --git a/tests/robotests/src/com/android/settings/search/SavedQueryRecorderAndRemoverTest.java b/tests/robotests/src/com/android/settings/search/SavedQueryRecorderAndRemoverTest.java index 5037626fb51..e60d21a1d62 100644 --- a/tests/robotests/src/com/android/settings/search/SavedQueryRecorderAndRemoverTest.java +++ b/tests/robotests/src/com/android/settings/search/SavedQueryRecorderAndRemoverTest.java @@ -22,10 +22,6 @@ import android.content.Context; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -import com.android.settings.search.SavedQueryLoader; -import com.android.settings.search.SavedQueryRecorder; -import com.android.settings.search.SavedQueryRemover; -import com.android.settings.search.SearchResult; import com.android.settings.testutils.DatabaseTestUtils; import org.junit.After; @@ -54,7 +50,7 @@ public class SavedQueryRecorderAndRemoverTest { @After public void cleanUp() { - DatabaseTestUtils.clearDb(); + DatabaseTestUtils.clearDb(mContext); } @Test diff --git a/tests/robotests/src/com/android/settings/search/SearchFragmentTest.java b/tests/robotests/src/com/android/settings/search/SearchFragmentTest.java index 94dc2332c94..07b007cedf4 100644 --- a/tests/robotests/src/com/android/settings/search/SearchFragmentTest.java +++ b/tests/robotests/src/com/android/settings/search/SearchFragmentTest.java @@ -21,18 +21,22 @@ import android.app.LoaderManager; import android.content.Context; import android.content.Loader; import android.os.Bundle; +import android.util.Pair; 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; +import com.android.settings.testutils.DatabaseTestUtils; import com.android.settings.testutils.FakeFeatureFactory; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Answers; +import org.mockito.ArgumentMatcher; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; @@ -44,8 +48,10 @@ import org.robolectric.util.ReflectionHelpers; import java.util.List; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.argThat; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -79,6 +85,11 @@ public class SearchFragmentTest { mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext); } + @After + public void tearDown() { + DatabaseTestUtils.clearDb(RuntimeEnvironment.application); + } + @Test public void screenRotate_shouldPersistQuery() { when(mFeatureFactory.searchFeatureProvider @@ -353,12 +364,12 @@ public class SearchFragmentTest { @Test public void onIndexingFinished_noActivity_shouldNotCrash() { ActivityController activityController = - Robolectric.buildActivity(SearchActivity.class); + Robolectric.buildActivity(SearchActivity.class); activityController.setup(); SearchFragment fragment = (SearchFragment) spy(activityController.get().getFragmentManager() - .findFragmentById(R.id.main_content)); + .findFragmentById(R.id.main_content)); when(mFeatureFactory.searchFeatureProvider.isIndexingComplete(any(Context.class))) - .thenReturn(true); + .thenReturn(true); fragment.mQuery = "bright"; ReflectionHelpers.setField(fragment, "mLoaderManager", null); ReflectionHelpers.setField(fragment, "mHost", null); @@ -366,4 +377,29 @@ public class SearchFragmentTest { fragment.onIndexingFinished(); // no crash } + + @Test + public void onSearchResultClicked_shouldLogResultMeta() { + SearchFragment fragment = new SearchFragment(); + ReflectionHelpers.setField(fragment, "mMetricsFeatureProvider", + mFeatureFactory.metricsFeatureProvider); + ReflectionHelpers.setField(fragment, "mSearchAdapter", mock(SearchResultsAdapter.class)); + fragment.mSavedQueryController = mock(SavedQueryController.class); + + // Should log result name, result count, clicked rank, etc. + final SearchViewHolder result = mock(SearchViewHolder.class); + fragment.onSearchResultClicked(result, "test_setting"); + + verify(mFeatureFactory.metricsFeatureProvider).action( + nullable(Context.class), + eq(MetricsProto.MetricsEvent.ACTION_CLICK_SETTINGS_SEARCH_RESULT), + eq("test_setting"), + argThat(pairMatches(MetricsProto.MetricsEvent.FIELD_SETTINGS_SERACH_RESULT_COUNT)), + argThat(pairMatches(MetricsProto.MetricsEvent.FIELD_SETTINGS_SERACH_RESULT_RANK)), + argThat(pairMatches(MetricsProto.MetricsEvent.FIELD_SETTINGS_SERACH_QUERY_LENGTH))); + } + + private ArgumentMatcher> pairMatches(int tag) { + return pair -> pair.first == tag; + } } diff --git a/tests/robotests/src/com/android/settings/search/SiteMapManagerTest.java b/tests/robotests/src/com/android/settings/search/SiteMapManagerTest.java index 2e585ac9474..b0a5b003283 100644 --- a/tests/robotests/src/com/android/settings/search/SiteMapManagerTest.java +++ b/tests/robotests/src/com/android/settings/search/SiteMapManagerTest.java @@ -80,7 +80,7 @@ public class SiteMapManagerTest { @After public void cleanUp() { - DatabaseTestUtils.clearDb(); + DatabaseTestUtils.clearDb(mContext); } @Test diff --git a/tests/robotests/src/com/android/settings/testutils/DatabaseTestUtils.java b/tests/robotests/src/com/android/settings/testutils/DatabaseTestUtils.java index 8fbe1c9ff39..7472996e036 100644 --- a/tests/robotests/src/com/android/settings/testutils/DatabaseTestUtils.java +++ b/tests/robotests/src/com/android/settings/testutils/DatabaseTestUtils.java @@ -16,13 +16,18 @@ package com.android.settings.testutils; +import android.content.Context; + import com.android.settings.search.IndexDatabaseHelper; import java.lang.reflect.Field; public class DatabaseTestUtils { - public static void clearDb() { + public static void clearDb(Context context) { + IndexDatabaseHelper helper = IndexDatabaseHelper.getInstance(context); + helper.close(); + Field instance; Class clazz = IndexDatabaseHelper.class; try { diff --git a/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java b/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java index 655f35428bc..56397f0f632 100644 --- a/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java +++ b/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java @@ -16,20 +16,6 @@ package com.android.settings.webview; -import static android.provider.Settings.ACTION_WEBVIEW_SETTINGS; -import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import android.app.Activity; import android.content.Context; import android.content.Intent; @@ -44,6 +30,8 @@ import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.applications.PackageManagerWrapper; import com.android.settings.applications.defaultapps.DefaultAppInfo; +import com.android.settings.core.instrumentation.MetricsFeatureProvider; +import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.widget.RadioButtonPreference; import org.junit.Before; @@ -58,6 +46,20 @@ import org.robolectric.util.ReflectionHelpers; import java.util.Arrays; +import static android.provider.Settings.ACTION_WEBVIEW_SETTINGS; +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class WebViewAppPickerTest { @@ -87,6 +89,7 @@ public class WebViewAppPickerTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); + FakeFeatureFactory.setupForTest(mActivity); when(mActivity.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); mPicker = new WebViewAppPicker(); @@ -96,7 +99,8 @@ public class WebViewAppPickerTest { doReturn(mActivity).when(mPicker).getActivity(); ReflectionHelpers.setField(mPicker, "mPm", mPackageManager); - + ReflectionHelpers.setField(mPicker, "mMetricsFeatureProvider", + mock(MetricsFeatureProvider.class)); mWvusWrapper = mock(WebViewUpdateServiceWrapper.class); mPicker.setWebViewUpdateServiceWrapper(mWvusWrapper); } diff --git a/tests/robotests/src/com/android/settings/widget/RadioButtonPickerFragmentTest.java b/tests/robotests/src/com/android/settings/widget/RadioButtonPickerFragmentTest.java index e6d00b38ee3..b0889b46806 100644 --- a/tests/robotests/src/com/android/settings/widget/RadioButtonPickerFragmentTest.java +++ b/tests/robotests/src/com/android/settings/widget/RadioButtonPickerFragmentTest.java @@ -16,12 +16,6 @@ package com.android.settings.widget; -import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import android.app.Activity; import android.content.Context; import android.os.UserManager; @@ -30,7 +24,7 @@ import android.support.v7.preference.PreferenceScreen; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.applications.defaultapps.DefaultAppInfo; -import com.android.settings.applications.defaultapps.DefaultAppPickerFragment; +import com.android.settings.testutils.FakeFeatureFactory; import org.junit.Before; import org.junit.Test; @@ -44,6 +38,12 @@ import org.robolectric.annotation.Config; import java.util.ArrayList; import java.util.List; +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class RadioButtonPickerFragmentTest { @@ -61,6 +61,7 @@ public class RadioButtonPickerFragmentTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); + FakeFeatureFactory.setupForTest(mActivity); mFragment = spy(new TestFragment()); when(mActivity.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); @@ -72,7 +73,6 @@ public class RadioButtonPickerFragmentTest { public void onAttach_userIsInitialized() { mFragment.onAttach((Context) mActivity); - verify(mActivity).getPackageManager(); verify(mActivity).getSystemService(Context.USER_SERVICE); } @@ -99,7 +99,7 @@ public class RadioButtonPickerFragmentTest { assertThat(mFragment.setDefaultKeyCalled).isTrue(); } - public static class TestFragment extends DefaultAppPickerFragment { + public static class TestFragment extends RadioButtonPickerFragment { boolean setDefaultKeyCalled;