Use proper DashboardFragment APIs for SecuritySettingsV2

Next CL will add tests.

Bug: 32953042
Test: TODO
Change-Id: I0cb0e4eb216d3e9408675486f1cd73ba82d8ca36
diff --git a/res/xml/security_settings_v2.xml b/res/xml/security_settings_v2.xml
index 86f542c..571e51f 100644
--- a/res/xml/security_settings_v2.xml
+++ b/res/xml/security_settings_v2.xml
@@ -47,6 +47,7 @@
         <Preference
             android:key="lockscreen_preferences"
             android:title="@string/lockscreen_settings_title"
+            android:summary="@string/summary_placeholder"
             android:fragment="com.android.settings.security.LockscreenDashboardFragment" />
 
         <Preference
@@ -77,6 +78,7 @@
 
         <SwitchPreference
             android:key="visiblepattern_profile"
+            android:summary="@string/summary_placeholder"
             android:title="@string/lockpattern_settings_enable_visible_pattern_title_profile" />
 
         <Preference
@@ -95,8 +97,8 @@
         <Preference
             android:key="location"
             android:title="@string/location_settings_title"
-            android:fragment="com.android.settings.location.LocationSettings">
-        </Preference>
+            android:summary="@string/summary_placeholder"
+            android:fragment="com.android.settings.location.LocationSettings" />
 
         <SwitchPreference
             android:key="show_password"
@@ -109,15 +111,17 @@
         android:order="40"
         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="manage_device_admin"
+            android:title="@string/manage_device_admin"
+            android:summary="@string/summary_placeholder"
+            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" />
+        <Preference
+            android:key="enterprise_privacy"
+            android:title="@string/enterprise_privacy_settings"
+            android:summary="@string/summary_placeholder"
+            android:fragment="com.android.settings.enterprise.EnterprisePrivacySettings" />
 
     </PreferenceCategory>
 
@@ -144,7 +148,7 @@
         android:order="70"
         android:key="manage_trust_agents"
         android:title="@string/manage_trust_agents"
-        android:persistent="false"
+        android:summary="@string/summary_placeholder"
         android:fragment="com.android.settings.security.trustagent.TrustAgentSettings" />
 
     <Preference
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index 9ef38b8..048f6ed 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -218,6 +218,10 @@
             preference.setSummary(tile.summary);
         } else if (tile.metaData != null
                 && tile.metaData.containsKey(META_DATA_PREFERENCE_SUMMARY_URI)) {
+            // Set a placeholder summary before  starting to fetch real summary, this is necessary
+            // to avoid preference height change.
+            preference.setSummary(R.string.summary_placeholder);
+
             ThreadUtils.postOnBackgroundThread(() -> {
                 final Map<String, IContentProvider> providerMap = new ArrayMap<>();
                 final String uri = tile.metaData.getString(META_DATA_PREFERENCE_SUMMARY_URI);
diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java
index c4e178f..0207c94 100644
--- a/src/com/android/settings/search/SearchIndexableResources.java
+++ b/src/com/android/settings/search/SearchIndexableResources.java
@@ -75,7 +75,7 @@
 import com.android.settings.security.EncryptionAndCredential;
 import com.android.settings.security.LockscreenDashboardFragment;
 import com.android.settings.security.ScreenPinningSettings;
-import com.android.settings.security.SecuritySettings;
+import com.android.settings.security.SecuritySettingsV2;
 import com.android.settings.security.screenlock.ScreenLockSettings;
 import com.android.settings.sim.SimSettings;
 import com.android.settings.support.SupportDashboardActivity;
@@ -135,7 +135,7 @@
         addIndex(LocationSettings.class);
         addIndex(LocationMode.class);
         addIndex(ScanningSettings.class);
-        addIndex(SecuritySettings.class);
+        addIndex(SecuritySettingsV2.class);
         addIndex(ScreenLockSettings.class);
         addIndex(EncryptionAndCredential.class);
         addIndex(ScreenPinningSettings.class);
@@ -179,5 +179,7 @@
     private SearchIndexableResources() {
     }
 
-    public static Collection<Class> providerValues() { return sProviders;}
+    public static Collection<Class> providerValues() {
+        return sProviders;
+    }
 }
\ No newline at end of file
diff --git a/src/com/android/settings/security/ChangeProfileScreenLockPreferenceController.java b/src/com/android/settings/security/ChangeProfileScreenLockPreferenceController.java
index 612dd6d..9a33ec3 100644
--- a/src/com/android/settings/security/ChangeProfileScreenLockPreferenceController.java
+++ b/src/com/android/settings/security/ChangeProfileScreenLockPreferenceController.java
@@ -30,7 +30,6 @@
 import com.android.settings.R;
 import com.android.settings.Utils;
 import com.android.settings.password.ChooseLockGeneric;
-import com.android.settings.widget.GearPreference;
 
 public class ChangeProfileScreenLockPreferenceController extends
         ChangeScreenLockPreferenceController {
@@ -42,12 +41,6 @@
         super(context, host);
     }
 
-    @Override
-    public void onGearClick(GearPreference p) {
-
-    }
-
-    @Override
     public boolean isAvailable() {
         if (mProfileChallengeUserId == UserHandle.USER_NULL ||
                 !mLockPatternUtils.isSeparateProfileChallengeAllowed(mProfileChallengeUserId)) {
diff --git a/src/com/android/settings/security/ChangeScreenLockPreferenceController.java b/src/com/android/settings/security/ChangeScreenLockPreferenceController.java
index 3cd235f..67b78fc 100644
--- a/src/com/android/settings/security/ChangeScreenLockPreferenceController.java
+++ b/src/com/android/settings/security/ChangeScreenLockPreferenceController.java
@@ -79,13 +79,19 @@
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
         mPreference = (RestrictedPreference) screen.findPreference(getPreferenceKey());
-        if (mPreference != null && mPreference instanceof GearPreference) {
-            ((GearPreference) mPreference).setOnGearClickListener(this);
-        }
     }
 
     @Override
     public void updateState(Preference preference) {
+        if (mPreference != null && mPreference instanceof GearPreference) {
+            if (mLockPatternUtils.isSecure(mUserId)
+                    || !mLockPatternUtils.isLockScreenDisabled(mUserId)) {
+                ((GearPreference) mPreference).setOnGearClickListener(this);
+            } else {
+                ((GearPreference) mPreference).setOnGearClickListener(null);
+            }
+        }
+
         updateSummary(preference, mUserId);
         disableIfPasswordQualityManaged(mUserId);
         if (!mLockPatternUtils.isSeparateProfileChallengeEnabled(mProfileChallengeUserId)) {
@@ -148,6 +154,7 @@
                     break;
             }
         }
+        mPreference.setEnabled(true);
     }
 
     /**
diff --git a/src/com/android/settings/security/EncryptionAndCredential.java b/src/com/android/settings/security/EncryptionAndCredential.java
index aa35dd3..627cf3e 100644
--- a/src/com/android/settings/security/EncryptionAndCredential.java
+++ b/src/com/android/settings/security/EncryptionAndCredential.java
@@ -66,7 +66,8 @@
             Lifecycle lifecycle) {
         final List<AbstractPreferenceController> controllers = new ArrayList<>();
         final EncryptionStatusPreferenceController encryptStatusController =
-                new EncryptionStatusPreferenceController(context, PREF_KEY_ENCRYPTION_DETAIL_PAGE);
+                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/LockScreenPreferenceController.java b/src/com/android/settings/security/LockScreenPreferenceController.java
index 213c39c..156ad81 100644
--- a/src/com/android/settings/security/LockScreenPreferenceController.java
+++ b/src/com/android/settings/security/LockScreenPreferenceController.java
@@ -27,18 +27,32 @@
 import com.android.settings.core.BasePreferenceController;
 import com.android.settings.notification.LockScreenNotificationPreferenceController;
 import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnResume;
 
-public class LockScreenPreferenceController extends BasePreferenceController {
+public class LockScreenPreferenceController extends BasePreferenceController implements
+        LifecycleObserver, OnResume {
 
     static final String KEY_LOCKSCREEN_PREFERENCES = "lockscreen_preferences";
 
     private static final int MY_USER_ID = UserHandle.myUserId();
     private final LockPatternUtils mLockPatternUtils;
+    private Preference mPreference;
 
-    public LockScreenPreferenceController(Context context) {
+    public LockScreenPreferenceController(Context context, Lifecycle lifecycle) {
         super(context, KEY_LOCKSCREEN_PREFERENCES);
         mLockPatternUtils = FeatureFactory.getFactory(context)
                 .getSecurityFeatureProvider().getLockPatternUtils(context);
+        if (lifecycle != null) {
+            lifecycle.addObserver(this);
+        }
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        mPreference = screen.findPreference(getPreferenceKey());
     }
 
     @Override
@@ -54,12 +68,13 @@
     }
 
     @Override
-    public void displayPreference(PreferenceScreen screen) {
-        super.displayPreference(screen);
-        final Preference lockscreenPreferences = screen.findPreference(getPreferenceKey());
-        if (lockscreenPreferences != null) {
-            lockscreenPreferences.setSummary(
-                    LockScreenNotificationPreferenceController.getSummaryResource(mContext));
-        }
+    public void updateState(Preference preference) {
+        preference.setSummary(
+                LockScreenNotificationPreferenceController.getSummaryResource(mContext));
+    }
+
+    @Override
+    public void onResume() {
+        mPreference.setVisible(isAvailable());
     }
 }
diff --git a/src/com/android/settings/security/SecuritySettingsV2.java b/src/com/android/settings/security/SecuritySettingsV2.java
index 7ae6ca7..9909ccf 100644
--- a/src/com/android/settings/security/SecuritySettingsV2.java
+++ b/src/com/android/settings/security/SecuritySettingsV2.java
@@ -1,33 +1,28 @@
 package com.android.settings.security;
 
-import static com.android.settings.security.EncryptionStatusPreferenceController.PREF_KEY_ENCRYPTION_SECURITY_PAGE;
+import static com.android.settings.security.EncryptionStatusPreferenceController
+        .PREF_KEY_ENCRYPTION_SECURITY_PAGE;
 
 import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
 import android.hardware.fingerprint.FingerprintManager;
-import android.os.UserHandle;
-import android.os.UserManager;
 import android.provider.SearchIndexableResource;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
 
 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.location.LocationPreferenceController;
-import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.password.ChooseLockSettingsHelper;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.security.trustagent.ManageTrustAgentsPreferenceController;
 import com.android.settings.security.trustagent.TrustAgentListPreferenceController;
+import com.android.settings.widget.PreferenceCategoryController;
 import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.lifecycle.Lifecycle;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -43,60 +38,12 @@
     public static final int UNIFY_LOCK_CONFIRM_PROFILE_REQUEST = 129;
     public static final int UNUNIFY_LOCK_CONFIRM_DEVICE_REQUEST = 130;
 
-
-    // Security status
-    private static final String KEY_SECURITY_STATUS = "security_status";
-    private static final String SECURITY_STATUS_KEY_PREFIX = "security_status_";
-
-    private static final int MY_USER_ID = UserHandle.myUserId();
-
-    private DashboardFeatureProvider mDashboardFeatureProvider;
-    private SecurityFeatureProvider mSecurityFeatureProvider;
-    private UserManager mUm;
-
-    private ChooseLockSettingsHelper mChooseLockSettingsHelper;
-    private LockPatternUtils mLockPatternUtils;
-
-    private int mProfileChallengeUserId;
-
-    private LocationPreferenceController mLocationController;
-    private ManageDeviceAdminPreferenceController mManageDeviceAdminPreferenceController;
-    private EnterprisePrivacyPreferenceController mEnterprisePrivacyPreferenceController;
-    private EncryptionStatusPreferenceController mEncryptionStatusPreferenceController;
-    private ManageTrustAgentsPreferenceController mManageTrustAgentsPreferenceController;
-    private ScreenPinningPreferenceController mScreenPinningPreferenceController;
-    private SimLockPreferenceController mSimLockPreferenceController;
-    private ShowPasswordPreferenceController mShowPasswordPreferenceController;
-    private TrustAgentListPreferenceController mTrustAgentListPreferenceController;
-    private LockScreenPreferenceController mLockScreenPreferenceController;
-    private ChangeScreenLockPreferenceController mChangeScreenLockPreferenceController;
-    private ChangeProfileScreenLockPreferenceController
-            mChangeProfileScreenLockPreferenceController;
-    private LockUnificationPreferenceController mLockUnificationPreferenceController;
-    private VisiblePatternProfilePreferenceController mVisiblePatternProfilePreferenceController;
-    private FingerprintStatusPreferenceController mFingerprintStatusPreferenceController;
-    private FingerprintProfileStatusPreferenceController
-            mFingerprintProfileStatusPreferenceController;
-
     @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);
-        mUm = UserManager.get(context);
-        mDashboardFeatureProvider = FeatureFactory.getFactory(context)
-                .getDashboardFeatureProvider(context);
-
-        mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity());
-    }
-
-    @Override
     protected int getPreferenceScreenResId() {
         return R.xml.security_settings_v2;
     }
@@ -106,7 +53,6 @@
         return TAG;
     }
 
-
     @Override
     public int getHelpResource() {
         return R.string.help_url_security;
@@ -114,161 +60,7 @@
 
     @Override
     protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
-        mManageDeviceAdminPreferenceController
-                = new ManageDeviceAdminPreferenceController(context);
-        mEnterprisePrivacyPreferenceController
-                = new EnterprisePrivacyPreferenceController(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());
-        mLockScreenPreferenceController = new LockScreenPreferenceController(context);
-        mChangeScreenLockPreferenceController = new ChangeScreenLockPreferenceController(context,
-                this /* host */);
-        mChangeProfileScreenLockPreferenceController =
-                new ChangeProfileScreenLockPreferenceController(context, this /* host */);
-        mLockUnificationPreferenceController = new LockUnificationPreferenceController(context,
-                this /* host */);
-        mVisiblePatternProfilePreferenceController =
-                new VisiblePatternProfilePreferenceController(context);
-        mFingerprintStatusPreferenceController = new FingerprintStatusPreferenceController(context);
-        mFingerprintProfileStatusPreferenceController =
-                new FingerprintProfileStatusPreferenceController(context);
-        return null;
-    }
-
-    /**
-     * 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() {
-        final PreferenceScreen root = getPreferenceScreen();
-        mTrustAgentListPreferenceController.displayPreference(root);
-        mLockScreenPreferenceController.displayPreference(root);
-        mChangeScreenLockPreferenceController.displayPreference(root);
-        mChangeProfileScreenLockPreferenceController.displayPreference(root);
-        mLockUnificationPreferenceController.displayPreference(root);
-        mVisiblePatternProfilePreferenceController.displayPreference(root);
-        mFingerprintStatusPreferenceController.displayPreference(root);
-        mFingerprintProfileStatusPreferenceController.displayPreference(root);
-
-        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));
-//        }
-
-        mLocationController.displayPreference(root);
-        mManageDeviceAdminPreferenceController.updateState(
-                root.findPreference(mManageDeviceAdminPreferenceController.getPreferenceKey()));
-        mEnterprisePrivacyPreferenceController.displayPreference(root);
-        final Preference enterprisePrivacyPreference = root.findPreference(
-                mEnterprisePrivacyPreferenceController.getPreferenceKey());
-        mEnterprisePrivacyPreferenceController.updateState(enterprisePrivacyPreference);
-
-        return root;
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-
-        // Make sure we reload the preference hierarchy since some of these settings
-        // depend on others...
-        createPreferenceHierarchy();
-
-        final Preference visiblePatternProfilePref = getPreferenceScreen().findPreference(
-                mVisiblePatternProfilePreferenceController.getPreferenceKey());
-        if (visiblePatternProfilePref != null) {
-            visiblePatternProfilePref
-                    .setOnPreferenceChangeListener(mVisiblePatternProfilePreferenceController);
-            mVisiblePatternProfilePreferenceController.updateState(visiblePatternProfilePref);
-        }
-
-        final Preference showPasswordPref = getPreferenceScreen().findPreference(
-                mShowPasswordPreferenceController.getPreferenceKey());
-        showPasswordPref.setOnPreferenceChangeListener(mShowPasswordPreferenceController);
-        mShowPasswordPreferenceController.updateState(showPasswordPref);
-
-        final Preference lockUnificationPref = getPreferenceScreen().findPreference(
-                mLockUnificationPreferenceController.getPreferenceKey());
-        lockUnificationPref.setOnPreferenceChangeListener(mLockUnificationPreferenceController);
-        mLockUnificationPreferenceController.updateState(lockUnificationPref);
-
-        final Preference changeDeviceLockPref = getPreferenceScreen().findPreference(
-                mChangeScreenLockPreferenceController.getPreferenceKey());
-        mChangeScreenLockPreferenceController.updateState(changeDeviceLockPref);
-
-        mFingerprintStatusPreferenceController.updateState(
-                getPreferenceScreen().findPreference(
-                        mFingerprintStatusPreferenceController.getPreferenceKey()));
-
-        mFingerprintProfileStatusPreferenceController.updateState(
-                getPreferenceScreen().findPreference(
-                        mFingerprintProfileStatusPreferenceController.getPreferenceKey()));
-
-        final Preference changeProfileLockPref = getPreferenceScreen().findPreference(
-                mChangeProfileScreenLockPreferenceController.getPreferenceKey());
-        mChangeProfileScreenLockPreferenceController.updateState(changeProfileLockPref);
-
-        final Preference encryptionStatusPref = getPreferenceScreen().findPreference(
-                mEncryptionStatusPreferenceController.getPreferenceKey());
-        mEncryptionStatusPreferenceController.updateState(encryptionStatusPref);
-        mTrustAgentListPreferenceController.onResume();
-        mLocationController.updateSummary();
-    }
-
-
-    @Override
-    public boolean onPreferenceTreeClick(Preference preference) {
-        if (mTrustAgentListPreferenceController.handlePreferenceTreeClick(preference)) {
-            return true;
-        }
-        if (mChangeScreenLockPreferenceController.handlePreferenceTreeClick(preference)) {
-            return true;
-        }
-        if (mChangeProfileScreenLockPreferenceController.handlePreferenceTreeClick(preference)) {
-            return true;
-        }
-        // If we didn't handle it, let preferences handle it.
-        return super.onPreferenceTreeClick(preference);
+        return buildPreferenceControllers(context, getLifecycle(), this /* host*/);
     }
 
     /**
@@ -276,50 +68,85 @@
      */
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (getPreferenceController(TrustAgentListPreferenceController.class)
+                .handleActivityResult(requestCode, resultCode)) {
+            return;
+        }
+        if (getPreferenceController(LockUnificationPreferenceController.class)
+                .handleActivityResult(requestCode, resultCode, data)) {
+            return;
+        }
         super.onActivityResult(requestCode, resultCode, data);
-        if (mTrustAgentListPreferenceController.handleActivityResult(requestCode, resultCode)) {
-            return;
-        }
-        if (mLockUnificationPreferenceController.handleActivityResult(
-                requestCode, resultCode, data)) {
-            return;
-        }
-        createPreferenceHierarchy();
+    }
+
+    void launchConfirmDeviceLockForUnification() {
+        getPreferenceController(LockUnificationPreferenceController.class)
+                .launchConfirmDeviceLockForUnification();
+    }
+
+    void unifyUncompliantLocks() {
+        getPreferenceController(LockUnificationPreferenceController.class).unifyUncompliantLocks();
+    }
+
+    void updateUnificationPreference() {
+        getPreferenceController(LockUnificationPreferenceController.class).updateState(null);
+    }
+
+    private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
+            Lifecycle lifecycle, SecuritySettingsV2 host) {
+        final List<AbstractPreferenceController> controllers = new ArrayList<>();
+        controllers.add(new LocationPreferenceController(context, lifecycle));
+        controllers.add(new ManageDeviceAdminPreferenceController(context));
+        controllers.add(new EnterprisePrivacyPreferenceController(context));
+        controllers.add(new ManageTrustAgentsPreferenceController(context));
+        controllers.add(new ScreenPinningPreferenceController(context));
+        controllers.add(new SimLockPreferenceController(context));
+        controllers.add(new ShowPasswordPreferenceController(context));
+        controllers.add(new FingerprintStatusPreferenceController(context));
+        controllers.add(new EncryptionStatusPreferenceController(context,
+                PREF_KEY_ENCRYPTION_SECURITY_PAGE));
+        controllers.add(new TrustAgentListPreferenceController(context, host, lifecycle));
+        controllers.add(new LockScreenPreferenceController(context, lifecycle));
+        controllers.add(new ChangeScreenLockPreferenceController(context, host));
+
+        final List<AbstractPreferenceController> profileSecurityControllers = new ArrayList<>();
+        profileSecurityControllers.add(new ChangeProfileScreenLockPreferenceController(
+                context, host));
+        profileSecurityControllers.add(new LockUnificationPreferenceController(context, host));
+        profileSecurityControllers.add(new VisiblePatternProfilePreferenceController(
+                context, lifecycle));
+        profileSecurityControllers.add(new FingerprintProfileStatusPreferenceController(context));
+        controllers.add(new PreferenceCategoryController(context, "security_category_profile",
+                profileSecurityControllers));
+        controllers.addAll(profileSecurityControllers);
+
+        return controllers;
     }
 
     /**
      * For Search. Please keep it in sync when updating "createPreferenceHierarchy()"
      */
     public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
-            new SecuritySearchIndexProvider();
+            new BaseSearchIndexProvider() {
 
-    void launchConfirmDeviceLockForUnification() {
-        mLockUnificationPreferenceController.launchConfirmDeviceLockForUnification();
-    }
+                @Override
+                public List<SearchIndexableResource> getXmlResourcesToIndex(
+                        Context context, boolean enabled) {
+                    final List<SearchIndexableResource> index = new ArrayList<>();
+                    // Append the rest of the settings
+                    final SearchIndexableResource sir = new SearchIndexableResource(context);
+                    sir.xmlResId = R.xml.security_settings_v2;
+                    index.add(sir);
+                    return index;
+                }
 
-    void unifyUncompliantLocks() {
-        mLockUnificationPreferenceController.unifyUncompliantLocks();
-    }
-
-    void updateUnificationPreference() {
-        mLockUnificationPreferenceController.updateState(null);
-    }
-
-    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<>();
-            // Append the rest of the settings
-            final SearchIndexableResource sir = new SearchIndexableResource(context);
-            sir.xmlResId = R.xml.security_settings_v2;
-            index.add(sir);
-            return index;
-        }
-    }
+                @Override
+                public List<AbstractPreferenceController> getPreferenceControllers(Context
+                        context) {
+                    return buildPreferenceControllers(context, null /* lifecycle */,
+                            null /* host*/);
+                }
+            };
 
     static class SummaryProvider implements SummaryLoader.SummaryProvider {
 
diff --git a/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java b/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java
index 39b1916..a9e56f4 100644
--- a/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java
+++ b/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java
@@ -21,13 +21,19 @@
 import android.content.Context;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
 
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.Utils;
 import com.android.settings.core.TogglePreferenceController;
 import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnResume;
 
-public class VisiblePatternProfilePreferenceController extends TogglePreferenceController {
+public class VisiblePatternProfilePreferenceController extends TogglePreferenceController
+        implements LifecycleObserver, OnResume {
 
     private static final String KEY_VISIBLE_PATTERN_PROFILE = "visiblepattern_profile";
 
@@ -36,13 +42,18 @@
     private final int mUserId = UserHandle.myUserId();
     private final int mProfileChallengeUserId;
 
-    public VisiblePatternProfilePreferenceController(Context context) {
+    private Preference mPreference;
+
+    public VisiblePatternProfilePreferenceController(Context context, Lifecycle lifecycle) {
         super(context, KEY_VISIBLE_PATTERN_PROFILE);
         mUm = (UserManager) context.getSystemService(Context.USER_SERVICE);
         mLockPatternUtils = FeatureFactory.getFactory(context)
                 .getSecurityFeatureProvider()
                 .getLockPatternUtils(context);
         mProfileChallengeUserId = Utils.getManagedProfileId(mUm, mUserId);
+        if (lifecycle != null) {
+            lifecycle.addObserver(this);
+        }
     }
 
     @Override
@@ -69,4 +80,15 @@
         mLockPatternUtils.setVisiblePatternEnabled(isChecked, mProfileChallengeUserId);
         return true;
     }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        mPreference = screen.findPreference(getPreferenceKey());
+    }
+
+    @Override
+    public void onResume() {
+        mPreference.setVisible(isAvailable());
+    }
 }
diff --git a/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java b/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java
index 8d198e7..99aa6a4 100644
--- a/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java
+++ b/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java
@@ -19,6 +19,7 @@
 import static com.android.settings.security.SecuritySettingsV2.CHANGE_TRUST_AGENT_SETTINGS;
 
 import android.app.Activity;
+import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
 import android.os.UserHandle;
@@ -56,20 +57,18 @@
 
     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,
+    public TrustAgentListPreferenceController(Context context, SecuritySettingsV2 host,
             Lifecycle lifecycle) {
-        super(activity);
-        final SecurityFeatureProvider provider = FeatureFactory.getFactory(activity)
+        super(context);
+        final SecurityFeatureProvider provider = FeatureFactory.getFactory(context)
                 .getSecurityFeatureProvider();
-        mActivity = activity;
         mHost = host;
-        mLockPatternUtils = provider.getLockPatternUtils(activity);
+        mLockPatternUtils = provider.getLockPatternUtils(context);
         mTrustAgentManager = provider.getTrustAgentManager();
         if (lifecycle != null) {
             lifecycle.addObserver(this);
@@ -90,6 +89,7 @@
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
         mSecurityCategory = (PreferenceCategory) screen.findPreference(PREF_KEY_SECURITY_CATEGORY);
+        updateTrustAgents();
     }
 
     @Override
@@ -112,7 +112,8 @@
         if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
             return super.handlePreferenceTreeClick(preference);
         }
-        final ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(mActivity, mHost);
+        final ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(
+                mHost.getActivity(), mHost);
         mTrustAgentClickIntent = preference.getIntent();
         boolean confirmationLaunched = helper.launchConfirmationActivity(
                 CHANGE_TRUST_AGENT_SETTINGS, preference.getTitle());
@@ -127,6 +128,10 @@
 
     @Override
     public void onResume() {
+        updateTrustAgents();
+    }
+
+    private void updateTrustAgents() {
         if (mSecurityCategory == null) {
             return;
         }
@@ -167,7 +172,7 @@
 
     public boolean handleActivityResult(int requestCode, int resultCode) {
         if (requestCode == CHANGE_TRUST_AGENT_SETTINGS && resultCode == Activity.RESULT_OK) {
-            if (mTrustAgentClickIntent != null){
+            if (mTrustAgentClickIntent != null) {
                 mHost.startActivity(mTrustAgentClickIntent);
                 mTrustAgentClickIntent = null;
             }
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 146893c..6a831b0 100644
--- a/tests/robotests/assets/grandfather_not_in_search_index_provider_registry
+++ b/tests/robotests/assets/grandfather_not_in_search_index_provider_registry
@@ -1,3 +1,3 @@
 com.android.settings.display.ScreenZoomPreferenceFragmentForSetupWizard
 com.android.settings.search.indexing.FakeSettingsFragment
-com.android.settings.security.SecuritySettingsV2
\ No newline at end of file
+com.android.settings.security.SecuritySettings
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java
index a97780b..6913c0c 100644
--- a/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java
@@ -23,6 +23,7 @@
         .PREF_KEY_TRUST_AGENT;
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -127,6 +128,6 @@
         mController.displayPreference(mScreen);
         mController.onResume();
 
-        verify(mCategory).addPreference(any(Preference.class));
+        verify(mCategory, atLeastOnce()).addPreference(any(Preference.class));
     }
 }