diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index c13e5f3..facfeab 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1287,6 +1287,28 @@
                 android:value="true" />
         </activity>
 
+        <!-- TODO(32953042) Merge with Settings$SecuritySettingsActivity -->
+        <activity android:name="Settings$SecuritySettingsActivityV2"
+                  android:label="@string/security_settings_title"
+                  android:icon="@drawable/ic_settings_security"
+                  android:enabled="false"
+                  android:configChanges="orientation|keyboardHidden|screenSize"
+                  android:taskAffinity=""
+                  android:parentActivityName="Settings">
+            <intent-filter android:priority="-1">
+                <action android:name="android.settings.SECURITY_SETTINGS" />
+                <action android:name="android.credentials.UNLOCK" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+            <intent-filter android:priority="4">
+                <action android:name="com.android.settings.action.SETTINGS" />
+            </intent-filter>
+            <meta-data android:name="com.android.settings.category"
+                       android:value="com.android.settings.category.ia.homepage" />
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                       android:value="com.android.settings.security.SecuritySettingsV2" />
+        </activity>
+
         <activity android:name="MonitoringCertInfoActivity"
                 android:label=""
                 android:theme="@style/Transparent"
diff --git a/res/layout/suggestion_tile_remote_container.xml b/res/layout/suggestion_tile_remote_container.xml
deleted file mode 100644
index fd19b80..0000000
--- a/res/layout/suggestion_tile_remote_container.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 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.
--->
-
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:background="@android:color/white"
-    android:clickable="true"
-    android:focusable="true"
-    android:minHeight="@dimen/dashboard_tile_minimum_height" />
diff --git a/res/values/bools.xml b/res/values/bools.xml
index 4c1c9c2..c28b968 100644
--- a/res/values/bools.xml
+++ b/res/values/bools.xml
@@ -49,6 +49,11 @@
     <!--Whether help links are defined. -->
     <bool name="config_has_help">false</bool>
 
+    <!-- Whether Wi-Fi settings should be shown or not.
+    This also controls whether Wi-fi related sub-settings (e.g. Wi-Fi preferences) will
+    surface in search results or not.-->
+    <bool name="config_show_wifi_settings">true</bool>
+
     <!-- Whether location mode is available or not. -->
     <bool name="config_location_mode_available">true</bool>
 
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 7153742..3dc342b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1951,7 +1951,7 @@
     <!-- Message in dialog when the user tries to connect to a carrier network[CHAR_LIMIT=40] -->
     <string name="wifi_carrier_connect">Carrier Wi\u2011Fi network</string>
     <!-- Message in dialog when the user tries to connect to a carrier network[CHAR_LIMIT=60] -->
-    <string name="wifi_carrier_content">Connect via <xliff:g id="name">%1%s</xliff:g></string>
+    <string name="wifi_carrier_content">Connect via <xliff:g id="name">%1$s</xliff:g></string>
 
     <string name="wifi_scan_always_turnon_message">To improve location accuracy and for other purposes, <xliff:g id="app_name">%1$s</xliff:g> wants to turn on network scanning, even when Wi-Fi is off.\n\nAllow this for all apps that want to scan?</string>
     <!-- Message informing the user how to turn off  [CHAR LIMIT=200] -->
@@ -6926,7 +6926,7 @@
     <string name="notification_group_title">Notification category group</string>
 
     <!-- [CHAR LIMIT=100] Notification importance screen title -->
-    <string name="notification_importance_title">Importance</string>
+    <string name="notification_importance_title">Behavior</string>
 
     <!-- [CHAR LIMIT=100 BACKUP_MESSAGE_ID=1820188704793497324] Notification Importance: unspecified importance level description -->
     <string name="notification_importance_unspecified">Allow sound</string>
@@ -6991,6 +6991,9 @@
     <!-- [CHAR LIMIT=100] Notification Importance title: high importance level title -->
     <string name="notification_channel_summary_high">Urgent importance</string>
 
+    <!-- [CHAR LIMIT=100] Label for on/off toggle -->
+    <string name="notification_switch_label">Show notifications</string>
+
     <!-- Default Apps > Default notification assistant -->
     <string name="default_notification_assistant">Notification assistant</string>
 
@@ -7087,13 +7090,13 @@
     <string name="loading_notification_apps">Loading apps...</string>
 
     <!-- [CHAR LIMIT=NONE] Text appearing when app notifications are off -->
-    <string name="app_notifications_off_desc">Android is blocking this app\'s notifications from appearing on this device</string>
+    <string name="app_notifications_off_desc">At your request, Android is blocking this app\'s notifications from appearing on this device</string>
 
     <!-- [CHAR LIMIT=NONE] Text appearing when channel notifications are off -->
-    <string name="channel_notifications_off_desc">Android is blocking this category of notifications from appearing on this device</string>
+    <string name="channel_notifications_off_desc">At your request, Android is blocking this category of notifications from appearing on this device</string>
 
     <!-- [CHAR LIMIT=NONE] Text appearing when channel group notifications are off -->
-    <string name="channel_group_notifications_off_desc">Android is blocking this group of notifications from appearing on this device</string>
+    <string name="channel_group_notifications_off_desc">At your request, Android is blocking this group of notifications from appearing on this device</string>
 
     <!-- [CHAR LIMIT=NONE] App notification settings: channels title -->
     <string name="notification_channels">Categories</string>
diff --git a/res/xml/channel_notification_settings.xml b/res/xml/channel_notification_settings.xml
index fb2705a..c799c8b 100644
--- a/res/xml/channel_notification_settings.xml
+++ b/res/xml/channel_notification_settings.xml
@@ -15,7 +15,8 @@
 -->
 
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:settings="http://schemas.android.com/apk/res-auto" >
+        xmlns:settings="http://schemas.android.com/apk/res-auto"
+        settings:initialExpandedChildrenCount="3">
 
     <com.android.settings.applications.LayoutPreference
         android:key="pref_app_header"
diff --git a/res/xml/notification_importance.xml b/res/xml/notification_importance.xml
index f801f3c..6f9cc0e 100644
--- a/res/xml/notification_importance.xml
+++ b/res/xml/notification_importance.xml
@@ -19,20 +19,15 @@
 
         <com.android.settings.widget.RadioButtonPreference
             android:key="importance_high"
-            android:title="@string/notification_importance_high_title"
-            android:summary="@string/notification_importance_high"
-        />
+            android:title="@string/notification_importance_high" />
         <com.android.settings.widget.RadioButtonPreference
             android:key="importance_default"
-            android:title="@string/notification_importance_default_title"
-            android:summary="@string/notification_importance_default" />
+            android:title="@string/notification_importance_default" />
         <com.android.settings.widget.RadioButtonPreference
             android:key="importance_low"
-            android:title="@string/notification_importance_low_title"
-            android:summary="@string/notification_importance_low" />
+            android:title="@string/notification_importance_low" />
         <com.android.settings.widget.RadioButtonPreference
             android:key="importance_min"
-            android:title="@string/notification_importance_min_title"
-            android:summary="@string/notification_importance_min" />
+            android:title="@string/notification_importance_min" />
 
 </PreferenceScreen>
diff --git a/res/xml/security_settings_v2.xml b/res/xml/security_settings_v2.xml
new file mode 100644
index 0000000..30e829d
--- /dev/null
+++ b/res/xml/security_settings_v2.xml
@@ -0,0 +1,115 @@
+<?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.
+  -->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:key="security_dashboard_page"
+    android:title="@string/security_settings_title"
+    settings:initialExpandedChildrenCount="9">
+
+    <!-- security_settings_status.xml -->
+    <PreferenceCategory
+        android:key="security_status"
+        android:title="@string/security_status_title" />
+
+    <!-- TODO Need security section -->
+    <PreferenceCategory
+        android:key="security_category"
+        android:title="@string/lock_settings_title">
+
+        <!-- security_settings_chooser -->
+        <com.android.settings.widget.GearPreference
+            android:key="unlock_set_or_change"
+            android:title="@string/unlock_set_unlock_launch_picker_title"
+            android:summary="@string/unlock_set_unlock_mode_none"
+            settings:keywords="@string/keywords_lockscreen" />
+
+        <Preference android:key="lockscreen_preferences"
+                    android:title="@string/lockscreen_settings_title"
+                    android:fragment="com.android.settings.security.LockscreenDashboardFragment"/>
+
+    </PreferenceCategory>
+
+    <!-- security_settings_misc.xml -->
+    <PreferenceCategory
+        android:key="security_settings_misc_category"
+        android:title="@string/security_passwords_title">
+
+        <Preference
+            android:key="location"
+            android:title="@string/location_settings_title"
+            android:fragment="com.android.settings.location.LocationSettings">
+        </Preference>
+
+        <SwitchPreference
+            android:key="show_password"
+            android:title="@string/show_password"
+            android:summary="@string/show_password_summary"/>
+
+    </PreferenceCategory>
+
+    <PreferenceCategory
+        android:key="security_settings_device_admin_category">
+
+        <Preference android:key="manage_device_admin"
+                    android:title="@string/manage_device_admin"
+                    android:persistent="false"
+                    android:fragment="com.android.settings.DeviceAdminSettings"/>
+
+        <Preference android:key="enterprise_privacy"
+                    android:title="@string/enterprise_privacy_settings"
+                    android:persistent="false"
+                    android:fragment="com.android.settings.enterprise.EnterprisePrivacySettings"/>
+
+    </PreferenceCategory>
+
+    <Preference android:key="sim_lock_settings"
+                android:title="@string/sim_lock_settings_category">
+
+        <intent android:action="android.intent.action.MAIN"
+                android:targetPackage="com.android.settings"
+                android:targetClass="com.android.settings.Settings$IccLockSettingsActivity"/>
+
+    </Preference>
+
+    <Preference
+        android:key="encryption_and_credential"
+        android:title="@string/encryption_and_credential_settings_title"
+        android:summary="@string/encryption_and_credential_settings_summary"
+        android:fragment="com.android.settings.security.EncryptionAndCredential"/>
+
+    <Preference android:key="manage_trust_agents"
+                android:title="@string/manage_trust_agents"
+                android:persistent="false"
+                android:fragment="com.android.settings.security.trustagent.TrustAgentSettings"/>
+
+    <Preference
+        android:key="screen_pinning_settings"
+        android:title="@string/screen_pinning_title"
+        android:summary="@string/summary_placeholder"
+        android:fragment="com.android.settings.security.ScreenPinningSettings"/>
+
+    <Preference android:key="security_misc_usage_access"
+                android:title="@string/usage_access_title"
+                android:fragment="com.android.settings.applications.manageapplications.ManageApplications">
+        <extra
+            android:name="classname"
+            android:value="com.android.settings.Settings$UsageAccessSettingsActivity" />
+    </Preference>
+
+</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/suggestion_ordering.xml b/res/xml/suggestion_ordering.xml
deleted file mode 100644
index e21fe5b..0000000
--- a/res/xml/suggestion_ordering.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-
-<optional-steps>
-    <step category="com.android.settings.suggested.category.DEFERRED_SETUP"
-          exclusive="true" />
-    <step category="com.android.settings.suggested.category.FIRST_IMPRESSION"
-          exclusiveExpireDays="14"
-          exclusive="true"
-          multiple="true" />
-    <step category="com.android.settings.suggested.category.LOCK_SCREEN" />
-    <step category="com.android.settings.suggested.category.TRUST_AGENT" />
-    <step category="com.android.settings.suggested.category.EMAIL" />
-    <step category="com.android.settings.suggested.category.PARTNER_ACCOUNT"
-          multiple="true" />
-    <step category="com.android.settings.suggested.category.GESTURE" />
-    <step category="com.android.settings.suggested.category.HOTWORD" />
-    <step category="com.android.settings.suggested.category.DEFAULT"
-          multiple="true" />
-    <step category="com.android.settings.suggested.category.SETTINGS_ONLY"
-          multiple="true" />
-</optional-steps>
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 9314952..d21a061 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -68,6 +68,7 @@
     public static class AccessibilityContrastSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AccessibilityDaltonizerSettingsActivity extends SettingsActivity { /* empty */ }
     public static class SecuritySettingsActivity extends SettingsActivity { /* empty */ }
+    public static class SecuritySettingsActivityV2 extends SettingsActivity { /* empty */ }
     public static class UsageAccessSettingsActivity extends SettingsActivity { /* empty */ }
     public static class LocationSettingsActivity extends SettingsActivity { /* empty */ }
     public static class PrivacySettingsActivity extends SettingsActivity { /* empty */ }
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index e684e5e..d3580d1 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -751,6 +751,7 @@
         PackageManager pm = getPackageManager();
         final UserManager um = UserManager.get(this);
         final boolean isAdmin = um.isAdminUser();
+        final FeatureFactory featureFactory = FeatureFactory.getFactory(this);
         boolean somethingChanged = false;
         String packageName = getPackageName();
         somethingChanged = setTileEnabled(
@@ -805,12 +806,26 @@
                 !isConnectedDeviceV2Enabled && !UserManager.isDeviceInDemoMode(this) /* enabled */,
                 isAdmin) || somethingChanged;
 
+        final boolean isSecurityV2Enabled = featureFactory.getSecurityFeatureProvider()
+                .isSecuritySettingsV2Enabled(this);
+
+        // Enable new security page if v2 enabled
+        somethingChanged = setTileEnabled(
+                new ComponentName(packageName,Settings.SecuritySettingsActivityV2.class.getName()),
+                isSecurityV2Enabled,
+                isAdmin) || somethingChanged;
+        // Enable old security page if v2 disabled
+        somethingChanged = setTileEnabled(
+                new ComponentName(packageName,Settings.SecuritySettingsActivity.class.getName()),
+                !isSecurityV2Enabled,
+                isAdmin) || somethingChanged;
+
         somethingChanged = setTileEnabled(new ComponentName(packageName,
                         Settings.SimSettingsActivity.class.getName()),
                 Utils.showSimCardTile(this), isAdmin)
                 || somethingChanged;
 
-        final boolean isBatterySettingsV2Enabled = FeatureFactory.getFactory(this)
+        final boolean isBatterySettingsV2Enabled = featureFactory
                 .getPowerUsageFeatureProvider(this)
                 .isBatteryV2Enabled();
         // Enable new battery page if v2 enabled
diff --git a/src/com/android/settings/core/FeatureFlags.java b/src/com/android/settings/core/FeatureFlags.java
index 4371b4a..e88fb11 100644
--- a/src/com/android/settings/core/FeatureFlags.java
+++ b/src/com/android/settings/core/FeatureFlags.java
@@ -21,9 +21,9 @@
  */
 public class FeatureFlags {
     public static final String SEARCH_V2 = "settings_search_v2";
-    public static final String SUGGESTIONS_V2 = "new_settings_suggestion";
     public static final String APP_INFO_V2 = "settings_app_info_v2";
     public static final String CONNECTED_DEVICE_V2 = "settings_connected_device_v2";
     public static final String BATTERY_SETTINGS_V2 = "settings_battery_v2";
     public static final String BATTERY_DISPLAY_APP_LIST = "settings_battery_display_app_list";
+    public static final String SECURITY_SETTINGS_V2 = "settings_security_settings_v2";
 }
diff --git a/src/com/android/settings/core/TogglePreferenceController.java b/src/com/android/settings/core/TogglePreferenceController.java
index 99d2ecc..febd7ad 100644
--- a/src/com/android/settings/core/TogglePreferenceController.java
+++ b/src/com/android/settings/core/TogglePreferenceController.java
@@ -14,8 +14,8 @@
 package com.android.settings.core;
 
 import android.content.Context;
-import android.support.v14.preference.SwitchPreference;
 import android.support.v7.preference.Preference;
+import android.support.v7.preference.TwoStatePreference;
 
 /**
  * Abstract class that consolidates logic for updating toggle controllers.
@@ -45,7 +45,7 @@
 
     @Override
     public final void updateState(Preference preference) {
-        ((SwitchPreference) preference).setChecked(isChecked());
+        ((TwoStatePreference) preference).setChecked(isChecked());
     }
 
     @Override
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index b7c73f3..4c861fb 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -115,6 +115,7 @@
 import com.android.settings.security.CryptKeeperSettings;
 import com.android.settings.security.LockscreenDashboardFragment;
 import com.android.settings.security.SecuritySettings;
+import com.android.settings.security.SecuritySettingsV2;
 import com.android.settings.sim.SimSettings;
 import com.android.settings.support.SupportDashboardActivity;
 import com.android.settings.system.ResetDashboardFragment;
@@ -163,6 +164,7 @@
             NotificationStation.class.getName(),
             LocationSettings.class.getName(),
             SecuritySettings.class.getName(),
+            SecuritySettingsV2.class.getName(),
             UsageAccessDetails.class.getName(),
             PrivacySettings.class.getName(),
             DeviceAdminSettings.class.getName(),
diff --git a/src/com/android/settings/core/instrumentation/MetricsFeatureProvider.java b/src/com/android/settings/core/instrumentation/MetricsFeatureProvider.java
index 532ec66..166cbb8 100644
--- a/src/com/android/settings/core/instrumentation/MetricsFeatureProvider.java
+++ b/src/com/android/settings/core/instrumentation/MetricsFeatureProvider.java
@@ -39,7 +39,6 @@
 
     protected void installLogWriters() {
         mLoggerWriters.add(new EventLogWriter());
-        mLoggerWriters.add(new SettingSuggestionsLogWriter());
     }
 
     public void visible(Context context, int source, int category) {
diff --git a/src/com/android/settings/core/instrumentation/SettingSuggestionsLogWriter.java b/src/com/android/settings/core/instrumentation/SettingSuggestionsLogWriter.java
deleted file mode 100644
index 697f0a3..0000000
--- a/src/com/android/settings/core/instrumentation/SettingSuggestionsLogWriter.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2017 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.core.instrumentation;
-
-import android.content.Context;
-import android.util.Pair;
-
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.dashboard.suggestions.EventStore;
-
-/**
- * {@link LogWriter} that writes setting suggestion related logs.
- */
-public class SettingSuggestionsLogWriter implements LogWriter {
-
-    private EventStore mEventStore;
-
-    @Override
-    public void visible(Context context, int source, int category) {
-    }
-
-    @Override
-    public void hidden(Context context, int category) {
-    }
-
-    @Override
-    public void action(Context context, int category, Pair<Integer, Object>... taggedData) {
-    }
-
-    @Override
-    public void actionWithSource(Context context, int source, int category) {
-    }
-
-    @Override
-    public void action(int category, int value, Pair<Integer, Object>... taggedData) {
-    }
-
-    @Override
-    public void action(int category, boolean value, Pair<Integer, Object>... taggedData) {
-    }
-
-    @Override
-    public void action(Context context, int category, int value) {
-    }
-
-    @Override
-    public void action(Context context, int category, boolean value) {
-    }
-
-    @Override
-    public void action(Context context, int category, String pkg,
-            Pair<Integer, Object>... taggedData) {
-        if (mEventStore == null) {
-            mEventStore = new EventStore(context);
-        }
-        switch (category) {
-            case MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION:
-                mEventStore.writeEvent(pkg, EventStore.EVENT_SHOWN);
-                break;
-            case MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION:
-                mEventStore.writeEvent(pkg, EventStore.EVENT_DISMISSED);
-                break;
-            case MetricsEvent.ACTION_SETTINGS_SUGGESTION:
-                mEventStore.writeEvent(pkg, EventStore.EVENT_CLICKED);
-                break;
-        }
-    }
-
-    @Override
-    public void count(Context context, String name, int value) {
-    }
-
-    @Override
-    public void histogram(Context context, String name, int bucket) {
-    }
-
-}
diff --git a/src/com/android/settings/dashboard/DashboardAdapter.java b/src/com/android/settings/dashboard/DashboardAdapter.java
index 3d473f0..97eef13 100644
--- a/src/com/android/settings/dashboard/DashboardAdapter.java
+++ b/src/com/android/settings/dashboard/DashboardAdapter.java
@@ -52,7 +52,6 @@
 import com.android.settingslib.Utils;
 import com.android.settingslib.drawer.DashboardCategory;
 import com.android.settingslib.drawer.Tile;
-import com.android.settingslib.suggestions.SuggestionParser;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -61,7 +60,6 @@
         implements SummaryLoader.SummaryConsumer {
     public static final String TAG = "DashboardAdapter";
     private static final String STATE_SUGGESTION_LIST = "suggestion_list";
-    private static final String STATE_SUGGESTION_LIST_V2 = "suggestion_list_v2";
     private static final String STATE_CATEGORY_LIST = "category_list";
     private static final String STATE_SUGGESTIONS_SHOWN_LOGGED = "suggestions_shown_logged";
 
@@ -69,8 +67,6 @@
     static final String STATE_SUGGESTION_CONDITION_MODE = "suggestion_condition_mode";
     @VisibleForTesting
     static final int SUGGESTION_CONDITION_HEADER_POSITION = 0;
-    @VisibleForTesting
-    static final int MAX_SUGGESTION_TO_SHOW = 5;
 
     private final IconCache mCache;
     private final Context mContext;
@@ -80,7 +76,6 @@
     private final ArrayList<String> mSuggestionsShownLogged;
     private boolean mFirstFrameDrawn;
     private RecyclerView mRecyclerView;
-    private SuggestionParser mSuggestionParser;
     private SuggestionAdapter mSuggestionAdapter;
     private SuggestionDismissController mSuggestionDismissHandler;
     private SuggestionDismissController.Callback mCallback;
@@ -97,13 +92,10 @@
     };
 
     public DashboardAdapter(Context context, Bundle savedInstanceState,
-            List<Condition> conditions, SuggestionParser suggestionParser,
-            SuggestionControllerMixin suggestionControllerMixin,
+            List<Condition> conditions, SuggestionControllerMixin suggestionControllerMixin,
             SuggestionDismissController.Callback callback) {
 
-        // @deprecated In favor of suggestionsV2 below.
-        List<Tile> suggestions = null;
-        List<Suggestion> suggestionsV2 = null;
+        List<Suggestion> suggestions = null;
         DashboardCategory category = null;
         int suggestionConditionMode = DashboardData.HEADER_MODE_DEFAULT;
 
@@ -113,14 +105,12 @@
         mMetricsFeatureProvider = factory.getMetricsFeatureProvider();
         mDashboardFeatureProvider = factory.getDashboardFeatureProvider(context);
         mCache = new IconCache(context);
-        mSuggestionParser = suggestionParser;
         mCallback = callback;
 
         setHasStableIds(true);
 
         if (savedInstanceState != null) {
             suggestions = savedInstanceState.getParcelableArrayList(STATE_SUGGESTION_LIST);
-            suggestionsV2 = savedInstanceState.getParcelableArrayList(STATE_SUGGESTION_LIST_V2);
             category = savedInstanceState.getParcelable(STATE_CATEGORY_LIST);
             suggestionConditionMode = savedInstanceState.getInt(
                     STATE_SUGGESTION_CONDITION_MODE, suggestionConditionMode);
@@ -133,37 +123,15 @@
         mDashboardData = new DashboardData.Builder()
                 .setConditions(conditions)
                 .setSuggestions(suggestions)
-                .setSuggestionsV2(suggestionsV2)
                 .setCategory(category)
                 .setSuggestionConditionMode(suggestionConditionMode)
                 .build();
     }
 
-    public List<Tile> getSuggestions() {
-        return mDashboardData.getSuggestions();
-    }
-
-    /**
-     * @deprecated in favor of {@link #setCategory(DashboardCategory)} and
-     * {@link #setSuggestionsV2(List)}.
-     */
-    @Deprecated
-    public void setCategoriesAndSuggestions(DashboardCategory category, List<Tile> suggestions) {
-        tintIcons(category, suggestions);
-
+    public void setSuggestions(List<Suggestion> data) {
         final DashboardData prevData = mDashboardData;
         mDashboardData = new DashboardData.Builder(prevData)
-                .setSuggestions(suggestions.subList(0,
-                        Math.min(suggestions.size(), MAX_SUGGESTION_TO_SHOW)))
-                .setCategory(category)
-                .build();
-        notifyDashboardDataChanged(prevData);
-    }
-
-    public void setSuggestionsV2(List<Suggestion> data) {
-        final DashboardData prevData = mDashboardData;
-        mDashboardData = new DashboardData.Builder(prevData)
-                .setSuggestionsV2(data)
+                .setSuggestions(data)
                 .build();
         notifyDashboardDataChanged(prevData);
     }
@@ -187,30 +155,8 @@
         notifyDashboardDataChanged(prevData);
     }
 
-    /**
-     * @deprecated in favor of {@link #onSuggestionDismissed(Suggestion)}.
-     */
-    @Deprecated
-    public void onSuggestionDismissed(Tile suggestion) {
-        final List<Tile> suggestions = mDashboardData.getSuggestions();
-        if (suggestions == null || suggestions.isEmpty()) {
-            return;
-        }
-        if (suggestions.size() == 1) {
-            // The only suggestion is dismissed, and the the empty suggestion container will
-            // remain as the dashboard item. Need to refresh the dashboard list.
-            final DashboardData prevData = mDashboardData;
-            mDashboardData = new DashboardData.Builder(prevData)
-                    .setSuggestions(null)
-                    .build();
-            notifyDashboardDataChanged(prevData);
-        } else {
-            mSuggestionAdapter.removeSuggestion(suggestion);
-        }
-    }
-
     public void onSuggestionDismissed(Suggestion suggestion) {
-        final List<Suggestion> list = mDashboardData.getSuggestionsV2();
+        final List<Suggestion> list = mDashboardData.getSuggestions();
         if (list == null || list.size() == 0) {
             return;
         }
@@ -219,7 +165,7 @@
             // remain as the dashboard item. Need to refresh the dashboard list.
             final DashboardData prevData = mDashboardData;
             mDashboardData = new DashboardData.Builder(prevData)
-                    .setSuggestionsV2(null)
+                    .setSuggestions(null)
                     .build();
             notifyDashboardDataChanged(prevData);
         } else {
@@ -309,18 +255,10 @@
         return mDashboardData.getItemEntityById(itemId);
     }
 
-    /**
-     * @deprecated in favor of {@link #getSuggestionV2(int)}.
-     */
-    @Deprecated
-    public Tile getSuggestion(int position) {
+    public Suggestion getSuggestion(int position) {
         return mSuggestionAdapter.getSuggestion(position);
     }
 
-    public Suggestion getSuggestionV2(int position) {
-        return mSuggestionAdapter.getSuggestionsV2(position);
-    }
-
     @VisibleForTesting
     void notifyDashboardDataChanged(DashboardData prevData) {
         if (mFirstFrameDrawn && prevData != null) {
@@ -422,26 +360,17 @@
             int position) {
         // If there is suggestions to show, it will be at position 0 as we don't show the suggestion
         // header anymore.
-        final List<Suggestion> suggestionsV2 = mDashboardData.getSuggestionsV2();
-        final List<Tile> suggestions = mDashboardData.getSuggestions();
+        final List<Suggestion> suggestions = mDashboardData.getSuggestions();
 
         boolean conditionOnly = true;
         if (position == SUGGESTION_CONDITION_HEADER_POSITION) {
-            if (suggestions != null && suggestions.size() > 0) {
+           if (suggestions != null && suggestions.size() > 0) {
                 conditionOnly = false;
                 mSuggestionAdapter = new SuggestionAdapter(mContext, mSuggestionControllerMixin,
-                        (List<Tile>) mDashboardData.getItemEntityByPosition(position),
-                        null, mSuggestionsShownLogged);
-                mSuggestionDismissHandler = new SuggestionDismissController(mContext,
-                        holder.data, mSuggestionControllerMixin, mSuggestionParser, mCallback);
-                holder.data.setAdapter(mSuggestionAdapter);
-            } else if (suggestionsV2 != null && suggestionsV2.size() > 0) {
-                conditionOnly = false;
-                mSuggestionAdapter = new SuggestionAdapter(mContext, mSuggestionControllerMixin,
-                        null, (List<Suggestion>) mDashboardData.getItemEntityByPosition(position),
+                        (List<Suggestion>) mDashboardData.getItemEntityByPosition(position),
                         mSuggestionsShownLogged);
                 mSuggestionDismissHandler = new SuggestionDismissController(mContext,
-                        holder.data, mSuggestionControllerMixin, null /* parser */, mCallback);
+                        holder.data, mSuggestionControllerMixin, mCallback);
                 holder.data.setAdapter(mSuggestionAdapter);
             }
         }
@@ -494,14 +423,10 @@
 
     void onSaveInstanceState(Bundle outState) {
         final DashboardCategory category = mDashboardData.getCategory();
-        final List<Tile> suggestions = mDashboardData.getSuggestions();
-        final List<Suggestion> suggestionV2 = mDashboardData.getSuggestionsV2();
+        final List<Suggestion> suggestions = mDashboardData.getSuggestions();
         if (suggestions != null) {
-            outState.putParcelableArrayList(STATE_SUGGESTION_LIST, new ArrayList<>(suggestions));
-        }
-        if (suggestionV2 != null) {
-            outState.putParcelableArrayList(STATE_SUGGESTION_LIST_V2,
-                    new ArrayList<>(suggestionV2));
+            outState.putParcelableArrayList(STATE_SUGGESTION_LIST,
+                    new ArrayList<>(suggestions));
         }
         if (category != null) {
             outState.putParcelable(STATE_CATEGORY_LIST, category);
diff --git a/src/com/android/settings/dashboard/DashboardData.java b/src/com/android/settings/dashboard/DashboardData.java
index 6407960..da2a526 100644
--- a/src/com/android/settings/dashboard/DashboardData.java
+++ b/src/com/android/settings/dashboard/DashboardData.java
@@ -69,16 +69,14 @@
     private final List<Item> mItems;
     private final DashboardCategory mCategory;
     private final List<Condition> mConditions;
-    private final List<Tile> mSuggestions;
-    private final List<Suggestion> mSuggestionsV2;
+    private final List<Suggestion> mSuggestions;
     @HeaderMode
     private final int mSuggestionConditionMode;
 
     private DashboardData(Builder builder) {
         mCategory = builder.mCategory;
         mConditions = builder.mConditions;
-        mSuggestions = builder.mSuggestions;
-        mSuggestionsV2 = builder.mSuggestionsV2;
+        mSuggestions = builder.mSuggestionsV2;
         mSuggestionConditionMode = builder.mSuggestionConditionMode;
 
         mItems = new ArrayList<>();
@@ -123,14 +121,10 @@
         return mConditions;
     }
 
-    public List<Tile> getSuggestions() {
+    public List<Suggestion> getSuggestions() {
         return mSuggestions;
     }
 
-    public List<Suggestion> getSuggestionsV2() {
-        return mSuggestionsV2;
-    }
-
     public int getSuggestionConditionMode() {
         return mSuggestionConditionMode;
     }
@@ -197,22 +191,15 @@
      * and mIsShowingAll, mSuggestionConditionMode flag.
      */
     private void buildItemsData() {
-        final boolean useSuggestionV2 = mSuggestionsV2 != null;
-        final boolean hasSuggestions = useSuggestionV2
-                ? sizeOf(mSuggestionsV2) > 0
-                : sizeOf(mSuggestions) > 0;
+        final boolean hasSuggestions = sizeOf(mSuggestions) > 0;
         final List<Condition> conditions = getConditionsToShow(mConditions);
         final boolean hasConditions = sizeOf(conditions) > 0;
 
-        final List<Tile> suggestions = getSuggestionsToShow(mSuggestions);
-        final List<Suggestion> suggestionsV2 = getSuggestionsV2ToShow(mSuggestionsV2);
+        final List<Suggestion> suggestions = getSuggestionsToShow(mSuggestions);
 
-        final int hiddenSuggestion;
-        if (useSuggestionV2) {
-            hiddenSuggestion = hasSuggestions ? sizeOf(mSuggestionsV2) - sizeOf(suggestionsV2) : 0;
-        } else {
-            hiddenSuggestion = hasSuggestions ? sizeOf(mSuggestions) - sizeOf(suggestions) : 0;
-        }
+        final int hiddenSuggestion = hasSuggestions
+                ? sizeOf(mSuggestions) - sizeOf(suggestions)
+                : 0;
 
         final boolean hasSuggestionAndCollapsed = hasSuggestions
                 && mSuggestionConditionMode == HEADER_MODE_COLLAPSED;
@@ -231,15 +218,8 @@
                 R.layout.suggestion_condition_header,
                 STABLE_ID_SUGGESTION_CONDITION_MIDDLE_HEADER, onlyHasConditionAndCollapsed);
 
-        if (useSuggestionV2) {
-            addToItemList(suggestionsV2, R.layout.suggestion_condition_container,
-                    STABLE_ID_SUGGESTION_CONTAINER, sizeOf(suggestionsV2) > 0);
-        } else {
-            /* Suggestion container. This is the card view that contains the list of suggestions.
-             * This will be added whenever the suggestion list is not empty */
-            addToItemList(suggestions, R.layout.suggestion_condition_container,
-                    STABLE_ID_SUGGESTION_CONTAINER, sizeOf(suggestions) > 0);
-        }
+        addToItemList(suggestions, R.layout.suggestion_condition_container,
+                STABLE_ID_SUGGESTION_CONTAINER, sizeOf(suggestions) > 0);
 
         /* Second suggestion/condition header. This will be added when there is at least one
          * suggestion or condition that is not currently displayed, and the user can expand the
@@ -296,22 +276,7 @@
         return result;
     }
 
-    /**
-     * @deprecated in favor of {@link #getSuggestionsV2ToShow}.
-     */
-    @Deprecated
-    private List<Tile> getSuggestionsToShow(List<Tile> suggestions) {
-        if (suggestions == null || mSuggestionConditionMode == HEADER_MODE_COLLAPSED) {
-            return null;
-        }
-        if (mSuggestionConditionMode != HEADER_MODE_DEFAULT
-                || suggestions.size() <= DEFAULT_SUGGESTION_COUNT) {
-            return suggestions;
-        }
-        return suggestions.subList(0, DEFAULT_SUGGESTION_COUNT);
-    }
-
-    private List<Suggestion> getSuggestionsV2ToShow(List<Suggestion> suggestions) {
+    private List<Suggestion> getSuggestionsToShow(List<Suggestion> suggestions) {
         if (suggestions == null || mSuggestionConditionMode == HEADER_MODE_COLLAPSED) {
             return null;
         }
@@ -333,11 +298,6 @@
 
         private DashboardCategory mCategory;
         private List<Condition> mConditions;
-        /**
-         * @deprecated in favor of SuggestionList
-         */
-        @Deprecated
-        private List<Tile> mSuggestions;
         private List<Suggestion> mSuggestionsV2;
 
         public Builder() {
@@ -346,8 +306,7 @@
         public Builder(DashboardData dashboardData) {
             mCategory = dashboardData.mCategory;
             mConditions = dashboardData.mConditions;
-            mSuggestions = dashboardData.mSuggestions;
-            mSuggestionsV2 = dashboardData.mSuggestionsV2;
+            mSuggestionsV2 = dashboardData.mSuggestions;
             mSuggestionConditionMode = dashboardData.mSuggestionConditionMode;
         }
 
@@ -361,16 +320,7 @@
             return this;
         }
 
-        /**
-         * @deprecated in favor of {@link #setSuggestionsV2(List)})}
-         */
-        @Deprecated
-        public Builder setSuggestions(List<Tile> suggestions) {
-            this.mSuggestions = suggestions;
-            return this;
-        }
-
-        public Builder setSuggestionsV2(List<Suggestion> suggestions) {
+        public Builder setSuggestions(List<Suggestion> suggestions) {
             this.mSuggestionsV2 = suggestions;
             return this;
         }
diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java
index 3e1e881..6a88a38 100644
--- a/src/com/android/settings/dashboard/DashboardFragment.java
+++ b/src/com/android/settings/dashboard/DashboardFragment.java
@@ -54,7 +54,7 @@
         SummaryLoader.SummaryConsumer {
     private static final String TAG = "DashboardFragment";
 
-    private final Map<Class, AbstractPreferenceController> mPreferenceControllers =
+    private final Map<Class, List<AbstractPreferenceController>> mPreferenceControllers =
             new ArrayMap<>();
     private final Set<String> mDashboardTilePrefKeys = new ArraySet<>();
 
@@ -156,14 +156,17 @@
 
     @Override
     public boolean onPreferenceTreeClick(Preference preference) {
-        Collection<AbstractPreferenceController> controllers = mPreferenceControllers.values();
+        Collection<List<AbstractPreferenceController>> controllers =
+                mPreferenceControllers.values();
         // If preference contains intent, log it before handling.
         mMetricsFeatureProvider.logDashboardStartIntent(
                 getContext(), preference.getIntent(), getMetricsCategory());
         // Give all controllers a chance to handle click.
-        for (AbstractPreferenceController controller : controllers) {
-            if (controller.handlePreferenceTreeClick(preference)) {
-                return true;
+        for (List<AbstractPreferenceController> controllerList : controllers) {
+            for (AbstractPreferenceController controller : controllerList) {
+                if (controller.handlePreferenceTreeClick(preference)) {
+                    return true;
+                }
             }
         }
         return super.onPreferenceTreeClick(preference);
@@ -189,12 +192,23 @@
     protected abstract int getPreferenceScreenResId();
 
     protected <T extends AbstractPreferenceController> T getPreferenceController(Class<T> clazz) {
-        AbstractPreferenceController controller = mPreferenceControllers.get(clazz);
-        return (T) controller;
+        List<AbstractPreferenceController> controllerList = mPreferenceControllers.get(clazz);
+        if (controllerList != null) {
+            if (controllerList.size() > 1) {
+                Log.w(TAG, "Multiple controllers of Class " + clazz.getSimpleName()
+                        + " found, returning first one.");
+            }
+            return (T) controllerList.get(0);
+        }
+
+        return null;
     }
 
     protected void addPreferenceController(AbstractPreferenceController controller) {
-        mPreferenceControllers.put(controller.getClass(), controller);
+        if (mPreferenceControllers.get(controller.getClass()) == null) {
+            mPreferenceControllers.put(controller.getClass(), new ArrayList<>());
+        }
+        mPreferenceControllers.get(controller.getClass()).add(controller);
     }
 
     /**
@@ -249,31 +263,32 @@
         }
         addPreferencesFromResource(resId);
         final PreferenceScreen screen = getPreferenceScreen();
-        Collection<AbstractPreferenceController> controllers = mPreferenceControllers.values();
-        for (AbstractPreferenceController controller : controllers) {
-            controller.displayPreference(screen);
-        }
+        mPreferenceControllers.values().stream().flatMap(Collection::stream).forEach(
+                controller -> controller.displayPreference(screen));
     }
 
     /**
      * Update state of each preference managed by PreferenceController.
      */
     protected void updatePreferenceStates() {
-        Collection<AbstractPreferenceController> controllers = mPreferenceControllers.values();
         final PreferenceScreen screen = getPreferenceScreen();
-        for (AbstractPreferenceController controller : controllers) {
-            if (!controller.isAvailable()) {
-                continue;
-            }
-            final String key = controller.getPreferenceKey();
+        Collection<List<AbstractPreferenceController>> controllerLists =
+                mPreferenceControllers.values();
+        for (List<AbstractPreferenceController> controllerList : controllerLists) {
+            for (AbstractPreferenceController controller : controllerList) {
+                if (!controller.isAvailable()) {
+                    continue;
+                }
+                final String key = controller.getPreferenceKey();
 
-            final Preference preference = screen.findPreference(key);
-            if (preference == null) {
-                Log.d(TAG, String.format("Cannot find preference with key %s in Controller %s",
-                        key, controller.getClass().getSimpleName()));
-                continue;
+                final Preference preference = screen.findPreference(key);
+                if (preference == null) {
+                    Log.d(TAG, String.format("Cannot find preference with key %s in Controller %s",
+                            key, controller.getClass().getSimpleName()));
+                    continue;
+                }
+                controller.updateState(preference);
             }
-            controller.updateState(preference);
         }
     }
 
diff --git a/src/com/android/settings/dashboard/DashboardFragmentRegistry.java b/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
index e841496..0536403 100644
--- a/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
+++ b/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
@@ -33,7 +33,7 @@
 import com.android.settings.notification.ConfigureNotificationSettings;
 import com.android.settings.notification.SoundSettings;
 import com.android.settings.security.LockscreenDashboardFragment;
-import com.android.settings.security.SecuritySettings;
+import com.android.settings.security.SecuritySettingsV2;
 import com.android.settings.system.SystemDashboardFragment;
 import com.android.settingslib.drawer.CategoryKey;
 
@@ -77,7 +77,7 @@
                 CategoryKey.CATEGORY_SOUND);
         PARENT_TO_CATEGORY_KEY_MAP.put(StorageDashboardFragment.class.getName(),
                 CategoryKey.CATEGORY_STORAGE);
-        PARENT_TO_CATEGORY_KEY_MAP.put(SecuritySettings.class.getName(),
+        PARENT_TO_CATEGORY_KEY_MAP.put(SecuritySettingsV2.class.getName(),
                 CategoryKey.CATEGORY_SECURITY);
         PARENT_TO_CATEGORY_KEY_MAP.put(AccountDetailDashboardFragment.class.getName(),
                 CategoryKey.CATEGORY_ACCOUNT_DETAIL);
diff --git a/src/com/android/settings/dashboard/DashboardSummary.java b/src/com/android/settings/dashboard/DashboardSummary.java
index ff2a76a..61c202e 100644
--- a/src/com/android/settings/dashboard/DashboardSummary.java
+++ b/src/com/android/settings/dashboard/DashboardSummary.java
@@ -19,7 +19,6 @@
 import android.app.Activity;
 import android.app.LoaderManager;
 import android.content.Context;
-import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.Handler;
 import android.service.settings.suggestions.Suggestion;
@@ -41,19 +40,14 @@
 import com.android.settings.dashboard.conditional.FocusRecyclerView.FocusListener;
 import com.android.settings.dashboard.suggestions.SuggestionControllerMixin;
 import com.android.settings.dashboard.suggestions.SuggestionDismissController;
-import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.widget.ActionBarShadowController;
 import com.android.settingslib.drawer.CategoryKey;
 import com.android.settingslib.drawer.DashboardCategory;
 import com.android.settingslib.drawer.SettingsDrawerActivity;
 import com.android.settingslib.drawer.SettingsDrawerActivity.CategoryListener;
-import com.android.settingslib.drawer.Tile;
-import com.android.settingslib.suggestions.SuggestionList;
-import com.android.settingslib.suggestions.SuggestionParser;
 import com.android.settingslib.utils.ThreadUtils;
 
-import java.util.ArrayList;
 import java.util.List;
 
 public class DashboardSummary extends InstrumentedFragment
@@ -73,11 +67,9 @@
     private DashboardAdapter mAdapter;
     private SummaryLoader mSummaryLoader;
     private ConditionManager mConditionManager;
-    private SuggestionParser mSuggestionParser;
     private LinearLayoutManager mLayoutManager;
     private SuggestionControllerMixin mSuggestionControllerMixin;
     private DashboardFeatureProvider mDashboardFeatureProvider;
-    private SuggestionFeatureProvider mSuggestionFeatureProvider;
     private boolean isOnCategoriesChangedCalled;
     private boolean mOnConditionsChangedCalled;
 
@@ -92,13 +84,9 @@
     @Override
     public void onAttach(Context context) {
         super.onAttach(context);
-        mSuggestionFeatureProvider = FeatureFactory.getFactory(context)
-                .getSuggestionFeatureProvider(context);
-        if (mSuggestionFeatureProvider.isSuggestionV2Enabled(context)) {
-            Log.d(TAG, "Suggestion v2 is enabled, creating SuggestionControllerMixin");
-            mSuggestionControllerMixin = new SuggestionControllerMixin(context, this /* host */,
-                    getLifecycle());
-        }
+        Log.d(TAG, "Creating SuggestionControllerMixin");
+        mSuggestionControllerMixin = new SuggestionControllerMixin(context, this /* host */,
+                getLifecycle());
     }
 
     @Override
@@ -121,10 +109,6 @@
 
         mConditionManager = ConditionManager.get(activity, false);
         getLifecycle().addObserver(mConditionManager);
-        if (mSuggestionFeatureProvider.isSuggestionEnabled(activity)) {
-            mSuggestionParser = new SuggestionParser(activity,
-                    mSuggestionFeatureProvider.getSharedPrefs(activity), R.xml.suggestion_ordering);
-        }
         if (DEBUG_TIMING) {
             Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime) + " ms");
         }
@@ -211,8 +195,7 @@
         mDashboard.setHasFixedSize(true);
         mDashboard.setListener(this);
         mAdapter = new DashboardAdapter(getContext(), bundle, mConditionManager.getConditions(),
-                mSuggestionParser, mSuggestionControllerMixin,
-                this /* SuggestionDismissController.Callback */);
+                mSuggestionControllerMixin, this /* SuggestionDismissController.Callback */);
         mDashboard.setAdapter(mAdapter);
         mDashboard.setItemAnimator(new DashboardItemAnimator());
         mSummaryLoader.setSummaryConsumer(mAdapter);
@@ -228,16 +211,7 @@
 
     @VisibleForTesting
     void rebuildUI() {
-        if (!mSuggestionFeatureProvider.isSuggestionEnabled(getContext())) {
-            Log.d(TAG, "Suggestion v1 feature is disabled, skipping suggestion v1");
-            ThreadUtils.postOnBackgroundThread(() -> updateCategory());
-        } else {
-            new SuggestionLoader().execute();
-            // Set categories on their own if loading suggestions takes too long.
-            mHandler.postDelayed(() -> {
-                updateCategory();
-            }, MAX_WAIT_MILLIS);
-        }
+        ThreadUtils.postOnBackgroundThread(() -> updateCategory());
     }
 
     @Override
@@ -274,20 +248,10 @@
 
     @Override
     public Suggestion getSuggestionAt(int position) {
-        return mAdapter.getSuggestionV2(position);
-    }
-
-    @Override
-    public Tile getSuggestionForPosition(int position) {
         return mAdapter.getSuggestion(position);
     }
 
     @Override
-    public void onSuggestionDismissed(Tile suggestion) {
-        mAdapter.onSuggestionDismissed(suggestion);
-    }
-
-    @Override
     public void onSuggestionDismissed(Suggestion suggestion) {
         mAdapter.onSuggestionDismissed(suggestion);
     }
@@ -295,7 +259,7 @@
     @Override
     public void onSuggestionReady(List<Suggestion> suggestions) {
         mStagingSuggestions = suggestions;
-        mAdapter.setSuggestionsV2(suggestions);
+        mAdapter.setSuggestions(suggestions);
         if (mStagingCategory != null) {
             Log.d(TAG, "Category has loaded, setting category from suggestionReady");
             mHandler.removeCallbacksAndMessages(null);
@@ -303,49 +267,6 @@
         }
     }
 
-    /**
-     * @deprecated in favor of {@link #mSuggestionControllerMixin}.
-     */
-    @Deprecated
-    private class SuggestionLoader extends AsyncTask<Void, Void, List<Tile>> {
-        @Override
-        protected List<Tile> doInBackground(Void... params) {
-            final Context context = getContext();
-            boolean isSmartSuggestionEnabled =
-                    mSuggestionFeatureProvider.isSmartSuggestionEnabled(context);
-            final SuggestionList sl = mSuggestionParser.getSuggestions(isSmartSuggestionEnabled);
-            final List<Tile> suggestions = sl.getSuggestions();
-
-            if (isSmartSuggestionEnabled) {
-                List<String> suggestionIds = new ArrayList<>(suggestions.size());
-                for (Tile suggestion : suggestions) {
-                    suggestionIds.add(mSuggestionFeatureProvider.getSuggestionIdentifier(
-                            context, suggestion));
-                }
-                // TODO: create a Suggestion class to maintain the id and other info
-                mSuggestionFeatureProvider.rankSuggestions(suggestions, suggestionIds);
-            }
-            for (int i = 0; i < suggestions.size(); i++) {
-                Tile suggestion = suggestions.get(i);
-                if (mSuggestionFeatureProvider.isSuggestionComplete(context,
-                        suggestion.intent.getComponent())) {
-                    suggestions.remove(i--);
-                }
-            }
-            if (sl.isExclusiveSuggestionCategory()) {
-                mSuggestionFeatureProvider.filterExclusiveSuggestions(suggestions);
-            }
-            return suggestions;
-        }
-
-        @Override
-        protected void onPostExecute(List<Tile> tiles) {
-            // tell handler that suggestions were loaded quickly enough
-            mHandler.removeCallbacksAndMessages(null);
-            updateCategoryAndSuggestion(tiles);
-        }
-    }
-
     @WorkerThread
     void updateCategory() {
         final DashboardCategory category = mDashboardFeatureProvider.getTilesForCategory(
@@ -356,7 +277,7 @@
             Log.d(TAG, "Suggestion has loaded, setting suggestion/category");
             ThreadUtils.postOnMainThread(() -> {
                 if (mStagingSuggestions != null) {
-                    mAdapter.setSuggestionsV2(mStagingSuggestions);
+                    mAdapter.setSuggestions(mStagingSuggestions);
                 }
                 mAdapter.setCategory(mStagingCategory);
             });
@@ -365,26 +286,4 @@
             mHandler.postDelayed(() -> mAdapter.setCategory(mStagingCategory), MAX_WAIT_MILLIS);
         }
     }
-
-    /**
-     * @deprecated in favor of {@link #mSuggestionControllerMixin}.
-     */
-    @Deprecated
-    @VisibleForTesting
-    void updateCategoryAndSuggestion(List<Tile> suggestions) {
-        final Activity activity = getActivity();
-        if (activity == null) {
-            return;
-        }
-
-        final DashboardCategory category = mDashboardFeatureProvider.getTilesForCategory(
-                CategoryKey.CATEGORY_HOMEPAGE);
-        mSummaryLoader.updateSummaryToCache(category);
-        if (suggestions != null) {
-            mAdapter.setCategoriesAndSuggestions(category, suggestions);
-        } else {
-            mAdapter.setCategory(category);
-        }
-    }
-
 }
diff --git a/src/com/android/settings/dashboard/SummaryLoader.java b/src/com/android/settings/dashboard/SummaryLoader.java
index 5af276c..c91882d 100644
--- a/src/com/android/settings/dashboard/SummaryLoader.java
+++ b/src/com/android/settings/dashboard/SummaryLoader.java
@@ -306,7 +306,7 @@
                     makeProviderW(tile);
                     break;
                 case MSG_SET_LISTENING:
-                    boolean listening = msg.arg1 != 0;
+                    boolean listening = msg.obj != null && msg.obj.equals(1);
                     setListeningW(listening);
                     break;
             }
diff --git a/src/com/android/settings/dashboard/suggestions/EventStore.java b/src/com/android/settings/dashboard/suggestions/EventStore.java
deleted file mode 100644
index cc3872e..0000000
--- a/src/com/android/settings/dashboard/suggestions/EventStore.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2017 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.dashboard.suggestions;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.util.Log;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Stores suggestion related statistics.
- */
-public class EventStore {
-
-    public static final String TAG = "SuggestionEventStore";
-
-    public static final String EVENT_SHOWN = "shown";
-    public static final String EVENT_DISMISSED = "dismissed";
-    public static final String EVENT_CLICKED = "clicked";
-    public static final String METRIC_LAST_EVENT_TIME = "last_event_time";
-    public static final String METRIC_COUNT = "count";
-
-    private static final Set<String> EVENTS = new HashSet<String>(
-            Arrays.asList(new String[] {EVENT_SHOWN, EVENT_DISMISSED, EVENT_CLICKED}));
-    private static final Set<String> METRICS = new HashSet<String>(
-            Arrays.asList(new String[] {METRIC_LAST_EVENT_TIME, METRIC_COUNT}));
-
-    private final SharedPreferences mSharedPrefs;
-
-    public EventStore(Context context) {
-        mSharedPrefs = context.getSharedPreferences(TAG, Context.MODE_PRIVATE);
-    }
-
-    /**
-     * Writes individual log events.
-     * @param pkgName: Package for which this event is reported.
-     * @param eventType: Type of event (one of {@link #EVENTS}).
-     */
-    public void writeEvent(String pkgName, String eventType) {
-        if (!EVENTS.contains(eventType)) {
-            Log.w(TAG, "Reported event type " + eventType + " is not a valid type!");
-            return;
-        }
-        final String lastTimePrefKey = getPrefKey(pkgName, eventType, METRIC_LAST_EVENT_TIME);
-        final String countPrefKey = getPrefKey(pkgName, eventType, METRIC_COUNT);
-        writePref(lastTimePrefKey, System.currentTimeMillis());
-        writePref(countPrefKey, readPref(countPrefKey, (long) 0) + 1);
-    }
-
-    /**
-     * Reads metric of the the reported events (e.g., counts).
-     * @param pkgName: Package for which this metric is queried.
-     * @param eventType: Type of event (one of {@link #EVENTS}).
-     * @param metricType: Type of the queried metric (one of {@link #METRICS}).
-     * @return the corresponding metric.
-     */
-    public long readMetric(String pkgName, String eventType, String metricType) {
-        if (!EVENTS.contains(eventType)) {
-            Log.w(TAG, "Reported event type " + eventType + " is not a valid event!");
-            return 0;
-        } else if (!METRICS.contains(metricType)) {
-            Log.w(TAG, "Required stat type + " + metricType + " is not a valid stat!");
-            return 0;
-        }
-        return readPref(getPrefKey(pkgName, eventType, metricType), (long) 0);
-    }
-
-    private void writePref(String prefKey, long value) {
-        mSharedPrefs.edit().putLong(prefKey, value).apply();
-    }
-
-    private long readPref(String prefKey, Long defaultValue) {
-        return mSharedPrefs.getLong(prefKey, defaultValue);
-    }
-
-    private String getPrefKey(String pkgName, String eventType, String statType) {
-        return new StringBuilder()
-                .append("setting_suggestion_")
-                .append(pkgName)
-                .append("_")
-                .append(eventType)
-                .append("_")
-                .append(statType)
-                .toString();
-    }
-}
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java b/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java
index 293c95a..fc11029 100644
--- a/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java
+++ b/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java
@@ -27,12 +27,10 @@
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
-import com.android.settings.SettingsActivity;
 import com.android.settings.core.instrumentation.MetricsFeatureProvider;
 import com.android.settings.dashboard.DashboardAdapter.DashboardItemHolder;
 import com.android.settings.dashboard.DashboardAdapter.IconCache;
 import com.android.settings.overlay.FeatureFactory;
-import com.android.settingslib.drawer.Tile;
 
 import java.util.List;
 import java.util.Objects;
@@ -42,26 +40,20 @@
 
     private final Context mContext;
     private final MetricsFeatureProvider mMetricsFeatureProvider;
-    private final SuggestionFeatureProvider mSuggestionFeatureProvider;
-    @Deprecated // in favor of mSuggestionsV2
-    private final List<Tile> mSuggestions;
-    private final List<Suggestion> mSuggestionsV2;
+    private final List<Suggestion> mSuggestions;
     private final IconCache mCache;
     private final List<String> mSuggestionsShownLogged;
     private final SuggestionControllerMixin mSuggestionControllerMixin;
 
     public SuggestionAdapter(Context context, SuggestionControllerMixin suggestionControllerMixin,
-            List<Tile> suggestions, List<Suggestion> suggestionsV2,
-            List<String> suggestionsShownLogged) {
+            List<Suggestion> suggestions, List<String> suggestionsShownLogged) {
         mContext = context;
         mSuggestionControllerMixin = suggestionControllerMixin;
         mSuggestions = suggestions;
-        mSuggestionsV2 = suggestionsV2;
         mSuggestionsShownLogged = suggestionsShownLogged;
         mCache = new IconCache(context);
         final FeatureFactory factory = FeatureFactory.getFactory(context);
         mMetricsFeatureProvider = factory.getMetricsFeatureProvider();
-        mSuggestionFeatureProvider = factory.getSuggestionFeatureProvider(context);
 
         setHasStableIds(true);
     }
@@ -74,15 +66,11 @@
 
     @Override
     public void onBindViewHolder(DashboardItemHolder holder, int position) {
-        if (mSuggestions != null) {
-            bindSuggestionTile(holder, position);
-        } else {
-            bindSuggestion(holder, position);
-        }
+        bindSuggestion(holder, position);
     }
 
     private void bindSuggestion(DashboardItemHolder holder, int position) {
-        final Suggestion suggestion = mSuggestionsV2.get(position);
+        final Suggestion suggestion = mSuggestions.get(position);
         final String id = suggestion.getId();
         if (!mSuggestionsShownLogged.contains(id)) {
             mMetricsFeatureProvider.action(
@@ -101,7 +89,7 @@
         }
         final View divider = holder.itemView.findViewById(R.id.divider);
         if (divider != null) {
-            divider.setVisibility(position < mSuggestionsV2.size() - 1 ? View.VISIBLE : View.GONE);
+            divider.setVisibility(position < mSuggestions.size() - 1 ? View.VISIBLE : View.GONE);
         }
         View clickHandler = holder.itemView;
         // If a view with @android:id/primary is defined, use that as the click handler
@@ -121,110 +109,32 @@
         });
     }
 
-    /**
-     * @deprecated in favor {@link #bindSuggestion(DashboardItemHolder, int)}.
-     */
-    @Deprecated
-    private void bindSuggestionTile(DashboardItemHolder holder, int position) {
-        final Tile suggestion = (Tile) mSuggestions.get(position);
-        final String suggestionId = mSuggestionFeatureProvider.getSuggestionIdentifier(
-                mContext, suggestion);
-        // This is for cases when a suggestion is dismissed and the next one comes to view
-        if (!mSuggestionsShownLogged.contains(suggestionId)) {
-            mMetricsFeatureProvider.action(
-                    mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, suggestionId,
-                    mSuggestionFeatureProvider.getLoggingTaggedData(mContext));
-            mSuggestionsShownLogged.add(suggestionId);
-        }
-        if (suggestion.remoteViews != null) {
-            final ViewGroup itemView = (ViewGroup) holder.itemView;
-            itemView.removeAllViews();
-            itemView.addView(suggestion.remoteViews.apply(itemView.getContext(), itemView));
-        } else {
-            holder.icon.setImageDrawable(mCache.getIcon(suggestion.icon));
-            holder.title.setText(suggestion.title);
-            if (!TextUtils.isEmpty(suggestion.summary)) {
-                holder.summary.setText(suggestion.summary);
-                holder.summary.setVisibility(View.VISIBLE);
-            } else {
-                holder.summary.setVisibility(View.GONE);
-            }
-        }
-        final View divider = holder.itemView.findViewById(R.id.divider);
-        if (divider != null) {
-            divider.setVisibility(position < mSuggestions.size() - 1 ? View.VISIBLE : View.GONE);
-        }
-        View clickHandler = holder.itemView;
-        // If a view with @android:id/primary is defined, use that as the click handler
-        // instead.
-        final View primaryAction = holder.itemView.findViewById(android.R.id.primary);
-        if (primaryAction != null) {
-            clickHandler = primaryAction;
-        }
-
-        clickHandler.setOnClickListener(v -> {
-            mMetricsFeatureProvider.action(mContext,
-                    MetricsEvent.ACTION_SETTINGS_SUGGESTION, suggestionId,
-                    mSuggestionFeatureProvider.getLoggingTaggedData(mContext));
-            ((SettingsActivity) mContext).startSuggestion(suggestion.intent);
-        });
-    }
-
     @Override
     public long getItemId(int position) {
-        if (mSuggestions != null) {
-            return Objects.hash(mSuggestions.get(position).title);
-        } else {
-            return Objects.hash(mSuggestionsV2.get(position).getId());
-        }
+        return Objects.hash(mSuggestions.get(position).getId());
     }
 
     @Override
     public int getItemViewType(int position) {
-        if (mSuggestions != null) {
-            Tile suggestion = getSuggestion(position);
-
-            return suggestion.remoteViews != null
-                    ? R.layout.suggestion_tile_remote_container
-                    : R.layout.suggestion_tile;
+        final Suggestion suggestion = getSuggestion(position);
+        if ((suggestion.getFlags() & Suggestion.FLAG_HAS_BUTTON) != 0) {
+            return R.layout.suggestion_tile_with_button;
         } else {
-            final Suggestion suggestion = getSuggestionsV2(position);
-            if ((suggestion.getFlags() & Suggestion.FLAG_HAS_BUTTON) != 0) {
-                return R.layout.suggestion_tile_with_button;
-            } else {
-                return R.layout.suggestion_tile;
-            }
+            return R.layout.suggestion_tile;
         }
     }
 
     @Override
     public int getItemCount() {
-        if (mSuggestions != null) {
-            return mSuggestions.size();
-        } else {
-            return mSuggestionsV2.size();
-        }
+        return mSuggestions.size();
     }
 
-    public Tile getSuggestion(int position) {
+    public Suggestion getSuggestion(int position) {
         final long itemId = getItemId(position);
         if (mSuggestions == null) {
             return null;
         }
-        for (Tile tile : mSuggestions) {
-            if (Objects.hash(tile.title) == itemId) {
-                return tile;
-            }
-        }
-        return null;
-    }
-
-    public Suggestion getSuggestionsV2(int position) {
-        final long itemId = getItemId(position);
-        if (mSuggestionsV2 == null) {
-            return null;
-        }
-        for (Suggestion suggestion : mSuggestionsV2) {
+        for (Suggestion suggestion : mSuggestions) {
             if (Objects.hash(suggestion.getId()) == itemId) {
                 return suggestion;
             }
@@ -232,13 +142,8 @@
         return null;
     }
 
-    public void removeSuggestion(Tile suggestion) {
-        mSuggestions.remove(suggestion);
-        notifyDataSetChanged();
-    }
-
     public void removeSuggestion(Suggestion suggestion) {
-        mSuggestionsV2.remove(suggestion);
+        mSuggestions.remove(suggestion);
         notifyDataSetChanged();
     }
 }
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionDismissController.java b/src/com/android/settings/dashboard/suggestions/SuggestionDismissController.java
index f269f69..de0c129 100644
--- a/src/com/android/settings/dashboard/suggestions/SuggestionDismissController.java
+++ b/src/com/android/settings/dashboard/suggestions/SuggestionDismissController.java
@@ -23,27 +23,10 @@
 
 import com.android.settings.R;
 import com.android.settings.overlay.FeatureFactory;
-import com.android.settingslib.drawer.Tile;
-import com.android.settingslib.suggestions.SuggestionParser;
 
 public class SuggestionDismissController extends ItemTouchHelper.SimpleCallback {
 
     public interface Callback {
-
-        /**
-         * @deprecated in favor of {@link #getSuggestionAt(int)}
-         * Returns suggestion tile data from the callback
-         */
-        @Deprecated
-        Tile getSuggestionForPosition(int position);
-
-        /**
-         * @deprecated in favor of {@link #onSuggestionDismissed(Suggestion)}
-         * Called when a suggestion is dismissed.
-         */
-        @Deprecated
-        void onSuggestionDismissed(Tile suggestion);
-
         /**
          * Returns suggestion tile data from the callback
          */
@@ -58,20 +41,13 @@
     private final Context mContext;
     private final SuggestionFeatureProvider mSuggestionFeatureProvider;
     private final SuggestionControllerMixin mSuggestionMixin;
-
-    /**
-     * @deprecated in favor of the new Suggestion backend.
-     */
-    @Deprecated
-    private final SuggestionParser mSuggestionParser;
     private final Callback mCallback;
 
     public SuggestionDismissController(Context context, RecyclerView recyclerView,
-            SuggestionControllerMixin suggestionMixin, SuggestionParser parser, Callback callback) {
+            SuggestionControllerMixin suggestionMixin, Callback callback) {
         super(0, ItemTouchHelper.START | ItemTouchHelper.END);
         mSuggestionMixin = suggestionMixin;
         mContext = context;
-        mSuggestionParser = parser;
         mSuggestionFeatureProvider = FeatureFactory.getFactory(context)
                 .getSuggestionFeatureProvider(context);
         mCallback = callback;
@@ -103,13 +79,7 @@
         }
         final int position = viewHolder.getAdapterPosition();
         final Suggestion suggestionV2 = mCallback.getSuggestionAt(position);
-        if (suggestionV2 != null) {
-            mSuggestionFeatureProvider.dismissSuggestion(mContext, mSuggestionMixin, suggestionV2);
-            mCallback.onSuggestionDismissed(suggestionV2);
-        } else {
-            final Tile suggestion = mCallback.getSuggestionForPosition(position);
-            mSuggestionFeatureProvider.dismissSuggestion(mContext, mSuggestionParser, suggestion);
-            mCallback.onSuggestionDismissed(suggestion);
-        }
+        mSuggestionFeatureProvider.dismissSuggestion(mContext, mSuggestionMixin, suggestionV2);
+        mCallback.onSuggestionDismissed(suggestionV2);
     }
 }
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java
index f911401..bdc29e7 100644
--- a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java
+++ b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java
@@ -24,7 +24,6 @@
 import android.util.Pair;
 
 import com.android.settingslib.drawer.Tile;
-import com.android.settingslib.suggestions.SuggestionParser;
 
 import java.util.List;
 
@@ -33,14 +32,6 @@
 
     /**
      * Whether or not the whole suggestion feature is enabled.
-     *
-     * @deprecated in favor of {@link #isSuggestionV2Enabled(Context)}
-     */
-    @Deprecated
-    boolean isSuggestionEnabled(Context context);
-
-    /**
-     * Whether or not the suggestion v2 feature is enabled.
      */
     boolean isSuggestionV2Enabled(Context context);
 
@@ -63,44 +54,17 @@
     SharedPreferences getSharedPrefs(Context context);
 
     /**
-     * Ranks the list of suggestions in place.
-     *
-     * @param suggestions   List of suggestion Tiles
-     * @param suggestionIds List of suggestion ids corresponding to the suggestion tiles.
-     * @deprecated in favor of SettingsIntelligence
-     */
-    @Deprecated
-    void rankSuggestions(final List<Tile> suggestions, List<String> suggestionIds);
-
-    /**
      * Only keep top few suggestions from exclusive suggestions.
      */
     void filterExclusiveSuggestions(List<Tile> suggestions);
 
     /**
      * Dismisses a suggestion.
-     *
-     * @deprecated in favor of {@link #dismissSuggestion(Context, SuggestionControllerMixin,
-     * Suggestion)}
-     */
-    @Deprecated
-    void dismissSuggestion(Context context, SuggestionParser parser, Tile suggestion);
-
-    /**
-     * Dismisses a suggestion.
      */
     void dismissSuggestion(Context context, SuggestionControllerMixin suggestionMixin,
             Suggestion suggestion);
 
     /**
-     * Returns an identifier for the suggestion
-     *
-     * @deprecated in favor or {@link Suggestion#getId()}
-     */
-    @Deprecated
-    String getSuggestionIdentifier(Context context, Tile suggestion);
-
-    /**
      * Returns common tagged data for suggestion logging.
      */
     Pair<Integer, Object>[] getLoggingTaggedData(Context context);
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java
index 3fc2fb2..fe19b95 100644
--- a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java
@@ -16,19 +16,15 @@
 
 package com.android.settings.dashboard.suggestions;
 
-import static com.android.settings.core.FeatureFlags.SUGGESTIONS_V2;
-
 import android.app.ActivityManager;
 import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.SharedPreferences;
-import android.content.pm.PackageManager;
 import android.provider.Settings.Secure;
 import android.service.settings.suggestions.Suggestion;
 import android.support.annotation.NonNull;
 import android.support.annotation.VisibleForTesting;
-import android.util.FeatureFlagUtils;
 import android.util.Log;
 import android.util.Pair;
 
@@ -54,7 +50,6 @@
 import com.android.settings.wallpaper.WallpaperSuggestionActivity;
 import com.android.settings.wifi.WifiCallingSuggestionActivity;
 import com.android.settingslib.drawer.Tile;
-import com.android.settingslib.suggestions.SuggestionParser;
 
 import java.util.List;
 
@@ -65,23 +60,13 @@
 
     private static final String SHARED_PREF_FILENAME = "suggestions";
 
-    private final SuggestionRanker mSuggestionRanker;
     private final MetricsFeatureProvider mMetricsFeatureProvider;
 
     @Override
-    public boolean isSuggestionEnabled(Context context) {
-        final ActivityManager am =
-                (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
-        boolean isLowRamDevice = am.isLowRamDevice();
-        return !isLowRamDevice && !isV2Enabled(context);
-    }
-
-    @Override
     public boolean isSuggestionV2Enabled(Context context) {
         final ActivityManager am =
                 (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
-        boolean isLowRamDevice = am.isLowRamDevice();
-        return !isLowRamDevice && isV2Enabled(context);
+        return !am.isLowRamDevice();
     }
 
     @Override
@@ -91,10 +76,6 @@
                 "com.android.settings.intelligence.suggestions.SuggestionService");
     }
 
-    private static boolean isV2Enabled(Context context) {
-        return FeatureFlagUtils.isEnabled(context, SUGGESTIONS_V2);
-    }
-
     @Override
     public boolean isSmartSuggestionEnabled(Context context) {
         return false;
@@ -143,18 +124,11 @@
 
     public SuggestionFeatureProviderImpl(Context context) {
         final Context appContext = context.getApplicationContext();
-        mSuggestionRanker = new SuggestionRanker(
-                new SuggestionFeaturizer(new EventStore(appContext)));
         mMetricsFeatureProvider = FeatureFactory.getFactory(appContext)
                 .getMetricsFeatureProvider();
     }
 
     @Override
-    public void rankSuggestions(final List<Tile> suggestions, List<String> suggestionIds) {
-        mSuggestionRanker.rankSuggestions(suggestions, suggestionIds);
-    }
-
-    @Override
     public void filterExclusiveSuggestions(List<Tile> suggestions) {
         if (suggestions == null) {
             return;
@@ -166,26 +140,6 @@
     }
 
     @Override
-    public void dismissSuggestion(Context context, SuggestionParser parser, Tile suggestion) {
-        if (parser == null || suggestion == null || context == null) {
-            return;
-        }
-        final Pair<Integer, Object>[] taggedData = getLoggingTaggedData(context);
-
-        mMetricsFeatureProvider.action(
-                context, MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION,
-                getSuggestionIdentifier(context, suggestion),
-                taggedData);
-        if (!parser.dismissSuggestion(suggestion)) {
-            return;
-        }
-        context.getPackageManager().setComponentEnabledSetting(
-                suggestion.intent.getComponent(),
-                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
-                PackageManager.DONT_KILL_APP);
-    }
-
-    @Override
     public void dismissSuggestion(Context context, SuggestionControllerMixin mixin,
             Suggestion suggestion) {
         if (mixin == null || suggestion == null || context == null) {
@@ -198,24 +152,9 @@
     }
 
     @Override
-    public String getSuggestionIdentifier(Context context, Tile suggestion) {
-        if (suggestion.intent == null || suggestion.intent.getComponent() == null
-                || context == null) {
-            return "unknown_suggestion";
-        }
-        String packageName = suggestion.intent.getComponent().getPackageName();
-        if (packageName.equals(context.getPackageName())) {
-            // Since Settings provides several suggestions, fill in the class instead of the
-            // package for these.
-            packageName = suggestion.intent.getComponent().getClassName();
-        }
-        return packageName;
-    }
-
-    @Override
     public Pair<Integer, Object>[] getLoggingTaggedData(Context context) {
         final boolean isSmartSuggestionEnabled = isSmartSuggestionEnabled(context);
-        return new Pair[]{Pair.create(
+        return new Pair[] {Pair.create(
                 MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED,
                 isSmartSuggestionEnabled ? 1 : 0)};
     }
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionFeaturizer.java b/src/com/android/settings/dashboard/suggestions/SuggestionFeaturizer.java
deleted file mode 100644
index 18ac50a..0000000
--- a/src/com/android/settings/dashboard/suggestions/SuggestionFeaturizer.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2017 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.dashboard.suggestions;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Creates a set of interaction features (i.e., metrics) to represent each setting suggestion. These
- * features currently include normalized time from previous events (shown, dismissed and clicked)
- * for any particular suggestion and also counts of these events. These features are used as signals
- * to find the best ranking for suggestion items.
- */
-public class SuggestionFeaturizer {
-
-    // Key of the features used for ranking.
-    public static final String FEATURE_IS_SHOWN = "is_shown";
-    public static final String FEATURE_IS_DISMISSED = "is_dismissed";
-    public static final String FEATURE_IS_CLICKED = "is_clicked";
-    public static final String FEATURE_TIME_FROM_LAST_SHOWN = "time_from_last_shown";
-    public static final String FEATURE_TIME_FROM_LAST_DISMISSED = "time_from_last_dismissed";
-    public static final String FEATURE_TIME_FROM_LAST_CLICKED = "time_from_last_clicked";
-    public static final String FEATURE_SHOWN_COUNT = "shown_count";
-    public static final String FEATURE_DISMISSED_COUNT = "dismissed_count";
-    public static final String FEATURE_CLICKED_COUNT = "clicked_count";
-
-    // The following numbers are estimated from histograms.
-    public static final double TIME_NORMALIZATION_FACTOR = 2e10;
-    public static final double COUNT_NORMALIZATION_FACTOR = 500;
-
-    private final EventStore mEventStore;
-
-    /**
-     * Constructor
-     *
-     * @param eventStore An instance of {@code EventStore} which maintains the recorded suggestion
-     * events.
-     */
-    public SuggestionFeaturizer(EventStore eventStore) {
-        mEventStore = eventStore;
-    }
-
-    /**
-     * Extracts the features for each package name.
-     *
-     * @param pkgNames: List of package names for which features are queried.
-     * @return A Map containing the features, keyed by the package names. Each map value contains
-     * another map with key-value pairs of the features.
-     */
-    public Map<String, Map<String, Double>> featurize(List<String> pkgNames) {
-        Map<String, Map<String, Double>> features = new HashMap<>();
-        Long curTimeMs = System.currentTimeMillis();
-        for (String pkgName : pkgNames) {
-            Map<String, Double> featureMap = new HashMap<>();
-            features.put(pkgName, featureMap);
-            Long lastShownTime = mEventStore
-                    .readMetric(pkgName, EventStore.EVENT_SHOWN, EventStore.METRIC_LAST_EVENT_TIME);
-            Long lastDismissedTime = mEventStore.readMetric(pkgName, EventStore.EVENT_DISMISSED,
-                    EventStore.METRIC_LAST_EVENT_TIME);
-            Long lastClickedTime = mEventStore.readMetric(pkgName, EventStore.EVENT_CLICKED,
-                    EventStore.METRIC_LAST_EVENT_TIME);
-            featureMap.put(FEATURE_IS_SHOWN, booleanToDouble(lastShownTime > 0));
-            featureMap.put(FEATURE_IS_DISMISSED, booleanToDouble(lastDismissedTime > 0));
-            featureMap.put(FEATURE_IS_CLICKED, booleanToDouble(lastClickedTime > 0));
-            featureMap.put(FEATURE_TIME_FROM_LAST_SHOWN,
-                    normalizedTimeDiff(curTimeMs, lastShownTime));
-            featureMap.put(FEATURE_TIME_FROM_LAST_DISMISSED,
-                    normalizedTimeDiff(curTimeMs, lastDismissedTime));
-            featureMap.put(FEATURE_TIME_FROM_LAST_CLICKED,
-                    normalizedTimeDiff(curTimeMs, lastClickedTime));
-            featureMap.put(FEATURE_SHOWN_COUNT, normalizedCount(mEventStore
-                    .readMetric(pkgName, EventStore.EVENT_SHOWN, EventStore.METRIC_COUNT)));
-            featureMap.put(FEATURE_DISMISSED_COUNT, normalizedCount(mEventStore
-                    .readMetric(pkgName, EventStore.EVENT_DISMISSED, EventStore.METRIC_COUNT)));
-            featureMap.put(FEATURE_CLICKED_COUNT, normalizedCount(mEventStore
-                    .readMetric(pkgName, EventStore.EVENT_CLICKED, EventStore.METRIC_COUNT)));
-        }
-        return features;
-    }
-
-    private static double booleanToDouble(boolean bool) {
-        return bool ? 1 : 0;
-    }
-
-    private static double normalizedTimeDiff(long curTimeMs, long preTimeMs) {
-        return Math.min(1, (curTimeMs - preTimeMs) / TIME_NORMALIZATION_FACTOR);
-    }
-
-    private static double normalizedCount(long count) {
-        return Math.min(1, count / COUNT_NORMALIZATION_FACTOR);
-    }
-}
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionRanker.java b/src/com/android/settings/dashboard/suggestions/SuggestionRanker.java
deleted file mode 100644
index 14c4b15..0000000
--- a/src/com/android/settings/dashboard/suggestions/SuggestionRanker.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2017 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.dashboard.suggestions;
-
-import com.android.settingslib.drawer.Tile;
-
-import android.support.annotation.VisibleForTesting;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class SuggestionRanker {
-
-    private static final String TAG = "SuggestionRanker";
-
-    // The following coefficients form a linear model, which mixes the features to obtain a
-    // relevance metric for ranking the suggestion items. This model is learned with off-line data
-    // by training a binary classifier to detect the clicked items. The higher the obtained
-    // relevance metric, the higher chance of getting clicked.
-    private static final Map<String, Double> WEIGHTS = new HashMap<String, Double>() {{
-        put(SuggestionFeaturizer.FEATURE_IS_SHOWN, 5.05140842519);
-        put(SuggestionFeaturizer.FEATURE_IS_DISMISSED, 2.29641455171);
-        put(SuggestionFeaturizer.FEATURE_IS_CLICKED, -2.98812233623);
-        put(SuggestionFeaturizer.FEATURE_TIME_FROM_LAST_SHOWN, 5.02807250202);
-        put(SuggestionFeaturizer.FEATURE_TIME_FROM_LAST_DISMISSED, 2.49589700842);
-        put(SuggestionFeaturizer.FEATURE_TIME_FROM_LAST_CLICKED, -4.3377039948);
-        put(SuggestionFeaturizer.FEATURE_SHOWN_COUNT, -2.35993512546);
-    }};
-
-    private final SuggestionFeaturizer mSuggestionFeaturizer;
-
-    private final Map<Tile, Double> relevanceMetrics;
-
-    Comparator<Tile> suggestionComparator = new Comparator<Tile>() {
-        @Override
-        public int compare(Tile suggestion1, Tile suggestion2) {
-            return relevanceMetrics.get(suggestion1) < relevanceMetrics.get(suggestion2) ? 1 : -1;
-        }
-    };
-
-    public SuggestionRanker(SuggestionFeaturizer suggestionFeaturizer) {
-        mSuggestionFeaturizer = suggestionFeaturizer;
-        relevanceMetrics = new HashMap<Tile, Double>();
-    }
-
-    public void rankSuggestions(final List<Tile> suggestions, List<String> suggestionIds) {
-        relevanceMetrics.clear();
-        Map<String, Map<String, Double>> features = mSuggestionFeaturizer.featurize(suggestionIds);
-        for (int i = 0; i < suggestionIds.size(); i++) {
-            relevanceMetrics.put(suggestions.get(i),
-                    getRelevanceMetric(features.get(suggestionIds.get(i))));
-        }
-        Collections.sort(suggestions, suggestionComparator);
-    }
-
-    @VisibleForTesting
-    double getRelevanceMetric(Map<String, Double> features) {
-        double sum = 0;
-        if (features == null) {
-            return sum;
-        }
-        for (String feature : WEIGHTS.keySet()) {
-            sum += WEIGHTS.get(feature) * features.get(feature);
-        }
-        return sum;
-    }
-}
diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java
index af168d6..ef0f40b 100644
--- a/src/com/android/settings/notification/AppNotificationSettings.java
+++ b/src/com/android/settings/notification/AppNotificationSettings.java
@@ -135,7 +135,6 @@
         return new ArrayList<>(mControllers);
     }
 
-
     private void populateList() {
         if (!mDynamicPreferences.isEmpty()) {
             // If there's anything in mChannelGroups, we've called populateChannelList twice.
@@ -164,61 +163,41 @@
     }
 
     private void populateGroupList() {
-        PreferenceCategory groupCategory = new PreferenceCategory(getPrefContext());
-        groupCategory.setTitle(R.string.notification_channels);
-        groupCategory.setKey(KEY_GENERAL_CATEGORY);
-        groupCategory.setOrderingAsAdded(true);
-        getPreferenceScreen().addPreference(groupCategory);
-        mDynamicPreferences.add(groupCategory);
         for (NotificationChannelGroup group : mChannelGroupList) {
-            final List<NotificationChannel> channels = group.getChannels();
-            int N = channels.size();
-            // app defined groups with one channel and channels with no group display the channel
-            // name and no summary and link directly to the channel page unless the group is blocked
-            if ((group.getId() == null || N < 2) && !group.isBlocked()) {
-                Collections.sort(channels, mChannelComparator);
-                for (int i = 0; i < N; i++) {
-                    final NotificationChannel channel = channels.get(i);
-                    populateSingleChannelPrefs(groupCategory, channel, "");
-                }
+            PreferenceCategory groupCategory = new PreferenceCategory(getPrefContext());
+            groupCategory.setOrderingAsAdded(true);
+            getPreferenceScreen().addPreference(groupCategory);
+            mDynamicPreferences.add(groupCategory);
+            if (group.getId() == null) {
+                groupCategory.setTitle(mChannelGroupList.size() > 1
+                        ? R.string.notification_channels_other
+                        : R.string.notification_channels);
+                groupCategory.setKey(KEY_GENERAL_CATEGORY);
             } else {
-                populateGroupPreference(groupCategory, group, N);
+                groupCategory.setTitle(group.getName());
+                groupCategory.setKey(group.getId());
+                Bundle groupArgs = new Bundle();
+                groupArgs.putInt(AppInfoBase.ARG_PACKAGE_UID, mUid);
+                groupArgs.putString(AppInfoBase.ARG_PACKAGE_NAME, mPkg);
+                groupArgs.putString(Settings.EXTRA_CHANNEL_GROUP_ID, group.getId());
+                Intent channelIntent = Utils.onBuildStartFragmentIntent(getActivity(),
+                        ChannelGroupNotificationSettings.class.getName(),
+                        groupArgs, null, R.string.notification_group_title,
+                        null, false, getMetricsCategory());
+                groupCategory.setIntent(channelIntent);
+                populateGroupToggle(groupCategory, group);
+            }
+
+            final List<NotificationChannel> channels = group.getChannels();
+            Collections.sort(channels, mChannelComparator);
+            int N = channels.size();
+            for (int i = 0; i < N; i++) {
+                final NotificationChannel channel = channels.get(i);
+                populateSingleChannelPrefs(groupCategory, channel, group.isBlocked());
             }
         }
     }
 
-    void populateGroupPreference(PreferenceGroup parent,
-            final NotificationChannelGroup group, int channelCount) {
-        MasterSwitchPreference groupPref = new MasterSwitchPreference(
-                getPrefContext());
-        groupPref.setSwitchEnabled(mSuspendedAppsAdmin == null
-                && isChannelGroupBlockable(group));
-        groupPref.setKey(group.getId());
-        groupPref.setTitle(group.getName());
-        groupPref.setChecked(!group.isBlocked());
-        groupPref.setSummary(getResources().getQuantityString(
-                R.plurals.notification_group_summary, channelCount, channelCount));
-        Bundle groupArgs = new Bundle();
-        groupArgs.putInt(AppInfoBase.ARG_PACKAGE_UID, mUid);
-        groupArgs.putString(AppInfoBase.ARG_PACKAGE_NAME, mPkg);
-        groupArgs.putString(Settings.EXTRA_CHANNEL_GROUP_ID, group.getId());
-        Intent groupIntent = Utils.onBuildStartFragmentIntent(getActivity(),
-                ChannelGroupNotificationSettings.class.getName(),
-                groupArgs, null, R.string.notification_group_title, null, false,
-                getMetricsCategory());
-        groupPref.setIntent(groupIntent);
-
-        groupPref.setOnPreferenceChangeListener(
-                (preference, o) -> {
-                    boolean value = (Boolean) o;
-                    group.setBlocked(!value);
-                    mBackend.updateChannelGroup(mPkg, mUid, group);
-
-                    return true;
-                });
-        parent.addPreference(groupPref);
-    }
-
     private Comparator<NotificationChannelGroup> mChannelGroupComparator =
             new Comparator<NotificationChannelGroup>() {
 
diff --git a/src/com/android/settings/notification/BlockPreferenceController.java b/src/com/android/settings/notification/BlockPreferenceController.java
index 5c366ea..6b65b0f 100644
--- a/src/com/android/settings/notification/BlockPreferenceController.java
+++ b/src/com/android/settings/notification/BlockPreferenceController.java
@@ -67,6 +67,8 @@
         LayoutPreference pref = (LayoutPreference) preference;
         SwitchBar bar = pref.findViewById(R.id.switch_bar);
         if (bar != null) {
+            bar.setSwitchBarText(R.string.notification_switch_label,
+                    R.string.notification_switch_label);
             bar.show();
             try {
                 bar.addOnSwitchChangeListener(this);
diff --git a/src/com/android/settings/notification/ChannelGroupNotificationSettings.java b/src/com/android/settings/notification/ChannelGroupNotificationSettings.java
index 68dd91b..707a559 100644
--- a/src/com/android/settings/notification/ChannelGroupNotificationSettings.java
+++ b/src/com/android/settings/notification/ChannelGroupNotificationSettings.java
@@ -19,7 +19,6 @@
 import android.app.NotificationChannel;
 import android.content.Context;
 import android.support.v7.preference.Preference;
-import android.text.TextUtils;
 import android.util.Log;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -98,9 +97,7 @@
             Collections.sort(channels, mChannelComparator);
             for (NotificationChannel channel : channels) {
                 mDynamicPreferences.add(populateSingleChannelPrefs(
-                        getPreferenceScreen(), channel,
-                        ImportancePreferenceController.getImportanceSummary(
-                                getPrefContext(), channel)));
+                        getPreferenceScreen(), channel, mChannelGroup.isBlocked()));
             }
 
         }
diff --git a/src/com/android/settings/notification/ImportancePreferenceController.java b/src/com/android/settings/notification/ImportancePreferenceController.java
index ba47c54..977cd9a 100644
--- a/src/com/android/settings/notification/ImportancePreferenceController.java
+++ b/src/com/android/settings/notification/ImportancePreferenceController.java
@@ -73,7 +73,8 @@
             if (preference.isEnabled()) {
                 Intent channelIntent = Utils.onBuildStartFragmentIntent(mContext,
                         ChannelImportanceSettings.class.getName(),
-                        channelArgs, null, R.string.notification_importance_title, null,
+                        channelArgs, null,
+                        R.string.notification_importance_title, null,
                         false, getMetricsCategory());
                 preference.setIntent(channelIntent);
                 preference.setSummary(getImportanceSummary(mContext, mChannel));
@@ -82,23 +83,19 @@
     }
 
     protected static String getImportanceSummary(Context context, NotificationChannel channel) {
-        String title;
-        String summary = null;
+        String summary = "";
         int importance = channel.getImportance();
         switch (importance) {
             case IMPORTANCE_UNSPECIFIED:
-                title = context.getString(R.string.notification_importance_unspecified);
+                summary = context.getString(R.string.notification_importance_unspecified);
                 break;
             case NotificationManager.IMPORTANCE_MIN:
-                title = context.getString(R.string.notification_importance_min_title);
                 summary = context.getString(R.string.notification_importance_min);
                 break;
             case NotificationManager.IMPORTANCE_LOW:
-                title = context.getString(R.string.notification_importance_low_title);
                 summary = context.getString(R.string.notification_importance_low);
                 break;
             case NotificationManager.IMPORTANCE_DEFAULT:
-                title = context.getString(R.string.notification_importance_default_title);
                 if (SoundPreferenceController.hasValidSound(channel)) {
                     summary = context.getString(R.string.notification_importance_default);
                 } else {
@@ -107,7 +104,6 @@
                 break;
             case NotificationManager.IMPORTANCE_HIGH:
             case NotificationManager.IMPORTANCE_MAX:
-                title = context.getString(R.string.notification_importance_high_title);
                 if (SoundPreferenceController.hasValidSound(channel)) {
                     summary = context.getString(R.string.notification_importance_high);
                 } else {
@@ -118,10 +114,6 @@
                 return "";
         }
 
-        if (summary != null) {
-            return context.getString(R.string.notification_importance_divider, title, summary);
-        } else {
-            return title;
-        }
+        return summary;
     }
 }
diff --git a/src/com/android/settings/notification/NotificationSettingsBase.java b/src/com/android/settings/notification/NotificationSettingsBase.java
index 9afb618..2a7e7d5 100644
--- a/src/com/android/settings/notification/NotificationSettingsBase.java
+++ b/src/com/android/settings/notification/NotificationSettingsBase.java
@@ -61,6 +61,7 @@
 import android.provider.SearchIndexableResource;
 import android.provider.Settings;
 import android.service.notification.NotificationListenerService;
+import android.support.v14.preference.SwitchPreference;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceGroup;
 import android.support.v7.preference.PreferenceScreen;
@@ -214,7 +215,6 @@
         }
         for (ResolveInfo ri : resolveInfos) {
             final ActivityInfo activityInfo = ri.activityInfo;
-            final ApplicationInfo appInfo = activityInfo.applicationInfo;
             if (mAppRow.settingsIntent != null) {
                 if (DEBUG) {
                     Log.d(TAG, "Ignoring duplicate notification preference activity ("
@@ -225,7 +225,8 @@
             }
             mAppRow.settingsIntent = intent
                     .setPackage(null)
-                    .setClassName(activityInfo.packageName, activityInfo.name);
+                    .setClassName(activityInfo.packageName, activityInfo.name)
+                    .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
             if (mChannel != null) {
                 mAppRow.settingsIntent.putExtra(Notification.EXTRA_CHANNEL_ID, mChannel.getId());
             }
@@ -257,17 +258,41 @@
         return null;
     }
 
+    protected void populateGroupToggle(final PreferenceGroup parent,
+            NotificationChannelGroup group) {
+        RestrictedSwitchPreference preference = new RestrictedSwitchPreference(getPrefContext());
+        preference.setTitle(R.string.notification_switch_label);
+        preference.setEnabled(mSuspendedAppsAdmin == null
+                && isChannelGroupBlockable(group));
+        preference.setChecked(!group.isBlocked());
+        preference.setOnPreferenceClickListener(preference1 -> {
+            final boolean allowGroup = ((SwitchPreference) preference1).isChecked();
+            group.setBlocked(!allowGroup);
+            mBackend.updateChannelGroup(mAppRow.pkg, mAppRow.uid, group);
+
+            for (int i = 0; i < parent.getPreferenceCount(); i++) {
+                Preference pref = parent.getPreference(i);
+                if (pref instanceof MasterSwitchPreference) {
+                    ((MasterSwitchPreference) pref).setSwitchEnabled(allowGroup);
+                }
+            }
+            return true;
+        });
+
+        parent.addPreference(preference);
+    }
+
     protected Preference populateSingleChannelPrefs(PreferenceGroup parent,
-            final NotificationChannel channel, String summary) {
+            final NotificationChannel channel, final boolean groupBlocked) {
         MasterSwitchPreference channelPref = new MasterSwitchPreference(
                 getPrefContext());
         channelPref.setSwitchEnabled(mSuspendedAppsAdmin == null
                 && isChannelBlockable(channel)
-                && isChannelConfigurable(channel));
+                && isChannelConfigurable(channel)
+                && !groupBlocked);
         channelPref.setKey(channel.getId());
         channelPref.setTitle(channel.getName());
         channelPref.setChecked(channel.getImportance() != IMPORTANCE_NONE);
-        channelPref.setSummary(summary);
         Bundle channelArgs = new Bundle();
         channelArgs.putInt(AppInfoBase.ARG_PACKAGE_UID, mUid);
         channelArgs.putString(AppInfoBase.ARG_PACKAGE_NAME, mPkg);
@@ -288,7 +313,6 @@
                         channel.setImportance(importance);
                         channel.lockFields(
                                 NotificationChannel.USER_LOCKED_IMPORTANCE);
-                        channelPref.setSummary(summary);
                         mBackend.updateChannel(mPkg, mUid, channel);
 
                         return true;
diff --git a/src/com/android/settings/security/EncryptionAndCredential.java b/src/com/android/settings/security/EncryptionAndCredential.java
index 62f5a0c..aa35dd3 100644
--- a/src/com/android/settings/security/EncryptionAndCredential.java
+++ b/src/com/android/settings/security/EncryptionAndCredential.java
@@ -16,6 +16,9 @@
 
 package com.android.settings.security;
 
+import static com.android.settings.security.EncryptionStatusPreferenceController
+        .PREF_KEY_ENCRYPTION_DETAIL_PAGE;
+
 import android.content.Context;
 import android.os.UserManager;
 import android.provider.SearchIndexableResource;
@@ -63,7 +66,7 @@
             Lifecycle lifecycle) {
         final List<AbstractPreferenceController> controllers = new ArrayList<>();
         final EncryptionStatusPreferenceController encryptStatusController =
-                new EncryptionStatusPreferenceController(context);
+                new EncryptionStatusPreferenceController(context, PREF_KEY_ENCRYPTION_DETAIL_PAGE);
         controllers.add(encryptStatusController);
         controllers.add(new PreferenceCategoryController(context,
                 "encryption_and_credentials_status_category",
diff --git a/src/com/android/settings/security/EncryptionStatusPreferenceController.java b/src/com/android/settings/security/EncryptionStatusPreferenceController.java
index 7d84421..0978935 100644
--- a/src/com/android/settings/security/EncryptionStatusPreferenceController.java
+++ b/src/com/android/settings/security/EncryptionStatusPreferenceController.java
@@ -19,43 +19,45 @@
 import android.content.Context;
 import android.os.UserManager;
 import android.support.v7.preference.Preference;
+import android.text.TextUtils;
 
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.R;
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settings.core.BasePreferenceController;
 
-public class EncryptionStatusPreferenceController extends AbstractPreferenceController
-        implements PreferenceControllerMixin {
+public class EncryptionStatusPreferenceController extends BasePreferenceController {
 
-    private static final String PREF_KEY = "encryption_and_credentials_encryption_status";
+
+    static final String PREF_KEY_ENCRYPTION_DETAIL_PAGE =
+            "encryption_and_credentials_encryption_status";
+    static final String PREF_KEY_ENCRYPTION_SECURITY_PAGE = "encryption_and_credential";
 
     private final UserManager mUserManager;
 
-    public EncryptionStatusPreferenceController(Context context) {
-        super(context);
+    public EncryptionStatusPreferenceController(Context context, String key) {
+        super(context, key);
         mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
     }
 
     @Override
-    public boolean isAvailable() {
-        return mUserManager.isAdminUser();
-    }
-
-    @Override
-    public String getPreferenceKey() {
-        return PREF_KEY;
+    public int getAvailabilityStatus() {
+        return mUserManager.isAdminUser() ? AVAILABLE : DISABLED_FOR_USER;
     }
 
     @Override
     public void updateState(Preference preference) {
         final boolean encryptionEnabled = LockPatternUtils.isDeviceEncryptionEnabled();
         if (encryptionEnabled) {
-            preference.setFragment(null);
+            if (TextUtils.equals(getPreferenceKey(), PREF_KEY_ENCRYPTION_DETAIL_PAGE)) {
+                preference.setFragment(null);
+            }
             preference.setSummary(R.string.crypt_keeper_encrypted_summary);
         } else {
-            preference.setFragment(CryptKeeperSettings.class.getName());
+            if (TextUtils.equals(getPreferenceKey(), PREF_KEY_ENCRYPTION_DETAIL_PAGE)) {
+                preference.setFragment(CryptKeeperSettings.class.getName());
+            }
             preference.setSummary(R.string.summary_placeholder);
         }
+
     }
 }
diff --git a/src/com/android/settings/security/ScreenPinningPreferenceController.java b/src/com/android/settings/security/ScreenPinningPreferenceController.java
new file mode 100644
index 0000000..60279c7
--- /dev/null
+++ b/src/com/android/settings/security/ScreenPinningPreferenceController.java
@@ -0,0 +1,56 @@
+/*
+ * 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.security;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+
+public class ScreenPinningPreferenceController extends BasePreferenceController {
+
+    private static final String KEY_SCREEN_PINNING = "screen_pinning_settings";
+
+    public ScreenPinningPreferenceController(Context context) {
+        super(context, KEY_SCREEN_PINNING);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        final Preference preference = screen.findPreference(getPreferenceKey());
+        if (preference == null) {
+            return;
+        }
+        if (Settings.System.getInt(mContext.getContentResolver(),
+                Settings.System.LOCK_TO_APP_ENABLED, 0) != 0) {
+            preference.setSummary(
+                    mContext.getString(R.string.switch_on_text));
+        } else {
+            preference.setSummary(
+                    mContext.getString(R.string.switch_off_text));
+        }
+    }
+}
diff --git a/src/com/android/settings/security/SecurityFeatureProvider.java b/src/com/android/settings/security/SecurityFeatureProvider.java
index 509446d..35ff586 100644
--- a/src/com/android/settings/security/SecurityFeatureProvider.java
+++ b/src/com/android/settings/security/SecurityFeatureProvider.java
@@ -18,7 +18,10 @@
 
 import android.content.Context;
 import android.support.v7.preference.PreferenceScreen;
+import android.util.FeatureFlagUtils;
 
+import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.core.FeatureFlags;
 import com.android.settings.security.trustagent.TrustAgentManager;
 import com.android.settingslib.drawer.DashboardCategory;
 
@@ -26,10 +29,19 @@
 /** FeatureProvider for security. */
 public interface SecurityFeatureProvider {
 
+    default boolean isSecuritySettingsV2Enabled(Context context) {
+        return FeatureFlagUtils.isEnabled(context, FeatureFlags.SECURITY_SETTINGS_V2);
+    }
+
     /** Update preferences with data from associated tiles. */
     void updatePreferences(Context context, PreferenceScreen preferenceScreen,
             DashboardCategory dashboardCategory);
 
     /** Returns the {@link TrustAgentManager} bound to this {@link SecurityFeatureProvider}. */
     TrustAgentManager getTrustAgentManager();
+
+    /**
+     * Returns a {@link LockPatternUtils} instance bound to application context.
+     */
+    LockPatternUtils getLockPatternUtils(Context context);
 }
diff --git a/src/com/android/settings/security/SecurityFeatureProviderImpl.java b/src/com/android/settings/security/SecurityFeatureProviderImpl.java
index 29aaefe..70b1ec1 100644
--- a/src/com/android/settings/security/SecurityFeatureProviderImpl.java
+++ b/src/com/android/settings/security/SecurityFeatureProviderImpl.java
@@ -29,6 +29,7 @@
 import android.util.ArrayMap;
 import android.util.Pair;
 
+import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.R;
 import com.android.settings.security.trustagent.TrustAgentManager;
 import com.android.settingslib.drawer.DashboardCategory;
@@ -43,6 +44,7 @@
 public class SecurityFeatureProviderImpl implements SecurityFeatureProvider {
 
     private TrustAgentManager mTrustAgentManager;
+    private LockPatternUtils mLockPatternUtils;
 
     @VisibleForTesting
     static final Drawable DEFAULT_ICON = null;
@@ -195,4 +197,12 @@
         }
         return mTrustAgentManager;
     }
+
+    @Override
+    public LockPatternUtils getLockPatternUtils(Context context) {
+        if (mLockPatternUtils == null) {
+            mLockPatternUtils = new LockPatternUtils(context.getApplicationContext());
+        }
+        return mLockPatternUtils;
+    }
 }
diff --git a/src/com/android/settings/security/SecuritySettingsV2.java b/src/com/android/settings/security/SecuritySettingsV2.java
new file mode 100644
index 0000000..002e447
--- /dev/null
+++ b/src/com/android/settings/security/SecuritySettingsV2.java
@@ -0,0 +1,751 @@
+package com.android.settings.security;
+
+import static com.android.settings.security.EncryptionStatusPreferenceController
+        .PREF_KEY_ENCRYPTION_SECURITY_PAGE;
+
+import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.hardware.fingerprint.FingerprintManager;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.os.storage.StorageManager;
+import android.provider.SearchIndexableResource;
+import android.support.annotation.VisibleForTesting;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceGroup;
+import android.support.v7.preference.PreferenceScreen;
+import android.text.TextUtils;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.R;
+import com.android.settings.Utils;
+import com.android.settings.dashboard.DashboardFeatureProvider;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.dashboard.SummaryLoader;
+import com.android.settings.enterprise.EnterprisePrivacyPreferenceController;
+import com.android.settings.enterprise.ManageDeviceAdminPreferenceController;
+import com.android.settings.fingerprint.FingerprintSettings;
+import com.android.settings.location.LocationPreferenceController;
+import com.android.settings.notification.LockScreenNotificationPreferenceController;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.password.ChooseLockGeneric;
+import com.android.settings.password.ChooseLockSettingsHelper;
+import com.android.settings.password.ManagedLockPasswordProvider;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.SearchIndexableRaw;
+import com.android.settings.security.screenlock.ScreenLockSettings;
+import com.android.settings.security.trustagent.ManageTrustAgentsPreferenceController;
+import com.android.settings.security.trustagent.TrustAgentListPreferenceController;
+import com.android.settings.widget.GearPreference;
+import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.RestrictedPreference;
+import com.android.settingslib.RestrictedSwitchPreference;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.drawer.CategoryKey;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SecuritySettingsV2 extends DashboardFragment
+        implements Preference.OnPreferenceChangeListener,
+        GearPreference.OnGearClickListener {
+
+    private static final String TAG = "SecuritySettingsV2";
+
+    // Lock Settings
+    private static final String KEY_UNLOCK_SET_OR_CHANGE = "unlock_set_or_change";
+    private static final String KEY_UNLOCK_SET_OR_CHANGE_PROFILE = "unlock_set_or_change_profile";
+    private static final String KEY_VISIBLE_PATTERN_PROFILE = "visiblepattern_profile";
+    private static final String KEY_SECURITY_CATEGORY = "security_category";
+    private static final String KEY_UNIFICATION = "unification";
+    @VisibleForTesting
+    static final String KEY_LOCKSCREEN_PREFERENCES = "lockscreen_preferences";
+    private static final String KEY_ENCRYPTION_AND_CREDENTIALS = "encryption_and_credential";
+    private static final String KEY_LOCATION_SCANNING = "location_scanning";
+    private static final String KEY_LOCATION = "location";
+
+    private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123;
+    public static final int CHANGE_TRUST_AGENT_SETTINGS = 126;
+    private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST_PROFILE = 127;
+    private static final int UNIFY_LOCK_CONFIRM_DEVICE_REQUEST = 128;
+    private static final int UNIFY_LOCK_CONFIRM_PROFILE_REQUEST = 129;
+    private static final int UNUNIFY_LOCK_CONFIRM_DEVICE_REQUEST = 130;
+    private static final String TAG_UNIFICATION_DIALOG = "unification_dialog";
+
+    // Security status
+    private static final String KEY_SECURITY_STATUS = "security_status";
+    private static final String SECURITY_STATUS_KEY_PREFIX = "security_status_";
+
+    // Device management settings
+    private static final String KEY_ENTERPRISE_PRIVACY = "enterprise_privacy";
+    private static final String KEY_MANAGE_DEVICE_ADMIN = "manage_device_admin";
+
+    // These switch preferences need special handling since they're not all stored in Settings.
+    private static final String SWITCH_PREFERENCE_KEYS[] = {
+            KEY_UNIFICATION, KEY_VISIBLE_PATTERN_PROFILE
+    };
+
+    private static final int MY_USER_ID = UserHandle.myUserId();
+
+    private DashboardFeatureProvider mDashboardFeatureProvider;
+    private DevicePolicyManager mDPM;
+    private SecurityFeatureProvider mSecurityFeatureProvider;
+    private UserManager mUm;
+
+    private ChooseLockSettingsHelper mChooseLockSettingsHelper;
+    private LockPatternUtils mLockPatternUtils;
+    private ManagedLockPasswordProvider mManagedPasswordProvider;
+
+    private SwitchPreference mVisiblePatternProfile;
+    private RestrictedSwitchPreference mUnifyProfile;
+
+    private int mProfileChallengeUserId;
+
+    private String mCurrentDevicePassword;
+    private String mCurrentProfilePassword;
+
+    private LocationPreferenceController mLocationController;
+    private ManageDeviceAdminPreferenceController mManageDeviceAdminPreferenceController;
+    private EnterprisePrivacyPreferenceController mEnterprisePrivacyPreferenceController;
+    private EncryptionStatusPreferenceController mEncryptionStatusPreferenceController;
+    private LockScreenNotificationPreferenceController mLockScreenNotificationPreferenceController;
+    private ManageTrustAgentsPreferenceController mManageTrustAgentsPreferenceController;
+    private ScreenPinningPreferenceController mScreenPinningPreferenceController;
+    private SimLockPreferenceController mSimLockPreferenceController;
+    private ShowPasswordPreferenceController mShowPasswordPreferenceController;
+    private TrustAgentListPreferenceController mTrustAgentListPreferenceController;
+
+    @Override
+    public int getMetricsCategory() {
+        return MetricsProto.MetricsEvent.SECURITY;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        mSecurityFeatureProvider = FeatureFactory.getFactory(context).getSecurityFeatureProvider();
+        mLocationController = new LocationPreferenceController(context, getLifecycle());
+        mLockPatternUtils = mSecurityFeatureProvider.getLockPatternUtils(context);
+        mManagedPasswordProvider = ManagedLockPasswordProvider.get(context, MY_USER_ID);
+        mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
+        mUm = UserManager.get(context);
+        mDashboardFeatureProvider = FeatureFactory.getFactory(context)
+                .getDashboardFeatureProvider(context);
+
+        mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity());
+    }
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.security_settings_v2;
+    }
+
+    @Override
+    protected String getLogTag() {
+        return TAG;
+    }
+
+    @Override
+    protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+        mManageDeviceAdminPreferenceController
+                = new ManageDeviceAdminPreferenceController(context);
+        mEnterprisePrivacyPreferenceController
+                = new EnterprisePrivacyPreferenceController(context);
+        mLockScreenNotificationPreferenceController
+                = new LockScreenNotificationPreferenceController(context);
+        mManageTrustAgentsPreferenceController = new ManageTrustAgentsPreferenceController(context);
+        mScreenPinningPreferenceController = new ScreenPinningPreferenceController(context);
+        mSimLockPreferenceController = new SimLockPreferenceController(context);
+        mShowPasswordPreferenceController = new ShowPasswordPreferenceController(context);
+        mEncryptionStatusPreferenceController = new EncryptionStatusPreferenceController(
+                context, PREF_KEY_ENCRYPTION_SECURITY_PAGE);
+        mTrustAgentListPreferenceController = new TrustAgentListPreferenceController(getActivity(),
+                this /* host */, getLifecycle());
+        return null;
+    }
+
+    private static int getResIdForLockUnlockScreen(LockPatternUtils lockPatternUtils,
+            ManagedLockPasswordProvider managedPasswordProvider, int userId) {
+        final boolean isMyUser = userId == MY_USER_ID;
+        int resid = 0;
+        if (!lockPatternUtils.isSecure(userId)) {
+            if (!isMyUser) {
+                resid = R.xml.security_settings_lockscreen_profile;
+            } else if (lockPatternUtils.isLockScreenDisabled(userId)) {
+                resid = R.xml.security_settings_lockscreen;
+            } else {
+                resid = R.xml.security_settings_chooser;
+            }
+        } else {
+            switch (lockPatternUtils.getKeyguardStoredPasswordQuality(userId)) {
+                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
+                    resid = isMyUser ? R.xml.security_settings_pattern
+                            : R.xml.security_settings_pattern_profile;
+                    break;
+                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
+                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
+                    resid = isMyUser ? R.xml.security_settings_pin
+                            : R.xml.security_settings_pin_profile;
+                    break;
+                case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
+                case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
+                case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
+                    resid = isMyUser ? R.xml.security_settings_password
+                            : R.xml.security_settings_password_profile;
+                    break;
+                case DevicePolicyManager.PASSWORD_QUALITY_MANAGED:
+                    resid = managedPasswordProvider.getResIdForLockUnlockScreen(!isMyUser);
+                    break;
+            }
+        }
+        return resid;
+    }
+
+    /**
+     * Important!
+     *
+     * Don't forget to update the SecuritySearchIndexProvider if you are doing any change in the
+     * logic or adding/removing preferences here.
+     */
+    private PreferenceScreen createPreferenceHierarchy() {
+        PreferenceScreen root = getPreferenceScreen();
+        if (root != null) {
+            root.removeAll();
+        }
+        addPreferencesFromResource(R.xml.security_settings_v2);
+        root = getPreferenceScreen();
+        mTrustAgentListPreferenceController.displayPreference(root);
+
+        // Add options for lock/unlock screen
+        final int resid = getResIdForLockUnlockScreen(mLockPatternUtils,
+                mManagedPasswordProvider, MY_USER_ID);
+        addPreferencesFromResource(resid);
+
+        // DO or PO installed in the user may disallow to change password.
+        disableIfPasswordQualityManaged(KEY_UNLOCK_SET_OR_CHANGE, MY_USER_ID);
+
+        mProfileChallengeUserId = Utils.getManagedProfileId(mUm, MY_USER_ID);
+        if (mProfileChallengeUserId != UserHandle.USER_NULL
+                && mLockPatternUtils.isSeparateProfileChallengeAllowed(mProfileChallengeUserId)) {
+            addPreferencesFromResource(R.xml.security_settings_profile);
+            addPreferencesFromResource(R.xml.security_settings_unification);
+            final int profileResid = getResIdForLockUnlockScreen(mLockPatternUtils,
+                    mManagedPasswordProvider, mProfileChallengeUserId);
+            addPreferencesFromResource(profileResid);
+            maybeAddFingerprintPreference(root, mProfileChallengeUserId);
+            if (!mLockPatternUtils.isSeparateProfileChallengeEnabled(mProfileChallengeUserId)) {
+                final Preference lockPreference =
+                        root.findPreference(KEY_UNLOCK_SET_OR_CHANGE_PROFILE);
+                final String summary = getContext().getString(
+                        R.string.lock_settings_profile_unified_summary);
+                lockPreference.setSummary(summary);
+                lockPreference.setEnabled(false);
+                // PO may disallow to change password for the profile, but screen lock and managed
+                // profile's lock is the same. Disable main "Screen lock" menu.
+                disableIfPasswordQualityManaged(KEY_UNLOCK_SET_OR_CHANGE, mProfileChallengeUserId);
+            } else {
+                // PO may disallow to change profile password, and the profile's password is
+                // separated from screen lock password. Disable profile specific "Screen lock" menu.
+                disableIfPasswordQualityManaged(KEY_UNLOCK_SET_OR_CHANGE_PROFILE,
+                        mProfileChallengeUserId);
+            }
+        }
+        Preference unlockSetOrChange = findPreference(KEY_UNLOCK_SET_OR_CHANGE);
+        if (unlockSetOrChange instanceof GearPreference) {
+            ((GearPreference) unlockSetOrChange).setOnGearClickListener(this);
+        }
+
+
+        // Fingerprint and trust agents
+        PreferenceGroup securityCategory = (PreferenceGroup)
+                root.findPreference(KEY_SECURITY_CATEGORY);
+        if (securityCategory != null) {
+            maybeAddFingerprintPreference(securityCategory, UserHandle.myUserId());
+            setLockscreenPreferencesSummary(securityCategory);
+        }
+
+        mVisiblePatternProfile =
+                (SwitchPreference) root.findPreference(KEY_VISIBLE_PATTERN_PROFILE);
+        mUnifyProfile = (RestrictedSwitchPreference) root.findPreference(KEY_UNIFICATION);
+
+        mSimLockPreferenceController.displayPreference(root);
+        mScreenPinningPreferenceController.displayPreference(root);
+
+        // Advanced Security features
+        mManageTrustAgentsPreferenceController.displayPreference(root);
+
+        PreferenceGroup securityStatusPreferenceGroup =
+                (PreferenceGroup) root.findPreference(KEY_SECURITY_STATUS);
+        final List<Preference> tilePrefs = mDashboardFeatureProvider.getPreferencesForCategory(
+                getActivity(), getPrefContext(), getMetricsCategory(),
+                CategoryKey.CATEGORY_SECURITY);
+        int numSecurityStatusPrefs = 0;
+        if (tilePrefs != null && !tilePrefs.isEmpty()) {
+            for (Preference preference : tilePrefs) {
+                if (!TextUtils.isEmpty(preference.getKey())
+                        && preference.getKey().startsWith(SECURITY_STATUS_KEY_PREFIX)) {
+                    // Injected security status settings are placed under the Security status
+                    // category.
+                    securityStatusPreferenceGroup.addPreference(preference);
+                    numSecurityStatusPrefs++;
+                } else {
+                    // Other injected settings are placed under the Security preference screen.
+                    root.addPreference(preference);
+                }
+            }
+        }
+
+        if (numSecurityStatusPrefs == 0) {
+            root.removePreference(securityStatusPreferenceGroup);
+        } else if (numSecurityStatusPrefs > 0) {
+            // Update preference data with tile data. Security feature provider only updates the
+            // data if it actually needs to be changed.
+            mSecurityFeatureProvider.updatePreferences(getActivity(), root,
+                    mDashboardFeatureProvider.getTilesForCategory(
+                            CategoryKey.CATEGORY_SECURITY));
+        }
+
+        for (int i = 0; i < SWITCH_PREFERENCE_KEYS.length; i++) {
+            final Preference pref = findPreference(SWITCH_PREFERENCE_KEYS[i]);
+            if (pref != null) pref.setOnPreferenceChangeListener(this);
+        }
+
+        mLocationController.displayPreference(root);
+        mManageDeviceAdminPreferenceController.updateState(
+                root.findPreference(KEY_MANAGE_DEVICE_ADMIN));
+        mEnterprisePrivacyPreferenceController.displayPreference(root);
+        final Preference enterprisePrivacyPreference = root.findPreference(
+                mEnterprisePrivacyPreferenceController.getPreferenceKey());
+        mEnterprisePrivacyPreferenceController.updateState(enterprisePrivacyPreference);
+
+        return root;
+    }
+
+    @VisibleForTesting
+    void setLockscreenPreferencesSummary(PreferenceGroup group) {
+        final Preference lockscreenPreferences = group.findPreference(KEY_LOCKSCREEN_PREFERENCES);
+        if (lockscreenPreferences != null) {
+            lockscreenPreferences.setSummary(
+                    mLockScreenNotificationPreferenceController.getSummaryResource());
+        }
+    }
+
+    /*
+     * Sets the preference as disabled by admin if PASSWORD_QUALITY_MANAGED is set.
+     * The preference must be a RestrictedPreference.
+     */
+    private void disableIfPasswordQualityManaged(String preferenceKey, int userId) {
+        final RestrictedLockUtils.EnforcedAdmin admin =
+                RestrictedLockUtils.checkIfPasswordQualityIsSet(
+                        getActivity(), userId);
+        if (admin != null && mDPM.getPasswordQuality(admin.component, userId) ==
+                DevicePolicyManager.PASSWORD_QUALITY_MANAGED) {
+            final RestrictedPreference pref =
+                    (RestrictedPreference) getPreferenceScreen().findPreference(preferenceKey);
+            pref.setDisabledByAdmin(admin);
+        }
+    }
+
+    private void maybeAddFingerprintPreference(PreferenceGroup securityCategory, int userId) {
+        Preference fingerprintPreference =
+                FingerprintSettings.getFingerprintPreferenceForUser(
+                        securityCategory.getContext(), userId);
+        if (fingerprintPreference != null) {
+            securityCategory.addPreference(fingerprintPreference);
+        }
+    }
+
+    @Override
+    public void onGearClick(GearPreference p) {
+        if (KEY_UNLOCK_SET_OR_CHANGE.equals(p.getKey())) {
+            startFragment(this, ScreenLockSettings.class.getName(), 0, 0, null);
+        }
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+
+        // Make sure we reload the preference hierarchy since some of these settings
+        // depend on others...
+        createPreferenceHierarchy();
+
+        if (mVisiblePatternProfile != null) {
+            mVisiblePatternProfile.setChecked(mLockPatternUtils.isVisiblePatternEnabled(
+                    mProfileChallengeUserId));
+        }
+
+        updateUnificationPreference();
+
+        final Preference showPasswordPref = getPreferenceScreen().findPreference(
+                mShowPasswordPreferenceController.getPreferenceKey());
+        showPasswordPref.setOnPreferenceChangeListener(mShowPasswordPreferenceController);
+        mShowPasswordPreferenceController.updateState(showPasswordPref);
+
+        final Preference encryptionStatusPref = getPreferenceScreen().findPreference(
+                mEncryptionStatusPreferenceController.getPreferenceKey());
+        mEncryptionStatusPreferenceController.updateState(encryptionStatusPref);
+        mTrustAgentListPreferenceController.onResume();
+        mLocationController.updateSummary();
+    }
+
+    @VisibleForTesting
+    void updateUnificationPreference() {
+        if (mUnifyProfile != null) {
+            final boolean separate =
+                    mLockPatternUtils.isSeparateProfileChallengeEnabled(mProfileChallengeUserId);
+            mUnifyProfile.setChecked(!separate);
+            if (separate) {
+                mUnifyProfile.setDisabledByAdmin(RestrictedLockUtils.checkIfRestrictionEnforced(
+                        getContext(), UserManager.DISALLOW_UNIFIED_PASSWORD,
+                        mProfileChallengeUserId));
+            }
+        }
+    }
+
+    @Override
+    public boolean onPreferenceTreeClick(Preference preference) {
+        if (mTrustAgentListPreferenceController.handlePreferenceTreeClick(preference)) {
+            return true;
+        }
+        final String key = preference.getKey();
+        if (KEY_UNLOCK_SET_OR_CHANGE.equals(key)) {
+            // TODO(b/35930129): Remove once existing password can be passed into vold directly.
+            // Currently we need this logic to ensure that the QUIET_MODE is off for any work
+            // profile with unified challenge on FBE-enabled devices. Otherwise, vold would not be
+            // able to complete the operation due to the lack of (old) encryption key.
+            if (mProfileChallengeUserId != UserHandle.USER_NULL
+                    && !mLockPatternUtils.isSeparateProfileChallengeEnabled(mProfileChallengeUserId)
+                    && StorageManager.isFileEncryptedNativeOnly()) {
+                if (Utils.startQuietModeDialogIfNecessary(this.getActivity(), mUm,
+                        mProfileChallengeUserId)) {
+                    return false;
+                }
+            }
+            startFragment(this, ChooseLockGeneric.ChooseLockGenericFragment.class.getName(),
+                    R.string.lock_settings_picker_title, SET_OR_CHANGE_LOCK_METHOD_REQUEST, null);
+        } else if (KEY_UNLOCK_SET_OR_CHANGE_PROFILE.equals(key)) {
+            if (Utils.startQuietModeDialogIfNecessary(this.getActivity(), mUm,
+                    mProfileChallengeUserId)) {
+                return false;
+            }
+            Bundle extras = new Bundle();
+            extras.putInt(Intent.EXTRA_USER_ID, mProfileChallengeUserId);
+            startFragment(this, ChooseLockGeneric.ChooseLockGenericFragment.class.getName(),
+                    R.string.lock_settings_picker_title_profile,
+                    SET_OR_CHANGE_LOCK_METHOD_REQUEST_PROFILE, extras);
+        } else {
+            // If we didn't handle it, let preferences handle it.
+            return super.onPreferenceTreeClick(preference);
+        }
+        return true;
+    }
+
+    /**
+     * see confirmPatternThenDisableAndClear
+     */
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (requestCode == CHANGE_TRUST_AGENT_SETTINGS && resultCode == Activity.RESULT_OK) {
+            mTrustAgentListPreferenceController.handleActivityResult(resultCode);
+            return;
+        } else if (requestCode == UNIFY_LOCK_CONFIRM_DEVICE_REQUEST
+                && resultCode == Activity.RESULT_OK) {
+            mCurrentDevicePassword =
+                    data.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
+            launchConfirmProfileLockForUnification();
+            return;
+        } else if (requestCode == UNIFY_LOCK_CONFIRM_PROFILE_REQUEST
+                && resultCode == Activity.RESULT_OK) {
+            mCurrentProfilePassword =
+                    data.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
+            unifyLocks();
+            return;
+        } else if (requestCode == UNUNIFY_LOCK_CONFIRM_DEVICE_REQUEST
+                && resultCode == Activity.RESULT_OK) {
+            ununifyLocks();
+            return;
+        }
+        createPreferenceHierarchy();
+    }
+
+    void launchConfirmDeviceLockForUnification() {
+        final String title = getActivity().getString(
+                R.string.unlock_set_unlock_launch_picker_title);
+        final ChooseLockSettingsHelper helper =
+                new ChooseLockSettingsHelper(getActivity(), this);
+        if (!helper.launchConfirmationActivity(
+                UNIFY_LOCK_CONFIRM_DEVICE_REQUEST, title, true, MY_USER_ID)) {
+            launchConfirmProfileLockForUnification();
+        }
+    }
+
+    private void launchConfirmProfileLockForUnification() {
+        final String title = getActivity().getString(
+                R.string.unlock_set_unlock_launch_picker_title_profile);
+        final ChooseLockSettingsHelper helper =
+                new ChooseLockSettingsHelper(getActivity(), this);
+        if (!helper.launchConfirmationActivity(
+                UNIFY_LOCK_CONFIRM_PROFILE_REQUEST, title, true, mProfileChallengeUserId)) {
+            unifyLocks();
+            createPreferenceHierarchy();
+        }
+    }
+
+    private void unifyLocks() {
+        int profileQuality =
+                mLockPatternUtils.getKeyguardStoredPasswordQuality(mProfileChallengeUserId);
+        if (profileQuality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
+            mLockPatternUtils.saveLockPattern(
+                    LockPatternUtils.stringToPattern(mCurrentProfilePassword),
+                    mCurrentDevicePassword, MY_USER_ID);
+        } else {
+            mLockPatternUtils.saveLockPassword(
+                    mCurrentProfilePassword, mCurrentDevicePassword,
+                    profileQuality, MY_USER_ID);
+        }
+        mLockPatternUtils.setSeparateProfileChallengeEnabled(mProfileChallengeUserId, false,
+                mCurrentProfilePassword);
+        final boolean profilePatternVisibility =
+                mLockPatternUtils.isVisiblePatternEnabled(mProfileChallengeUserId);
+        mLockPatternUtils.setVisiblePatternEnabled(profilePatternVisibility, MY_USER_ID);
+        mCurrentDevicePassword = null;
+        mCurrentProfilePassword = null;
+    }
+
+    void unifyUncompliantLocks() {
+        mLockPatternUtils.setSeparateProfileChallengeEnabled(mProfileChallengeUserId, false,
+                mCurrentProfilePassword);
+        startFragment(this, ChooseLockGeneric.ChooseLockGenericFragment.class.getName(),
+                R.string.lock_settings_picker_title, SET_OR_CHANGE_LOCK_METHOD_REQUEST, null);
+    }
+
+    private void ununifyLocks() {
+        Bundle extras = new Bundle();
+        extras.putInt(Intent.EXTRA_USER_ID, mProfileChallengeUserId);
+        startFragment(this,
+                ChooseLockGeneric.ChooseLockGenericFragment.class.getName(),
+                R.string.lock_settings_picker_title_profile,
+                SET_OR_CHANGE_LOCK_METHOD_REQUEST_PROFILE, extras);
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object value) {
+        boolean result = true;
+        final String key = preference.getKey();
+        final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils();
+        if (KEY_VISIBLE_PATTERN_PROFILE.equals(key)) {
+            if (Utils.startQuietModeDialogIfNecessary(this.getActivity(), mUm,
+                    mProfileChallengeUserId)) {
+                return false;
+            }
+            lockPatternUtils.setVisiblePatternEnabled((Boolean) value, mProfileChallengeUserId);
+        } else if (KEY_UNIFICATION.equals(key)) {
+            if (Utils.startQuietModeDialogIfNecessary(this.getActivity(), mUm,
+                    mProfileChallengeUserId)) {
+                return false;
+            }
+            if ((Boolean) value) {
+                final boolean compliantForDevice =
+                        (mLockPatternUtils.getKeyguardStoredPasswordQuality(mProfileChallengeUserId)
+                                >= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING
+                                && mLockPatternUtils.isSeparateProfileChallengeAllowedToUnify(
+                                mProfileChallengeUserId));
+                UnificationConfirmationDialog dialog =
+                        UnificationConfirmationDialog.newIntance(compliantForDevice);
+                dialog.show(getChildFragmentManager(), TAG_UNIFICATION_DIALOG);
+            } else {
+                final String title = getActivity().getString(
+                        R.string.unlock_set_unlock_launch_picker_title);
+                final ChooseLockSettingsHelper helper =
+                        new ChooseLockSettingsHelper(getActivity(), this);
+                if (!helper.launchConfirmationActivity(
+                        UNUNIFY_LOCK_CONFIRM_DEVICE_REQUEST, title, true, MY_USER_ID)) {
+                    ununifyLocks();
+                }
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public int getHelpResource() {
+        return R.string.help_url_security;
+    }
+
+    /**
+     * For Search. Please keep it in sync when updating "createPreferenceHierarchy()"
+     */
+    public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+            new SecuritySearchIndexProvider();
+
+    private static class SecuritySearchIndexProvider extends BaseSearchIndexProvider {
+
+        // TODO (b/68001777) Refactor indexing to include all XML and block other settings.
+
+        @Override
+        public List<SearchIndexableResource> getXmlResourcesToIndex(
+                Context context, boolean enabled) {
+            final List<SearchIndexableResource> index = new ArrayList<>();
+
+            final LockPatternUtils lockPatternUtils = new LockPatternUtils(context);
+            final ManagedLockPasswordProvider managedPasswordProvider =
+                    ManagedLockPasswordProvider.get(context, MY_USER_ID);
+            final DevicePolicyManager dpm = (DevicePolicyManager)
+                    context.getSystemService(Context.DEVICE_POLICY_SERVICE);
+            final UserManager um = UserManager.get(context);
+            final int profileUserId = Utils.getManagedProfileId(um, MY_USER_ID);
+
+            // To add option for unlock screen, user's password must not be managed and
+            // must not be unified with managed profile, whose password is managed.
+            if (!isPasswordManaged(MY_USER_ID, context, dpm)
+                    && (profileUserId == UserHandle.USER_NULL
+                    || lockPatternUtils.isSeparateProfileChallengeAllowed(profileUserId)
+                    || !isPasswordManaged(profileUserId, context, dpm))) {
+                // Add options for lock/unlock screen
+                final int resId = getResIdForLockUnlockScreen(lockPatternUtils,
+                        managedPasswordProvider, MY_USER_ID);
+                index.add(getSearchResource(context, resId));
+            }
+
+            if (profileUserId != UserHandle.USER_NULL
+                    && lockPatternUtils.isSeparateProfileChallengeAllowed(profileUserId)
+                    && !isPasswordManaged(profileUserId, context, dpm)) {
+                index.add(getSearchResource(context, getResIdForLockUnlockScreen(
+                        lockPatternUtils, managedPasswordProvider, profileUserId)));
+            }
+
+            // Append the rest of the settings
+            index.add(getSearchResource(context, R.xml.security_settings_misc));
+
+            return index;
+        }
+
+        private SearchIndexableResource getSearchResource(Context context, int xmlResId) {
+            final SearchIndexableResource sir = new SearchIndexableResource(context);
+            sir.xmlResId = xmlResId;
+            return sir;
+        }
+
+        private boolean isPasswordManaged(int userId, Context context, DevicePolicyManager dpm) {
+            final RestrictedLockUtils.EnforcedAdmin admin =
+                    RestrictedLockUtils.checkIfPasswordQualityIsSet(
+                            context, userId);
+            return admin != null && dpm.getPasswordQuality(admin.component, userId) ==
+                    DevicePolicyManager.PASSWORD_QUALITY_MANAGED;
+        }
+
+        @Override
+        public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
+            final List<SearchIndexableRaw> result = new ArrayList<SearchIndexableRaw>();
+            final Resources res = context.getResources();
+
+            final String screenTitle = res.getString(R.string.security_settings_title);
+
+            SearchIndexableRaw data = new SearchIndexableRaw(context);
+            data.title = screenTitle;
+            data.key = "security_settings_screen";
+            data.screenTitle = screenTitle;
+            result.add(data);
+
+            final UserManager um = UserManager.get(context);
+
+            // Fingerprint
+            final FingerprintManager fpm = Utils.getFingerprintManagerOrNull(context);
+            if (fpm != null && fpm.isHardwareDetected()) {
+                // This catches the title which can be overloaded in an overlay
+                data = new SearchIndexableRaw(context);
+                data.title = res.getString(R.string.security_settings_fingerprint_preference_title);
+                data.key = "security_fingerprint";
+                data.screenTitle = screenTitle;
+                result.add(data);
+                // Fallback for when the above doesn't contain "fingerprint"
+                data = new SearchIndexableRaw(context);
+                data.title = res.getString(R.string.fingerprint_manage_category_title);
+                data.key = "security_managed_fingerprint";
+                data.screenTitle = screenTitle;
+                result.add(data);
+            }
+
+            final LockPatternUtils lockPatternUtils = new LockPatternUtils(context);
+            final int profileUserId = Utils.getManagedProfileId(um, MY_USER_ID);
+            if (profileUserId != UserHandle.USER_NULL
+                    && lockPatternUtils.isSeparateProfileChallengeAllowed(profileUserId)) {
+                if (lockPatternUtils.getKeyguardStoredPasswordQuality(profileUserId)
+                        >= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING
+                        && lockPatternUtils.isSeparateProfileChallengeAllowedToUnify(
+                        profileUserId)) {
+                    data = new SearchIndexableRaw(context);
+                    data.title = res.getString(R.string.lock_settings_profile_unification_title);
+                    data.key = "security_use_one_lock";
+                    data.screenTitle = screenTitle;
+                    result.add(data);
+                }
+            }
+            return result;
+        }
+
+        @Override
+        public List<String> getNonIndexableKeys(Context context) {
+            final List<String> keys = super.getNonIndexableKeys(context);
+
+            new SimLockPreferenceController(context).updateNonIndexableKeys(keys);
+
+            if (!(new EnterprisePrivacyPreferenceController(context))
+                    .isAvailable()) {
+                keys.add(KEY_ENTERPRISE_PRIVACY);
+            }
+
+            // Duplicate in special app access
+            keys.add(KEY_MANAGE_DEVICE_ADMIN);
+            // Duplicates between parent-child
+            keys.add(KEY_LOCATION);
+            keys.add(KEY_ENCRYPTION_AND_CREDENTIALS);
+            keys.add(KEY_LOCATION_SCANNING);
+
+            return keys;
+        }
+    }
+
+    static class SummaryProvider implements SummaryLoader.SummaryProvider {
+
+        private final Context mContext;
+        private final SummaryLoader mSummaryLoader;
+
+        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
+            mContext = context;
+            mSummaryLoader = summaryLoader;
+        }
+
+        @Override
+        public void setListening(boolean listening) {
+            if (listening) {
+                final FingerprintManager fpm =
+                        Utils.getFingerprintManagerOrNull(mContext);
+                if (fpm != null && fpm.isHardwareDetected()) {
+                    mSummaryLoader.setSummary(this,
+                            mContext.getString(R.string.security_dashboard_summary));
+                } else {
+                    mSummaryLoader.setSummary(this, mContext.getString(
+                            R.string.security_dashboard_summary_no_fingerprint));
+                }
+            }
+        }
+    }
+
+    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY =
+            new SummaryLoader.SummaryProviderFactory() {
+                @Override
+                public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
+                        SummaryLoader summaryLoader) {
+                    return new SummaryProvider(activity, summaryLoader);
+                }
+            };
+}
diff --git a/src/com/android/settings/security/ShowPasswordPreferenceController.java b/src/com/android/settings/security/ShowPasswordPreferenceController.java
new file mode 100644
index 0000000..9f9b52d
--- /dev/null
+++ b/src/com/android/settings/security/ShowPasswordPreferenceController.java
@@ -0,0 +1,58 @@
+/*
+ * 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.security;
+
+import android.content.Context;
+import android.os.UserHandle;
+import android.provider.Settings;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.core.TogglePreferenceController;
+import com.android.settings.overlay.FeatureFactory;
+
+public class ShowPasswordPreferenceController extends TogglePreferenceController {
+
+    private static final String KEY_SHOW_PASSWORD = "show_password";
+    private static final int MY_USER_ID = UserHandle.myUserId();
+    private final LockPatternUtils mLockPatternUtils;
+
+    public ShowPasswordPreferenceController(Context context) {
+        super(context, KEY_SHOW_PASSWORD);
+        mLockPatternUtils = FeatureFactory.getFactory(context)
+                .getSecurityFeatureProvider()
+                .getLockPatternUtils(context);
+    }
+
+    @Override
+    public boolean isChecked() {
+        return Settings.System.getInt(mContext.getContentResolver(),
+                Settings.System.TEXT_SHOW_PASSWORD, 1) != 0;
+    }
+
+    @Override
+    public void setChecked(boolean isChecked) {
+        Settings.System.putInt(mContext.getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD,
+                isChecked ? 1 : 0);
+        mLockPatternUtils.setVisiblePasswordEnabled(isChecked, MY_USER_ID);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+}
+
diff --git a/src/com/android/settings/security/SimLockPreferenceController.java b/src/com/android/settings/security/SimLockPreferenceController.java
new file mode 100644
index 0000000..797f098
--- /dev/null
+++ b/src/com/android/settings/security/SimLockPreferenceController.java
@@ -0,0 +1,108 @@
+/*
+ * 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.security;
+
+import android.content.Context;
+import android.os.PersistableBundle;
+import android.os.UserManager;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import com.android.settings.core.BasePreferenceController;
+
+import java.util.List;
+
+public class SimLockPreferenceController extends BasePreferenceController {
+
+    private static final String KEY_SIM_LOCK = "sim_lock_settings";
+
+    private final CarrierConfigManager mCarrierConfigManager;
+    private final UserManager mUserManager;
+    private final SubscriptionManager mSubscriptionManager;
+    private final TelephonyManager mTelephonyManager;
+
+    public SimLockPreferenceController(Context context) {
+        super(context, KEY_SIM_LOCK);
+        mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
+        mCarrierConfigManager = (CarrierConfigManager)
+                mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);
+        mSubscriptionManager = (SubscriptionManager) context
+                .getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
+        mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        final PersistableBundle b = mCarrierConfigManager.getConfig();
+        final boolean IsAdmin = mUserManager.isAdminUser();
+        if (!IsAdmin || !isSimIccReady() ||
+                b.getBoolean(CarrierConfigManager.KEY_HIDE_SIM_LOCK_SETTINGS_BOOL)) {
+            return DISABLED_FOR_USER;
+        }
+        return AVAILABLE;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        final Preference preference = screen.findPreference(getPreferenceKey());
+        if (preference == null) {
+            return;
+        }
+        // Disable SIM lock if there is no ready SIM card.
+        preference.setEnabled(isSimReady());
+    }
+
+    /* Return true if a SIM is ready for locking.
+     * TODO: consider adding to TelephonyManager or SubscritpionManasger.
+     */
+    private boolean isSimReady() {
+        final List<SubscriptionInfo> subInfoList =
+                mSubscriptionManager.getActiveSubscriptionInfoList();
+        if (subInfoList != null) {
+            for (SubscriptionInfo subInfo : subInfoList) {
+                final int simState = mTelephonyManager.getSimState(subInfo.getSimSlotIndex());
+                if ((simState != TelephonyManager.SIM_STATE_ABSENT) &&
+                        (simState != TelephonyManager.SIM_STATE_UNKNOWN)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Return true if a there is a Slot that has Icc
+     */
+    private boolean isSimIccReady() {
+        final List<SubscriptionInfo> subInfoList =
+                mSubscriptionManager.getActiveSubscriptionInfoList();
+
+        if (subInfoList != null) {
+            for (SubscriptionInfo subInfo : subInfoList) {
+                if (mTelephonyManager.hasIccCard(subInfo.getSimSlotIndex())) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+}
diff --git a/src/com/android/settings/security/UnificationConfirmationDialog.java b/src/com/android/settings/security/UnificationConfirmationDialog.java
new file mode 100644
index 0000000..21118d7
--- /dev/null
+++ b/src/com/android/settings/security/UnificationConfirmationDialog.java
@@ -0,0 +1,82 @@
+/*
+ * 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.security;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.FragmentManager;
+import android.content.DialogInterface;
+import android.os.Bundle;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.R;
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+
+public class UnificationConfirmationDialog extends InstrumentedDialogFragment {
+    private static final String EXTRA_COMPLIANT = "compliant";
+
+    public static UnificationConfirmationDialog newIntance(boolean compliant) {
+        UnificationConfirmationDialog
+                dialog = new UnificationConfirmationDialog();
+        Bundle args = new Bundle();
+        args.putBoolean(EXTRA_COMPLIANT, compliant);
+        dialog.setArguments(args);
+        return dialog;
+    }
+
+    @Override
+    public void show(FragmentManager manager, String tag) {
+        if (manager.findFragmentByTag(tag) == null) {
+            // Prevent opening multiple dialogs if tapped on button quickly
+            super.show(manager, tag);
+        }
+    }
+
+    @Override
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        final SecuritySettingsV2 parentFragment = ((SecuritySettingsV2) getParentFragment());
+        final boolean compliant = getArguments().getBoolean(EXTRA_COMPLIANT);
+        return new AlertDialog.Builder(getActivity())
+                .setTitle(R.string.lock_settings_profile_unification_dialog_title)
+                .setMessage(compliant ? R.string.lock_settings_profile_unification_dialog_body
+                        : R.string.lock_settings_profile_unification_dialog_uncompliant_body)
+                .setPositiveButton(
+                        compliant ? R.string.lock_settings_profile_unification_dialog_confirm
+                                : R.string.lock_settings_profile_unification_dialog_uncompliant_confirm,
+                        (dialog, whichButton) -> {
+                            if (compliant) {
+                                parentFragment.launchConfirmDeviceLockForUnification();
+                            }    else {
+                                parentFragment.unifyUncompliantLocks();
+                            }
+                        }
+                )
+                .setNegativeButton(R.string.cancel, null)
+                .create();
+    }
+
+    @Override
+    public void onDismiss(DialogInterface dialog) {
+        super.onDismiss(dialog);
+        ((SecuritySettingsV2) getParentFragment()).updateUnificationPreference();
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return MetricsProto.MetricsEvent.DIALOG_UNIFICATION_CONFIRMATION;
+    }
+}
diff --git a/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceController.java b/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceController.java
new file mode 100644
index 0000000..c615eff
--- /dev/null
+++ b/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceController.java
@@ -0,0 +1,76 @@
+/*
+ * 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.security.trustagent;
+
+import android.content.Context;
+import android.os.UserHandle;
+import android.support.annotation.VisibleForTesting;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.security.SecurityFeatureProvider;
+
+public class ManageTrustAgentsPreferenceController extends BasePreferenceController {
+
+    @VisibleForTesting
+    static final String KEY_MANAGE_TRUST_AGENTS = "manage_trust_agents";
+    private static final int MY_USER_ID = UserHandle.myUserId();
+
+    private final LockPatternUtils mLockPatternUtils;
+    private TrustAgentManager mTrustAgentManager;
+
+    public ManageTrustAgentsPreferenceController(Context context) {
+        super(context, KEY_MANAGE_TRUST_AGENTS);
+        final SecurityFeatureProvider securityFeatureProvider = FeatureFactory.getFactory(context)
+                .getSecurityFeatureProvider();
+        mLockPatternUtils = securityFeatureProvider.getLockPatternUtils(context);
+        mTrustAgentManager = securityFeatureProvider.getTrustAgentManager();
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        final Preference preference = screen.findPreference(getPreferenceKey());
+        if (preference == null) {
+            return;
+        }
+        final int numberOfTrustAgent = getTrustAgentCount();
+        if (!mLockPatternUtils.isSecure(MY_USER_ID)) {
+            preference.setEnabled(false);
+            preference.setSummary(R.string.disabled_because_no_backup_security);
+        } else if (numberOfTrustAgent > 0) {
+            preference.setSummary(mContext.getResources().getQuantityString(
+                    R.plurals.manage_trust_agents_summary_on,
+                    numberOfTrustAgent, numberOfTrustAgent));
+        } else {
+            preference.setSummary(R.string.manage_trust_agents_summary);
+        }
+    }
+
+    private int getTrustAgentCount() {
+        return mTrustAgentManager.getActiveTrustAgents(mContext, mLockPatternUtils).size();
+    }
+}
diff --git a/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java b/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java
new file mode 100644
index 0000000..d99757b
--- /dev/null
+++ b/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java
@@ -0,0 +1,172 @@
+/*
+ * 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.security.trustagent;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.support.annotation.VisibleForTesting;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceCategory;
+import android.support.v7.preference.PreferenceScreen;
+import android.text.TextUtils;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.R;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.password.ChooseLockSettingsHelper;
+import com.android.settings.security.SecurityFeatureProvider;
+import com.android.settings.security.SecuritySettingsV2;
+import com.android.settingslib.RestrictedPreference;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnCreate;
+import com.android.settingslib.core.lifecycle.events.OnResume;
+import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
+
+import java.util.List;
+
+public class TrustAgentListPreferenceController extends AbstractPreferenceController
+        implements LifecycleObserver, OnSaveInstanceState, OnCreate, OnResume {
+
+    private static final String TRUST_AGENT_CLICK_INTENT = "trust_agent_click_intent";
+    @VisibleForTesting
+    static final String PREF_KEY_TRUST_AGENT = "trust_agent";
+    @VisibleForTesting
+    static final String PREF_KEY_SECURITY_CATEGORY = "security_category";
+    private static final int MY_USER_ID = UserHandle.myUserId();
+
+    private final LockPatternUtils mLockPatternUtils;
+    private final TrustAgentManager mTrustAgentManager;
+    private final Activity mActivity;
+    private final SecuritySettingsV2 mHost;
+
+    private Intent mTrustAgentClickIntent;
+    private PreferenceCategory mSecurityCategory;
+
+    public TrustAgentListPreferenceController(Activity activity, SecuritySettingsV2 host,
+            Lifecycle lifecycle) {
+        super(activity);
+        final SecurityFeatureProvider provider = FeatureFactory.getFactory(activity)
+                .getSecurityFeatureProvider();
+        mActivity = activity;
+        mHost = host;
+        mLockPatternUtils = provider.getLockPatternUtils(activity);
+        mTrustAgentManager = provider.getTrustAgentManager();
+        if (lifecycle != null) {
+            lifecycle.addObserver(this);
+        }
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return true;
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return PREF_KEY_TRUST_AGENT;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        mSecurityCategory = (PreferenceCategory) screen.findPreference(PREF_KEY_SECURITY_CATEGORY);
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        if (savedInstanceState != null
+                && savedInstanceState.containsKey(TRUST_AGENT_CLICK_INTENT)) {
+            mTrustAgentClickIntent = savedInstanceState.getParcelable(TRUST_AGENT_CLICK_INTENT);
+        }
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        if (mTrustAgentClickIntent != null) {
+            outState.putParcelable(TRUST_AGENT_CLICK_INTENT, mTrustAgentClickIntent);
+        }
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
+            return super.handlePreferenceTreeClick(preference);
+        }
+        final ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(mActivity, mHost);
+        mTrustAgentClickIntent = preference.getIntent();
+        boolean confirmationLaunched = helper.launchConfirmationActivity(
+                SecuritySettingsV2.CHANGE_TRUST_AGENT_SETTINGS, preference.getTitle());
+
+        if (!confirmationLaunched && mTrustAgentClickIntent != null) {
+            // If this returns false, it means no password confirmation is required.
+            mHost.startActivity(mTrustAgentClickIntent);
+            mTrustAgentClickIntent = null;
+        }
+        return true;
+    }
+
+    @Override
+    public void onResume() {
+        if (mSecurityCategory == null) {
+            return;
+        }
+        // First remove all old trust agents.
+        while (true) {
+            final Preference oldAgent = mSecurityCategory.findPreference(PREF_KEY_TRUST_AGENT);
+            if (oldAgent == null) {
+                break;
+            } else {
+                mSecurityCategory.removePreference(oldAgent);
+            }
+        }
+        // Then add new ones.
+        final boolean hasSecurity = mLockPatternUtils.isSecure(MY_USER_ID);
+        final List<TrustAgentManager.TrustAgentComponentInfo> agents =
+                mTrustAgentManager.getActiveTrustAgents(mContext, mLockPatternUtils);
+        if (agents == null) {
+            return;
+        }
+        for (TrustAgentManager.TrustAgentComponentInfo agent : agents) {
+            final RestrictedPreference trustAgentPreference =
+                    new RestrictedPreference(mSecurityCategory.getContext());
+            trustAgentPreference.setKey(PREF_KEY_TRUST_AGENT);
+            trustAgentPreference.setTitle(agent.title);
+            trustAgentPreference.setSummary(agent.summary);
+            // Create intent for this preference.
+            trustAgentPreference.setIntent(new Intent(Intent.ACTION_MAIN)
+                    .setComponent(agent.componentName));
+            trustAgentPreference.setDisabledByAdmin(agent.admin);
+            if (!trustAgentPreference.isDisabledByAdmin() && !hasSecurity) {
+                trustAgentPreference.setEnabled(false);
+                trustAgentPreference.setSummary(R.string.disabled_because_no_backup_security);
+            }
+            // Add preference to the settings menu.
+            mSecurityCategory.addPreference(trustAgentPreference);
+        }
+    }
+
+    public void handleActivityResult(int resultCode) {
+        if (resultCode == Activity.RESULT_OK && mTrustAgentClickIntent != null) {
+            mHost.startActivity(mTrustAgentClickIntent);
+            mTrustAgentClickIntent = null;
+        }
+    }
+}
diff --git a/src/com/android/settings/widget/SwitchBar.java b/src/com/android/settings/widget/SwitchBar.java
index 3d30638..3c1e7c1 100644
--- a/src/com/android/settings/widget/SwitchBar.java
+++ b/src/com/android/settings/widget/SwitchBar.java
@@ -64,6 +64,8 @@
     private TextView mTextView;
     private String mLabel;
     private String mSummary;
+    private int mOnTextId;
+    private int mOffTextId;
 
     private boolean mLoggingIntialized;
     private boolean mDisabledByAdmin;
@@ -102,9 +104,7 @@
 
         mTextView = (TextView) findViewById(R.id.switch_text);
         mTextView.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
-        mLabel = getResources().getString(R.string.switch_off_text);
         mSummarySpan = new TextAppearanceSpan(mContext, R.style.TextAppearance_Small_SwitchBar);
-        updateText();
         ViewGroup.MarginLayoutParams lp = (MarginLayoutParams) mTextView.getLayoutParams();
         lp.setMarginStart(switchBarMarginStart);
 
@@ -117,6 +117,8 @@
         lp.setMarginEnd(switchBarMarginEnd);
         setBackgroundColor(switchBarBackgroundColor);
 
+        setSwitchBarText(R.string.switch_on_text, R.string.switch_off_text);
+
         addOnSwitchChangeListener(new OnSwitchChangeListener() {
             @Override
             public void onSwitchChanged(Switch switchView, boolean isChecked) {
@@ -139,11 +141,16 @@
     }
 
     public void setTextViewLabel(boolean isChecked) {
-        mLabel = getResources()
-                .getString(isChecked ? R.string.switch_on_text : R.string.switch_off_text);
+        mLabel = getResources().getString(isChecked ? mOnTextId : mOffTextId);
         updateText();
     }
 
+    public void setSwitchBarText(int onText, int offText) {
+        mOnTextId = onText;
+        mOffTextId = offText;
+        setTextViewLabel(isChecked());
+    }
+
     public void setSummary(String summary) {
         mSummary = summary;
         updateText();
diff --git a/src/com/android/settings/wifi/ConfigureWifiSettings.java b/src/com/android/settings/wifi/ConfigureWifiSettings.java
index 4cb87e5..3cd925e 100644
--- a/src/com/android/settings/wifi/ConfigureWifiSettings.java
+++ b/src/com/android/settings/wifi/ConfigureWifiSettings.java
@@ -44,6 +44,7 @@
 
     private static final String TAG = "ConfigureWifiSettings";
 
+    public static final String KEY_WIFI_CONFIGURE = "wifi_configure_settings_screen";
     public static final String KEY_IP_ADDRESS = "current_ip_address";
 
     private WifiWakeupPreferenceController mWifiWakeupPreferenceController;
@@ -134,5 +135,10 @@
 
                     return keys;
                 }
+
+                protected boolean isPageSearchEnabled(Context context) {
+                    return context.getResources()
+                            .getBoolean(R.bool.config_show_wifi_settings);
+                }
             };
 }
diff --git a/src/com/android/settings/wifi/WifiMasterSwitchPreferenceController.java b/src/com/android/settings/wifi/WifiMasterSwitchPreferenceController.java
index 2fadede..de1b030 100644
--- a/src/com/android/settings/wifi/WifiMasterSwitchPreferenceController.java
+++ b/src/com/android/settings/wifi/WifiMasterSwitchPreferenceController.java
@@ -20,6 +20,7 @@
 
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.core.instrumentation.MetricsFeatureProvider;
+import com.android.settings.R;
 import com.android.settings.widget.SummaryUpdater;
 import com.android.settings.widget.MasterSwitchPreference;
 import com.android.settings.widget.MasterSwitchController;
@@ -56,7 +57,7 @@
 
     @Override
     public boolean isAvailable() {
-        return true;
+        return mContext.getResources().getBoolean(R.bool.config_show_wifi_settings);
     }
 
     @Override
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 863bf6b..73f17f7 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -167,7 +167,7 @@
     private LinkablePreference mStatusMessagePreference;
 
     // For Search
-    private static final String DATA_KEY_REFERENCE = "main_toggle_wifi";
+    public static final String DATA_KEY_REFERENCE = "main_toggle_wifi";
 
     /**
      * Tracks whether the user initiated a connection via clicking in order to autoscroll to the
@@ -1104,13 +1104,15 @@
                 final List<SearchIndexableRaw> result = new ArrayList<>();
                 final Resources res = context.getResources();
 
-                // Add fragment title
-                SearchIndexableRaw data = new SearchIndexableRaw(context);
-                data.title = res.getString(R.string.wifi_settings);
-                data.screenTitle = res.getString(R.string.wifi_settings);
-                data.keywords = res.getString(R.string.keywords_wifi);
-                data.key = DATA_KEY_REFERENCE;
-                result.add(data);
+                // Add fragment title if we are showing this fragment
+                if (res.getBoolean(R.bool.config_show_wifi_settings)) {
+                    SearchIndexableRaw data = new SearchIndexableRaw(context);
+                    data.title = res.getString(R.string.wifi_settings);
+                    data.screenTitle = res.getString(R.string.wifi_settings);
+                    data.keywords = res.getString(R.string.keywords_wifi);
+                    data.key = DATA_KEY_REFERENCE;
+                    result.add(data);
+                }
 
                 return result;
             }
diff --git a/tests/robotests/assets/grandfather_not_in_search_index_provider_registry b/tests/robotests/assets/grandfather_not_in_search_index_provider_registry
index 666b224..146893c 100644
--- a/tests/robotests/assets/grandfather_not_in_search_index_provider_registry
+++ b/tests/robotests/assets/grandfather_not_in_search_index_provider_registry
@@ -1,2 +1,3 @@
 com.android.settings.display.ScreenZoomPreferenceFragmentForSetupWizard
-com.android.settings.search.indexing.FakeSettingsFragment
\ No newline at end of file
+com.android.settings.search.indexing.FakeSettingsFragment
+com.android.settings.security.SecuritySettingsV2
\ No newline at end of file
diff --git a/tests/robotests/res/values-mcc999/config.xml b/tests/robotests/res/values-mcc999/config.xml
index f8f59f1..d2e146b 100644
--- a/tests/robotests/res/values-mcc999/config.xml
+++ b/tests/robotests/res/values-mcc999/config.xml
@@ -20,6 +20,7 @@
     <bool name="config_show_camera_laser_sensor">false</bool>
     <bool name="config_show_connectivity_monitor">false</bool>
     <bool name="config_display_recent_apps">false</bool>
+    <bool name="config_show_wifi_settings">false</bool>
     <bool name="config_location_mode_available">false</bool>
     <bool name="config_show_wallpaper_attribution">false</bool>
     <bool name="config_show_default_home">false</bool>
diff --git a/tests/robotests/src/com/android/settings/core/XmlControllerAttributeTest.java b/tests/robotests/src/com/android/settings/core/XmlControllerAttributeTest.java
index ed4e815..c561d0d 100644
--- a/tests/robotests/src/com/android/settings/core/XmlControllerAttributeTest.java
+++ b/tests/robotests/src/com/android/settings/core/XmlControllerAttributeTest.java
@@ -16,6 +16,7 @@
 import com.android.settings.search.SearchIndexableResources;
 import com.android.settings.search.XmlParserUtils;
 import com.android.settings.security.SecuritySettings;
+import com.android.settings.security.SecuritySettingsV2;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.After;
@@ -42,7 +43,8 @@
     // List of classes that are too hard to mock in order to retrieve xml information.
     private final List<Class> illegalClasses = new ArrayList<>(
             Arrays.asList(
-                    SecuritySettings.class
+                    SecuritySettings.class,
+                    SecuritySettingsV2.class
             ));
 
     // List of XML that could be retrieved from the illegalClasses list.
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java
index e2359e3..f9ef424 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java
@@ -28,13 +28,10 @@
 import static org.mockito.Mockito.when;
 
 import android.app.PendingIntent;
-import android.content.ComponentName;
 import android.content.Context;
-import android.content.Intent;
 import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.graphics.drawable.Icon;
-import android.os.Bundle;
 import android.service.settings.suggestions.Suggestion;
 import android.support.v7.widget.RecyclerView;
 import android.util.DisplayMetrics;
@@ -46,7 +43,6 @@
 import com.android.settings.SettingsActivity;
 import com.android.settings.TestConfig;
 import com.android.settings.dashboard.conditional.Condition;
-import com.android.settings.dashboard.conditional.ConditionAdapter;
 import com.android.settings.dashboard.suggestions.SuggestionAdapter;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
@@ -94,12 +90,6 @@
         MockitoAnnotations.initMocks(this);
         mFactory = FakeFeatureFactory.setupForTest();
         when(mFactory.dashboardFeatureProvider.shouldTintIcon()).thenReturn(true);
-        when(mFactory.suggestionsFeatureProvider
-                .getSuggestionIdentifier(any(Context.class), any(Tile.class)))
-                .thenAnswer(invocation -> {
-                    final Object[] args = invocation.getArguments();
-                    return ((Tile) args[1]).intent.getComponent().getPackageName();
-                });
 
         when(mContext.getResources()).thenReturn(mResources);
         when(mResources.getQuantityString(any(int.class), any(int.class), any()))
@@ -108,14 +98,14 @@
         mConditionList = new ArrayList<>();
         mConditionList.add(mCondition);
         when(mCondition.shouldShow()).thenReturn(true);
-        mDashboardAdapter = new DashboardAdapter(mContext, null, mConditionList, null, null, null);
+        mDashboardAdapter = new DashboardAdapter(mContext, null, mConditionList, null, null);
         mSuggestionHeaderData = new DashboardData.SuggestionConditionHeaderData(mConditionList, 1);
         when(mView.getTag()).thenReturn(mCondition);
     }
 
     @Test
     public void testSuggestionsLogs_nullSuggestionsList_shouldNotCrash() {
-        setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3", "pkg4", "pkg5"));
+        setupSuggestions(makeSuggestionsV2("pkg1", "pkg2", "pkg3", "pkg4", "pkg5"));
         mDashboardAdapter.onBindSuggestionConditionHeader(mSuggestionHolder, mSuggestionHeaderData);
 
         // set suggestions to null
@@ -131,9 +121,9 @@
     @Test
     public void testSuggestionDismissed_notOnlySuggestion_updateSuggestionOnly() {
         final DashboardAdapter adapter =
-                spy(new DashboardAdapter(mContext, null, null, null, null, null));
-        final List<Tile> suggestions = makeSuggestions("pkg1", "pkg2", "pkg3");
-        adapter.setCategoriesAndSuggestions(null /* category */, suggestions);
+                spy(new DashboardAdapter(mContext, null, null, null, null));
+        final List<Suggestion> suggestions = makeSuggestionsV2("pkg1", "pkg2", "pkg3");
+        adapter.setSuggestions(suggestions);
 
         final RecyclerView data = mock(RecyclerView.class);
         when(data.getResources()).thenReturn(mResources);
@@ -150,7 +140,7 @@
         final DashboardData dashboardData = adapter.mDashboardData;
         reset(adapter); // clear interactions tracking
 
-        final Tile suggestionToRemove = suggestions.get(1);
+        final Suggestion suggestionToRemove = suggestions.get(1);
         adapter.onSuggestionDismissed(suggestionToRemove);
 
         assertThat(adapter.mDashboardData).isEqualTo(dashboardData);
@@ -166,12 +156,11 @@
         when(itemView.findViewById(R.id.data)).thenReturn(data);
         final DashboardAdapter.SuggestionAndConditionContainerHolder holder =
                 new DashboardAdapter.SuggestionAndConditionContainerHolder(itemView);
-        final List<Tile> suggestions =
-                makeSuggestions("pkg1", "pkg2", "pkg3", "pkg4");
+        final List<Suggestion> suggestions = makeSuggestionsV2("pkg1", "pkg2", "pkg3", "pkg4");
         final DashboardAdapter adapter = spy(new DashboardAdapter(mContext, null /*savedInstance */,
-                null /* conditions */, null /* suggestionParser */,
+                null /* conditions */,
                 null /* suggestionControllerMixin */, null /* callback */));
-        adapter.setCategoriesAndSuggestions(null /* category */, suggestions);
+        adapter.setSuggestions(suggestions);
         adapter.onBindConditionAndSuggestion(
                 holder, DashboardAdapter.SUGGESTION_CONDITION_HEADER_POSITION);
         // default mode, only displaying 2 suggestions
@@ -180,16 +169,16 @@
 
         // verify operations that access the lists will not cause ConcurrentModificationException
         assertThat(holder.data.getAdapter().getItemCount()).isEqualTo(1);
-        adapter.setCategoriesAndSuggestions(null /* category */, suggestions);
+        adapter.setSuggestions(suggestions);
         // should not crash
     }
 
     @Test
     public void testSuggestionDismissed_onlySuggestion_updateDashboardData() {
         DashboardAdapter adapter =
-                spy(new DashboardAdapter(mContext, null, null, null, null, null));
-        final List<Tile> suggestions = makeSuggestions("pkg1");
-        adapter.setCategoriesAndSuggestions(null /* category */, suggestions);
+                spy(new DashboardAdapter(mContext, null, null, null, null));
+        final List<Suggestion> suggestions = makeSuggestionsV2("pkg1");
+        adapter.setSuggestions(suggestions);
         final DashboardData dashboardData = adapter.mDashboardData;
         reset(adapter); // clear interactions tracking
 
@@ -200,22 +189,6 @@
     }
 
     @Test
-    public void testSetCategoriesAndSuggestions_iconTinted() {
-        TypedArray mockTypedArray = mock(TypedArray.class);
-        doReturn(mockTypedArray).when(mContext).obtainStyledAttributes(any(int[].class));
-        doReturn(0x89000000).when(mockTypedArray).getColor(anyInt(), anyInt());
-
-        List<Tile> packages = makeSuggestions("pkg1");
-        Icon mockIcon = mock(Icon.class);
-        packages.get(0).isIconTintable = true;
-        packages.get(0).icon = mockIcon;
-
-        mDashboardAdapter.setCategoriesAndSuggestions(null /* category */, packages);
-
-        verify(mockIcon).setTint(eq(0x89000000));
-    }
-
-    @Test
     public void testSetCategories_iconTinted() {
         TypedArray mockTypedArray = mock(TypedArray.class);
         doReturn(mockTypedArray).when(mContext).obtainStyledAttributes(any(int[].class));
@@ -234,48 +207,13 @@
     }
 
     @Test
-    public void testSetCategoriesAndSuggestions_limitSuggestionSize() {
-        List<Tile> packages =
-                makeSuggestions("pkg1", "pkg2", "pkg3", "pkg4", "pkg5", "pkg6", "pkg7");
-        mDashboardAdapter.setCategoriesAndSuggestions(null /* category */, packages);
-
-        assertThat(mDashboardAdapter.mDashboardData.getSuggestions().size())
-                .isEqualTo(DashboardAdapter.MAX_SUGGESTION_TO_SHOW);
-    }
-
-    @Test
-    public void testBindConditionAndSuggestion_shouldSetSuggestionAdapterAndNoCrash() {
-        mDashboardAdapter = new DashboardAdapter(mContext, null, null, null, null, null);
-        final List<Tile> suggestions = makeSuggestions("pkg1");
-        final DashboardCategory category = new DashboardCategory();
-        category.addTile(mock(Tile.class));
-
-        mDashboardAdapter.setCategoriesAndSuggestions(category, suggestions);
-
-        final RecyclerView data = mock(RecyclerView.class);
-        when(data.getResources()).thenReturn(mResources);
-        when(data.getContext()).thenReturn(mContext);
-        when(mResources.getDisplayMetrics()).thenReturn(mock(DisplayMetrics.class));
-        final View itemView = mock(View.class);
-        when(itemView.findViewById(R.id.data)).thenReturn(data);
-        final DashboardAdapter.SuggestionAndConditionContainerHolder holder =
-                new DashboardAdapter.SuggestionAndConditionContainerHolder(itemView);
-
-        mDashboardAdapter.onBindConditionAndSuggestion(
-                holder, DashboardAdapter.SUGGESTION_CONDITION_HEADER_POSITION);
-
-        verify(data).setAdapter(any(SuggestionAdapter.class));
-        // should not crash
-    }
-
-    @Test
     public void testBindConditionAndSuggestion_v2_shouldSetSuggestionAdapterAndNoCrash() {
-        mDashboardAdapter = new DashboardAdapter(mContext, null, null, null, null, null);
+        mDashboardAdapter = new DashboardAdapter(mContext, null, null, null, null);
         final List<Suggestion> suggestions = makeSuggestionsV2("pkg1");
         final DashboardCategory category = new DashboardCategory();
         category.addTile(mock(Tile.class));
 
-        mDashboardAdapter.setSuggestionsV2(suggestions);
+        mDashboardAdapter.setSuggestions(suggestions);
 
         final RecyclerView data = mock(RecyclerView.class);
         when(data.getResources()).thenReturn(mResources);
@@ -293,50 +231,6 @@
         // should not crash
     }
 
-    @Test
-    public void testBindConditionAndSuggestion_emptySuggestion_shouldSetConditionAdpater() {
-        final Bundle savedInstance = new Bundle();
-        savedInstance.putInt(DashboardAdapter.STATE_SUGGESTION_CONDITION_MODE,
-                DashboardData.HEADER_MODE_FULLY_EXPANDED);
-        mDashboardAdapter = new DashboardAdapter(mContext, savedInstance, mConditionList,
-                null /* SuggestionParser */, null /* suggestionControllerMixin */,
-                null /* SuggestionDismissController.Callback */);
-
-        final List<Tile> suggestions = new ArrayList<>();
-        final DashboardCategory category = new DashboardCategory();
-        category.addTile(mock(Tile.class));
-        mDashboardAdapter.setCategoriesAndSuggestions(category, suggestions);
-
-        final RecyclerView data = mock(RecyclerView.class);
-        when(data.getResources()).thenReturn(mResources);
-        when(data.getContext()).thenReturn(mContext);
-        when(mResources.getDisplayMetrics()).thenReturn(mock(DisplayMetrics.class));
-        final View itemView = mock(View.class);
-        when(itemView.findViewById(R.id.data)).thenReturn(data);
-        final DashboardAdapter.SuggestionAndConditionContainerHolder holder =
-                new DashboardAdapter.SuggestionAndConditionContainerHolder(itemView);
-
-        mDashboardAdapter.onBindConditionAndSuggestion(
-                holder, DashboardAdapter.SUGGESTION_CONDITION_HEADER_POSITION);
-
-        verify(data).setAdapter(any(ConditionAdapter.class));
-    }
-
-    /**
-     * @deprecated in favor of {@link #makeSuggestionsV2(String...)}
-     */
-    @Deprecated
-    private List<Tile> makeSuggestions(String... pkgNames) {
-        final List<Tile> suggestions = new ArrayList<>();
-        for (String pkgName : pkgNames) {
-            Tile suggestion = new Tile();
-            suggestion.intent = new Intent("action");
-            suggestion.intent.setComponent(new ComponentName(pkgName, "cls"));
-            suggestions.add(suggestion);
-        }
-        return suggestions;
-    }
-
     private List<Suggestion> makeSuggestionsV2(String... pkgNames) {
         final List<Suggestion> suggestions = new ArrayList<>();
         for (String pkgName : pkgNames) {
@@ -348,13 +242,11 @@
         return suggestions;
     }
 
-    private void setupSuggestions(List<Tile> suggestions) {
-        mDashboardAdapter.setCategoriesAndSuggestions(null /* category */, suggestions);
+    private void setupSuggestions(List<Suggestion> suggestions) {
         final Context context = RuntimeEnvironment.application;
+        mDashboardAdapter.setSuggestions(suggestions);
         mSuggestionHolder = new DashboardAdapter.SuggestionAndConditionHeaderHolder(
                 LayoutInflater.from(context).inflate(
                         R.layout.suggestion_condition_header, new RelativeLayout(context), true));
     }
-
-
 }
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java
index 2e4ef71..1116d7d 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java
@@ -23,10 +23,11 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import android.app.PendingIntent;
+import android.service.settings.suggestions.Suggestion;
 import android.support.annotation.NonNull;
 import android.support.v7.util.DiffUtil;
 import android.support.v7.util.ListUpdateCallback;
-import android.widget.RemoteViews;
 
 import com.android.settings.TestConfig;
 import com.android.settings.dashboard.conditional.AirplaneModeCondition;
@@ -61,11 +62,10 @@
     @Mock
     private Tile mTestCategoryTile;
     @Mock
-    private Tile mTestSuggestion;
-    @Mock
     private Condition mTestCondition;
     @Mock
     private Condition mSecondCondition; // condition used to test insert in DiffUtil
+    private Suggestion mTestSuggestion;
 
     @Before
     public void SetUp() {
@@ -74,8 +74,11 @@
         mDashboardCategory = new DashboardCategory();
 
         // Build suggestions
-        final List<Tile> suggestions = new ArrayList<>();
-        mTestSuggestion.title = TEST_SUGGESTION_TITLE;
+        final List<Suggestion> suggestions = new ArrayList<>();
+        mTestSuggestion = new Suggestion.Builder("pkg")
+                .setTitle(TEST_SUGGESTION_TITLE)
+                .setPendingIntent(mock(PendingIntent.class))
+                .build();
         suggestions.add(mTestSuggestion);
 
         // Build oneItemConditions
@@ -227,8 +230,7 @@
         final List<Condition> oneItemConditions = new ArrayList<>();
         when(mTestCondition.shouldShow()).thenReturn(true);
         oneItemConditions.add(mTestCondition);
-        final List<Tile> suggestions = new ArrayList<>();
-        mTestSuggestion.title = TEST_SUGGESTION_TITLE;
+        final List<Suggestion> suggestions = new ArrayList<>();
         suggestions.add(mTestSuggestion);
 
         final DashboardData oldData = new DashboardData.Builder()
@@ -261,20 +263,16 @@
     public void testDiffUtil_typeSuggestedContainer_ResultDataNothingChanged() {
         //Build testResultData
         final List<ListUpdateResult.ResultData> testResultData = new ArrayList<>();
-        testResultData.add(new ListUpdateResult.ResultData(
-                ListUpdateResult.ResultData.TYPE_OPERATION_CHANGE, 0, 1));
-        Tile tile = new Tile();
-        tile.remoteViews = mock(RemoteViews.class);
 
         DashboardData prevData = new DashboardData.Builder()
                 .setConditions(null)
                 .setCategory(null)
-                .setSuggestions(Arrays.asList(tile))
+                .setSuggestions(Arrays.asList(mTestSuggestion))
                 .build();
         DashboardData currentData = new DashboardData.Builder()
                 .setConditions(null)
                 .setCategory(null)
-                .setSuggestions(Arrays.asList(tile))
+                .setSuggestions(Arrays.asList(mTestSuggestion))
                 .build();
         testDiffUtil(prevData, currentData, testResultData);
     }
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
index c330340..6c663ab 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
@@ -91,6 +91,19 @@
     }
 
     @Test
+    public void testPreferenceControllerSetter_shouldAddAndNotReplace() {
+        final TestPreferenceController controller1 = new TestPreferenceController(mContext);
+        mTestFragment.addPreferenceController(controller1);
+        final TestPreferenceController controller2 = new TestPreferenceController(mContext);
+        mTestFragment.addPreferenceController(controller2);
+
+        final TestPreferenceController retrievedController = mTestFragment.getPreferenceController
+                (TestPreferenceController.class);
+
+        assertThat(controller1).isSameAs(retrievedController);
+    }
+
+    @Test
     public void displayTilesAsPreference_shouldAddTilesWithIntent() {
         when(mFakeFeatureFactory.dashboardFeatureProvider
                 .getTilesForCategory(nullable(String.class)))
@@ -146,6 +159,23 @@
     }
 
     @Test
+    public void updateState_doesNotSkipControllersOfSameClass() {
+        final AbstractPreferenceController mockController1 =
+                mock(AbstractPreferenceController.class);
+        final AbstractPreferenceController mockController2 =
+                mock(AbstractPreferenceController.class);
+        mTestFragment.addPreferenceController(mockController1);
+        mTestFragment.addPreferenceController(mockController2);
+        when(mockController1.isAvailable()).thenReturn(true);
+        when(mockController2.isAvailable()).thenReturn(true);
+
+        mTestFragment.updatePreferenceStates();
+
+        verify(mockController1).getPreferenceKey();
+        verify(mockController2).getPreferenceKey();
+    }
+
+    @Test
     public void tintTileIcon_hasMetadata_shouldReturnIconTintableMetadata() {
         final Tile tile = new Tile();
         tile.icon = mock(Icon.class);
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardSummaryTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardSummaryTest.java
index f3ed57c..59823ec 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardSummaryTest.java
@@ -16,25 +16,6 @@
 
 package com.android.settings.dashboard;
 
-import android.app.Activity;
-import android.support.v7.widget.LinearLayoutManager;
-
-import com.android.settings.TestConfig;
-import com.android.settings.dashboard.conditional.ConditionManager;
-import com.android.settings.dashboard.conditional.FocusRecyclerView;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settingslib.drawer.CategoryKey;
-import com.android.settingslib.drawer.DashboardCategory;
-import com.android.settingslib.drawer.Tile;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.annotation.Config;
-import org.robolectric.util.ReflectionHelpers;
-
 import static org.mockito.ArgumentMatchers.nullable;
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.doNothing;
@@ -45,6 +26,27 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.app.Activity;
+import android.content.Context;
+import android.service.settings.suggestions.Suggestion;
+import android.support.v7.widget.LinearLayoutManager;
+
+import com.android.settings.TestConfig;
+import com.android.settings.dashboard.conditional.ConditionManager;
+import com.android.settings.dashboard.conditional.FocusRecyclerView;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.drawer.CategoryKey;
+import com.android.settingslib.drawer.DashboardCategory;
+
+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.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
+
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
@@ -63,11 +65,13 @@
     @Mock
     private SummaryLoader mSummaryLoader;
 
+    private Context mContext;
     private DashboardSummary mSummary;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
         mSummary = spy(new DashboardSummary());
         ReflectionHelpers.setField(mSummary, "mAdapter", mAdapter);
         ReflectionHelpers.setField(mSummary, "mDashboardFeatureProvider",
@@ -79,9 +83,10 @@
     }
 
     @Test
-    public void updateCategoryAndSuggestion_shouldGetCategoryFromFeatureProvider() {
+    public void updateCategory_shouldGetCategoryFromFeatureProvider() {
         doReturn(mock(Activity.class)).when(mSummary).getActivity();
-        mSummary.updateCategoryAndSuggestion(null);
+        mSummary.onAttach(mContext);
+        mSummary.updateCategory();
 
         verify(mSummaryLoader).updateSummaryToCache(nullable(DashboardCategory.class));
         verify(mDashboardFeatureProvider).getTilesForCategory(CategoryKey.CATEGORY_HOMEPAGE);
@@ -135,7 +140,7 @@
 
     @Test
     public void onSuggestionDismissed_shouldNotRebuildUI() {
-        mSummary.onSuggestionDismissed(mock(Tile.class));
+        mSummary.onSuggestionDismissed(mock(Suggestion.class));
         verify(mSummary, never()).rebuildUI();
     }
 }
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/EventStoreTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/EventStoreTest.java
deleted file mode 100644
index 114ee2b..0000000
--- a/tests/robotests/src/com/android/settings/dashboard/suggestions/EventStoreTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2017 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.dashboard.suggestions;
-
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.TestConfig;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class EventStoreTest {
-
-    private EventStore mEventStore;
-
-    @Before
-    public void setUp() {
-        mEventStore = new EventStore(RuntimeEnvironment.application);
-    }
-
-    @Test
-    public void testWriteRead() {
-        mEventStore.writeEvent("pkg", EventStore.EVENT_SHOWN);
-        long timeMs = System.currentTimeMillis();
-        assertThat(mEventStore.readMetric("pkg", EventStore.EVENT_SHOWN, EventStore.METRIC_COUNT))
-            .isEqualTo(1);
-        assertThat(Math.abs(timeMs - mEventStore
-            .readMetric("pkg", EventStore.EVENT_SHOWN, EventStore.METRIC_LAST_EVENT_TIME)) < 10000)
-            .isTrue();
-    }
-
-    @Test
-    public void testWriteRead_shouldHaveLatestValues() {
-        mEventStore.writeEvent("pkg", EventStore.EVENT_DISMISSED);
-        mEventStore.writeEvent("pkg", EventStore.EVENT_DISMISSED);
-        assertThat(
-            mEventStore.readMetric("pkg", EventStore.EVENT_DISMISSED, EventStore.METRIC_COUNT))
-            .isEqualTo(2);
-    }
-
-    @Test
-    public void testWriteRead_shouldReturnDefaultIfNotAvailable() {
-        assertThat(mEventStore.readMetric("pkg", EventStore.EVENT_SHOWN, EventStore.METRIC_COUNT))
-            .isEqualTo(0);
-        assertThat(
-            mEventStore
-                .readMetric("pkg", EventStore.EVENT_SHOWN, EventStore.METRIC_LAST_EVENT_TIME))
-            .isEqualTo(0);
-    }
-
-}
diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionAdapterTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionAdapterTest.java
index 030fb6d..26940d6 100644
--- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionAdapterTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionAdapterTest.java
@@ -16,28 +16,18 @@
 package com.android.settings.dashboard.suggestions;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 
 import android.app.PendingIntent;
-import android.content.ComponentName;
 import android.content.Context;
-import android.content.Intent;
 import android.graphics.drawable.Icon;
 import android.service.settings.suggestions.Suggestion;
-import android.view.ContextThemeWrapper;
 import android.view.LayoutInflater;
 import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Button;
 import android.widget.FrameLayout;
 import android.widget.LinearLayout;
-import android.widget.RemoteViews;
-import android.widget.TextView;
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
@@ -56,7 +46,6 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowApplication;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -111,37 +100,18 @@
     @Test
     public void getItemCount_shouldReturnListSize() {
         mSuggestionAdapter = new SuggestionAdapter(mContext, mSuggestionControllerMixin,
-                mOneSuggestion, null /* suggestionV2 */, new ArrayList<>());
+                mOneSuggestionV2, new ArrayList<>());
         assertThat(mSuggestionAdapter.getItemCount()).isEqualTo(1);
 
         mSuggestionAdapter = new SuggestionAdapter(mContext, mSuggestionControllerMixin,
-                mTwoSuggestions, null /* suggestionV2 */, new ArrayList<>());
-        assertThat(mSuggestionAdapter.getItemCount()).isEqualTo(2);
-    }
-
-    @Test
-    public void getItemCount_v2_shouldReturnListSize() {
-        mSuggestionAdapter = new SuggestionAdapter(mContext, mSuggestionControllerMixin,
-                null /* suggestions */, mOneSuggestionV2, new ArrayList<>());
-        assertThat(mSuggestionAdapter.getItemCount()).isEqualTo(1);
-
-        mSuggestionAdapter = new SuggestionAdapter(mContext, mSuggestionControllerMixin,
-                null /* suggestions */, mTwoSuggestionsV2, new ArrayList<>());
+                mTwoSuggestionsV2, new ArrayList<>());
         assertThat(mSuggestionAdapter.getItemCount()).isEqualTo(2);
     }
 
     @Test
     public void getItemViewType_shouldReturnSuggestionTile() {
         mSuggestionAdapter = new SuggestionAdapter(mContext, mSuggestionControllerMixin,
-                mOneSuggestion, null /* suggestionV2 */, new ArrayList<>());
-        assertThat(mSuggestionAdapter.getItemViewType(0))
-                .isEqualTo(R.layout.suggestion_tile);
-    }
-
-    @Test
-    public void getItemViewType_v2_shouldReturnSuggestionTile() {
-        mSuggestionAdapter = new SuggestionAdapter(mContext, mSuggestionControllerMixin,
-                null /* suggestions */, mOneSuggestionV2, new ArrayList<>());
+                mOneSuggestionV2, new ArrayList<>());
         assertThat(mSuggestionAdapter.getItemViewType(0))
                 .isEqualTo(R.layout.suggestion_tile);
     }
@@ -155,32 +125,19 @@
                 .setSummary("456")
                 .build());
         mSuggestionAdapter = new SuggestionAdapter(mContext, mSuggestionControllerMixin,
-                null /* suggestions */, suggestions, new ArrayList<>());
+                suggestions, new ArrayList<>());
 
         assertThat(mSuggestionAdapter.getItemViewType(0))
                 .isEqualTo(R.layout.suggestion_tile_with_button);
     }
 
     @Test
-    public void onBindViewHolder_shouldSetListener() {
-        final View view = spy(LayoutInflater.from(mContext).inflate(
-                R.layout.suggestion_tile, new LinearLayout(mContext), true));
-        mSuggestionHolder = new DashboardAdapter.DashboardItemHolder(view);
-        mSuggestionAdapter = new SuggestionAdapter(mContext, mSuggestionControllerMixin,
-                mOneSuggestion, null /* suggestionV2 */, new ArrayList<>());
-
-        mSuggestionAdapter.onBindViewHolder(mSuggestionHolder, 0);
-
-        verify(view).setOnClickListener(any(View.OnClickListener.class));
-    }
-
-    @Test
     public void onBindViewHolder_shouldLog() {
         final View view = spy(LayoutInflater.from(mContext).inflate(
                 R.layout.suggestion_tile, new LinearLayout(mContext), true));
         mSuggestionHolder = new DashboardAdapter.DashboardItemHolder(view);
         mSuggestionAdapter = new SuggestionAdapter(mContext, mSuggestionControllerMixin,
-                null /* suggestionV1*/, mOneSuggestionV2, new ArrayList<>());
+                mOneSuggestionV2, new ArrayList<>());
 
         // Bind twice
         mSuggestionAdapter.onBindViewHolder(mSuggestionHolder, 0);
@@ -193,53 +150,10 @@
     }
 
     @Test
-    public void onBindViewHolder_shouldInflateRemoteView() {
-        List<Tile> packages = makeSuggestions("pkg1");
-        RemoteViews remoteViews = mock(RemoteViews.class);
-        TextView textView = new TextView(RuntimeEnvironment.application);
-        doReturn(textView).when(remoteViews).apply(any(Context.class), any(ViewGroup.class));
-        packages.get(0).remoteViews = remoteViews;
-        setupSuggestions(mActivity, packages, null);
-
-        mSuggestionAdapter.onBindViewHolder(mSuggestionHolder, 0);
-
-        assertThat(textView.getParent()).isSameAs(mSuggestionHolder.itemView);
-        mSuggestionHolder.itemView.performClick();
-
-        verify(mActivity).startSuggestion(any(Intent.class));
-    }
-
-    @Test
-    public void onBindViewHolder_primaryViewShouldHandleClick() {
-        Context context =
-                new ContextThemeWrapper(RuntimeEnvironment.application, R.style.Theme_Settings);
-
-        List<Tile> packages = makeSuggestions("pkg1");
-        RemoteViews remoteViews = mock(RemoteViews.class);
-        FrameLayout layout = new FrameLayout(context);
-        Button primary = new Button(context);
-        primary.setId(android.R.id.primary);
-        layout.addView(primary);
-        doReturn(layout).when(remoteViews).apply(any(Context.class), any(ViewGroup.class));
-        packages.get(0).remoteViews = remoteViews;
-        setupSuggestions(mActivity, packages, null /* suggestionV2 */);
-
-        mSuggestionAdapter.onBindViewHolder(mSuggestionHolder, 0);
-        mSuggestionHolder.itemView.performClick();
-
-        assertThat(ShadowApplication.getInstance().getNextStartedActivity()).isNull();
-        verify(mActivity, never()).startSuggestion(any(Intent.class));
-
-        primary.performClick();
-
-        verify(mActivity).startSuggestion(any(Intent.class));
-    }
-
-    @Test
-    public void onBindViewHolder_v2_itemViewShouldHandleClick()
+    public void onBindViewHolder_itemViewShouldHandleClick()
             throws PendingIntent.CanceledException {
         final List<Suggestion> suggestions = makeSuggestionsV2("pkg1");
-        setupSuggestions(mActivity, null /* suggestionV1 */, suggestions);
+        setupSuggestions(mActivity, suggestions);
 
         mSuggestionAdapter.onBindViewHolder(mSuggestionHolder, 0);
         mSuggestionHolder.itemView.performClick();
@@ -249,64 +163,21 @@
     }
 
     @Test
-    public void onBindViewHolder_viewsShouldClearOnRebind() {
-        Context context =
-                new ContextThemeWrapper(RuntimeEnvironment.application, R.style.Theme_Settings);
-
-        List<Tile> packages = makeSuggestions("pkg1");
-        RemoteViews remoteViews = mock(RemoteViews.class);
-        FrameLayout layout = new FrameLayout(context);
-        Button primary = new Button(context);
-        primary.setId(android.R.id.primary);
-        layout.addView(primary);
-        doReturn(layout).when(remoteViews).apply(any(Context.class), any(ViewGroup.class));
-        packages.get(0).remoteViews = remoteViews;
-        setupSuggestions(mActivity, packages, null /* suggestionV2 */);
-
-        mSuggestionAdapter.onBindViewHolder(mSuggestionHolder, 0);
-        mSuggestionAdapter.onBindViewHolder(mSuggestionHolder, 0);
-
-        ViewGroup itemView = (ViewGroup) mSuggestionHolder.itemView;
-        assertThat(itemView.getChildCount()).isEqualTo(1);
-    }
-
-    @Test
-    public void getSuggestionsV2_shouldReturnSuggestionWhenMatch() {
+    public void getSuggestions_shouldReturnSuggestionWhenMatch() {
         final List<Suggestion> suggestionsV2 = makeSuggestionsV2("pkg1");
-        setupSuggestions(mActivity, null /* suggestionV1 */, suggestionsV2);
+        setupSuggestions(mActivity, suggestionsV2);
 
-        assertThat(mSuggestionAdapter.getSuggestion(0)).isNull();
-        assertThat(mSuggestionAdapter.getSuggestionsV2(0)).isNotNull();
-
-        List<Tile> suggestionsV1 = makeSuggestions("pkg1");
-        setupSuggestions(mActivity, suggestionsV1, null /* suggestionV2 */);
-
-        assertThat(mSuggestionAdapter.getSuggestionsV2(0)).isNull();
         assertThat(mSuggestionAdapter.getSuggestion(0)).isNotNull();
-
     }
 
-    private void setupSuggestions(Context context, List<Tile> suggestions,
-            List<Suggestion> suggestionsV2) {
+    private void setupSuggestions(Context context, List<Suggestion> suggestionsV2) {
         mSuggestionAdapter = new SuggestionAdapter(context, mSuggestionControllerMixin,
-                suggestions, suggestionsV2, new ArrayList<>());
+                suggestionsV2, new ArrayList<>());
         mSuggestionHolder = mSuggestionAdapter.onCreateViewHolder(
                 new FrameLayout(RuntimeEnvironment.application),
                 mSuggestionAdapter.getItemViewType(0));
     }
 
-    private List<Tile> makeSuggestions(String... pkgNames) {
-        final List<Tile> suggestions = new ArrayList<>();
-        for (String pkgName : pkgNames) {
-            Tile suggestion = new Tile();
-            suggestion.intent = new Intent("action");
-            suggestion.intent.setComponent(new ComponentName(pkgName, "cls"));
-            suggestions.add(suggestion);
-            suggestion.icon = mock(Icon.class);
-        }
-        return suggestions;
-    }
-
     private List<Suggestion> makeSuggestionsV2(String... pkgNames) {
         final List<Suggestion> suggestions = new ArrayList<>();
         for (String pkgName : pkgNames) {
diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionDismissControllerTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionDismissControllerTest.java
index 329518a..a437cb4 100644
--- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionDismissControllerTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionDismissControllerTest.java
@@ -33,8 +33,6 @@
 import com.android.settings.TestConfig;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settingslib.drawer.Tile;
-import com.android.settingslib.suggestions.SuggestionParser;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -53,8 +51,6 @@
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private RecyclerView mRecyclerView;
     @Mock
-    private SuggestionParser mSuggestionParser;
-    @Mock
     private SuggestionControllerMixin mSuggestionControllerMixin;
     @Mock
     private SuggestionDismissController.Callback mCallback;
@@ -70,7 +66,7 @@
         when(mRecyclerView.getResources().getDimension(anyInt())).thenReturn(50F);
 
         mController = new SuggestionDismissController(mContext, mRecyclerView,
-                mSuggestionControllerMixin, mSuggestionParser, mCallback);
+                mSuggestionControllerMixin, mCallback);
     }
 
     @Test
@@ -108,17 +104,6 @@
     @Test
     public void onSwiped_shouldTriggerDismissSuggestion() {
         final RecyclerView.ViewHolder vh = mock(RecyclerView.ViewHolder.class);
-
-        mController.onSwiped(vh, ItemTouchHelper.START);
-
-        verify(mFactory.suggestionsFeatureProvider).dismissSuggestion(
-                eq(mContext), eq(mSuggestionParser), nullable(Tile.class));
-        verify(mCallback).onSuggestionDismissed(nullable(Tile.class));
-    }
-
-    @Test
-    public void onSwiped_v2_shouldTriggerDismissSuggestion() {
-        final RecyclerView.ViewHolder vh = mock(RecyclerView.ViewHolder.class);
         when(mCallback.getSuggestionAt(anyInt())).thenReturn(
                 new Suggestion.Builder("id").build());
 
diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java
index 49fbf88..8ed885f 100644
--- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java
@@ -21,7 +21,6 @@
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyZeroInteractions;
@@ -30,34 +29,27 @@
 import android.app.ActivityManager;
 import android.content.ComponentName;
 import android.content.Context;
-import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.hardware.fingerprint.FingerprintManager;
 import android.provider.Settings.Secure;
 import android.service.settings.suggestions.Suggestion;
-import android.util.FeatureFlagUtils;
 import android.util.Pair;
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.Settings.NightDisplaySuggestionActivity;
 import com.android.settings.TestConfig;
-import com.android.settings.core.FeatureFlags;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.SettingsShadowResources;
-import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
 import com.android.settings.testutils.shadow.ShadowSecureSettings;
 import com.android.settingslib.drawer.Tile;
-import com.android.settingslib.suggestions.SuggestionParser;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
@@ -71,26 +63,21 @@
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, shadows = {
         ShadowSecureSettings.class,
         SettingsShadowResources.class,
-        SettingsShadowSystemProperties.class
 })
 public class SuggestionFeatureProviderImplTest {
 
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private Context mContext;
     @Mock
-    private SuggestionParser mSuggestionParser;
-    @Mock
     private SuggestionControllerMixin mSuggestionControllerMixin;
     @Mock
-    private Tile mSuggestion;
+    private Suggestion mSuggestion;
     @Mock
     private ActivityManager mActivityManager;
     @Mock
     private PackageManager mPackageManager;
     @Mock
     private FingerprintManager mFingerprintManager;
-    @Captor
-    private ArgumentCaptor<Pair> mTaggedDataCaptor = ArgumentCaptor.forClass(Pair.class);
 
     private FakeFeatureFactory mFactory;
     private SuggestionFeatureProviderImpl mProvider;
@@ -103,20 +90,17 @@
         // Explicit casting to object due to MockitoCast bug
         when((Object) mContext.getSystemService(FingerprintManager.class))
                 .thenReturn(mFingerprintManager);
+        when(mSuggestion.getId()).thenReturn("test_id");
         when(mContext.getApplicationContext()).thenReturn(RuntimeEnvironment.application);
         when(mContext.getSystemService(Context.ACTIVITY_SERVICE)).thenReturn(mActivityManager);
         when(mActivityManager.isLowRamDevice()).thenReturn(false);
 
-        mSuggestion.intent = new Intent().setClassName("pkg", "cls");
-        mSuggestion.category = "category";
-
         mProvider = new SuggestionFeatureProviderImpl(mContext);
     }
 
     @After
     public void tearDown() {
         SettingsShadowResources.reset();
-        SettingsShadowSystemProperties.clear();
     }
 
     @Test
@@ -129,29 +113,18 @@
     public void isSuggestionEnabled_isLowMemoryDevice_shouldReturnFalse() {
         when(mActivityManager.isLowRamDevice()).thenReturn(true);
 
-        assertThat(mProvider.isSuggestionEnabled(mContext)).isFalse();
+        assertThat(mProvider.isSuggestionV2Enabled(mContext)).isFalse();
     }
 
     @Test
-    public void isSuggestionV2Enabled_isNotLowMemoryDevice_sysPropOn_shouldReturnTrue() {
+    public void isSuggestionV2Enabled_isNotLowMemoryDevice_shouldReturnTrue() {
         when(mActivityManager.isLowRamDevice()).thenReturn(false);
-        SettingsShadowSystemProperties.set(
-                FeatureFlagUtils.FFLAG_PREFIX + FeatureFlags.SUGGESTIONS_V2, "true");
         assertThat(mProvider.isSuggestionV2Enabled(mContext)).isTrue();
     }
 
     @Test
-    public void dismissSuggestion_noParserOrSuggestion_noop() {
-        mProvider.dismissSuggestion(mContext, null, (Tile) null);
-        mProvider.dismissSuggestion(mContext, mSuggestionParser, null);
-        mProvider.dismissSuggestion(mContext, null, mSuggestion);
-
-        verifyZeroInteractions(mFactory.metricsFeatureProvider);
-    }
-
-    @Test
     public void dismissSuggestion_noControllerOrSuggestion_noop() {
-        mProvider.dismissSuggestion(mContext, null, (Suggestion) null);
+        mProvider.dismissSuggestion(mContext, null, null);
         mProvider.dismissSuggestion(mContext, mSuggestionControllerMixin, null);
         mProvider.dismissSuggestion(mContext, null, new Suggestion.Builder("id").build());
 
@@ -160,81 +133,21 @@
     }
 
     @Test
-    public void getSuggestionIdentifier_samePackage_returnClassName() {
-        final Tile suggestion = new Tile();
-        suggestion.intent = new Intent()
-                .setClassName(RuntimeEnvironment.application.getPackageName(), "123");
-        assertThat(mProvider.getSuggestionIdentifier(RuntimeEnvironment.application, suggestion))
-                .isEqualTo("123");
-    }
-
-    @Test
-    public void getSuggestionIdentifier_differentPackage_returnPackageName() {
-        final Tile suggestion = new Tile();
-        suggestion.intent = new Intent()
-                .setClassName(RuntimeEnvironment.application.getPackageName(), "123");
-        assertThat(mProvider.getSuggestionIdentifier(mContext, suggestion))
-                .isEqualTo(RuntimeEnvironment.application.getPackageName());
-    }
-
-    @Test
-    public void getSuggestionIdentifier_nullComponent_shouldNotCrash() {
-        final Tile suggestion = new Tile();
-        suggestion.intent = new Intent();
-        assertThat(mProvider.getSuggestionIdentifier(mContext, suggestion))
-                .isNotEmpty();
-    }
-
-    @Test
-    public void getSuggestionIdentifier_nullContext_shouldNotCrash() {
-        final Tile suggestion = new Tile();
-        suggestion.intent = new Intent()
-                .setClassName(RuntimeEnvironment.application.getPackageName(), "123");
-        assertThat(mProvider.getSuggestionIdentifier(null, suggestion))
-                .isNotEmpty();
-    }
-
-    @Test
-    public void dismissSuggestion_hasMoreDismissCount_shouldNotDisableComponent() {
-        when(mSuggestionParser.dismissSuggestion(any(Tile.class)))
-                .thenReturn(false);
-        mProvider.dismissSuggestion(mContext, mSuggestionParser, mSuggestion);
-
-        verify(mFactory.metricsFeatureProvider).action(
-                eq(mContext),
-                eq(MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION),
-                anyString(),
-                mTaggedDataCaptor.capture());
-        assertThat(mTaggedDataCaptor.getAllValues()).containsExactly(
-                Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0));
-        verify(mContext, never()).getPackageManager();
-    }
-
-    @Test
     public void dismissSuggestion_noContext_shouldDoNothing() {
-        mProvider.dismissSuggestion(null, mSuggestionParser, mSuggestion);
+        mProvider.dismissSuggestion(null, mSuggestionControllerMixin, mSuggestion);
 
         verifyZeroInteractions(mFactory.metricsFeatureProvider);
     }
 
     @Test
-    public void dismissSuggestion_hasNoMoreDismissCount_shouldDisableComponent() {
-        when(mSuggestionParser.dismissSuggestion(any(Tile.class)))
-                .thenReturn(true);
-
-        mProvider.dismissSuggestion(mContext, mSuggestionParser, mSuggestion);
+    public void dismissSuggestion_shouldLogAndDismiss() {
+        mProvider.dismissSuggestion(mContext, mSuggestionControllerMixin, mSuggestion);
 
         verify(mFactory.metricsFeatureProvider).action(
                 eq(mContext),
                 eq(MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION),
-                anyString(),
-                mTaggedDataCaptor.capture());
-        assertThat(mTaggedDataCaptor.getAllValues()).containsExactly(
-                Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0));
-        verify(mContext.getPackageManager())
-                .setComponentEnabledSetting(mSuggestion.intent.getComponent(),
-                        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
-                        PackageManager.DONT_KILL_APP);
+                anyString());
+        verify(mSuggestionControllerMixin).dismissSuggestion(mSuggestion);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeaturizerTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeaturizerTest.java
deleted file mode 100644
index 4d6a743..0000000
--- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeaturizerTest.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (C) 2017 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.dashboard.suggestions;
-
-import java.util.Arrays;
-import java.util.Map;
-
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.TestConfig;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class SuggestionFeaturizerTest {
-
-    private EventStore mEventStore;
-    private SuggestionFeaturizer mSuggestionFeaturizer;
-
-    @Before
-    public void setUp() {
-        mEventStore = new EventStore(RuntimeEnvironment.application);
-        mSuggestionFeaturizer = new SuggestionFeaturizer(mEventStore);
-    }
-
-    @Test
-    public void testFeaturize_singlePackage() {
-        mEventStore.writeEvent("pkg", EventStore.EVENT_DISMISSED);
-        mEventStore.writeEvent("pkg", EventStore.EVENT_SHOWN);
-        mEventStore.writeEvent("pkg", EventStore.EVENT_SHOWN);
-        Map<String, Double> features = mSuggestionFeaturizer.featurize(Arrays.asList("pkg"))
-                .get("pkg");
-        assertThat(features.get(SuggestionFeaturizer.FEATURE_IS_SHOWN)).isEqualTo(1.0);
-        assertThat(features.get(SuggestionFeaturizer.FEATURE_IS_DISMISSED)).isEqualTo(1.0);
-        assertThat(features.get(SuggestionFeaturizer.FEATURE_IS_CLICKED)).isEqualTo(0.0);
-
-        assertThat(features.get(SuggestionFeaturizer.FEATURE_TIME_FROM_LAST_SHOWN)).isLessThan(1.0);
-        assertThat(features.get(SuggestionFeaturizer.FEATURE_TIME_FROM_LAST_DISMISSED))
-                .isLessThan(1.0);
-        assertThat(features.get(SuggestionFeaturizer.FEATURE_TIME_FROM_LAST_CLICKED))
-                .isEqualTo(1.0);
-        assertThat(features.get(SuggestionFeaturizer.FEATURE_SHOWN_COUNT))
-                .isEqualTo(2.0 / SuggestionFeaturizer.COUNT_NORMALIZATION_FACTOR);
-        assertThat(features.get(SuggestionFeaturizer.FEATURE_DISMISSED_COUNT))
-                .isEqualTo(1.0 / SuggestionFeaturizer.COUNT_NORMALIZATION_FACTOR);
-        assertThat(features.get(SuggestionFeaturizer.FEATURE_CLICKED_COUNT)).isEqualTo(0.0);
-    }
-
-    @Test
-    public void testFeaturize_multiplePackages() {
-        mEventStore.writeEvent("pkg1", EventStore.EVENT_DISMISSED);
-        mEventStore.writeEvent("pkg2", EventStore.EVENT_SHOWN);
-        mEventStore.writeEvent("pkg1", EventStore.EVENT_SHOWN);
-        Map<String, Map<String, Double>> features = mSuggestionFeaturizer
-                .featurize(Arrays.asList("pkg1", "pkg2"));
-        Map<String, Double> features1 = features.get("pkg1");
-        Map<String, Double> features2 = features.get("pkg2");
-
-        assertThat(features1.get(SuggestionFeaturizer.FEATURE_IS_SHOWN)).isEqualTo(1.0);
-        assertThat(features1.get(SuggestionFeaturizer.FEATURE_IS_DISMISSED)).isEqualTo(1.0);
-        assertThat(features1.get(SuggestionFeaturizer.FEATURE_IS_CLICKED)).isEqualTo(0.0);
-        assertThat(features1.get(SuggestionFeaturizer.FEATURE_TIME_FROM_LAST_SHOWN))
-                .isLessThan(1.0);
-        assertThat(features1.get(SuggestionFeaturizer.FEATURE_TIME_FROM_LAST_DISMISSED))
-                .isLessThan(1.0);
-        assertThat(features1.get(SuggestionFeaturizer.FEATURE_TIME_FROM_LAST_CLICKED))
-                .isEqualTo(1.0);
-        assertThat(features1.get(SuggestionFeaturizer.FEATURE_SHOWN_COUNT))
-                .isEqualTo(1.0 / SuggestionFeaturizer.COUNT_NORMALIZATION_FACTOR);
-        assertThat(features1.get(SuggestionFeaturizer.FEATURE_DISMISSED_COUNT))
-                .isEqualTo(1.0 / SuggestionFeaturizer.COUNT_NORMALIZATION_FACTOR);
-        assertThat(features1.get(SuggestionFeaturizer.FEATURE_CLICKED_COUNT)).isEqualTo(0.0);
-
-        assertThat(features2.get(SuggestionFeaturizer.FEATURE_IS_SHOWN)).isEqualTo(1.0);
-        assertThat(features2.get(SuggestionFeaturizer.FEATURE_IS_DISMISSED)).isEqualTo(0.0);
-        assertThat(features2.get(SuggestionFeaturizer.FEATURE_IS_CLICKED)).isEqualTo(0.0);
-        assertThat(features2.get(SuggestionFeaturizer.FEATURE_TIME_FROM_LAST_SHOWN))
-                .isLessThan(1.0);
-        assertThat(features2.get(SuggestionFeaturizer.FEATURE_TIME_FROM_LAST_DISMISSED))
-                .isEqualTo(1.0);
-        assertThat(features2.get(SuggestionFeaturizer.FEATURE_TIME_FROM_LAST_CLICKED))
-                .isEqualTo(1.0);
-        assertThat(features2.get(SuggestionFeaturizer.FEATURE_SHOWN_COUNT))
-                .isEqualTo(1.0 / SuggestionFeaturizer.COUNT_NORMALIZATION_FACTOR);
-        assertThat(features2.get(SuggestionFeaturizer.FEATURE_DISMISSED_COUNT)).isEqualTo(0.0);
-        assertThat(features2.get(SuggestionFeaturizer.FEATURE_CLICKED_COUNT)).isEqualTo(0.0);
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionRankerTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionRankerTest.java
deleted file mode 100644
index 1f32531..0000000
--- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionRankerTest.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2017 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.dashboard.suggestions;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.TestConfig;
-import com.android.settingslib.drawer.Tile;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.annotation.Config;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-import static org.mockito.Mockito.same;
-import static org.mockito.Mockito.spy;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class SuggestionRankerTest {
-
-    @Mock
-    private SuggestionRanker mSuggestionRanker;
-    @Mock
-    private SuggestionFeaturizer mSuggestionFeaturizer;
-    private Map<String, Map<String, Double>> mFeatures;
-    private List<String> mPkgNames;
-    private List<Tile> mSuggestions;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mPkgNames = Arrays.asList("pkg1", "pkg2", "pkg3");
-        mFeatures = new HashMap<String, Map<String, Double>>();
-        mFeatures.put("pkg1", new HashMap<String, Double>());
-        mFeatures.put("pkg2", new HashMap<String, Double>());
-        mFeatures.put("pkg3", new HashMap<String, Double>());
-        mSuggestions = new ArrayList<Tile>() {
-            {
-                add(new Tile());
-                add(new Tile());
-                add(new Tile());
-            }
-        };
-        mSuggestionFeaturizer = mock(SuggestionFeaturizer.class);
-        mSuggestionRanker = new SuggestionRanker(mSuggestionFeaturizer);
-        when(mSuggestionFeaturizer.featurize(mPkgNames)).thenReturn(mFeatures);
-        mSuggestionRanker = spy(mSuggestionRanker);
-        when(mSuggestionRanker.getRelevanceMetric(same(mFeatures.get("pkg1")))).thenReturn(0.9);
-        when(mSuggestionRanker.getRelevanceMetric(same(mFeatures.get("pkg2")))).thenReturn(0.1);
-        when(mSuggestionRanker.getRelevanceMetric(same(mFeatures.get("pkg3")))).thenReturn(0.5);
-    }
-
-    @Test
-    public void testRank() {
-        List<Tile> expectedOrderdList = new ArrayList<Tile>() {
-            {
-                add(mSuggestions.get(0)); // relevance = 0.9
-                add(mSuggestions.get(2)); // relevance = 0.5
-                add(mSuggestions.get(1)); // relevance = 0.1
-            }
-        };
-        mSuggestionRanker.rankSuggestions(mSuggestions, mPkgNames);
-        assertThat(mSuggestions).isEqualTo(expectedOrderdList);
-    }
-}
-
diff --git a/tests/robotests/src/com/android/settings/security/EncryptionStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/EncryptionStatusPreferenceControllerTest.java
index a53ee42..b042736 100644
--- a/tests/robotests/src/com/android/settings/security/EncryptionStatusPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/EncryptionStatusPreferenceControllerTest.java
@@ -16,6 +16,10 @@
 
 package com.android.settings.security;
 
+import static com.android.settings.security.EncryptionStatusPreferenceController
+        .PREF_KEY_ENCRYPTION_DETAIL_PAGE;
+import static com.android.settings.security.EncryptionStatusPreferenceController
+        .PREF_KEY_ENCRYPTION_SECURITY_PAGE;
 import static com.google.common.truth.Truth.assertThat;
 
 import android.content.Context;
@@ -48,7 +52,8 @@
     @Before
     public void setUp() {
         mContext = RuntimeEnvironment.application;
-        mController = new EncryptionStatusPreferenceController(mContext);
+        mController = new EncryptionStatusPreferenceController(mContext,
+                PREF_KEY_ENCRYPTION_DETAIL_PAGE);
         mPreference = new Preference(mContext);
     }
 
@@ -85,6 +90,21 @@
 
         assertThat(mPreference.getSummary())
                 .isEqualTo(mContext.getText(R.string.summary_placeholder));
+        assertThat(mController.getPreferenceKey()).isNotEqualTo(PREF_KEY_ENCRYPTION_SECURITY_PAGE);
         assertThat(mPreference.getFragment()).isEqualTo(CryptKeeperSettings.class.getName());
     }
+
+    @Test
+    public void updateSummary_unencrypted_securityPage_shouldNotHaveEncryptionFragment() {
+        mController = new EncryptionStatusPreferenceController(mContext,
+                PREF_KEY_ENCRYPTION_SECURITY_PAGE);
+        ShadowLockPatternUtils.setDeviceEncryptionEnabled(false);
+
+        mController.updateState(mPreference);
+
+        assertThat(mPreference.getSummary())
+                .isEqualTo(mContext.getText(R.string.summary_placeholder));
+
+        assertThat(mPreference.getFragment()).isNotEqualTo(CryptKeeperSettings.class.getName());
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/security/ScreenPinningPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/ScreenPinningPreferenceControllerTest.java
new file mode 100644
index 0000000..797e7d0
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/security/ScreenPinningPreferenceControllerTest.java
@@ -0,0 +1,99 @@
+/*
+ * 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.security;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.After;
+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.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class ScreenPinningPreferenceControllerTest {
+
+    @Mock
+    private PreferenceScreen mScreen;
+
+    private FakeFeatureFactory mFeatureFactory;
+    private Context mContext;
+    private ScreenPinningPreferenceController mController;
+    private Preference mPreference;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mFeatureFactory = FakeFeatureFactory.setupForTest();
+        mController = new ScreenPinningPreferenceController(mContext);
+        mPreference = new Preference(mContext);
+        mPreference.setKey(mController.getPreferenceKey());
+        when(mScreen.findPreference(mController.getPreferenceKey()))
+                .thenReturn(mPreference);
+    }
+
+    @After
+    public void tearDown() {
+        Settings.System.putInt(mContext.getContentResolver(),
+                Settings.System.LOCK_TO_APP_ENABLED, 0);
+    }
+
+    @Test
+    public void isAlwaysAvailable() {
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void displayPreference_isOff_shouldDisableOffSummary() {
+        Settings.System.putInt(mContext.getContentResolver(),
+                Settings.System.LOCK_TO_APP_ENABLED, 0);
+
+        mController.displayPreference(mScreen);
+
+        assertThat(mPreference.getSummary())
+                .isEqualTo(mContext.getString(R.string.switch_off_text));
+    }
+
+    @Test
+    public void displayPreference_isOn_shouldDisableOnSummary() {
+        Settings.System.putInt(mContext.getContentResolver(),
+                Settings.System.LOCK_TO_APP_ENABLED, 1);
+
+        mController.displayPreference(mScreen);
+
+        assertThat(mPreference.getSummary())
+                .isEqualTo(mContext.getString(R.string.switch_on_text));
+    }
+
+}
diff --git a/tests/robotests/src/com/android/settings/security/ShowPasswordPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/ShowPasswordPreferenceControllerTest.java
new file mode 100644
index 0000000..63cf00b
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/security/ShowPasswordPreferenceControllerTest.java
@@ -0,0 +1,107 @@
+/*
+ * 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.security;
+
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.FakeFeatureFactory;
+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.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class ShowPasswordPreferenceControllerTest {
+
+    @Mock
+    private LockPatternUtils mLockPatternUtils;
+    @Mock
+    private PreferenceScreen mScreen;
+
+    private FakeFeatureFactory mFeatureFactory;
+    private Context mContext;
+    private ShowPasswordPreferenceController mController;
+    private Preference mPreference;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mFeatureFactory = FakeFeatureFactory.setupForTest();
+        when(mFeatureFactory.securityFeatureProvider.getLockPatternUtils(mContext))
+                .thenReturn(mLockPatternUtils);
+        mController = new ShowPasswordPreferenceController(mContext);
+        mPreference = new Preference(mContext);
+        mPreference.setKey(mController.getPreferenceKey());
+        when(mScreen.findPreference(mController.getPreferenceKey()))
+                .thenReturn(mPreference);
+    }
+
+    @Test
+    public void isAlwaysAvailable() {
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void isChecked_settingIsOff_false() {
+        Settings.System.putInt(mContext.getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD,
+                0);
+
+        assertThat(mController.isChecked()).isFalse();
+    }
+
+    @Test
+    public void isChecked_settingIsOn_true() {
+        Settings.System.putInt(mContext.getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD,
+                1);
+        assertThat(mController.isChecked()).isTrue();
+    }
+
+    @Test
+    public void changePref_turnOn_shouldChangeSettingTo1() {
+        mController.onPreferenceChange(mPreference, true);
+
+        assertThat(mController.isChecked()).isTrue();
+        verify(mLockPatternUtils).setVisiblePasswordEnabled(true, UserHandle.myUserId());
+    }
+
+    @Test
+    public void changePref_turnOff_shouldChangeSettingTo0() {
+        mController.onPreferenceChange(mPreference, false);
+
+        assertThat(mController.isChecked()).isFalse();
+        verify(mLockPatternUtils).setVisiblePasswordEnabled(false, UserHandle.myUserId());
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/security/SimLockPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/SimLockPreferenceControllerTest.java
new file mode 100644
index 0000000..a3a4fe3
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/security/SimLockPreferenceControllerTest.java
@@ -0,0 +1,163 @@
+/*
+ * 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.security;
+
+import static android.telephony.TelephonyManager.SIM_STATE_READY;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.PersistableBundle;
+import android.os.UserManager;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import com.android.settings.TestConfig;
+import com.android.settings.core.BasePreferenceController;
+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.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class SimLockPreferenceControllerTest {
+
+    @Mock
+    private SubscriptionManager mSubscriptionManager;
+    @Mock
+    private CarrierConfigManager mCarrierManager;
+    @Mock
+    private UserManager mUserManager;
+    @Mock
+    private TelephonyManager mTelephonyManager;
+    @Mock
+    private PreferenceScreen mScreen;
+
+    private Context mContext;
+    private SimLockPreferenceController mController;
+    private Preference mPreference;
+
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        ShadowApplication shadowApplication = ShadowApplication.getInstance();
+        shadowApplication.setSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE,
+                mSubscriptionManager);
+        shadowApplication.setSystemService(Context.CARRIER_CONFIG_SERVICE, mCarrierManager);
+        shadowApplication.setSystemService(Context.USER_SERVICE, mUserManager);
+        shadowApplication.setSystemService(Context.TELEPHONY_SERVICE, mTelephonyManager);
+        mController = new SimLockPreferenceController(mContext);
+        mPreference = new Preference(mContext);
+        mPreference.setKey(mController.getPreferenceKey());
+        when(mScreen.findPreference(mController.getPreferenceKey()))
+                .thenReturn(mPreference);
+    }
+
+    @Test
+    public void isAvailable_notAdmin_false() {
+        when(mUserManager.isAdminUser()).thenReturn(false);
+
+        assertThat(mController.getAvailabilityStatus())
+                .isEqualTo(BasePreferenceController.DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void isAvailable_simIccNotReady_false() {
+        when(mUserManager.isAdminUser()).thenReturn(true);
+
+        assertThat(mController.getAvailabilityStatus())
+                .isEqualTo(BasePreferenceController.DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void isAvailable_carrierConfigDisabled_false() {
+        when(mUserManager.isAdminUser()).thenReturn(true);
+        setupMockIcc();
+        final PersistableBundle pb = new PersistableBundle();
+        pb.putBoolean(CarrierConfigManager.KEY_HIDE_SIM_LOCK_SETTINGS_BOOL, true);
+        when(mCarrierManager.getConfig()).thenReturn(pb);
+
+        assertThat(mController.getAvailabilityStatus())
+                .isEqualTo(BasePreferenceController.DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void isAvailable_true() {
+        when(mUserManager.isAdminUser()).thenReturn(true);
+        setupMockIcc();
+        final PersistableBundle pb = new PersistableBundle();
+        when(mCarrierManager.getConfig()).thenReturn(pb);
+
+        assertThat(mController.getAvailabilityStatus())
+                .isEqualTo(BasePreferenceController.AVAILABLE);
+    }
+
+    @Test
+    public void displayPreference_simReady_enablePreference() {
+        mController.displayPreference(mScreen);
+
+        assertThat(mPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void displayPreference_simNotReady_disablePreference() {
+        setupMockSimReady();
+
+        mController.displayPreference(mScreen);
+
+        assertThat(mPreference.isEnabled()).isTrue();
+    }
+
+    private void setupMockIcc() {
+        final List<SubscriptionInfo> subscriptionInfoList = new ArrayList<>();
+        SubscriptionInfo info = mock(SubscriptionInfo.class);
+        subscriptionInfoList.add(info);
+        when(mTelephonyManager.hasIccCard(anyInt()))
+                .thenReturn(true);
+        when(mSubscriptionManager.getActiveSubscriptionInfoList())
+                .thenReturn(subscriptionInfoList);
+    }
+
+    private void setupMockSimReady() {
+        final List<SubscriptionInfo> subscriptionInfoList = new ArrayList<>();
+        SubscriptionInfo info = mock(SubscriptionInfo.class);
+        subscriptionInfoList.add(info);
+        when(mTelephonyManager.getSimState(anyInt()))
+                .thenReturn(SIM_STATE_READY);
+        when(mSubscriptionManager.getActiveSubscriptionInfoList())
+                .thenReturn(subscriptionInfoList);
+    }
+
+}
diff --git a/tests/robotests/src/com/android/settings/security/screenlock/ScreenLockSettingsTest.java b/tests/robotests/src/com/android/settings/security/screenlock/ScreenLockSettingsTest.java
index 4213fc5..374b7ec 100644
--- a/tests/robotests/src/com/android/settings/security/screenlock/ScreenLockSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/security/screenlock/ScreenLockSettingsTest.java
@@ -33,6 +33,8 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.util.ReflectionHelpers;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 @RunWith(SettingsRobolectricTestRunner.class)
@@ -55,10 +57,12 @@
 
     @Test
     public void onOwnerInfoUpdated_shouldUpdateOwnerInfoController() {
-        final Map<Class, AbstractPreferenceController> preferenceControllers =
+        final Map<Class, List<AbstractPreferenceController>> preferenceControllers =
                 ReflectionHelpers.getField(mSettings, "mPreferenceControllers");
         final OwnerInfoPreferenceController controller = mock(OwnerInfoPreferenceController.class);
-        preferenceControllers.put(OwnerInfoPreferenceController.class, controller);
+        List<AbstractPreferenceController> controllerList = new ArrayList<>();
+        controllerList.add(controller);
+        preferenceControllers.put(OwnerInfoPreferenceController.class, controllerList);
 
         mSettings.onOwnerInfoUpdated();
 
diff --git a/tests/robotests/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceControllerTest.java
new file mode 100644
index 0000000..8818602
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceControllerTest.java
@@ -0,0 +1,119 @@
+/*
+ * 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.security.trustagent;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.FakeFeatureFactory;
+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.annotation.Config;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class ManageTrustAgentsPreferenceControllerTest {
+
+    @Mock
+    private TrustAgentManager mTrustAgentManager;
+    @Mock
+    private LockPatternUtils mLockPatternUtils;
+    @Mock
+    private PreferenceScreen mScreen;
+
+    private FakeFeatureFactory mFeatureFactory;
+    private Context mContext;
+    private ManageTrustAgentsPreferenceController mController;
+    private Preference mPreference;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mFeatureFactory = FakeFeatureFactory.setupForTest();
+        when(mFeatureFactory.securityFeatureProvider.getLockPatternUtils(mContext))
+                .thenReturn(mLockPatternUtils);
+        when(mFeatureFactory.securityFeatureProvider.getTrustAgentManager())
+                .thenReturn(mTrustAgentManager);
+        mController = new ManageTrustAgentsPreferenceController(mContext);
+        mPreference = new Preference(mContext);
+        mPreference.setKey(mController.getPreferenceKey());
+        when(mScreen.findPreference(mController.getPreferenceKey()))
+                .thenReturn(mPreference);
+    }
+
+    @Test
+    public void isAlwaysAvailable() {
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void displayPreference_isNotSecure_shouldDisablePreference() {
+        when(mLockPatternUtils.isSecure(anyInt())).thenReturn(false);
+
+        mController.displayPreference(mScreen);
+
+        assertThat(mPreference.isEnabled()).isFalse();
+        assertThat(mPreference.getSummary())
+                .isEqualTo(mContext.getString(R.string.disabled_because_no_backup_security));
+    }
+
+    @Test
+    public void displayPreference_isSecure_noTrustAgent_shouldShowGenericSummary() {
+        when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
+        when(mTrustAgentManager.getActiveTrustAgents(mContext, mLockPatternUtils))
+                .thenReturn(new ArrayList<>());
+
+        mController.displayPreference(mScreen);
+
+        assertThat(mPreference.isEnabled()).isTrue();
+        assertThat(mPreference.getSummary())
+                .isEqualTo(mContext.getString(R.string.manage_trust_agents_summary));
+    }
+
+    @Test
+    public void displayPreference_isSecure_hasTrustAgent_shouldShowDetailedSummary() {
+        when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
+        when(mTrustAgentManager.getActiveTrustAgents(mContext, mLockPatternUtils))
+                .thenReturn(Arrays.asList(new TrustAgentManager.TrustAgentComponentInfo()));
+
+        mController.displayPreference(mScreen);
+
+        assertThat(mPreference.isEnabled()).isTrue();
+        assertThat(mPreference.getSummary())
+                .isEqualTo(mContext.getResources().getQuantityString(
+                        R.plurals.manage_trust_agents_summary_on, 1, 1));
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java
new file mode 100644
index 0000000..a97780b
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java
@@ -0,0 +1,132 @@
+/*
+ * 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.security.trustagent;
+
+
+import static com.android.settings.security.trustagent.TrustAgentListPreferenceController
+        .PREF_KEY_SECURITY_CATEGORY;
+import static com.android.settings.security.trustagent.TrustAgentListPreferenceController
+        .PREF_KEY_TRUST_AGENT;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.Activity;
+import android.content.ComponentName;
+import android.content.Context;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceCategory;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.TestConfig;
+import com.android.settings.security.SecuritySettingsV2;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
+import org.robolectric.annotation.Config;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class TrustAgentListPreferenceControllerTest {
+
+    @Mock
+    private TrustAgentManager mTrustAgentManager;
+    @Mock
+    private LockPatternUtils mLockPatternUtils;
+    @Mock
+    private PreferenceScreen mScreen;
+    @Mock
+    private PreferenceCategory mCategory;
+    @Mock
+    private SecuritySettingsV2 mFragment;
+
+    private Lifecycle mLifecycle;
+    private FakeFeatureFactory mFeatureFactory;
+    private Activity mActivity;
+
+    private TrustAgentListPreferenceController mController;
+
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mActivity = Robolectric.buildActivity(Activity.class).get();
+        mLifecycle = new Lifecycle(() -> mLifecycle);
+        mFeatureFactory = FakeFeatureFactory.setupForTest();
+        when(mFeatureFactory.securityFeatureProvider.getLockPatternUtils(any(Context.class)))
+                .thenReturn(mLockPatternUtils);
+        when(mFeatureFactory.securityFeatureProvider.getTrustAgentManager())
+                .thenReturn(mTrustAgentManager);
+        when(mCategory.getKey()).thenReturn(PREF_KEY_SECURITY_CATEGORY);
+        when(mCategory.getContext()).thenReturn(mActivity);
+        when(mScreen.findPreference(PREF_KEY_SECURITY_CATEGORY))
+                .thenReturn(mCategory);
+        mController = new TrustAgentListPreferenceController(mActivity, mFragment, mLifecycle);
+    }
+
+    @Test
+    public void testConstants() {
+        assertThat(mController.isAvailable()).isTrue();
+        assertThat(mController.getPreferenceKey()).isEqualTo(PREF_KEY_TRUST_AGENT);
+    }
+
+    @Test
+    public void onResume_shouldClearOldAgents() {
+        final Preference oldAgent = new Preference(mActivity);
+        oldAgent.setKey(PREF_KEY_TRUST_AGENT);
+        when(mCategory.findPreference(PREF_KEY_TRUST_AGENT))
+                .thenReturn(oldAgent)
+                .thenReturn(null);
+
+        mController.displayPreference(mScreen);
+        mController.onResume();
+
+        verify(mCategory).removePreference(oldAgent);
+    }
+
+    @Test
+    public void onResume_shouldAddNewAgents() {
+        final List<TrustAgentManager.TrustAgentComponentInfo> agents = new ArrayList<>();
+        final TrustAgentManager.TrustAgentComponentInfo agent = mock(
+                TrustAgentManager.TrustAgentComponentInfo.class);
+        agent.title = "Test_title";
+        agent.summary = "test summary";
+        agent.componentName = new ComponentName("pkg", "agent");
+        agent.admin = null;
+        agents.add(agent);
+        when(mTrustAgentManager.getActiveTrustAgents(mActivity, mLockPatternUtils))
+                .thenReturn(agents);
+
+        mController.displayPreference(mScreen);
+        mController.onResume();
+
+        verify(mCategory).addPreference(any(Preference.class));
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/widget/SwitchBarTest.java b/tests/robotests/src/com/android/settings/widget/SwitchBarTest.java
new file mode 100644
index 0000000..c805761
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/widget/SwitchBarTest.java
@@ -0,0 +1,74 @@
+/*
+ * 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.widget;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.robolectric.RuntimeEnvironment.application;
+
+import android.content.Context;
+import android.widget.TextView;
+
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class SwitchBarTest {
+
+    private Context mContext;
+    private SwitchBar mBar;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mBar = new SwitchBar(application, Robolectric.buildAttributeSet().build());
+    }
+
+    @Test
+    public void testDefaultLabels() {
+        int defaultOnText = R.string.switch_on_text;
+        int defaultOffText = R.string.switch_off_text;
+        assertThat(((TextView) mBar.findViewById(R.id.switch_text)).getText())
+                .isEqualTo(mContext.getString(defaultOffText));
+
+        mBar.setChecked(true);
+        assertThat(((TextView) mBar.findViewById(R.id.switch_text)).getText())
+                .isEqualTo(mContext.getString(defaultOnText));
+    }
+
+    @Test
+    public void testCustomLabels() {
+        int onText = R.string.master_clear_progress_text;
+        int offText = R.string.manage_space_text;
+        mBar.setSwitchBarText(onText, offText);
+        assertThat(((TextView) mBar.findViewById(R.id.switch_text)).getText())
+                .isEqualTo(mContext.getString(offText));
+
+        mBar.setChecked(true);
+        assertThat(((TextView) mBar.findViewById(R.id.switch_text)).getText())
+                .isEqualTo(mContext.getString(onText));
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java
index 687287b..f32177c 100644
--- a/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java
@@ -45,6 +45,17 @@
     }
 
     @Test
+    @Config(qualifiers = "mcc999")
+    public void testNonIndexableKeys_ifPageDisabled_shouldNotIndexResource() {
+        final List<String> niks = ConfigureWifiSettings.SEARCH_INDEX_DATA_PROVIDER
+                .getNonIndexableKeys(mContext);
+        final int xmlId = new ConfigureWifiSettings().getPreferenceScreenResId();
+
+        final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(mContext, xmlId);
+        assertThat(niks).containsAllIn(keys);
+    }
+
+    @Test
     public void testNonIndexableKeys_noConnection_blocksIP() {
         ConnectivityManager manager = mock(ConnectivityManager.class);
         when(manager.getActiveNetworkInfo()).thenReturn(null);
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiMasterSwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/WifiMasterSwitchPreferenceControllerTest.java
index f1bca6f..1708e36 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiMasterSwitchPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiMasterSwitchPreferenceControllerTest.java
@@ -72,11 +72,18 @@
     }
 
     @Test
-    public void isAvailable_shouldAlwaysReturnTrue() {
+    public void testWifiMasterSwitch_byDefault_shouldBeShown() {
         assertThat(mController.isAvailable()).isTrue();
     }
 
     @Test
+    @Config(qualifiers = "mcc999")
+    public void testWifiMasterSwitch_ifDisabled_shouldNotBeShown() {
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+
+    @Test
     public void onResume_shouldRegisterCallback() {
         mController.onResume();
 
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/WifiSettingsTest.java
new file mode 100644
index 0000000..5f34800
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/wifi/WifiSettingsTest.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2017 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.wifi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+
+import android.content.Context;
+
+import com.android.settings.TestConfig;
+import com.android.settings.search.SearchIndexableRaw;
+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;
+import org.robolectric.annotation.Config;
+
+import java.util.List;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class WifiSettingsTest {
+
+    private Context mContext;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = spy(RuntimeEnvironment.application);
+    }
+
+    @Test
+    public void testSearchIndexProvider_shouldIndexFragmentTitle() {
+        final List<SearchIndexableRaw> indexRes =
+                WifiSettings.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(mContext,
+                        true /* enabled */);
+
+        assertThat(indexRes).isNotNull();
+        assertThat(indexRes.get(0).key).isEqualTo(WifiSettings.DATA_KEY_REFERENCE);
+    }
+
+    @Test
+    @Config(qualifiers = "mcc999")
+    public void testSearchIndexProvider_ifWifiSettingsNotVisible_shouldNotIndexFragmentTitle() {
+        final List<SearchIndexableRaw> indexRes =
+                WifiSettings.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(mContext,
+                        true /* enabled */);
+
+        assertThat(indexRes).isEmpty();
+    }
+}
\ No newline at end of file
