diff --git a/src/com/android/settings/slices/SliceBroadcastReceiver.java b/src/com/android/settings/slices/SliceBroadcastReceiver.java
index 06b1b62..2d6f83e 100644
--- a/src/com/android/settings/slices/SliceBroadcastReceiver.java
+++ b/src/com/android/settings/slices/SliceBroadcastReceiver.java
@@ -32,10 +32,13 @@
 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 @@
         }
 
         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 @@
         // 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 @@
         }
 
         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<Integer, Object> namePair = Pair.create(
+                MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME, sliceKey);
+        final Pair<Integer, Object> 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 af9a336..adb8ec6 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.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.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 static Slice buildSlice(Context context, SliceData sliceData) {
         final BasePreferenceController controller = getPreferenceController(context, sliceData);
-
+        final Pair<Integer, Object> 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 525ecc7..fdd77e8 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.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 @@
     private SliceBroadcastReceiver mReceiver;
     private SearchFeatureProvider mSearchFeatureProvider;
     private FakeFeatureFactory mFakeFeatureFactory;
+    private ArgumentCaptor<Pair<Integer, Object>> mLoggingNameArgumentCatpor;
+    private ArgumentCaptor<Pair<Integer, Object>> mLoggingValueArgumentCatpor;
 
     @Before
     public void setUp() {
@@ -67,6 +74,8 @@
         mSearchFeatureProvider = new SearchFeatureProviderImpl();
         mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
         mFakeFeatureFactory.searchFeatureProvider = mSearchFeatureProvider;
+        mLoggingNameArgumentCatpor = ArgumentCaptor.forClass(Pair.class);
+        mLoggingValueArgumentCatpor = ArgumentCaptor.forClass(Pair.class);
     }
 
     @After
@@ -75,8 +84,8 @@
     }
 
     @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 @@
         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<Integer, Object> namePair = mLoggingNameArgumentCatpor.getValue();
+        final Pair<Integer, Object> 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 @@
         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<Integer, Object> namePair = mLoggingNameArgumentCatpor.getValue();
+        final Pair<Integer, Object> 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 @@
     @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 d21fc05..df6be44 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.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 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 @@
     private final String ACTION_PATH = SettingsSlicesContract.PATH_SETTING_ACTION + "/" + KEY;
 
     private Context mContext;
+    private FakeFeatureFactory mFeatureFactory;
+    private ArgumentCaptor<Pair<Integer, Object>> mLoggingArgumentCatpor;
 
     @Before
     public void setUp() {
         mContext = RuntimeEnvironment.application;
+        mFeatureFactory = FakeFeatureFactory.setupForTest();
+        mLoggingArgumentCatpor = ArgumentCaptor.forClass(Pair.class);
     }
 
     @Test
@@ -73,67 +81,76 @@
 
     @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<Integer, Object> 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 @@
 
     @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 @@
 
     @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 @@
 
     @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<Boolean, String> pathPair = SliceBuilderUtils.getPathData(uri);
+        final Pair<Boolean, String> pathPair = SliceBuilderUtils.getPathData(uri);
 
         assertThat(pathPair.first).isFalse();
         assertThat(pathPair.second).isEqualTo(KEY);
@@ -216,13 +235,13 @@
 
     @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<Boolean, String> pathPair = SliceBuilderUtils.getPathData(uri);
+        final Pair<Boolean, String> pathPair = SliceBuilderUtils.getPathData(uri);
 
         assertThat(pathPair.first).isTrue();
         assertThat(pathPair.second).isEqualTo(KEY);
@@ -230,7 +249,7 @@
 
     @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 @@
 
     @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<Boolean, String> pathPair = SliceBuilderUtils.getPathData(uri);
+        final Pair<Boolean, String> pathPair = SliceBuilderUtils.getPathData(uri);
 
         assertThat(pathPair.first).isTrue();
         assertThat(pathPair.second).isEqualTo(KEY + "/" + KEY);
@@ -255,49 +274,68 @@
 
     @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<Integer, Object> 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<Integer, Object> capturedLoggingPair = mLoggingArgumentCatpor.getValue();
+
+        assertThat(capturedLoggingPair.first)
+                .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
+        assertThat(capturedLoggingPair.second)
+                .isEqualTo(data.getKey());
         assertThat(slice).isNotNull();
     }
 
