diff --git a/src/com/android/settings/slices/SliceBroadcastReceiver.java b/src/com/android/settings/slices/SliceBroadcastReceiver.java index 06b1b62e369..2d6f83e0b62 100644 --- a/src/com/android/settings/slices/SliceBroadcastReceiver.java +++ b/src/com/android/settings/slices/SliceBroadcastReceiver.java @@ -32,10 +32,13 @@ import android.os.Handler; import android.provider.SettingsSlicesContract; import android.text.TextUtils; import android.util.Log; +import android.util.Pair; +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.core.BasePreferenceController; import com.android.settings.core.SliderPreferenceController; import com.android.settings.core.TogglePreferenceController; +import com.android.settings.overlay.FeatureFactory; import androidx.slice.core.SliceHints; @@ -92,7 +95,7 @@ public class SliceBroadcastReceiver extends BroadcastReceiver { } if (!controller.isAvailable()) { - Log.d(TAG, "Can't update " + key + " since the setting is unavailable"); + Log.w(TAG, "Can't update " + key + " since the setting is unavailable"); updateUri(context, key, isPlatformSlice); } @@ -100,7 +103,9 @@ public class SliceBroadcastReceiver extends BroadcastReceiver { // so that it's automatically broadcast to any slice. final TogglePreferenceController toggleController = (TogglePreferenceController) controller; final boolean currentValue = toggleController.isChecked(); - toggleController.setChecked(!currentValue); + final boolean newValue = !currentValue; + toggleController.setChecked(newValue); + logSliceValueChange(context, key, newValue ? 1 : 0); updateUri(context, key, isPlatformSlice); } @@ -129,6 +134,20 @@ public class SliceBroadcastReceiver extends BroadcastReceiver { } sliderController.setSliderPosition(newPosition); + logSliceValueChange(context, key, newPosition); + } + + /** + * Log Slice value update events into MetricsFeatureProvider. The logging schema generally + * follows the pattern in SharedPreferenceLogger. + */ + private void logSliceValueChange(Context context, String sliceKey, int newValue) { + final Pair namePair = Pair.create( + MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME, sliceKey); + final Pair valuePair = Pair.create( + MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE, newValue); + FeatureFactory.getFactory(context).getMetricsFeatureProvider() + .action(context, MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED, namePair, valuePair); } private BasePreferenceController getPreferenceController(Context context, String key) { diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java index af9a3363421..adb8ec66764 100644 --- a/src/com/android/settings/slices/SliceBuilderUtils.java +++ b/src/com/android/settings/slices/SliceBuilderUtils.java @@ -16,6 +16,7 @@ package com.android.settings.slices; +import static androidx.slice.builders.ListBuilder.ICON_IMAGE; import static com.android.settings.core.BasePreferenceController.DISABLED_DEPENDENT_SETTING; import static com.android.settings.core.BasePreferenceController.DISABLED_FOR_USER; import static com.android.settings.core.BasePreferenceController.DISABLED_UNSUPPORTED; @@ -23,8 +24,6 @@ import static com.android.settings.core.BasePreferenceController.UNAVAILABLE_UNK import static com.android.settings.slices.SettingsSliceProvider.EXTRA_SLICE_KEY; import static com.android.settings.slices.SettingsSliceProvider.EXTRA_SLICE_PLATFORM_DEFINED; -import static androidx.slice.builders.ListBuilder.ICON_IMAGE; - import android.app.PendingIntent; import android.content.ContentResolver; import android.content.Context; @@ -37,17 +36,19 @@ import android.text.TextUtils; import android.util.Pair; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.SubSettings; import com.android.settings.core.BasePreferenceController; import com.android.settings.core.SliderPreferenceController; import com.android.settings.core.TogglePreferenceController; +import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.DatabaseIndexingUtils; import com.android.settingslib.core.AbstractPreferenceController; import androidx.slice.Slice; -import androidx.slice.builders.SliceAction; import androidx.slice.builders.ListBuilder; +import androidx.slice.builders.SliceAction; /** @@ -67,7 +68,12 @@ public class SliceBuilderUtils { */ public static Slice buildSlice(Context context, SliceData sliceData) { final BasePreferenceController controller = getPreferenceController(context, sliceData); - + final Pair sliceNamePair = + Pair.create(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME, sliceData.getKey()); + // Log Slice requests using the same schema as SharedPreferenceLogger (but with a different + // action name). + FeatureFactory.getFactory(context).getMetricsFeatureProvider() + .action(context, MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED, sliceNamePair); if (!controller.isAvailable()) { return buildUnavailableSlice(context, sliceData, controller); } diff --git a/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java b/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java index 525ecc7b344..fdd77e86eb3 100644 --- a/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java +++ b/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java @@ -18,12 +18,16 @@ package com.android.settings.slices; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.database.sqlite.SQLiteDatabase; +import android.util.Pair; +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.search.FakeIndexProvider; import com.android.settings.search.SearchFeatureProvider; import com.android.settings.search.SearchFeatureProviderImpl; @@ -37,6 +41,7 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.robolectric.RuntimeEnvironment; import androidx.slice.core.SliceHints; @@ -56,6 +61,8 @@ public class SliceBroadcastReceiverTest { private SliceBroadcastReceiver mReceiver; private SearchFeatureProvider mSearchFeatureProvider; private FakeFeatureFactory mFakeFeatureFactory; + private ArgumentCaptor> mLoggingNameArgumentCatpor; + private ArgumentCaptor> mLoggingValueArgumentCatpor; @Before public void setUp() { @@ -67,6 +74,8 @@ public class SliceBroadcastReceiverTest { mSearchFeatureProvider = new SearchFeatureProviderImpl(); mFakeFeatureFactory = FakeFeatureFactory.setupForTest(); mFakeFeatureFactory.searchFeatureProvider = mSearchFeatureProvider; + mLoggingNameArgumentCatpor = ArgumentCaptor.forClass(Pair.class); + mLoggingValueArgumentCatpor = ArgumentCaptor.forClass(Pair.class); } @After @@ -75,8 +84,8 @@ public class SliceBroadcastReceiverTest { } @Test - public void testOnReceive_toggleChanged() { - String key = "key"; + public void onReceive_toggleChanged() { + final String key = "key"; mSearchFeatureProvider.getSearchIndexableResources().getProviderValues().clear(); insertSpecialCase(key); // Turn on toggle setting @@ -91,11 +100,25 @@ public class SliceBroadcastReceiverTest { mReceiver.onReceive(mContext, intent); assertThat(fakeToggleController.isChecked()).isFalse(); + verify(mFakeFeatureFactory.metricsFeatureProvider) + .action(eq(mContext), + eq(MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED), + mLoggingNameArgumentCatpor.capture(), + mLoggingValueArgumentCatpor.capture()); + + final Pair namePair = mLoggingNameArgumentCatpor.getValue(); + final Pair valuePair = mLoggingValueArgumentCatpor.getValue(); + assertThat(namePair.first).isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME); + assertThat(namePair.second).isEqualTo(fakeToggleController.getPreferenceKey()); + + assertThat(valuePair.first) + .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE); + assertThat(valuePair.second).isEqualTo(0); } @Test - public void testOnReceive_sliderChanged() { - String key = "key"; + public void onReceive_sliderChanged() { + final String key = "key"; final int position = FakeSliderController.MAX_STEPS - 1; final int oldPosition = FakeSliderController.MAX_STEPS; mSearchFeatureProvider.getSearchIndexableResources().getProviderValues().clear(); @@ -115,11 +138,25 @@ public class SliceBroadcastReceiverTest { mReceiver.onReceive(mContext, intent); assertThat(fakeSliderController.getSliderPosition()).isEqualTo(position); + verify(mFakeFeatureFactory.metricsFeatureProvider) + .action(eq(mContext), + eq(MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED), + mLoggingNameArgumentCatpor.capture(), + mLoggingValueArgumentCatpor.capture()); + + final Pair namePair = mLoggingNameArgumentCatpor.getValue(); + final Pair valuePair = mLoggingValueArgumentCatpor.getValue(); + assertThat(namePair.first).isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME); + assertThat(namePair.second).isEqualTo(key); + + assertThat(valuePair.first) + .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE); + assertThat(valuePair.second).isEqualTo(position); } @Test(expected = IllegalArgumentException.class) - public void testOnReceive_invalidController_throwsException() { - String key = "key"; + public void onReceive_invalidController_throwsException() { + final String key = "key"; final int position = 0; mSearchFeatureProvider.getSearchIndexableResources().getProviderValues().clear(); insertSpecialCase(FakeToggleController.class, key); @@ -136,23 +173,23 @@ public class SliceBroadcastReceiverTest { @Test(expected = IllegalArgumentException.class) public void sliderOnReceive_noKey_throwsException() { // Build action - Intent intent = new Intent(SettingsSliceProvider.ACTION_SLIDER_CHANGED); - intent.putExtra(SliceHints.EXTRA_RANGE_VALUE, 0); + final Intent intent = new Intent(SettingsSliceProvider.ACTION_SLIDER_CHANGED) + .putExtra(SliceHints.EXTRA_RANGE_VALUE, 0); // Trigger the exception. mReceiver.onReceive(mContext, intent); } - @Test(expected = IllegalStateException.class) + @Test(expected = IllegalStateException.class) public void toggleOnReceive_noExtra_illegalStateException() { - Intent intent = new Intent(SettingsSliceProvider.ACTION_TOGGLE_CHANGED); + final Intent intent = new Intent(SettingsSliceProvider.ACTION_TOGGLE_CHANGED); mReceiver.onReceive(mContext, intent); } - @Test(expected = IllegalStateException.class) + @Test(expected = IllegalStateException.class) public void toggleOnReceive_emptyKey_throwsIllegalStateException() { - Intent intent = new Intent(SettingsSliceProvider.ACTION_TOGGLE_CHANGED); - intent.putExtra(SettingsSliceProvider.EXTRA_SLICE_KEY, (String) null); + final Intent intent = new Intent(SettingsSliceProvider.ACTION_TOGGLE_CHANGED) + .putExtra(SettingsSliceProvider.EXTRA_SLICE_KEY, (String) null); mReceiver.onReceive(mContext, intent); } diff --git a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java index d21fc05ffd1..df6be443114 100644 --- a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java +++ b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java @@ -17,9 +17,10 @@ package com.android.settings.slices; import static com.google.common.truth.Truth.assertThat; - +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; import android.content.ContentResolver; import android.content.Context; @@ -28,8 +29,10 @@ import android.provider.Settings; import android.provider.SettingsSlicesContract; import android.util.Pair; +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; +import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeSliderController; import com.android.settings.testutils.FakeToggleController; import com.android.settings.testutils.SettingsRobolectricTestRunner; @@ -37,6 +40,7 @@ import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.robolectric.RuntimeEnvironment; import androidx.slice.Slice; @@ -58,10 +62,14 @@ public class SliceBuilderUtilsTest { private final String ACTION_PATH = SettingsSlicesContract.PATH_SETTING_ACTION + "/" + KEY; private Context mContext; + private FakeFeatureFactory mFeatureFactory; + private ArgumentCaptor> mLoggingArgumentCatpor; @Before public void setUp() { mContext = RuntimeEnvironment.application; + mFeatureFactory = FakeFeatureFactory.setupForTest(); + mLoggingArgumentCatpor = ArgumentCaptor.forClass(Pair.class); } @Test @@ -73,67 +81,76 @@ public class SliceBuilderUtilsTest { @Test public void testSliderSlice_returnsSeekBarSlice() { - final Slice slice = SliceBuilderUtils.buildSlice(mContext, getDummyData( - FakeSliderController.class)); + final SliceData data = getDummyData(FakeSliderController.class); + final Slice slice = SliceBuilderUtils.buildSlice(mContext, data); + verify(mFeatureFactory.metricsFeatureProvider) + .action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED), + mLoggingArgumentCatpor.capture()); + final Pair capturedLoggingPair = mLoggingArgumentCatpor.getValue(); + + assertThat(capturedLoggingPair.first) + .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME); + assertThat(capturedLoggingPair.second) + .isEqualTo(data.getKey()); assertThat(slice).isNotNull(); } @Test public void testUriBuilder_oemAuthority_intentPath_returnsValidSliceUri() { - Uri expectedUri = new Uri.Builder() + final Uri expectedUri = new Uri.Builder() .scheme(ContentResolver.SCHEME_CONTENT) .authority(SettingsSliceProvider.SLICE_AUTHORITY) .appendPath(INTENT_PATH) .build(); - Uri actualUri = SliceBuilderUtils.getUri(INTENT_PATH, false); + final Uri actualUri = SliceBuilderUtils.getUri(INTENT_PATH, false); assertThat(actualUri).isEqualTo(expectedUri); } @Test public void testUriBuilder_oemAuthority_actionPath_returnsValidSliceUri() { - Uri expectedUri = new Uri.Builder() + final Uri expectedUri = new Uri.Builder() .scheme(ContentResolver.SCHEME_CONTENT) .authority(SettingsSliceProvider.SLICE_AUTHORITY) .appendPath(ACTION_PATH) .build(); - Uri actualUri = SliceBuilderUtils.getUri(ACTION_PATH, false); + final Uri actualUri = SliceBuilderUtils.getUri(ACTION_PATH, false); assertThat(actualUri).isEqualTo(expectedUri); } @Test public void testUriBuilder_platformAuthority_intentPath_returnsValidSliceUri() { - Uri expectedUri = new Uri.Builder() + final Uri expectedUri = new Uri.Builder() .scheme(ContentResolver.SCHEME_CONTENT) .authority(SettingsSlicesContract.AUTHORITY) .appendPath(ACTION_PATH) .build(); - Uri actualUri = SliceBuilderUtils.getUri(ACTION_PATH, true); + final Uri actualUri = SliceBuilderUtils.getUri(ACTION_PATH, true); assertThat(actualUri).isEqualTo(expectedUri); } @Test public void testUriBuilder_platformAuthority_actionPath_returnsValidSliceUri() { - Uri expectedUri = new Uri.Builder() + final Uri expectedUri = new Uri.Builder() .scheme(ContentResolver.SCHEME_CONTENT) .authority(SettingsSlicesContract.AUTHORITY) .appendPath(ACTION_PATH) .build(); - Uri actualUri = SliceBuilderUtils.getUri(ACTION_PATH, true); + final Uri actualUri = SliceBuilderUtils.getUri(ACTION_PATH, true); assertThat(actualUri).isEqualTo(expectedUri); } @Test public void testGetPreferenceController_buildsMatchingController() { - BasePreferenceController controller = + final BasePreferenceController controller = SliceBuilderUtils.getPreferenceController(mContext, getDummyData()); assertThat(controller).isInstanceOf(FakeToggleController.class); @@ -141,7 +158,7 @@ public class SliceBuilderUtilsTest { @Test public void testGetPreferenceController_contextOnly_buildsMatchingController() { - BasePreferenceController controller = + final BasePreferenceController controller = SliceBuilderUtils.getPreferenceController(mContext, getDummyData(PREF_CONTROLLER2)); assertThat(controller).isInstanceOf(FakeContextOnlyPreferenceController.class); @@ -149,50 +166,52 @@ public class SliceBuilderUtilsTest { @Test public void testDynamicSummary_returnsSliceSummary() { - SliceData data = getDummyData(); - FakePreferenceController controller = new FakePreferenceController(mContext, KEY); + final SliceData data = getDummyData(); + final FakePreferenceController controller = new FakePreferenceController(mContext, KEY); - CharSequence summary = SliceBuilderUtils.getSubtitleText(mContext, controller, data); + final CharSequence summary = SliceBuilderUtils.getSubtitleText(mContext, controller, data); assertThat(summary).isEqualTo(data.getSummary()); } @Test public void testDynamicSummary_returnsFragmentSummary() { - SliceData data = getDummyData((String) null); - FakePreferenceController controller = spy(new FakePreferenceController(mContext, KEY)); - String controllerSummary = "new_Summary"; + final SliceData data = getDummyData((String) null); + final FakePreferenceController controller = spy( + new FakePreferenceController(mContext, KEY)); + final String controllerSummary = "new_Summary"; doReturn(controllerSummary).when(controller).getSummary(); - CharSequence summary = SliceBuilderUtils.getSubtitleText(mContext, controller, data); + final CharSequence summary = SliceBuilderUtils.getSubtitleText(mContext, controller, data); assertThat(summary).isEqualTo(controllerSummary); } @Test public void testDynamicSummary_returnsSliceScreenTitle() { - SliceData data = getDummyData((String) null); - FakePreferenceController controller = new FakePreferenceController(mContext, KEY); + final SliceData data = getDummyData((String) null); + final FakePreferenceController controller = new FakePreferenceController(mContext, KEY); - CharSequence summary = SliceBuilderUtils.getSubtitleText(mContext, controller, data); + final CharSequence summary = SliceBuilderUtils.getSubtitleText(mContext, controller, data); assertThat(summary).isEqualTo(data.getScreenTitle()); } @Test public void testDynamicSummary_placeHolderString_returnsScreenTitle() { - SliceData data = getDummyData(mContext.getString(R.string.summary_placeholder)); - FakePreferenceController controller = new FakePreferenceController(mContext, KEY); - CharSequence summary = SliceBuilderUtils.getSubtitleText(mContext, controller, data); + final SliceData data = getDummyData(mContext.getString(R.string.summary_placeholder)); + final FakePreferenceController controller = new FakePreferenceController(mContext, KEY); + final CharSequence summary = SliceBuilderUtils.getSubtitleText(mContext, controller, data); assertThat(summary).isEqualTo(data.getScreenTitle()); } @Test public void testDynamicSummary_sliceDataAndFragmentPlaceholder_returnsSliceScreenTitle() { - String summaryPlaceholder = mContext.getString(R.string.summary_placeholder); - SliceData data = getDummyData(summaryPlaceholder); - FakePreferenceController controller = spy(new FakePreferenceController(mContext, KEY)); + final String summaryPlaceholder = mContext.getString(R.string.summary_placeholder); + final SliceData data = getDummyData(summaryPlaceholder); + final FakePreferenceController controller = spy( + new FakePreferenceController(mContext, KEY)); doReturn(summaryPlaceholder).when(controller).getSummary(); CharSequence summary = SliceBuilderUtils.getSubtitleText(mContext, controller, data); @@ -202,13 +221,13 @@ public class SliceBuilderUtilsTest { @Test public void getPathData_splitsIntentUri() { - Uri uri = new Uri.Builder() + final Uri uri = new Uri.Builder() .authority(SettingsSliceProvider.SLICE_AUTHORITY) .appendPath(SettingsSlicesContract.PATH_SETTING_INTENT) .appendPath(KEY) .build(); - Pair pathPair = SliceBuilderUtils.getPathData(uri); + final Pair pathPair = SliceBuilderUtils.getPathData(uri); assertThat(pathPair.first).isFalse(); assertThat(pathPair.second).isEqualTo(KEY); @@ -216,13 +235,13 @@ public class SliceBuilderUtilsTest { @Test public void getPathData_splitsActionUri() { - Uri uri = new Uri.Builder() + final Uri uri = new Uri.Builder() .authority(SettingsSliceProvider.SLICE_AUTHORITY) .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION) .appendPath(KEY) .build(); - Pair pathPair = SliceBuilderUtils.getPathData(uri); + final Pair pathPair = SliceBuilderUtils.getPathData(uri); assertThat(pathPair.first).isTrue(); assertThat(pathPair.second).isEqualTo(KEY); @@ -230,7 +249,7 @@ public class SliceBuilderUtilsTest { @Test(expected = IllegalArgumentException.class) public void getPathData_noKey_returnsNull() { - Uri uri = new Uri.Builder() + final Uri uri = new Uri.Builder() .authority(SettingsSliceProvider.SLICE_AUTHORITY) .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION) .build(); @@ -240,14 +259,14 @@ public class SliceBuilderUtilsTest { @Test public void getPathData_extraArg_returnsNull() { - Uri uri = new Uri.Builder() + final Uri uri = new Uri.Builder() .authority(SettingsSliceProvider.SLICE_AUTHORITY) .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION) .appendPath(KEY) .appendPath(KEY) .build(); - Pair pathPair = SliceBuilderUtils.getPathData(uri); + final Pair pathPair = SliceBuilderUtils.getPathData(uri); assertThat(pathPair.first).isTrue(); assertThat(pathPair.second).isEqualTo(KEY + "/" + KEY); @@ -255,49 +274,68 @@ public class SliceBuilderUtilsTest { @Test public void testUnsupportedSlice_validTitleSummary() { - SliceData data = getDummyData(FakeUnavailablePreferenceController.class.getName()); + final SliceData data = getDummyData(FakeUnavailablePreferenceController.class.getName()); Settings.System.putInt(mContext.getContentResolver(), FakeUnavailablePreferenceController.AVAILABILITY_KEY, BasePreferenceController.DISABLED_UNSUPPORTED); - Slice slice = SliceBuilderUtils.buildSlice(mContext, data); + final Slice slice = SliceBuilderUtils.buildSlice(mContext, data); assertThat(slice).isNotNull(); } @Test public void testDisabledForUserSlice_validTitleSummary() { - SliceData data = getDummyData(FakeUnavailablePreferenceController.class.getName()); + final SliceData data = getDummyData(FakeUnavailablePreferenceController.class.getName()); Settings.System.putInt(mContext.getContentResolver(), FakeUnavailablePreferenceController.AVAILABILITY_KEY, BasePreferenceController.DISABLED_FOR_USER); - Slice slice = SliceBuilderUtils.buildSlice(mContext, data); + final Slice slice = SliceBuilderUtils.buildSlice(mContext, data); assertThat(slice).isNotNull(); } @Test public void testDisabledDependententSettingSlice_validTitleSummary() { - SliceData data = getDummyData(FakeUnavailablePreferenceController.class.getName()); + final SliceData data = getDummyData(FakeUnavailablePreferenceController.class.getName()); Settings.System.putInt(mContext.getContentResolver(), FakeUnavailablePreferenceController.AVAILABILITY_KEY, BasePreferenceController.DISABLED_DEPENDENT_SETTING); - Slice slice = SliceBuilderUtils.buildSlice(mContext, data); + final Slice slice = SliceBuilderUtils.buildSlice(mContext, data); + verify(mFeatureFactory.metricsFeatureProvider) + .action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED), + mLoggingArgumentCatpor.capture()); + final Pair capturedLoggingPair = mLoggingArgumentCatpor.getValue(); + + assertThat(capturedLoggingPair.first) + .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME); + assertThat(capturedLoggingPair.second) + .isEqualTo(data.getKey()); assertThat(slice).isNotNull(); } @Test public void testUnavailableUnknownSlice_validTitleSummary() { - SliceData data = getDummyData(FakeUnavailablePreferenceController.class.getName()); + final SliceData data = getDummyData(FakeUnavailablePreferenceController.class.getName()); Settings.System.putInt(mContext.getContentResolver(), FakeUnavailablePreferenceController.AVAILABILITY_KEY, BasePreferenceController.UNAVAILABLE_UNKNOWN); - Slice slice = SliceBuilderUtils.buildSlice(mContext, data); + final Slice slice = SliceBuilderUtils.buildSlice(mContext, data); + verify(mFeatureFactory.metricsFeatureProvider) + .action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED), + mLoggingArgumentCatpor.capture()); + + final Pair capturedLoggingPair = mLoggingArgumentCatpor.getValue(); + + assertThat(capturedLoggingPair.first) + .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME); + assertThat(capturedLoggingPair.second) + .isEqualTo(data.getKey()); assertThat(slice).isNotNull(); }