Support slice deep links highlighting menu entries

- Add an interface to get highlight menu key resource in Sliceable
- Force implementing the new interface in TogglePreferenceController and
  CustomSliceable at syntax level
- Update the slice index db schema

Bug: 204695404
Test: manual, robotest build pass, unit
Change-Id: I0b5068bccd04f1590023de7f3385bc0a4c6fa47b
diff --git a/src/com/android/settings/core/TogglePreferenceController.java b/src/com/android/settings/core/TogglePreferenceController.java
index c958a93..8b4d6d9 100644
--- a/src/com/android/settings/core/TogglePreferenceController.java
+++ b/src/com/android/settings/core/TogglePreferenceController.java
@@ -89,4 +89,7 @@
     public boolean isPublicSlice() {
         return false;
     }
+
+    @Override
+    public abstract int getSliceHighlightMenuRes();
 }
\ No newline at end of file
diff --git a/src/com/android/settings/slices/CustomSliceable.java b/src/com/android/settings/slices/CustomSliceable.java
index d06ad1e..2c807c4 100644
--- a/src/com/android/settings/slices/CustomSliceable.java
+++ b/src/com/android/settings/slices/CustomSliceable.java
@@ -103,6 +103,9 @@
         return true;
     }
 
+    @Override
+    int getSliceHighlightMenuRes();
+
     /**
      * Build an instance of a {@link CustomSliceable} which has a {@link Context}-only constructor.
      */
diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java
index 2957df2..4cefa4e 100644
--- a/src/com/android/settings/slices/SliceBuilderUtils.java
+++ b/src/com/android/settings/slices/SliceBuilderUtils.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.slices;
 
+import static android.provider.Settings.EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_HIGHLIGHT_MENU_KEY;
+
 import static com.android.settings.SettingsActivity.EXTRA_IS_FROM_SLICE;
 import static com.android.settings.core.BasePreferenceController.DISABLED_DEPENDENT_SETTING;
 import static com.android.settings.slices.SettingsSliceProvider.EXTRA_SLICE_KEY;
@@ -203,8 +205,15 @@
     }
 
     public static Intent buildSearchResultPageIntent(Context context, String className, String key,
-            String screenTitle, int sourceMetricsCategory) {
+            String screenTitle, int sourceMetricsCategory, int highlightMenuRes) {
         final Bundle args = new Bundle();
+        String highlightMenuKey = null;
+        if (highlightMenuRes != 0) {
+            highlightMenuKey = context.getString(highlightMenuRes);
+            if (TextUtils.isEmpty(highlightMenuKey)) {
+                Log.w(TAG, "Invalid menu key res from: " + screenTitle);
+            }
+        }
         args.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, key);
         final Intent searchDestination = new SubSettingLauncher(context)
                 .setDestination(className)
@@ -215,6 +224,7 @@
         searchDestination
                 .putExtra(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, key)
                 .putExtra(EXTRA_IS_FROM_SLICE, true)
+                .putExtra(EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_HIGHLIGHT_MENU_KEY, highlightMenuKey)
                 .setAction("com.android.settings.SEARCH_RESULT_TRAMPOLINE")
                 .setComponent(null);
         searchDestination.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -222,13 +232,22 @@
         return searchDestination;
     }
 
+    /**
+     * Build a search result page intent for {@link CustomSliceable}
+     */
+    public static Intent buildSearchResultPageIntent(Context context, String className, String key,
+            String screenTitle, int sourceMetricsCategory, CustomSliceable sliceable) {
+        return buildSearchResultPageIntent(context, className, key, screenTitle,
+                sourceMetricsCategory, sliceable.getSliceHighlightMenuRes());
+    }
+
     public static Intent getContentIntent(Context context, SliceData sliceData) {
         final Uri contentUri = new Uri.Builder().appendPath(sliceData.getKey()).build();
         final String screenTitle = TextUtils.isEmpty(sliceData.getScreenTitle()) ? null
                 : sliceData.getScreenTitle().toString();
         final Intent intent = buildSearchResultPageIntent(context,
                 sliceData.getFragmentClassName(), sliceData.getKey(),
-                screenTitle, 0 /* TODO */);
+                screenTitle, 0 /* TODO */, sliceData.getHighlightMenuRes());
         intent.setClassName(context.getPackageName(), SubSettings.class.getName());
         intent.setData(contentUri);
         return intent;
diff --git a/src/com/android/settings/slices/SliceData.java b/src/com/android/settings/slices/SliceData.java
index 60f5e3f..01b29b2 100644
--- a/src/com/android/settings/slices/SliceData.java
+++ b/src/com/android/settings/slices/SliceData.java
@@ -19,6 +19,7 @@
 import android.annotation.IntDef;
 import android.net.Uri;
 import android.text.TextUtils;
+import android.util.Log;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -50,6 +51,8 @@
         int SLIDER = 2;
     }
 
+    private static final String TAG = "SliceData";
+
     private final String mKey;
 
     private final String mTitle;
@@ -68,6 +71,8 @@
 
     private final String mPreferenceController;
 
+    private final int mHighlightMenuRes;
+
     @SliceType
     private final int mSliceType;
 
@@ -119,6 +124,10 @@
         return mUnavailableSliceSubtitle;
     }
 
+    public int getHighlightMenuRes() {
+        return mHighlightMenuRes;
+    }
+
     public boolean isPublicSlice() {
         return mIsPublicSlice;
     }
@@ -136,6 +145,7 @@
         mSliceType = builder.mSliceType;
         mUnavailableSliceSubtitle = builder.mUnavailableSliceSubtitle;
         mIsPublicSlice = builder.mIsPublicSlice;
+        mHighlightMenuRes = builder.mHighlightMenuRes;
     }
 
     @Override
@@ -175,6 +185,8 @@
 
         private String mUnavailableSliceSubtitle;
 
+        private int mHighlightMenuRes;
+
         private boolean mIsPublicSlice;
 
         public Builder setKey(String key) {
@@ -233,6 +245,11 @@
             return this;
         }
 
+        public Builder setHighlightMenuRes(int highlightMenuRes) {
+            mHighlightMenuRes = highlightMenuRes;
+            return this;
+        }
+
         public Builder setIsPublicSlice(boolean isPublicSlice) {
             mIsPublicSlice = isPublicSlice;
             return this;
@@ -255,6 +272,10 @@
                 throw new InvalidSliceDataException("Preference Controller cannot be empty");
             }
 
+            if (mHighlightMenuRes == 0) {
+                Log.w(TAG, "Highlight menu key res is empty: " + mPrefControllerClassName);
+            }
+
             return new SliceData(this);
         }
 
diff --git a/src/com/android/settings/slices/SliceDataConverter.java b/src/com/android/settings/slices/SliceDataConverter.java
index 5608169..eb08c5f 100644
--- a/src/com/android/settings/slices/SliceDataConverter.java
+++ b/src/com/android/settings/slices/SliceDataConverter.java
@@ -213,6 +213,7 @@
                 final String unavailableSliceSubtitle = bundle.getString(
                         METADATA_UNAVAILABLE_SLICE_SUBTITLE);
                 final boolean isPublicSlice = controller.isPublicSlice();
+                final int highlightMenuRes = controller.getSliceHighlightMenuRes();
 
                 final SliceData xmlSlice = new SliceData.Builder()
                         .setKey(key)
@@ -226,6 +227,7 @@
                         .setSliceType(sliceType)
                         .setUnavailableSliceSubtitle(unavailableSliceSubtitle)
                         .setIsPublicSlice(isPublicSlice)
+                        .setHighlightMenuRes(highlightMenuRes)
                         .build();
 
                 xmlSliceData.add(xmlSlice);
diff --git a/src/com/android/settings/slices/Sliceable.java b/src/com/android/settings/slices/Sliceable.java
index ad27b7c..31555df 100644
--- a/src/com/android/settings/slices/Sliceable.java
+++ b/src/com/android/settings/slices/Sliceable.java
@@ -50,6 +50,8 @@
      * - Must be understandable as a stand-alone Setting.
      * <p>
      * This does not guarantee the setting is available.
+     * <p>
+     * {@link #getSliceHighlightMenuRes} should also be overridden when returning true.
      *
      * @return {@code true} if the controller should be used as a Slice.
      */
@@ -131,4 +133,12 @@
     default Class<? extends SliceBackgroundWorker> getBackgroundWorkerClass() {
         return null;
     }
+
+    /**
+     * @return a resource ID that indicates which menu entry should be highlighted in multi-pane
+     * mode.
+     */
+    default int getSliceHighlightMenuRes() {
+        return 0;
+    }
 }
diff --git a/src/com/android/settings/slices/SlicesDatabaseAccessor.java b/src/com/android/settings/slices/SlicesDatabaseAccessor.java
index c0bb8de..75f0220 100644
--- a/src/com/android/settings/slices/SlicesDatabaseAccessor.java
+++ b/src/com/android/settings/slices/SlicesDatabaseAccessor.java
@@ -50,6 +50,7 @@
             IndexColumns.CONTROLLER,
             IndexColumns.SLICE_TYPE,
             IndexColumns.UNAVAILABLE_SLICE_SUBTITLE,
+            IndexColumns.HIGHLIGHT_MENU_RESOURCE,
     };
 
     private final Context mContext;
@@ -163,6 +164,8 @@
                 cursor.getColumnIndex(IndexColumns.SLICE_TYPE));
         final String unavailableSliceSubtitle = cursor.getString(
                 cursor.getColumnIndex(IndexColumns.UNAVAILABLE_SLICE_SUBTITLE));
+        final int highlightMenuRes = cursor.getInt(
+                cursor.getColumnIndex(IndexColumns.HIGHLIGHT_MENU_RESOURCE));
 
         if (isIntentOnly) {
             sliceType = SliceData.SliceType.INTENT;
@@ -180,6 +183,7 @@
                 .setUri(uri)
                 .setSliceType(sliceType)
                 .setUnavailableSliceSubtitle(unavailableSliceSubtitle)
+                .setHighlightMenuRes(highlightMenuRes)
                 .build();
     }
 
diff --git a/src/com/android/settings/slices/SlicesDatabaseHelper.java b/src/com/android/settings/slices/SlicesDatabaseHelper.java
index fe4420b..69ad702 100644
--- a/src/com/android/settings/slices/SlicesDatabaseHelper.java
+++ b/src/com/android/settings/slices/SlicesDatabaseHelper.java
@@ -36,7 +36,7 @@
     private static final String DATABASE_NAME = "slices_index.db";
     private static final String SHARED_PREFS_TAG = "slices_shared_prefs";
 
-    private static final int DATABASE_VERSION = 8;
+    private static final int DATABASE_VERSION = 9;
 
     public interface Tables {
         String TABLE_SLICES_INDEX = "slices_index";
@@ -103,39 +103,43 @@
          * Whether the slice should be exposed publicly.
          */
         String PUBLIC_SLICE = "public_slice";
+
+        /**
+         * Resource ID for the menu entry of the setting.
+         */
+        String HIGHLIGHT_MENU_RESOURCE = "highlight_menu";
     }
 
     private static final String CREATE_SLICES_TABLE =
-            "CREATE VIRTUAL TABLE " + Tables.TABLE_SLICES_INDEX + " USING fts4" +
-                    "(" +
-                    IndexColumns.KEY +
-                    ", " +
-                    IndexColumns.SLICE_URI +
-                    ", " +
-                    IndexColumns.TITLE +
-                    ", " +
-                    IndexColumns.SUMMARY +
-                    ", " +
-                    IndexColumns.SCREENTITLE +
-                    ", " +
-                    IndexColumns.KEYWORDS +
-                    ", " +
-                    IndexColumns.ICON_RESOURCE +
-                    ", " +
-                    IndexColumns.FRAGMENT +
-                    ", " +
-                    IndexColumns.CONTROLLER +
-                    ", " +
-                    IndexColumns.SLICE_TYPE +
-                    ", " +
-                    IndexColumns.UNAVAILABLE_SLICE_SUBTITLE +
-                    ", "
-                    +
-                    IndexColumns.PUBLIC_SLICE
-                    +
-                    " INTEGER DEFAULT 0 "
-                    +
-                    ");";
+            "CREATE VIRTUAL TABLE " + Tables.TABLE_SLICES_INDEX + " USING fts4"
+                    + "("
+                    + IndexColumns.KEY
+                    + ", "
+                    + IndexColumns.SLICE_URI
+                    + ", "
+                    + IndexColumns.TITLE
+                    + ", "
+                    + IndexColumns.SUMMARY
+                    + ", "
+                    + IndexColumns.SCREENTITLE
+                    + ", "
+                    + IndexColumns.KEYWORDS
+                    + ", "
+                    + IndexColumns.ICON_RESOURCE
+                    + ", "
+                    + IndexColumns.FRAGMENT
+                    + ", "
+                    + IndexColumns.CONTROLLER
+                    + ", "
+                    + IndexColumns.SLICE_TYPE
+                    + ", "
+                    + IndexColumns.UNAVAILABLE_SLICE_SUBTITLE
+                    + ", "
+                    + IndexColumns.PUBLIC_SLICE
+                    + ", "
+                    + IndexColumns.HIGHLIGHT_MENU_RESOURCE
+                    + " INTEGER DEFAULT 0 "
+                    + ");";
 
     private final Context mContext;
 
diff --git a/src/com/android/settings/slices/SlicesIndexer.java b/src/com/android/settings/slices/SlicesIndexer.java
index e527fd6..ac30c6c 100644
--- a/src/com/android/settings/slices/SlicesIndexer.java
+++ b/src/com/android/settings/slices/SlicesIndexer.java
@@ -116,6 +116,7 @@
             values.put(IndexColumns.UNAVAILABLE_SLICE_SUBTITLE,
                     dataRow.getUnavailableSliceSubtitle());
             values.put(IndexColumns.PUBLIC_SLICE, dataRow.isPublicSlice());
+            values.put(IndexColumns.HIGHLIGHT_MENU_RESOURCE, dataRow.getHighlightMenuRes());
 
             database.replaceOrThrow(Tables.TABLE_SLICES_INDEX, null /* nullColumnHack */,
                     values);
diff --git a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
index c2c67e3..c7a4b2f 100644
--- a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
@@ -707,6 +707,7 @@
                 .setIcon(SliceTestUtils.FAKE_ICON)
                 .setFragmentName(SliceTestUtils.FAKE_FRAGMENT_NAME)
                 .setPreferenceControllerClassName(SliceTestUtils.FAKE_CONTROLLER_NAME)
+                .setHighlightMenuRes(SliceTestUtils.FAKE_HIGHLIGHT_MENU_RES)
                 .build();
     }
 
diff --git a/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java b/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java
index df3d84f..a880681 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java
@@ -322,6 +322,8 @@
         values.put(SlicesDatabaseHelper.IndexColumns.FRAGMENT, SliceTestUtils.FAKE_FRAGMENT_NAME);
         values.put(SlicesDatabaseHelper.IndexColumns.CONTROLLER, controllerClass);
         values.put(SlicesDatabaseHelper.IndexColumns.SLICE_URI, buildUri(key).toSafeString());
+        values.put(SlicesDatabaseHelper.IndexColumns.HIGHLIGHT_MENU_RESOURCE,
+                SliceTestUtils.FAKE_HIGHLIGHT_MENU_RES);
         mDb.replaceOrThrow(SlicesDatabaseHelper.Tables.TABLE_SLICES_INDEX, null, values);
     }
 
diff --git a/tests/robotests/src/com/android/settings/slices/SliceTestUtils.java b/tests/robotests/src/com/android/settings/slices/SliceTestUtils.java
index 1c9164a..97beeb3 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceTestUtils.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceTestUtils.java
@@ -35,6 +35,7 @@
     public static final int FAKE_ICON = 1234;
     public static final String FAKE_FRAGMENT_NAME = FakeIndexProvider.class.getName();
     public static final String FAKE_CONTROLLER_NAME = FakeToggleController.class.getName();
+    public static final int FAKE_HIGHLIGHT_MENU_RES = FakeToggleController.HIGHLIGHT_MENU_RES;
 
 
     public static void insertSliceToDb(Context context, String key) {
@@ -75,6 +76,8 @@
         values.put(SlicesDatabaseHelper.IndexColumns.UNAVAILABLE_SLICE_SUBTITLE,
                 customizedUnavailableSliceSubtitle);
         values.put(SlicesDatabaseHelper.IndexColumns.PUBLIC_SLICE, isPublicSlice);
+        values.put(SlicesDatabaseHelper.IndexColumns.HIGHLIGHT_MENU_RESOURCE,
+                FAKE_HIGHLIGHT_MENU_RES);
 
         db.replaceOrThrow(SlicesDatabaseHelper.Tables.TABLE_SLICES_INDEX, null, values);
         db.close();
diff --git a/tests/robotests/src/com/android/settings/slices/SlicesDatabaseAccessorTest.java b/tests/robotests/src/com/android/settings/slices/SlicesDatabaseAccessorTest.java
index b4385d8..cacd32c 100644
--- a/tests/robotests/src/com/android/settings/slices/SlicesDatabaseAccessorTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SlicesDatabaseAccessorTest.java
@@ -102,6 +102,7 @@
         assertThat(data.getFragmentClassName()).isEqualTo(SliceTestUtils.FAKE_FRAGMENT_NAME);
         assertThat(data.getUri()).isNull();
         assertThat(data.getPreferenceController()).isEqualTo(SliceTestUtils.FAKE_CONTROLLER_NAME);
+        assertThat(data.getHighlightMenuRes()).isEqualTo(SliceTestUtils.FAKE_HIGHLIGHT_MENU_RES);
         assertThat(data.getUnavailableSliceSubtitle()).isNull();
     }
 
@@ -122,6 +123,7 @@
         assertThat(data.getFragmentClassName()).isEqualTo(SliceTestUtils.FAKE_FRAGMENT_NAME);
         assertThat(data.getUri()).isNull();
         assertThat(data.getPreferenceController()).isEqualTo(SliceTestUtils.FAKE_CONTROLLER_NAME);
+        assertThat(data.getHighlightMenuRes()).isEqualTo(SliceTestUtils.FAKE_HIGHLIGHT_MENU_RES);
     }
 
     @Test(expected = IllegalStateException.class)
@@ -154,6 +156,7 @@
         assertThat(data.getFragmentClassName()).isEqualTo(SliceTestUtils.FAKE_FRAGMENT_NAME);
         assertThat(data.getUri()).isEqualTo(uri);
         assertThat(data.getPreferenceController()).isEqualTo(SliceTestUtils.FAKE_CONTROLLER_NAME);
+        assertThat(data.getHighlightMenuRes()).isEqualTo(SliceTestUtils.FAKE_HIGHLIGHT_MENU_RES);
     }
 
     @Test(expected = IllegalStateException.class)
@@ -289,6 +292,7 @@
         assertThat(data.getFragmentClassName()).isEqualTo(SliceTestUtils.FAKE_FRAGMENT_NAME);
         assertThat(data.getUri()).isNull();
         assertThat(data.getPreferenceController()).isEqualTo(SliceTestUtils.FAKE_CONTROLLER_NAME);
+        assertThat(data.getHighlightMenuRes()).isEqualTo(SliceTestUtils.FAKE_HIGHLIGHT_MENU_RES);
         assertThat(data.getUnavailableSliceSubtitle()).isNull();
     }
 
@@ -309,6 +313,7 @@
         assertThat(data.getFragmentClassName()).isEqualTo(SliceTestUtils.FAKE_FRAGMENT_NAME);
         assertThat(data.getUri()).isNull();
         assertThat(data.getPreferenceController()).isEqualTo(SliceTestUtils.FAKE_CONTROLLER_NAME);
+        assertThat(data.getHighlightMenuRes()).isEqualTo(SliceTestUtils.FAKE_HIGHLIGHT_MENU_RES);
         assertThat(data.getUnavailableSliceSubtitle()).isEqualTo(subtitle);
     }
 
diff --git a/tests/robotests/src/com/android/settings/slices/SlicesIndexerTest.java b/tests/robotests/src/com/android/settings/slices/SlicesIndexerTest.java
index a943ac0..f025d3d 100644
--- a/tests/robotests/src/com/android/settings/slices/SlicesIndexerTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SlicesIndexerTest.java
@@ -43,17 +43,18 @@
 @RunWith(RobolectricTestRunner.class)
 public class SlicesIndexerTest {
 
-    private final String[] KEYS = new String[]{"key1", "key2", "key3"};
-    private final String[] TITLES = new String[]{"title1", "title2", "title3"};
-    private final String SUMMARY = "subtitle";
-    private final String SCREEN_TITLE = "screen title";
-    private final String KEYWORDS = "a, b, c";
-    private final String FRAGMENT_NAME = "fragment name";
-    private final int ICON = 1234; // I declare a thumb war
-    private final Uri URI = Uri.parse("content://com.android.settings.slices/test");
-    private final String PREF_CONTROLLER = "com.android.settings.slices.tester";
-    private final int SLICE_TYPE = SliceData.SliceType.SLIDER;
-    private final String UNAVAILABLE_SLICE_SUBTITLE = "subtitleOfUnavailableSlice";
+    private static final String[] KEYS = new String[]{"key1", "key2", "key3"};
+    private static final String[] TITLES = new String[]{"title1", "title2", "title3"};
+    private static final String SUMMARY = "subtitle";
+    private static final String SCREEN_TITLE = "screen title";
+    private static final String KEYWORDS = "a, b, c";
+    private static final String FRAGMENT_NAME = "fragment name";
+    private static final int ICON = 1234; // I declare a thumb war
+    private static final Uri URI = Uri.parse("content://com.android.settings.slices/test");
+    private static final String PREF_CONTROLLER = "com.android.settings.slices.tester";
+    private static final int SLICE_TYPE = SliceData.SliceType.SLIDER;
+    private static final String UNAVAILABLE_SLICE_SUBTITLE = "subtitleOfUnavailableSlice";
+    private static final int HIGHLIGHT_MENU_KEY = 5678; // I declare a thumb war
 
     private Context mContext;
 
@@ -142,6 +143,9 @@
                         .isEqualTo(UNAVAILABLE_SLICE_SUBTITLE);
                 assertThat(cursor.getInt(
                         cursor.getColumnIndex(IndexColumns.PUBLIC_SLICE))).isEqualTo(0);
+                assertThat(cursor.getInt(
+                        cursor.getColumnIndex(IndexColumns.HIGHLIGHT_MENU_RESOURCE)))
+                        .isEqualTo(HIGHLIGHT_MENU_KEY);
                 cursor.moveToNext();
             }
         } finally {
@@ -187,6 +191,9 @@
                         .isEqualTo(UNAVAILABLE_SLICE_SUBTITLE);
                 assertThat(cursor.getInt(
                         cursor.getColumnIndex(IndexColumns.PUBLIC_SLICE))).isEqualTo(1);
+                assertThat(cursor.getInt(
+                        cursor.getColumnIndex(IndexColumns.HIGHLIGHT_MENU_RESOURCE)))
+                        .isEqualTo(HIGHLIGHT_MENU_KEY);
                 cursor.moveToNext();
             }
         } finally {
@@ -220,7 +227,8 @@
                 .setUri(URI)
                 .setPreferenceControllerClassName(PREF_CONTROLLER)
                 .setSliceType(SLICE_TYPE)
-                .setUnavailableSliceSubtitle(UNAVAILABLE_SLICE_SUBTITLE);
+                .setUnavailableSliceSubtitle(UNAVAILABLE_SLICE_SUBTITLE)
+                .setHighlightMenuRes(HIGHLIGHT_MENU_KEY);
 
         if (isPublicSlice) {
             builder.setIsPublicSlice(true);
diff --git a/tests/robotests/src/com/android/settings/testutils/FakeToggleController.java b/tests/robotests/src/com/android/settings/testutils/FakeToggleController.java
index 6812451..4e968a2 100644
--- a/tests/robotests/src/com/android/settings/testutils/FakeToggleController.java
+++ b/tests/robotests/src/com/android/settings/testutils/FakeToggleController.java
@@ -27,6 +27,7 @@
 public class FakeToggleController extends TogglePreferenceController {
 
     public static final String AVAILABILITY_KEY = "fake_toggle_availability_key";
+    public static final int HIGHLIGHT_MENU_RES = 5678;
 
     public static final IntentFilter INTENT_FILTER = new IntentFilter(
             WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
@@ -71,6 +72,11 @@
     }
 
     @Override
+    public int getSliceHighlightMenuRes() {
+        return HIGHLIGHT_MENU_RES;
+    }
+
+    @Override
     public Class<? extends SliceBackgroundWorker> getBackgroundWorkerClass() {
         return TestWorker.class;
     }
diff --git a/tests/unit/src/com/android/settings/core/TogglePreferenceControllerTest.java b/tests/unit/src/com/android/settings/core/TogglePreferenceControllerTest.java
index 8817a17..13e8c13 100644
--- a/tests/unit/src/com/android/settings/core/TogglePreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/core/TogglePreferenceControllerTest.java
@@ -120,6 +120,11 @@
         }
 
         @Override
+        public int getSliceHighlightMenuRes() {
+            return 5678;
+        }
+
+        @Override
         public int getAvailabilityStatus() {
             return AVAILABLE;
         }
diff --git a/tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java b/tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java
index 7d43230..df6a38b 100644
--- a/tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java
+++ b/tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java
@@ -302,6 +302,11 @@
         public Intent getIntent() {
             return new Intent();
         }
+
+        @Override
+        public int getSliceHighlightMenuRes() {
+            return 0;
+        }
     }
 
     private class MockProviderModelSliceHelper extends ProviderModelSliceHelper {
diff --git a/tests/unit/src/com/android/settings/slices/SliceTestUtils.java b/tests/unit/src/com/android/settings/slices/SliceTestUtils.java
index 1b035cd..40a827a 100644
--- a/tests/unit/src/com/android/settings/slices/SliceTestUtils.java
+++ b/tests/unit/src/com/android/settings/slices/SliceTestUtils.java
@@ -35,6 +35,7 @@
     public static final int FAKE_ICON = 1234;
     public static final String FAKE_FRAGMENT_NAME = FakeIndexProvider.class.getName();
     public static final String FAKE_CONTROLLER_NAME = FakeToggleController.class.getName();
+    public static final int FAKE_HIGHLIGHT_MENU_RES = FakeToggleController.HIGHLIGHT_MENU_RES;
 
 
     public static void insertSliceToDb(Context context, String key) {
@@ -75,6 +76,8 @@
         values.put(SlicesDatabaseHelper.IndexColumns.UNAVAILABLE_SLICE_SUBTITLE,
                 customizedUnavailableSliceSubtitle);
         values.put(SlicesDatabaseHelper.IndexColumns.PUBLIC_SLICE, isPublicSlice);
+        values.put(SlicesDatabaseHelper.IndexColumns.HIGHLIGHT_MENU_RESOURCE,
+                FAKE_HIGHLIGHT_MENU_RES);
 
         db.replaceOrThrow(SlicesDatabaseHelper.Tables.TABLE_SLICES_INDEX, null, values);
         db.close();
diff --git a/tests/unit/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java b/tests/unit/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java
index 4fcbd15..490b7bd 100644
--- a/tests/unit/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java
+++ b/tests/unit/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java
@@ -143,5 +143,10 @@
         public Intent getIntent() {
             return null;
         }
+
+        @Override
+        public int getSliceHighlightMenuRes() {
+            return 0;
+        }
     }
 }
diff --git a/tests/unit/src/com/android/settings/testutils/FakeToggleController.java b/tests/unit/src/com/android/settings/testutils/FakeToggleController.java
index 9eda8b6..c232479 100644
--- a/tests/unit/src/com/android/settings/testutils/FakeToggleController.java
+++ b/tests/unit/src/com/android/settings/testutils/FakeToggleController.java
@@ -27,6 +27,7 @@
 public class FakeToggleController extends TogglePreferenceController {
 
     public static final String AVAILABILITY_KEY = "fake_toggle_availability_key";
+    public static final int HIGHLIGHT_MENU_RES = 5678;
 
     public static final IntentFilter INTENT_FILTER = new IntentFilter(
             WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
@@ -71,6 +72,11 @@
     }
 
     @Override
+    public int getSliceHighlightMenuRes() {
+        return HIGHLIGHT_MENU_RES;
+    }
+
+    @Override
     public Class<? extends SliceBackgroundWorker> getBackgroundWorkerClass() {
         return TestWorker.class;
     }