diff --git a/res/layout/homepage_slice_tile.xml b/res/layout/homepage_slice_tile.xml
new file mode 100644
index 0000000..b947d65
--- /dev/null
+++ b/res/layout/homepage_slice_tile.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<androidx.cardview.widget.CardView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_marginTop="@dimen/homepage_card_top_margin"
+    android:layout_marginBottom="@dimen/homepage_card_bottom_margin"
+    android:layout_marginStart="@dimen/homepage_card_side_margin"
+    android:layout_marginEnd="@dimen/homepage_card_side_margin"
+    app:cardCornerRadius="@dimen/homepage_card_corner_radius"
+    app:cardElevation="@dimen/homepage_card_elevation">
+
+    <androidx.slice.widget.SliceView
+        android:id="@+id/slice_view"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingStart="@dimen/homepage_card_padding_start"
+        android:paddingEnd="@dimen/homepage_card_padding_end"
+        android:paddingTop="@dimen/homepage_card_padding_top"
+        android:paddingBottom="@dimen/homepage_card_padding_bottom"/>
+
+</androidx.cardview.widget.CardView>
diff --git a/res/layout/switch_bar.xml b/res/layout/switch_bar.xml
index e305f9d..8cb6f51 100644
--- a/res/layout/switch_bar.xml
+++ b/res/layout/switch_bar.xml
@@ -38,7 +38,8 @@
         android:tint="?android:attr/colorAccent"
         android:theme="@android:style/Theme.Material"
         android:layout_gravity="center_vertical"
-        android:layout_marginEnd="@dimen/restricted_icon_margin_end"/>
+        android:layout_marginEnd="@dimen/restricted_icon_margin_end"
+        android:visibility="gone" />
 
     <com.android.settings.widget.ToggleSwitch
         android:id="@+id/switch_widget"
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 70672ca..37b3c4b 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -340,4 +340,15 @@
     <dimen name="homepage_bottombar_top_margin">34dp</dimen>
     <dimen name="homepage_bottombar_fab_cradle">68dp</dimen>
 
+    <!-- Homepage cards size and padding -->
+    <dimen name="homepage_card_corner_radius">8dp</dimen>
+    <dimen name="homepage_card_elevation">2dp</dimen>
+    <dimen name="homepage_card_top_margin">6dp</dimen>
+    <dimen name="homepage_card_bottom_margin">6dp</dimen>
+    <dimen name="homepage_card_side_margin">16dp</dimen>
+    <dimen name="homepage_card_padding_start">16dp</dimen>
+    <dimen name="homepage_card_padding_end">16dp</dimen>
+    <dimen name="homepage_card_padding_top">6dp</dimen>
+    <dimen name="homepage_card_padding_bottom">6dp</dimen>
+
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index c99d7ad..0c3caf6 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -10068,4 +10068,10 @@
     <!-- Homepage bottom menu. Title for display personalized Settings [CHAR LIMIT=30] -->
     <string name="homepage_personal_settings">Your Settings</string>
 
+    <!-- Setting Checkbox title whether to enable CBRS data. [CHAR LIMIT=40] -->
+    <string name="cbrs_data_switch">CBRS Data</string>
+
+    <!-- Title of implications of enabling CBRS Data -->
+    <string name="cbrs_data_switch_summary">CBRS Data</string>
+
 </resources>
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index 8cc8001..5b6d215 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -234,6 +234,11 @@
             android:title="@string/usb_default_label"/>
 
         <SwitchPreference
+            android:key="cbrs_data_switch"
+            android:title="@string/cbrs_data_switch"
+            android:summary="@string/cbrs_data_switch" />
+
+        <SwitchPreference
             android:key="bluetooth_show_devices_without_names"
             android:title="@string/bluetooth_show_devices_without_names"
             android:summary="@string/bluetooth_show_devices_without_names_summary" />
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index ffce321..ea2370c 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -648,7 +648,6 @@
         PackageManager pm = getPackageManager();
         final UserManager um = UserManager.get(this);
         final boolean isAdmin = um.isAdminUser();
-        final FeatureFactory featureFactory = FeatureFactory.getFactory(this);
         boolean somethingChanged = false;
         final String packageName = getPackageName();
         final StringBuilder changedList = new StringBuilder();
@@ -661,7 +660,6 @@
                 pm.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH), isAdmin)
                 || somethingChanged;
 
-
         // Enable DataUsageSummaryActivity if the data plan feature flag is turned on otherwise
         // enable DataPlanUsageSummaryActivity.
         somethingChanged = setTileEnabled(changedList,
diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java
index eb258ac..35c6d1c 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -1335,7 +1335,8 @@
         private void updateSummary(ApplicationViewHolder holder, AppEntry entry) {
             switch (mManageApplications.mListType) {
                 case LIST_TYPE_NOTIFICATION:
-                    if (entry.extraInfo != null) {
+                    if (entry.extraInfo != null
+                            && entry.extraInfo instanceof NotificationsSentState) {
                         holder.setSummary(AppStateNotificationBridge.getSummary(mContext,
                                 (NotificationsSentState) entry.extraInfo,
                                 (mLastSortMode == R.id.sort_order_recent_notification)));
@@ -1384,7 +1385,8 @@
                                     .getSwitchOnClickListener(entry),
                             AppStateNotificationBridge.enableSwitch(entry),
                             AppStateNotificationBridge.checkSwitch(entry));
-                    if (entry.extraInfo != null) {
+                    if (entry.extraInfo != null
+                            && entry.extraInfo instanceof NotificationsSentState) {
                         holder.setSummary(AppStateNotificationBridge.getSummary(mContext,
                                 (NotificationsSentState) entry.extraInfo,
                                 (mLastSortMode == R.id.sort_order_recent_notification)));
diff --git a/src/com/android/settings/applications/manageapplications/ResetAppsHelper.java b/src/com/android/settings/applications/manageapplications/ResetAppsHelper.java
index ec4cc1e..3af3500 100644
--- a/src/com/android/settings/applications/manageapplications/ResetAppsHelper.java
+++ b/src/com/android/settings/applications/manageapplications/ResetAppsHelper.java
@@ -117,7 +117,7 @@
                 for (int i = 0; i < apps.size(); i++) {
                     ApplicationInfo app = apps.get(i);
                     try {
-                        mNm.setNotificationsEnabledForPackage(app.packageName, app.uid, true);
+                        mNm.clearData(app.packageName, app.uid, false);
                     } catch (android.os.RemoteException ex) {
                     }
                     if (!app.enabled) {
diff --git a/src/com/android/settings/development/CbrsDataSwitchPreferenceController.java b/src/com/android/settings/development/CbrsDataSwitchPreferenceController.java
new file mode 100644
index 0000000..ec1f8e0
--- /dev/null
+++ b/src/com/android/settings/development/CbrsDataSwitchPreferenceController.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.development;
+
+import android.content.Context;
+import android.util.Log;
+import android.telephony.TelephonyManager;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.SwitchPreference;
+import androidx.preference.Preference;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.development.DeveloperOptionsPreferenceController;
+
+public class CbrsDataSwitchPreferenceController extends DeveloperOptionsPreferenceController
+        implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {
+    private static final String CBRS_DATA_SWITCH_KEY = "cbrs_data_switch";
+    private static final String TAG = "CbrsDataSwitchPreferenceController";
+    private Context mContext;
+
+    private TelephonyManager mTelephonyManager;
+
+    public CbrsDataSwitchPreferenceController(Context context) {
+        super(context);
+        mContext = context;
+        mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return CBRS_DATA_SWITCH_KEY;
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return mTelephonyManager != null;
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        boolean state = (Boolean)newValue;
+        return mTelephonyManager.setAlternativeNetworkAccessState(state);
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        boolean state = mTelephonyManager.isAlternativeNetworkAccessEnabled();
+        ((SwitchPreference) mPreference).setChecked(state);
+    }
+
+}
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index 937de20..873cec4 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -460,6 +460,7 @@
         controllers.add(new FreeformWindowsPreferenceController(context));
         controllers.add(new ShortcutManagerThrottlingPreferenceController(context));
         controllers.add(new EnableGnssRawMeasFullTrackingPreferenceController(context));
+        controllers.add(new CbrsDataSwitchPreferenceController(context));
         controllers.add(new DefaultLaunchPreferenceController(context, "running_apps"));
         controllers.add(new DefaultLaunchPreferenceController(context, "demo_mode"));
         controllers.add(new DefaultLaunchPreferenceController(context, "quick_settings_tiles"));
diff --git a/src/com/android/settings/homepage/ContextualCardLookupTable.java b/src/com/android/settings/homepage/ContextualCardLookupTable.java
index e70b700..1acd812 100644
--- a/src/com/android/settings/homepage/ContextualCardLookupTable.java
+++ b/src/com/android/settings/homepage/ContextualCardLookupTable.java
@@ -19,6 +19,8 @@
 import com.android.settings.homepage.ContextualCard.CardType;
 import com.android.settings.homepage.conditional.ConditionContextualCardController;
 import com.android.settings.homepage.conditional.ConditionContextualCardRenderer;
+import com.android.settings.homepage.slices.SliceContextualCardController;
+import com.android.settings.homepage.slices.SliceContextualCardRenderer;
 
 import java.util.Set;
 import java.util.TreeSet;
@@ -50,6 +52,9 @@
                 add(new ControllerRendererMapping(CardType.CONDITIONAL,
                         ConditionContextualCardController.class,
                         ConditionContextualCardRenderer.class));
+                add(new ControllerRendererMapping(CardType.SLICE,
+                        SliceContextualCardController.class,
+                        SliceContextualCardRenderer.class));
             }};
 
     public static Class<? extends ContextualCardController> getCardControllerClass(
diff --git a/src/com/android/settings/homepage/ContextualCardsAdapter.java b/src/com/android/settings/homepage/ContextualCardsAdapter.java
index 9ab8893..81cae39 100644
--- a/src/com/android/settings/homepage/ContextualCardsAdapter.java
+++ b/src/com/android/settings/homepage/ContextualCardsAdapter.java
@@ -21,6 +21,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 
+import androidx.lifecycle.LifecycleOwner;
 import androidx.recyclerview.widget.GridLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
@@ -39,11 +40,14 @@
     private final Context mContext;
     private final ControllerRendererPool mControllerRendererPool;
     private final List<ContextualCard> mContextualCards;
+    private final LifecycleOwner mLifecycleOwner;
 
-    public ContextualCardsAdapter(Context context, ContextualCardManager manager) {
+    public ContextualCardsAdapter(Context context, LifecycleOwner lifecycleOwner,
+            ContextualCardManager manager) {
         mContext = context;
         mContextualCards = new ArrayList<>();
         mControllerRendererPool = manager.getControllerRendererPool();
+        mLifecycleOwner = lifecycleOwner;
         setHasStableIds(true);
     }
 
@@ -60,7 +64,7 @@
     @Override
     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int cardType) {
         final ContextualCardRenderer renderer = mControllerRendererPool.getRenderer(mContext,
-                cardType);
+                mLifecycleOwner, cardType);
         final int viewType = renderer.getViewType();
         final View view = LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false);
 
@@ -71,7 +75,7 @@
     public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
         final int cardType = mContextualCards.get(position).getCardType();
         final ContextualCardRenderer renderer = mControllerRendererPool.getRenderer(mContext,
-                cardType);
+                mLifecycleOwner, cardType);
 
         renderer.bindView(holder, mContextualCards.get(position));
     }
diff --git a/src/com/android/settings/homepage/ControllerRendererPool.java b/src/com/android/settings/homepage/ControllerRendererPool.java
index 1e4b37c..73f73a5 100644
--- a/src/com/android/settings/homepage/ControllerRendererPool.java
+++ b/src/com/android/settings/homepage/ControllerRendererPool.java
@@ -20,9 +20,12 @@
 import android.util.Log;
 
 import androidx.collection.ArraySet;
+import androidx.lifecycle.LifecycleOwner;
 
 import com.android.settings.homepage.conditional.ConditionContextualCardController;
 import com.android.settings.homepage.conditional.ConditionContextualCardRenderer;
+import com.android.settings.homepage.slices.SliceContextualCardController;
+import com.android.settings.homepage.slices.SliceContextualCardRenderer;
 
 import java.util.Set;
 
@@ -64,7 +67,8 @@
         return mControllers;
     }
 
-    public ContextualCardRenderer getRenderer(Context context, @ContextualCard.CardType int cardType) {
+    public ContextualCardRenderer getRenderer(Context context, LifecycleOwner lifecycleOwner,
+            @ContextualCard.CardType int cardType) {
         final Class<? extends ContextualCardRenderer> clz =
                 ContextualCardLookupTable.getCardRendererClasses(cardType);
         for (ContextualCardRenderer renderer : mRenderers) {
@@ -74,7 +78,7 @@
             }
         }
 
-        final ContextualCardRenderer renderer = createCardRenderer(context, clz);
+        final ContextualCardRenderer renderer = createCardRenderer(context, lifecycleOwner, clz);
         if (renderer != null) {
             mRenderers.add(renderer);
         }
@@ -85,15 +89,19 @@
             Class<? extends ContextualCardController> clz) {
         if (ConditionContextualCardController.class == clz) {
             return new ConditionContextualCardController(context);
+        } else if (SliceContextualCardController.class == clz) {
+            return new SliceContextualCardController();
         }
         return null;
     }
 
-    private ContextualCardRenderer createCardRenderer(Context context, Class<?> clz) {
+    private ContextualCardRenderer createCardRenderer(Context context,
+            LifecycleOwner lifecycleOwner, Class<?> clz) {
         if (ConditionContextualCardRenderer.class == clz) {
             return new ConditionContextualCardRenderer(context, this /*controllerRendererPool*/);
+        } else if (SliceContextualCardRenderer.class == clz) {
+            return new SliceContextualCardRenderer(context, lifecycleOwner);
         }
         return null;
     }
-
 }
diff --git a/src/com/android/settings/homepage/PersonalSettingsFragment.java b/src/com/android/settings/homepage/PersonalSettingsFragment.java
index 4a0041e..93c723b 100644
--- a/src/com/android/settings/homepage/PersonalSettingsFragment.java
+++ b/src/com/android/settings/homepage/PersonalSettingsFragment.java
@@ -54,7 +54,8 @@
         mLayoutManager = new GridLayoutManager(getActivity(), SPAN_COUNT,
                 GridLayoutManager.VERTICAL, false /* reverseLayout */);
         mCardsContainer.setLayoutManager(mLayoutManager);
-        mContextualCardsAdapter = new ContextualCardsAdapter(getContext(), mContextualCardManager);
+        mContextualCardsAdapter = new ContextualCardsAdapter(getContext(),
+                this /* lifecycleOwner */, mContextualCardManager);
         mCardsContainer.setAdapter(mContextualCardsAdapter);
         mContextualCardManager.setListener(mContextualCardsAdapter);
 
diff --git a/src/com/android/settings/homepage/slices/SliceContextualCardController.java b/src/com/android/settings/homepage/slices/SliceContextualCardController.java
new file mode 100644
index 0000000..e6fc283
--- /dev/null
+++ b/src/com/android/settings/homepage/slices/SliceContextualCardController.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.homepage.slices;
+
+import com.android.settings.homepage.ContextualCard;
+import com.android.settings.homepage.ContextualCardController;
+import com.android.settings.homepage.ContextualCardUpdateListener;
+
+import java.util.List;
+
+/**
+ * Card controller for {@link ContextualCard} built as slices.
+ */
+public class SliceContextualCardController implements ContextualCardController {
+
+    @Override
+    public int getCardType() {
+        return ContextualCard.CardType.SLICE;
+    }
+
+    @Override
+    public void onPrimaryClick(ContextualCard card) {
+
+    }
+
+    @Override
+    public void onActionClick(ContextualCard card) {
+
+    }
+
+    @Override
+    public void setCardUpdateListener(ContextualCardUpdateListener listener) {
+
+    }
+}
diff --git a/src/com/android/settings/homepage/slices/SliceContextualCardRenderer.java b/src/com/android/settings/homepage/slices/SliceContextualCardRenderer.java
new file mode 100644
index 0000000..705b990
--- /dev/null
+++ b/src/com/android/settings/homepage/slices/SliceContextualCardRenderer.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.homepage.slices;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.net.Uri;
+import android.util.ArrayMap;
+import android.util.Log;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.LiveData;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.slice.Slice;
+import androidx.slice.SliceItem;
+import androidx.slice.widget.EventInfo;
+import androidx.slice.widget.SliceLiveData;
+import androidx.slice.widget.SliceView;
+
+import com.android.settings.R;
+import com.android.settings.homepage.ContextualCard;
+import com.android.settings.homepage.ContextualCardRenderer;
+
+import java.util.Map;
+
+/**
+ * Card renderer for {@link ContextualCard} built as slices.
+ */
+public class SliceContextualCardRenderer implements ContextualCardRenderer,
+        SliceView.OnSliceActionListener {
+
+    private static final String TAG = "SliceCardRenderer";
+
+    @VisibleForTesting
+    final Map<String, LiveData<Slice>> mSliceLiveDataMap;
+
+    private final Context mContext;
+    private final LifecycleOwner mLifecycleOwner;
+
+    public SliceContextualCardRenderer(Context context, LifecycleOwner lifecycleOwner) {
+        mContext = context;
+        mLifecycleOwner = lifecycleOwner;
+        mSliceLiveDataMap = new ArrayMap<>();
+    }
+
+    @Override
+    public int getViewType() {
+        return R.layout.homepage_slice_tile;
+    }
+
+    @Override
+    public RecyclerView.ViewHolder createViewHolder(View view) {
+        return new SliceViewHolder(view);
+    }
+
+    @Override
+    public void bindView(RecyclerView.ViewHolder holder, ContextualCard card) {
+        final SliceViewHolder cardHolder = (SliceViewHolder) holder;
+        final Uri uri = card.getSliceUri();
+
+        //TODO(b/116063073): The URI check should be done earlier when we are performing final
+        // filtering after having the full list.
+        if (!ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) {
+            Log.w(TAG, "Invalid uri, skipping slice: " + uri);
+            return;
+        }
+
+        cardHolder.sliceView.setTag(uri);
+        //TODO(b/114009676): We will soon have a field to decide what slice mode we should set.
+        cardHolder.sliceView.setMode(SliceView.MODE_LARGE);
+        LiveData<Slice> sliceLiveData = mSliceLiveDataMap.get(uri.toString());
+
+        if (sliceLiveData == null) {
+            sliceLiveData = SliceLiveData.fromUri(mContext, uri);
+            mSliceLiveDataMap.put(uri.toString(), sliceLiveData);
+            sliceLiveData.observe(mLifecycleOwner, slice -> {
+                if (slice == null) {
+                    Log.w(TAG, "Slice is null");
+                }
+                cardHolder.sliceView.setSlice(slice);
+            });
+        }
+
+        // Set this listener so we can log the interaction users make on the slice
+        cardHolder.sliceView.setOnSliceActionListener(this);
+    }
+
+    @Override
+    public void onSliceAction(@NonNull EventInfo eventInfo, @NonNull SliceItem sliceItem) {
+        //TODO(b/79698338): Log user interaction
+    }
+
+    public static class SliceViewHolder extends RecyclerView.ViewHolder {
+        public final SliceView sliceView;
+
+        public SliceViewHolder(View view) {
+            super(view);
+            sliceView = view.findViewById(R.id.slice_view);
+        }
+    }
+}
diff --git a/src/com/android/settings/search/DeviceIndexFeatureProvider.java b/src/com/android/settings/search/DeviceIndexFeatureProvider.java
index a55fcff..f777f71 100644
--- a/src/com/android/settings/search/DeviceIndexFeatureProvider.java
+++ b/src/com/android/settings/search/DeviceIndexFeatureProvider.java
@@ -105,7 +105,7 @@
         // soon as possible.
         context.getSystemService(JobScheduler.class).schedule(
                 new JobInfo.Builder(jobId, jobComponent)
-                        .setPersisted(true)
+                        .setPersisted(false)
                         .setMinimumLatency(1000)
                         .setOverrideDeadline(1)
                         .build());
diff --git a/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceController.java b/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceController.java
index 0b50f5f..a02c0b2 100644
--- a/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceController.java
+++ b/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceController.java
@@ -93,12 +93,9 @@
         if (hapProfile != null && hfpProfile != null && device == null) {
             hfpProfile.setActiveDevice(null);
             hapProfile.setActiveDevice(null);
-            return;
-        }
-        if (hapProfile != null && hapProfile.getHiSyncId(device) != HI_SYNC_ID_INVALID) {
+        } else if (hapProfile != null && hapProfile.getHiSyncId(device) != HI_SYNC_ID_INVALID) {
             hapProfile.setActiveDevice(device);
-        }
-        if (hfpProfile != null) {
+        } else if (hfpProfile != null) {
             hfpProfile.setActiveDevice(device);
         }
     }
diff --git a/src/com/android/settings/sound/MediaOutputPreferenceController.java b/src/com/android/settings/sound/MediaOutputPreferenceController.java
index 8704243..2ac460c 100644
--- a/src/com/android/settings/sound/MediaOutputPreferenceController.java
+++ b/src/com/android/settings/sound/MediaOutputPreferenceController.java
@@ -106,12 +106,9 @@
         if (hapProfile != null && a2dpProfile != null && device == null) {
             hapProfile.setActiveDevice(null);
             a2dpProfile.setActiveDevice(null);
-            return;
-        }
-        if (hapProfile != null && hapProfile.getHiSyncId(device) != HI_SYNC_ID_INVALID) {
+        } else if (hapProfile != null && hapProfile.getHiSyncId(device) != HI_SYNC_ID_INVALID) {
             hapProfile.setActiveDevice(device);
-        }
-        if (a2dpProfile != null) {
+        } else if (a2dpProfile != null) {
             a2dpProfile.setActiveDevice(device);
         }
     }
diff --git a/src/com/android/settings/support/SupportDashboardActivity.java b/src/com/android/settings/support/SupportDashboardActivity.java
index 245810a..8703ec7 100644
--- a/src/com/android/settings/support/SupportDashboardActivity.java
+++ b/src/com/android/settings/support/SupportDashboardActivity.java
@@ -68,7 +68,6 @@
                     data.title = context.getString(R.string.page_tab_title_support);
                     data.screenTitle = context.getString(R.string.settings_label);
                     data.summaryOn = context.getString(R.string.support_summary);
-                    data.iconResId = R.drawable.ic_homepage_support;
                     data.intentTargetPackage = context.getPackageName();
                     data.intentTargetClass = SupportDashboardActivity.class.getName();
                     data.intentAction = Intent.ACTION_MAIN;
diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
index da88e54..c9ab7c0 100644
--- a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
@@ -282,6 +282,28 @@
     }
 
     @Test
+    public void applicationsAdapter_onBindViewHolder_notifications_wrongExtraInfo() {
+        when(mUserManager.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{});
+        ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
+        mFragment.mListType = LIST_TYPE_NOTIFICATION;
+        ApplicationViewHolder holder = mock(ApplicationViewHolder.class);
+        ReflectionHelpers.setField(holder, "itemView", mock(View.class));
+        ManageApplications.ApplicationsAdapter adapter =
+                new ManageApplications.ApplicationsAdapter(mState,
+                        mFragment, mock(AppFilterItem.class),
+                        mock(Bundle.class));
+        final ArrayList<ApplicationsState.AppEntry> appList = new ArrayList<>();
+        final ApplicationsState.AppEntry appEntry = mock(ApplicationsState.AppEntry.class);
+        appEntry.info = mock(ApplicationInfo.class);
+        appEntry.extraInfo = mock(AppFilterItem.class);
+        appList.add(appEntry);
+        ReflectionHelpers.setField(adapter, "mEntries", appList);
+
+        adapter.onBindViewHolder(holder, 0);
+        // no crash? yay!
+    }
+
+    @Test
     public void applicationsAdapter_onBindViewHolder_updateSwitch_notifications() {
         when(mUserManager.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{});
         ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
diff --git a/tests/robotests/src/com/android/settings/development/CbrsDataSwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/CbrsDataSwitchPreferenceControllerTest.java
new file mode 100644
index 0000000..be9b123
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/development/CbrsDataSwitchPreferenceControllerTest.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.development;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.telephony.TelephonyManager;
+
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public final class CbrsDataSwitchPreferenceControllerTest {
+
+    @Mock
+    private PreferenceScreen mPreferenceScreen;
+    private Context mContext;
+    private TelephonyManager mTelephonyManager;
+    private SwitchPreference mPreference;
+    private CbrsDataSwitchPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mController = new CbrsDataSwitchPreferenceController(mContext);
+        mPreference = new SwitchPreference(mContext);
+        when(mPreferenceScreen.findPreference(mController.getPreferenceKey()))
+            .thenReturn(mPreference);
+        mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
+        mController.displayPreference(mPreferenceScreen);
+    }
+
+    @Test
+    public void onPreferenceChanged_settingEnabled_shouldEnableANAS() {
+        mController.onPreferenceChange(mPreference, true);
+
+        assertThat(mTelephonyManager.isAlternativeNetworkAccessEnabled()).isTrue();
+    }
+
+    @Test
+    public void onPreferenceChanged_settingDisabled_shouldDisableANAS() {
+        mController.onPreferenceChange(mPreference, false);
+
+        assertThat(mTelephonyManager.isAlternativeNetworkAccessEnabled()).isFalse();
+    }
+
+    @Test
+    public void updateState_settingEnabled_shouldEnablePreference() {
+        mTelephonyManager.setAlternativeNetworkAccessState(true);
+        mController.updateState(mPreference);
+
+        assertThat(mPreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void updateState_settingDisabled_shouldDisablePreference() {
+        mTelephonyManager.setAlternativeNetworkAccessState(false);
+        mController.updateState(mPreference);
+
+        assertThat(mPreference.isChecked()).isFalse();
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/homepage/slices/SliceContextualCardRendererTest.java b/tests/robotests/src/com/android/settings/homepage/slices/SliceContextualCardRendererTest.java
new file mode 100644
index 0000000..3239971
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/homepage/slices/SliceContextualCardRendererTest.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.homepage.slices;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.settings.homepage.ContextualCard;
+import com.android.settings.homepage.PersonalSettingsFragment;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public class SliceContextualCardRendererTest {
+
+    private Context mContext;
+    private SliceContextualCardRenderer mRenderer;
+    private LifecycleOwner mLifecycleOwner;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mLifecycleOwner = new PersonalSettingsFragment();
+        mRenderer = new SliceContextualCardRenderer(mContext, mLifecycleOwner);
+    }
+
+    @Test
+    public void bindView_invalidScheme_sliceShouldBeNull() {
+        final String sliceUri = "contet://com.android.settings.slices/action/flashlight";
+        RecyclerView.ViewHolder viewHolder = getSliceViewHolder();
+
+        mRenderer.bindView(viewHolder, buildContextualCard(sliceUri));
+
+        assertThat(
+                ((SliceContextualCardRenderer.SliceViewHolder) viewHolder).sliceView.getSlice())
+                .isNull();
+    }
+
+    @Test
+    public void bindView_newSliceLiveData_shouldAddDataToMap() {
+        final String sliceUri = "content://com.android.settings.slices/action/flashlight";
+
+        mRenderer.bindView(getSliceViewHolder(), buildContextualCard(sliceUri));
+
+        assertThat(mRenderer.mSliceLiveDataMap.size()).isEqualTo(1);
+    }
+
+    @Test
+    public void bindView_sliceLiveDataShouldObserveSliceView() {
+        final String sliceUri = "content://com.android.settings.slices/action/flashlight";
+
+        mRenderer.bindView(getSliceViewHolder(), buildContextualCard(sliceUri));
+
+        assertThat(mRenderer.mSliceLiveDataMap.get(sliceUri).hasObservers()).isTrue();
+    }
+
+    private RecyclerView.ViewHolder getSliceViewHolder() {
+        final int viewType = mRenderer.getViewType();
+        final RecyclerView recyclerView = new RecyclerView(mContext);
+        recyclerView.setLayoutManager(new LinearLayoutManager(mContext));
+        final View view = LayoutInflater.from(mContext).inflate(viewType, recyclerView, false);
+        final RecyclerView.ViewHolder viewHolder = mRenderer.createViewHolder(view);
+
+        return viewHolder;
+    }
+
+    private ContextualCard buildContextualCard(String sliceUri) {
+        return new ContextualCard.Builder()
+                .setName("test_name")
+                .setSliceUri(sliceUri)
+                .build();
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceControllerTest.java
index e2fc779..58df2d2 100644
--- a/tests/robotests/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceControllerTest.java
@@ -23,6 +23,7 @@
 
 import static org.mockito.ArgumentMatchers.any;
 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;
@@ -179,6 +180,7 @@
         mController.setActiveBluetoothDevice(mLeftBluetoothHapDevice);
 
         verify(mHearingAidProfile).setActiveDevice(mLeftBluetoothHapDevice);
+        verify(mHeadsetProfile, never()).setActiveDevice(mLeftBluetoothHapDevice);
     }
 
     /**
@@ -192,6 +194,7 @@
         mController.setActiveBluetoothDevice(mBluetoothDevice);
 
         verify(mHeadsetProfile).setActiveDevice(mBluetoothDevice);
+        verify(mHearingAidProfile, never()).setActiveDevice(mBluetoothDevice);
     }
 
     /**
diff --git a/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java
index d2f5f1a..9e1ac3d 100644
--- a/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java
@@ -24,6 +24,7 @@
 
 import static org.mockito.ArgumentMatchers.any;
 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;
@@ -180,6 +181,7 @@
         mController.setActiveBluetoothDevice(mLeftBluetoothHapDevice);
 
         verify(mHearingAidProfile).setActiveDevice(mLeftBluetoothHapDevice);
+        verify(mA2dpProfile, never()).setActiveDevice(mLeftBluetoothHapDevice);
     }
 
     /**
@@ -193,6 +195,7 @@
         mController.setActiveBluetoothDevice(mBluetoothDevice);
 
         verify(mA2dpProfile).setActiveDevice(mBluetoothDevice);
+        verify(mHearingAidProfile, never()).setActiveDevice(mBluetoothDevice);
     }
 
     /**
diff --git a/tests/robotests/src/com/android/settings/testutils/SettingsRobolectricTestRunner.java b/tests/robotests/src/com/android/settings/testutils/SettingsRobolectricTestRunner.java
index 14d5c75..2e3a140 100644
--- a/tests/robotests/src/com/android/settings/testutils/SettingsRobolectricTestRunner.java
+++ b/tests/robotests/src/com/android/settings/testutils/SettingsRobolectricTestRunner.java
@@ -93,6 +93,8 @@
                 Fs.fromURL(new URL("file:out/soong/.intermediates/prebuilts/sdk/current/extras/material-design-x/com.google.android.material_material-nodeps/android_common/aar/res/")), null));
             paths.add(new ResourcePath(null,
                 Fs.fromURL(new URL("file:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.cardview_cardview-nodeps/android_common/aar/res")), null));
+            paths.add(new ResourcePath(null,
+                Fs.fromURL(new URL("file:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.slice_slice-view-nodeps/android_common/aar/res")), null));
         } catch (MalformedURLException e) {
             throw new RuntimeException("SettingsRobolectricTestRunner failure", e);
         }
diff --git a/tests/uitests/AndroidManifest.xml b/tests/uitests/AndroidManifest.xml
index 91e15b8..49a2fd1 100644
--- a/tests/uitests/AndroidManifest.xml
+++ b/tests/uitests/AndroidManifest.xml
@@ -28,6 +28,7 @@
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
     <uses-permission android:name="android.permission.READ_LOGS" />
     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
+    <uses-permission android:name="android.permission.READ_SEARCH_INDEXABLES"/>
 
     <instrumentation
             android:name="android.support.test.runner.AndroidJUnitRunner"
diff --git a/tests/uitests/assets/search_results_list b/tests/uitests/assets/search_results_list
new file mode 100644
index 0000000..a0cc894
--- /dev/null
+++ b/tests/uitests/assets/search_results_list
@@ -0,0 +1,623 @@
+AP Band;wifi_tether_network_ap_band
+About phone;my_device_info_pref_screen
+Accessibility;accessibility_settings_screen
+Accessibility;top_level_accessibility
+Accounts;top_level_accounts
+Accounts;user_and_account_settings_screen
+Active Edge;gesture_assist_application
+Active Edge;gesture_assist_input_summary
+Active Edge;gesture_assist_settings_page
+Adaptive Battery;smart_battery_detail
+Adaptive Battery;smart_battery_manager
+Adaptive brightness;auto_brightness
+Adaptive brightness;auto_brightness_entry
+Add an account;add_account_screen
+Add rule;zen_mode_add_automatic_rule
+Add user or profile;user_add
+Add users from lock screen;security_lockscreen_add_users_when_locked
+Add users from lock screen;user_settings_add_users_when_locked
+Additional system updates;additional_system_update_settings
+Admin can delete all device data;enterprise_privacy_wipe_device
+Admin can lock the device and reset password;enterprise_privacy_lock_device
+Airplane mode;toggle_airplane
+Alarm volume;alarm_volume
+Alarms;zen_mode_alarms
+Allow calls;zen_mode_calls
+Allow events;zen_mode_events
+Allow messages;zen_mode_messages
+Allow notification dots;notification_badging
+Allow reminders;zen_mode_reminders
+Allow repeat callers;zen_mode_repeat_callers
+Allow when screen is off;gesture_assist_wake
+Also vibrate for calls;vibrate_when_ringing
+Always on;ambient_display_always_on
+Always show crash dialog;show_first_crash_dialog
+Always-on VPN turned on in your work profile;always_on_vpn_managed_profile
+Amount of time and data spent in each app;enterprise_privacy_usage_stats
+Android Beam;android_beam_settings
+Android version;my_device_firmware_version
+Animator duration scale;animator_duration_scale
+App data usage cycle;billing_cycle
+App info;all_app_info
+App permissions;manage_perms
+App-level permissions;app_level_permissions
+Apps;debug_applications_category
+Apps & app data;storage_settings_apps_space
+Apps & notifications;apps_and_notification_screen
+Apps & notifications;top_level_apps_and_notifs
+Apps installed;number_enterprise_installed_packages
+Assist & voice input;assist_and_voice_input
+Assist & voice input;manage_assist_screen
+Assist app;default_assist
+Audio & on-screen text;audio_and_captions_category
+Audio (music, ringtones, podcasts, etc.);storage_settings_music_space
+Auto-rotate screen;auto_rotate
+Auto-rotate screen;toggle_lock_screen_rotation_preference
+Auto-sync personal data;auto_sync_personal_account_data
+Auto-sync work data;auto_sync_work_account_data
+Autofill;debug_autofill_category
+Autofill service;default_autofill
+Autofill service;default_autofill_main
+Autofill service;default_autofill_work
+Automatic 24-hour format;auto_24hour
+Automatic date & time;auto_time
+Automatic restore;auto_restore
+Automatic rules;zen_mode_automation_settings_page
+Automatic system updates;ota_disable_automatic_update
+Automatic time zone;auto_zone
+Automatically lock;lock_after_timeout
+Automatically sync data;auto_sync_account_data
+Available;storage_settings_memory_available
+Available media devices;available_device_list
+Back up my data;backup_data
+Background check;background_check
+Background process limit;app_process_limit
+Backup;backup
+Backup;backup_settings
+Backup;privacy_settings_screen
+Backup account;configure_account
+Backup service isn't active;backup_inactive
+Battery;power_usage_summary_screen
+Battery;top_level_battery
+Battery Saver;battery_saver
+Battery Saver;battery_saver_summary
+Battery optimization;high_power_apps
+Battery percentage;battery_percentage
+Battery usage;power_usage_advanced_screen
+Battery usage since full charge;app_list
+Behavior;zen_mode_settings_category_behavior
+Blink light;notification_pulse
+Bluetooth;bluetooth_settings
+Bluetooth;bluetooth_switchbar_screen
+Bluetooth AVRCP Version;bluetooth_select_avrcp_version
+Bluetooth Audio Bits Per Sample;bluetooth_select_a2dp_bits_per_sample
+Bluetooth Audio Channel Mode;bluetooth_select_a2dp_channel_mode
+Bluetooth Audio Codec;bluetooth_select_a2dp_codec
+Bluetooth Audio LDAC Codec: Playback Quality;bluetooth_select_a2dp_ldac_playback_quality
+Bluetooth Audio Sample Rate;bluetooth_select_a2dp_sample_rate
+Bluetooth address;bt_address
+Bluetooth scanning;bluetooth_always_scanning
+Bluetooth tethering;enable_bluetooth_tethering
+Brightness level;brightness
+Browser app;default_browser
+Browser app;work_default_browser
+Bug report shortcut;bugreport_in_power
+Build number;build_number
+Call volume;call_volume
+Calls;zen_mode_calls_settings
+Calls;zen_mode_calls_settings_page
+Camera Laser Sensor;camera_laser_sensor_switch
+Camera permissions;enterprise_privacy_number_camera_access_packages
+Captions;captioning_preference_screen
+Cast;wifi_display_settings_screen
+Changes made by your organization's admin;exposure_changes_category
+Charging sounds;charging_sounds
+Clear credentials;credentials_reset
+Color correction;daltonizer_preference
+Color correction;daltonizer_preference_screen
+Color inversion;toggle_inversion_preference
+Colors;color_mode
+Colors;color_mode_settings_screen
+Connect to open networks;use_open_wifi_automatically
+Connected MAC Randomization;wifi_connected_mac_randomization
+Connected devices;connected_devices_screen
+Connected devices;top_level_connected_devices
+Connection preferences;connected_devices_advanced_screen
+Connection preferences;connection_preferences
+Convert to file encryption;convert_to_file_encryption
+Cool color temperature;color_temperature
+Copyright;copyright
+Correction mode;type
+Credential storage;credentials_management
+Current screen saver;current_screensaver
+Currently connected;connected_device_list
+Custom;zen_custom
+Custom restrictions;zen_mode_block_settings_page
+Data Saver;data_saver_screen
+Data Saver;restrict_background
+Data associated with your work account, such as email and calendar;enterprise_privacy_enterprise_data
+Data limit;data_limit
+Data usage;data_usage_screen
+Data warning;data_warning
+Data warning & limit;billing_cycle_settings
+Data warning & limit;billing_preference
+Date & time;date_time_settings_screen
+Debug GPU overdraw;debug_hw_overdraw
+Debug non-rectangular clip operations;show_non_rect_clip
+Debugging;debug_debugging_category
+Default USB configuration;default_usb_configuration
+Default alarm sound;alarm_ringtone
+Default apps;app_default_settings_screen
+Default apps;number_enterprise_set_default_apps
+Default for work;autofill_work_app_defaults
+Default for work;work_app_defaults
+Default keyboard;input_method
+Default notification sound;notification_default_ringtone
+Default notification sound;notification_ringtone
+Default work alarm sound;work_alarm_ringtone
+Default work notification sound;work_notification_ringtone
+Delay before click;autoclick_delay
+Desktop backup password;local_backup_password
+Developer options;development_prefs_screen
+Device admin apps;device_admin_settings
+Device admin apps;device_administrators
+Device admin apps;manage_device_admin
+Device name;device_name
+Device security;security_category
+Device theme;theme
+Dial pad tones;dial_pad_tones
+Directory access;special_app_directory_access
+Disable Bluetooth A2DP hardware offload;bluetooth_disable_a2dp_hw_offload
+Disable HW overlays;disable_overlays
+Disable USB audio routing;usb_audio
+Disable absolute volume;bluetooth_disable_absolute_volume
+Display;display_category
+Display;display_settings_screen
+Display;top_level_display
+Display cutout;display_cutout_emulation
+Display over other apps;system_alert_window
+Display size;accessibility_settings_screen_zoom
+Display size;display_settings_screen_zoom
+Display size;screen_zoom_settings
+Do Not Disturb;zen_mode
+Do Not Disturb;zen_mode_notifications
+Do Not Disturb;zen_mode_settings
+Do Not Disturb access;zen_access
+Do Not Disturb access;zen_access_screen
+Dock speaker plays;dock_audio_media
+Docking sounds;docking_sounds
+Don't blink light;zen_effect_light
+Don't pop notifications on screen;zen_effect_peek
+Don't turn on screen;zen_effect_intent
+Don't wake for notifications;zen_effect_ambient
+Don’t keep activities;immediately_destroy_activities
+Double twist for camera;camera_gesture
+Double-tap to check phone;ambient_display_double_tap
+Double-tap to check phone;gesture_double_tap_screen
+Double-tap to check phone;gesture_double_tap_screen_input_summary
+Downloaded services;user_installed_services_category
+Drawing;debug_drawing_category
+Duration;zen_mode_duration_settings
+Dwell timing;autoclick_preference
+Dwell timing;autoclick_preference_screen
+Emergency alerts;app_and_notif_cell_broadcast_settings
+Emergency app;default_emergency_app
+Emergency dialing signal;emergency_tone
+Emergency information;emergency_info
+Enable Bluetooth HCI snoop log;bt_hci_snoop_log
+Enable GPU debug layers;enable_gpu_debug_layers
+Enable Wi-Fi Verbose Logging;wifi_verbose_logging
+Enable freeform windows;enable_freeform_support
+Enable view attribute inspection;debug_view_attributes
+Encrypt phone;encryption_and_credentials_encryption_status
+Encryption;encryption_and_credentials_status_category
+Encryption & credentials;encryption_and_credential
+Encryption & credentials;encryption_and_credentials_screen
+End time;night_display_end_time
+Equipment ID;fcc_equipment_id
+Erase all data (factory reset);factory_reset
+Exceptions;zen_mode_settings_category_exceptions
+Experimental;experimental_category
+Face authentication;face_settings
+Face authentication;security_settings_face_settings_page
+Failed password attempts before deleting all device data;failed_password_wipe_current_user
+Failed password attempts before deleting work profile data;failed_password_wipe_managed_profile
+Feature flags;feature_flags_dashboard
+Feature flags;feature_flags_settings
+Files;pref_files
+Files received via Bluetooth;bt_received_files
+Flash screen;flash
+Flip camera;gesture_double_twist
+Flip camera;gesture_double_twist_input_summary
+Font size;font_size
+Font size;font_size_preference_screen
+Font size;font_size_setting_screen
+Force 4x MSAA;force_msaa
+Force RTL layout direction;force_rtl_layout_all_locales
+Force activities to be resizable;force_resizable_activities
+Force allow apps on external;force_allow_on_external
+Force full GNSS measurements;enable_gnss_raw_meas_full_tracking
+Free up space;storage_settings_free_space
+Games;pref_games
+Gestures;gesture_settings
+Gestures;gesture_settings_screen
+Global HTTP proxy set;global_http_proxy
+Google Account;branded_account
+HDCP checking;hdcp_checking
+Hardware accelerated rendering;debug_hw_drawing_category
+Hearing aids;hearing_aid_preference
+Hide from notification list;zen_effect_list
+Hide notification dots;zen_effect_badge
+Hide status bar icons;zen_effect_status
+High contrast text;toggle_high_text_contrast_preference
+Home app;default_home
+Hotspot & tethering;tether_prefs_screen
+Hotspot & tethering;tether_settings
+Hotspot name;wifi_tether_network_name
+Hotspot password;wifi_tether_network_password
+IMEI;imei_info
+IP address;current_ip_address
+IP address;wifi_ip_address
+Improve your face data;security_settings_face_improve
+Input;debug_input_category
+Input assistance;input_assistance_category
+Install certificates;install_credentials
+Install from storage;credentials_install
+Install unknown apps;manage_external_sources
+Installed apps;installed_apps_web_action
+Instant Apps preferences;instant_app_web_action_pref
+Instant apps;instant_app_web_action_toggle
+Instant apps;web_action_category
+Intensity;night_display_temperature
+Interaction controls;interaction_control_category
+Internal shared storage;storage_settings_volume_private
+Internal storage;storage_settings_internal_storage
+Jump to camera;gesture_double_tap_power
+Jump to camera;gesture_double_tap_power_input_summary
+Keyboard & inputs;keyboards_category
+Keyboard assistance;keyboard_assistance_category
+Keyboard shortcuts helper;keyboard_shortcuts_helper
+Language;tts_default_lang
+Languages;phone_language
+Languages & input;language_and_input_settings_screen
+Large mouse pointer;toggle_large_pointer_icon
+Last full charge;last_full_charge
+Legal information;legal_container
+Legal information;legal_screen
+License;license
+Lift to check phone;ambient_display_pick_up
+Lift to check phone;gesture_pick_up
+Lift to check phone;gesture_pick_up_input_summary
+Lift to wake;lift_to_wake
+List of apps on your device;enterprise_privacy_installed_packages
+Local terminal;enable_terminal
+Location;location
+Location;location_settings
+Location for work profile;managed_profile_location_switch
+Location permissions;enterprise_privacy_number_location_access_packages
+Location services;location_services
+Lock device when unpinning;use_screen_lock
+Lock screen display;lockscreen_from_display_settings
+Lock screen display;security_lockscreen_settings_screen
+Lock screen message;owner_info_settings
+Logger buffer sizes;select_logd_size
+Logging level;autofill_logging_level
+MAC address;mac_address
+Magnification;magnification_preference_screen
+Magnification;magnification_preference_screen_title
+Magnify with button;screen_magnification_navbar_preference_screen
+Magnify with triple-tap;screen_magnification_gestures_preference_screen
+Make pattern visible;visiblepattern
+Make profile pattern visible;visiblepattern_profile
+Manage backup account;data_management
+Manage keyboards;add_virtual_keyboard_screen
+Manage keyboards;available_virtual_keyboard_page
+Managed device info;enterprise_privacy
+Managed device info;enterprise_privacy_settings
+Manual;manual
+Max requests per session;autofill_max_partitions
+Max visible datasets;autofill_visible_datasets
+Maximum connected Bluetooth audio devices;bluetooth_max_connected_audio_devices
+Media;media_category
+Media;zen_mode_media
+Media volume;media_volume
+Memory;memory
+Messages, events & reminders;zen_mode_msg_event_reminder_settings
+Messages, events & reminders;zen_mode_msg_event_reminder_settings_page
+Microphone permissions;enterprise_privacy_number_microphone_access_packages
+Mobile;mobile_category
+Mobile data;data_usage_enable
+Mobile data always active;mobile_data_always_on
+Mobile data usage;cellular_data_usage
+Mobile network;mobile_network_settings
+Mobile plan;manage_mobile_plan
+Model & hardware;device_model
+Modify system settings;write_settings_apps
+Monitoring;debug_monitoring_category
+Mono audio;toggle_master_mono
+Most recent bug report;bug_reports
+Most recent network traffic log;network_logs
+Most recent security log;security_logs
+Movie & TV apps;pref_movies
+Multiple users;user_settings_screen
+Music & audio;pref_music_audio
+NFC;toggle_nfc
+Network & internet;network_and_internet_screen
+Network & internet;top_level_network
+Network name;show_operator_name
+Network rating provider;network_scorer_picker
+Networking;debug_networking_category
+New notifications;ambient_display_notification
+Night Light;night_display
+Night Light;night_display_activated
+Night mode;dark_ui_mode
+No sound from notifications;zen_mute_notifications
+No visuals or sound from notifications;zen_hide_notifications
+Notification access;notification_access
+Notification access;notification_access_screen
+Notification volume;notification_volume
+Notifications;all_notifications
+Notifications;zen_mode_block_effects_settings
+Notifications;zen_mode_restrict_settings_page
+OEM unlocking;oem_unlock_enable
+On lock screen;lock_screen_notifications
+On lock screen;security_setting_lock_screen_notif
+Open network notification;notify_open_networks
+Opening links;domain_urls
+Opening links;manage_domain_url_screen
+Other apps;pref_other_apps
+Other files;storage_settings_misc_space
+Other sounds and vibrations;other_sounds_and_vibrations_category
+Other users;pref_secondary_users
+Pair new device;add_bt_devices
+Payment default;nfc_payment
+Personal dictionary;key_user_dictionary_settings
+Personal dictionary;user_dict_list
+Phone app;default_phone_app
+Phone app;work_default_phone_app
+Phone number;phone_number
+Phone ringtone;ringtone
+Photos & videos;pref_photos_videos
+Physical keyboard;physical_keyboard_pref
+Physical keyboard;physical_keyboard_screen
+Picture color mode;picture_color_mode
+Picture-in-picture;picture_in_picture
+Picture-in-picture;picture_in_picture_screen
+Pictures, videos;storage_settings_dcim_space
+Pitch;tts_default_pitch
+Pixel Imprint;fingerprint_settings
+Pixel Imprint;fingerprint_settings_profile
+Play media to;media_output
+Pointer location;pointer_location
+Pointer speed;pointer_speed
+Power button ends call;toggle_power_button_ends_call_preference
+Power button instantly locks;power_button_instantly_locks
+Power on sounds;boot_sounds
+Preferred engine;tts_engine_picker_screen
+Preferred engine;tts_engine_preference
+Premium SMS access;premium_sms
+Premium SMS access;premium_sms_screen
+Press Power & Volume Up together;gesture_prevent_ringing
+Prevent ringing;gesture_prevent_ringing_screen
+Prevent ringing;gesture_prevent_ringing_summary
+Previously connected devices;previously_connected_devices
+Previously connected devices;saved_device_list
+Print jobs;print_jobs_category
+Print services;print_services_category
+Printing;connected_device_printing
+Printing;print_settings_screen
+Privacy;security_settings_misc_category
+Private DNS;private_dns_settings
+Profile HWUI rendering;track_frame_time
+Proxy;proxy_settings
+Quick settings developer tiles;development_tile_settings
+Quick settings developer tiles;quick_settings_tiles
+Reach to check phone;gesture_reach
+Recent location requests;recent_location_requests
+Recent location requests;recent_location_requests_see_all
+Recently opened apps;recent_apps_category
+Recently sent;recent_notifications_category
+Redirect vibration;vibrate_input_devices
+Regulatory labels;regulatory_info
+Remove animations;toggle_disable_animations
+Reset ShortcutManager rate-limiting;reset_shortcut_manager_throttling
+Reset Wi-Fi, mobile & Bluetooth;network_reset_pref
+Reset app preferences;reset_app_prefs
+Reset options;reset_dashboard
+Reset options;reset_dashboard_fragment_screen
+Reset to default values;autofill_reset_developer_options
+Restricted apps;restricted_app
+Revoke USB debugging authorizations;clear_adb_keys
+Ring & notification vibration;notification_vibration_preference_screen
+Ring volume;ring_volume
+Running services;running_apps
+SIM card lock;sim_lock_settings
+SIM status;sim_status
+SMS app;default_sms_app
+Safety & regulatory manual;safety_info
+Scanning;location_scanning
+Scanning;scanning_screen
+Schedule;night_display_auto_mode
+Schedule;zen_mode_settings_category_schedule
+Screen lock;security_settings_password_sub_screen
+Screen lock;unlock_set_or_change
+Screen locking sounds;screen_locking_sounds
+Screen pinning;screen_pinning_settings
+Screen pinning;screen_pinning_settings_screen
+Screen readers;screen_reader_category
+Screen saver;dream_overview_screen
+Screen saver;screensaver
+Screen usage since full charge;screen_usage
+Security;wifi_tether_security
+Security & location;security_dashboard_page
+Security & location;top_level_security
+Security status;security_status
+See all;recent_location_requests_see_all_button
+Select debug app;debug_app
+Select mock location app;mock_location_app
+Select time zone;timezone
+Send feedback about this device;device_feedback
+Set data limit;set_data_limit
+Set data warning;set_data_warning
+Set date;date
+Set time;time
+Settings;top_level_settings
+Shortcut to prevent ringing;gesture_prevent_ringing_sound
+Show Bluetooth devices without names;bluetooth_show_devices_without_names
+Show background ANRs;show_all_anrs
+Show hardware layers updates;show_hw_layers_updates
+Show layout bounds;debug_layout
+Show lockdown option;security_setting_lockdown_enabled
+Show notification channel warnings;show_notification_channel_warnings
+Show passwords;show_password
+Show surface updates;show_screen_updates
+Show taps;show_touches
+Show view updates;show_hw_screen_updates
+Show virtual keyboard;show_virtual_keyboard_switch
+Simulate color space;simulate_color_space
+Simulate secondary displays;overlay_display_devices
+Sleep;screen_timeout
+Smallest width;density
+Smart Storage;toggle_asm
+Sound;sound_settings
+Sound;top_level_sound
+Sound & vibration;zen_mode_sound_vibration_settings_page
+Sound & vibration;zen_sound_vibration_settings
+Special app access;special_access
+Special app access;special_app_access_screen
+Speech rate;tts_default_rate
+Spell checker;spellcheckers_settings
+Squeeze for silence;gesture_assist_silence
+Squeeze for your Assistant;gesture_assist
+Squeeze sensitivity;gesture_assist_sensitivity
+Standby apps;inactive_apps
+Starred contacts;zen_mode_starred_contacts_callers
+Starred contacts;zen_mode_starred_contacts_messages
+Start time;night_display_start_time
+Stay awake;keep_screen_on
+Storage;storage_dashboard_screen
+Storage;storage_settings
+Storage;top_level_storage
+Storage type;credential_storage_type
+Store logger data persistently on device;select_logpersist
+Strict mode enabled;strict_mode
+Swipe fingerprint;gesture_swipe_down_fingerprint_screen
+Swipe fingerprint for notifications;gesture_swipe_down_fingerprint
+Swipe fingerprint for notifications;gesture_swipe_down_fingerprint_input_summary
+Swipe fingerprint for notifications;gesture_swipe_down_fingerprint_notifications
+Swipe up on Home button;gesture_swipe_up
+Swipe up on Home button;gesture_swipe_up_input_summary
+Switch to mobile data automatically;wifi_cellular_data_fallback
+System;pref_system
+System;system_dashboard_screen
+System;top_level_system
+System UI demo mode;demo_mode
+System WebView License;webview_license
+System updates;system_update_settings
+Take bug report;bugreport
+Take call on;take_call_on_output
+Tap & pay;default_payment_app
+Tap & pay;nfc_payment_settings_screen
+Tap to wake;tap_to_wake
+Terms and conditions;terms
+Tethering hardware acceleration;tethering_hardware_offload
+Text-to-speech output;tts_settings_preference
+Text-to-speech output;tts_settings_screen
+Text-to-speech output;tts_settings_summary
+This device's data is being backed up;backups_enabled
+Tips & support;support_dashboard_activity
+Tips & support;top_level_support
+To extend your battery life, Battery Saver turns off some device features and restricts apps.;battery_saver_footer_preference
+Total space;storage_settings_memory_size
+Touch & hold delay;select_long_press_timeout_preference
+Touch sounds;touch_sounds
+Touch sounds;zen_mode_system
+Touch vibration;touch_vibration_preference_screen
+Touch vibration;vibrate_on_touch
+Transition animation scale;transition_animation_scale
+Trust agents;manage_trust_agents
+Trust agents;trust_agents
+Trusted credentials;trusted_credentials
+Trusted credentials in your personal profile;ca_certs_current_user
+Trusted credentials in your work profile;ca_certs_managed_profile
+Turn off hotspot automatically;wifi_tether_auto_turn_off
+Turn on;battery_saver_seek_bar
+Turn on Wi-Fi automatically;enable_wifi_wakeup
+Turn on automatically;auto_battery_saver
+Turn on automatically;zen_mode_automation_settings
+Types of information your organization can see;exposure_category
+USB Preferences;usb_details_fragment
+USB controlled by;usb_details_data_role
+USB debugging;enable_adb
+USB tethering;usb_tether_settings
+Unlock your device;security_settings_face_unlock
+Unrestricted data;data_saver
+Unrestricted data;unrestricted_access
+Unrestricted data;unrestricted_data_screen
+Up time;up_time
+Usage access;special_app_usage_access
+Use 24-hour format;24 hour
+Use Adaptive Battery;smart_battery
+Use Battery Manager;auto_restriction
+Use Bluetooth when driving;bluetooth_on_while_driving
+Use USB for;usb_details_functions
+Use default;nfc_foreground
+Use one lock;unification
+Use personal profile sounds;work_use_personal_sounds
+Use screenshot;screenshot
+Use text from screen;context
+Use your face to;security_settings_face_unlock_category
+User credentials;user_credentials
+Users & profiles;user_list
+VPN;vpn_settings
+VR helper services;enabled_vr_listeners
+VR helper services;vr_listener_settings
+Verify apps over USB;verify_apps_over_usb
+Vibration;accessibility_settings_vibration_screen
+Vibration;vibration_preference_screen
+Virtual keyboard;virtual_keyboard_category
+Virtual keyboard;virtual_keyboard_pref
+Voice input;voice_input_settings
+Volume key shortcut;accessibility_shortcut_preference
+Wait for debugger;wait_for_debugger
+Wallpaper;wallpaper
+Wallpapers;wallpaper_attributions
+Wallpapers;wallpaper_type_settings
+WebView implementation;select_webview_provider
+What to show;lockscreen_what_to_show
+When Do Not Disturb is turned on;restrict_category
+When Do Not Disturb is turned on;zen_mode_settings_category_calls
+When Do Not Disturb is turned on;zen_mode_settings_category_msg_event_reminder
+When Do Not Disturb is turned on;zen_mode_settings_category_sound_vibration
+When device is in VR;vr_display_pref
+When the screen is off;zen_mode_block_screen_off
+When the screen is on;zen_mode_block_screen_on
+When to show;ambient_display_category_when_to_show
+When to start;when_to_start
+When work profile is locked;lock_screen_notifications_profile
+When work profile is locked;security_setting_lock_screen_notif_work
+Wi-Fi;main_toggle_wifi
+Wi-Fi;toggle_wifi
+Wi-Fi;wifi_category
+Wi-Fi Direct;wifi_direct
+Wi-Fi MAC address;wifi_mac_address
+Wi-Fi control;change_wifi_state
+Wi-Fi data usage;wifi_data_usage
+Wi-Fi hotspot;wifi_tether
+Wi-Fi hotspot;wifi_tether_settings_screen
+Wi-Fi preferences;wifi_configure_settings_screen
+Wi-Fi scanning;wifi_always_scanning
+Window animation scale;window_animation_scale
+Wireless display certification;wifi_display_certification
+Work notifications;lock_screen_notifications_profile_header
+Work notifications;security_setting_lock_screen_notif_work_header
+Work phone ringtone;work_ringtone
+Work profile lock;unlock_set_or_change_profile
+Work profile security;security_category_profile
+Work profile sounds;sound_work_settings_section
+Your access to this device;device_access_category
+ ;auto_awesome_battery
+ ;auto_brightness_video
+ ;battery_header
+ ;battery_tip
+ ;feature_flag_category
\ No newline at end of file
diff --git a/tests/uitests/src/com/android/settings/search/SearchData.java b/tests/uitests/src/com/android/settings/search/SearchData.java
new file mode 100644
index 0000000..201841b
--- /dev/null
+++ b/tests/uitests/src/com/android/settings/search/SearchData.java
@@ -0,0 +1,81 @@
+package uitests.src.com.android.settings.search;
+
+import android.text.TextUtils;
+import java.util.Objects;
+
+
+/**
+ * Data class for {@link com.android.settings.search.SettingsSearchResultRegressionTest}
+ */
+public class SearchData {
+  public final String title;
+  public final String key;
+
+  public String getTitle() {
+    return title;
+  }
+
+  public String getKey() {
+    return key;
+  }
+  public static final String DELIM = ";";
+
+  public static SearchData from(String searchDataString) {
+    String[] split = searchDataString.trim().split(DELIM, -1);
+
+    if (split.length != 2) {
+      throw new IllegalArgumentException("Arg is invalid: " + searchDataString);
+    }
+
+    return new SearchData.Builder()
+        .setTitle(split[0])
+        .setKey(split[1])
+        .build();
+  }
+
+  @Override
+  public String toString() {
+    return title + DELIM + key;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (!(obj instanceof SearchData)) {
+      return false;
+    }
+
+    SearchData other = (SearchData) obj;
+    return TextUtils.equals(this.title, other.title)
+        && TextUtils.equals(this.key, other.key);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(title, key);
+  }
+
+  private SearchData(
+      SearchData.Builder builder) {
+    this.title = builder.title;
+    this.key = builder.key;
+  }
+
+  public static class Builder {
+    protected String title = "";
+    protected String key = "";
+
+    public SearchData build() {
+      return new SearchData(this);
+    }
+
+    public SearchData.Builder setTitle(String title) {
+      this.title = title;
+      return this;
+    }
+
+    public SearchData.Builder setKey(String key) {
+      this.key = key;
+      return this;
+    }
+  }
+}
diff --git a/tests/uitests/src/com/android/settings/search/SettingsSearchResultRegressionTest.java b/tests/uitests/src/com/android/settings/search/SettingsSearchResultRegressionTest.java
new file mode 100644
index 0000000..31900e4
--- /dev/null
+++ b/tests/uitests/src/com/android/settings/search/SettingsSearchResultRegressionTest.java
@@ -0,0 +1,210 @@
+
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.settings.search;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+
+import android.platform.test.annotations.Presubmit;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.text.TextUtils;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.Set;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+import uitests.src.com.android.settings.search.SearchData;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class SettingsSearchResultRegressionTest {
+
+  private Context mContext;
+
+  public interface IndexColumns {
+    String DATA_TITLE = "data_title";
+    String DATA_KEY_REF = "data_key_reference";
+  }
+
+  private static final String ERROR_RESULTS_MISSING =
+      "\nSettings search results missing. \n"
+          + "If the changes are intentional, we want to update the master-list.\n";
+
+  private static final String ERROR_NEW_RESULTS =
+      "\nNew settings search results have been found.\nIf the changes are intentional, we want to"
+      + "prevent the new results from regressing.\n";
+
+  private static final String ERROR_RERUN_TEST =
+      "Please re-run the test \"generate_search_result_list\" by removing the '@Ignore' annotation above 'generate_search_result_list' test, and run: \n"
+      + "$ runtest --path packages/apps/Settings/tests/uitests/src/com/android/settings/search/SettingsSearchResultRegressionTest.java \n"
+      + "and copy the output into 'packages/apps/Settings/tests/uitests/assets/search_result_list'\n";
+
+
+  @Before
+  public void setUp() {
+    mContext = InstrumentationRegistry.getContext();
+  }
+
+  /**
+   * Tests that the set of search results does not regress.
+   * <p>
+   *     The data set used here (/tests/unit/assets/search_results_list) needs to be updated
+   *     every once in a while so that we can check newly added results.
+   * </p>
+   */
+  @Test
+  @Presubmit
+  public void searchResultsDoNotRegress() {
+    final ContentResolver resolver = mContext.getContentResolver();
+    final Uri uri = getTestProviderUri();
+    final Cursor cursor = resolver.query(uri, null, null, null, null);
+
+    if (cursor == null) {
+      // Assume Settings Intelligence is wrong.
+      return;
+    }
+
+    final Set<SearchData> availableSearchResults = getSearchDataFromCursor(cursor);
+    final Set<SearchData> registeredSearchResults = getRegisteredResults();
+
+    // Seed with results that we expect
+    final Set<SearchData> missingSearchResults = new HashSet<>(registeredSearchResults);
+    // Seed with results that are available
+    final Set<SearchData> newSearchResults = new HashSet<>(availableSearchResults);
+
+    // Remove all available results, leaving results that have been removed.
+    missingSearchResults.removeAll(availableSearchResults);
+    // Remove all results we expect, leaving results that have not yet been registered.
+    newSearchResults.removeAll(registeredSearchResults);
+
+    assertWithMessage(ERROR_RESULTS_MISSING + ERROR_RERUN_TEST)
+        .that(missingSearchResults).isEmpty();
+    assertWithMessage(ERROR_NEW_RESULTS + ERROR_RERUN_TEST).that(newSearchResults).isEmpty();
+  }
+
+  // TODO (b/113907111) add a test to catch duplicate title search results.
+
+  /**
+   * Test to generate a new list of search results. Uncomment the Test annotation and run the
+   * test to generate the list.
+   */
+  @Ignore
+  @Test
+  public void generate_search_result_list() {
+    final ContentResolver resolver = mContext.getContentResolver();
+    final Uri uri = getTestProviderUri();
+    final Cursor cursor = resolver.query(uri, null, null, null, null);
+    final List<SearchData> availableSearchResults =
+        new ArrayList<>(getSearchDataFromCursor(cursor));
+
+    Collections.sort(availableSearchResults, Comparator.comparing(SearchData::getTitle)
+        .thenComparing(SearchData::getKey));
+
+    assertThat(generateListFromSearchData(availableSearchResults)).isNull();
+  }
+
+  private Set<SearchData> getSearchDataFromCursor(Cursor cursor) {
+    final Set<SearchData> searchData = new HashSet<>();
+
+    final int titleIndex = cursor.getColumnIndex(
+        IndexColumns.DATA_TITLE);
+    final int keyIndex = cursor.getColumnIndex(
+        IndexColumns.DATA_KEY_REF);
+
+    while (cursor.moveToNext()) {
+      String title = cursor.getString(titleIndex);
+      String key = cursor.getString(keyIndex);
+
+      if (TextUtils.isEmpty(title)) {
+        title = "";
+      }
+
+      if (TextUtils.isEmpty(key)) {
+        key = "";
+      }
+
+      searchData.add(new SearchData.Builder()
+          .setTitle(title)
+          .setKey(key)
+          .build());
+    }
+
+    return searchData;
+  }
+
+  /**
+   * Utility method to generate the list of search results that this class uses to validate
+   * results.
+   */
+  private String generateListFromSearchData(List<SearchData> searchData) {
+    StringBuilder builder = new StringBuilder();
+    for (SearchData searchResult : searchData) {
+      builder.append(searchResult.title)
+          .append(
+              SearchData.DELIM)
+          .append(searchResult.key)
+          .append("\n");
+    }
+    return builder.toString();
+  }
+
+  private Uri getTestProviderUri() {
+    return new Uri.Builder()
+        .scheme(ContentResolver.SCHEME_CONTENT)
+        .authority("com.google.android.settings.intelligence.modules.search.regression")
+        .build();
+  }
+
+  private Set<SearchData> getRegisteredResults() {
+    final String filename = "search_results_list";
+    final Set<SearchData> registeredResults = new HashSet<>();
+
+    try {
+      final InputStream in = mContext.getAssets().open(filename);
+      BufferedReader reader = new BufferedReader(new InputStreamReader(in));
+      String line;
+      while ((line = reader.readLine()) != null) {
+        registeredResults.add(
+            SearchData.from(line));
+      }
+    } catch (Exception e) {
+      throw new IllegalArgumentException("Error initializing registered result list "
+          + filename, e);
+    }
+
+    return registeredResults;
+  }
+}
\ No newline at end of file
