Migrate About/Reset/Legal to SettingsFragment/PreferenceController<T>

Also move LanguageSettingsEntryPreferenceController to language package.

Bug: 120942613
Test: Manual, Build, Robolectric
Change-Id: Ic532aa813561f06e97646d48f768b173c6bd98cf
diff --git a/res/xml/about_settings_fragment.xml b/res/xml/about_settings_fragment.xml
index c12ef2d..1b48e45 100644
--- a/res/xml/about_settings_fragment.xml
+++ b/res/xml/about_settings_fragment.xml
@@ -18,31 +18,25 @@
 <PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:settings="http://schemas.android.com/apk/res-auto"
-    android:orderingFromXml="false"
     android:title="@string/about_settings">
     <Preference
         android:key="@string/pk_model_info"
-        android:order="0"
         android:title="@string/model_info"
         settings:controller="com.android.car.settings.system.ModelInfoPreferenceController"/>
     <Preference
         android:key="@string/pk_firmware_version"
-        android:order="100"
         android:title="@string/firmware_version"
         settings:controller="com.android.car.settings.system.FirmwareVersionPreferenceController"/>
     <Preference
         android:key="@string/pk_security_patch"
-        android:order="200"
         android:title="@string/security_patch"
         settings:controller="com.android.car.settings.system.SecurityPatchPreferenceController"/>
     <Preference
         android:key="@string/pk_kernel_version"
-        android:order="300"
         android:title="@string/kernel_version"
         settings:controller="com.android.car.settings.system.KernelVersionPreferenceController"/>
     <Preference
         android:key="@string/pk_build_number"
-        android:order="400"
         android:title="@string/build_number"
         settings:controller="com.android.car.settings.system.BuildNumberPreferenceController"/>
 </PreferenceScreen>
diff --git a/res/xml/languages_and_input_fragment.xml b/res/xml/languages_and_input_fragment.xml
index 7e8f8ac..c206833 100644
--- a/res/xml/languages_and_input_fragment.xml
+++ b/res/xml/languages_and_input_fragment.xml
@@ -22,5 +22,5 @@
         android:icon="@drawable/ic_translate"
         android:key="@string/pk_language_settings_entry"
         android:title="@string/language_settings"
-        settings:controller="com.android.car.settings.system.LanguageSettingsEntryPreferenceController"/>
+        settings:controller="com.android.car.settings.language.LanguageSettingsEntryPreferenceController"/>
 </PreferenceScreen>
diff --git a/res/xml/legal_information_fragment.xml b/res/xml/legal_information_fragment.xml
index 1fe7662..5e1541a 100644
--- a/res/xml/legal_information_fragment.xml
+++ b/res/xml/legal_information_fragment.xml
@@ -18,20 +18,17 @@
 <PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:settings="http://schemas.android.com/apk/res-auto"
-    android:orderingFromXml="false"
     android:title="@string/legal_information">
     <Preference
         android:key="@string/pk_system_license_entry"
-        android:order="0"
         android:title="@string/webview_license_title"
-        settings:controller="com.android.car.settings.common.NoSetupPreferenceController">
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController">
         <intent android:action="android.settings.WEBVIEW_LICENSE"/>
     </Preference>
     <Preference
         android:key="@string/pk_third_party_license_entry"
-        android:order="100"
         android:title="@string/settings_license_activity_title"
-        settings:controller="com.android.car.settings.common.NoSetupPreferenceController">
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController">
         <intent
             android:targetClass="com.android.car.settings.system.ThirdPartyLicensesActivity"
             android:targetPackage="com.android.car.settings"/>
diff --git a/res/xml/reset_options_fragment.xml b/res/xml/reset_options_fragment.xml
index 7800312..f0fda00 100644
--- a/res/xml/reset_options_fragment.xml
+++ b/res/xml/reset_options_fragment.xml
@@ -30,7 +30,7 @@
         android:fragment="com.android.car.settings.system.ResetAppPrefFragment"
         android:key="@string/pk_reset_app_pref"
         android:title="@string/reset_app_pref_title"
-        settings:controller="com.android.car.settings.common.NoSetupPreferenceController"/>
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
     <com.android.car.settings.common.RestrictedPreference
         android:key="@string/pk_master_clear"
         android:title="@string/master_clear_title"
diff --git a/src/com/android/car/settings/system/LanguageSettingsEntryPreferenceController.java b/src/com/android/car/settings/language/LanguageSettingsEntryPreferenceController.java
similarity index 96%
rename from src/com/android/car/settings/system/LanguageSettingsEntryPreferenceController.java
rename to src/com/android/car/settings/language/LanguageSettingsEntryPreferenceController.java
index e161b85..3e31c11 100644
--- a/src/com/android/car/settings/system/LanguageSettingsEntryPreferenceController.java
+++ b/src/com/android/car/settings/language/LanguageSettingsEntryPreferenceController.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.car.settings.system;
+package com.android.car.settings.language;
 
 import android.content.Context;
 
diff --git a/src/com/android/car/settings/system/AboutSettingsFragment.java b/src/com/android/car/settings/system/AboutSettingsFragment.java
index 8969dcd..4171542 100644
--- a/src/com/android/car/settings/system/AboutSettingsFragment.java
+++ b/src/com/android/car/settings/system/AboutSettingsFragment.java
@@ -19,12 +19,12 @@
 import androidx.annotation.XmlRes;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.BasePreferenceFragment;
+import com.android.car.settings.common.SettingsFragment;
 
 /**
  * Shows basic info about the system and provide some actions like update, reset etc.
  */
-public class AboutSettingsFragment extends BasePreferenceFragment {
+public class AboutSettingsFragment extends SettingsFragment {
 
     @Override
     @XmlRes
diff --git a/src/com/android/car/settings/system/BuildNumberPreferenceController.java b/src/com/android/car/settings/system/BuildNumberPreferenceController.java
index 47c70eb..c9187e4 100644
--- a/src/com/android/car/settings/system/BuildNumberPreferenceController.java
+++ b/src/com/android/car/settings/system/BuildNumberPreferenceController.java
@@ -16,10 +16,10 @@
 
 package com.android.car.settings.system;
 
+import android.car.drivingstate.CarUxRestrictions;
 import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.os.Build;
-import android.text.TextUtils;
 import android.widget.Toast;
 
 import androidx.lifecycle.Lifecycle;
@@ -29,22 +29,26 @@
 
 import com.android.car.settings.R;
 import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.NoSetupPreferenceController;
+import com.android.car.settings.common.PreferenceController;
 import com.android.car.settings.development.DevelopmentSettingsUtil;
 
 /** Updates the build number entry summary with the build number. */
-public class BuildNumberPreferenceController extends NoSetupPreferenceController implements
+public class BuildNumberPreferenceController extends PreferenceController<Preference> implements
         LifecycleObserver {
 
     private final CarUserManagerHelper mCarUserManagerHelper;
     private Toast mDevHitToast;
     private int mDevHitCountdown;
 
-    public BuildNumberPreferenceController(Context context,
-            String preferenceKey,
-            FragmentController fragmentController) {
-        super(context, preferenceKey, fragmentController);
-        mCarUserManagerHelper = new CarUserManagerHelper(mContext);
+    public BuildNumberPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
     }
 
     /**
@@ -54,41 +58,38 @@
     @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
     public void onResume() {
         mDevHitToast = null;
-        mDevHitCountdown = DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
+        mDevHitCountdown = DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(getContext(),
                 mCarUserManagerHelper) ? -1 : getTapsToBecomeDeveloper();
     }
 
     @Override
-    public CharSequence getSummary() {
-        return Build.DISPLAY;
+    protected void updateState(Preference preference) {
+        preference.setSummary(Build.DISPLAY);
     }
 
     @Override
-    public boolean handlePreferenceTreeClick(Preference preference) {
-        if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
-            return false;
-        }
-
+    protected boolean handlePreferenceClicked(Preference preference) {
         if (!mCarUserManagerHelper.isCurrentProcessAdminUser()
                 && !mCarUserManagerHelper.isCurrentProcessDemoUser()) {
             return false;
         }
 
-        if (!DevelopmentSettingsUtil.isDeviceProvisioned(mContext)) {
+        if (!DevelopmentSettingsUtil.isDeviceProvisioned(getContext())) {
             return false;
         }
 
         if (mDevHitCountdown > 0) {
             mDevHitCountdown--;
             if (mDevHitCountdown == 0) {
-                DevelopmentSettingsUtil.setDevelopmentSettingsEnabled(mContext, true);
-                showToast(mContext.getString(R.string.show_dev_on), Toast.LENGTH_LONG);
+                DevelopmentSettingsUtil.setDevelopmentSettingsEnabled(getContext(), true);
+                showToast(getContext().getString(R.string.show_dev_on), Toast.LENGTH_LONG);
             } else if (mDevHitCountdown <= getTapsToBecomeDeveloper() - getTapsToShowToast()) {
-                showToast(mContext.getResources().getQuantityString(R.plurals.show_dev_countdown,
-                        mDevHitCountdown, mDevHitCountdown), Toast.LENGTH_SHORT);
+                showToast(getContext().getResources().getQuantityString(
+                        R.plurals.show_dev_countdown, mDevHitCountdown, mDevHitCountdown),
+                        Toast.LENGTH_SHORT);
             }
         } else if (mDevHitCountdown < 0) {
-            showToast(mContext.getString(R.string.show_dev_already), Toast.LENGTH_LONG);
+            showToast(getContext().getString(R.string.show_dev_already), Toast.LENGTH_LONG);
         }
         return true;
     }
@@ -97,16 +98,17 @@
         if (mDevHitToast != null) {
             mDevHitToast.cancel();
         }
-        mDevHitToast = Toast.makeText(mContext, text, duration);
+        mDevHitToast = Toast.makeText(getContext(), text, duration);
         mDevHitToast.show();
     }
 
     private int getTapsToBecomeDeveloper() {
-        return mContext.getResources().getInteger(R.integer.enable_developer_settings_click_count);
+        return getContext().getResources().getInteger(
+                R.integer.enable_developer_settings_click_count);
     }
 
     private int getTapsToShowToast() {
-        return mContext.getResources().getInteger(
+        return getContext().getResources().getInteger(
                 R.integer.enable_developer_settings_clicks_to_show_toast_count);
     }
 }
diff --git a/src/com/android/car/settings/system/FirmwareVersionPreferenceController.java b/src/com/android/car/settings/system/FirmwareVersionPreferenceController.java
index 090fa94..0d24dec 100644
--- a/src/com/android/car/settings/system/FirmwareVersionPreferenceController.java
+++ b/src/com/android/car/settings/system/FirmwareVersionPreferenceController.java
@@ -16,24 +16,32 @@
 
 package com.android.car.settings.system;
 
+import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
 import android.os.Build;
 
+import androidx.preference.Preference;
+
 import com.android.car.settings.R;
 import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.NoSetupPreferenceController;
+import com.android.car.settings.common.PreferenceController;
 
 /** Updates the firmware version entry summary with the firmware version. */
-public class FirmwareVersionPreferenceController extends NoSetupPreferenceController {
+public class FirmwareVersionPreferenceController extends PreferenceController<Preference> {
 
-    public FirmwareVersionPreferenceController(Context context,
-            String preferenceKey,
-            FragmentController fragmentController) {
-        super(context, preferenceKey, fragmentController);
+    public FirmwareVersionPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
     }
 
     @Override
-    public CharSequence getSummary() {
-        return mContext.getString(R.string.about_summary, Build.VERSION.RELEASE);
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setSummary(
+                getContext().getString(R.string.about_summary, Build.VERSION.RELEASE));
     }
 }
diff --git a/src/com/android/car/settings/system/KernelVersionPreferenceController.java b/src/com/android/car/settings/system/KernelVersionPreferenceController.java
index d6a1bfc..1d18523 100644
--- a/src/com/android/car/settings/system/KernelVersionPreferenceController.java
+++ b/src/com/android/car/settings/system/KernelVersionPreferenceController.java
@@ -16,23 +16,30 @@
 
 package com.android.car.settings.system;
 
+import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
 
+import androidx.preference.Preference;
+
 import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.NoSetupPreferenceController;
+import com.android.car.settings.common.PreferenceController;
 import com.android.settingslib.DeviceInfoUtils;
 
 /** Updates the kernel version entry summary with the kernel version. */
-public class KernelVersionPreferenceController extends NoSetupPreferenceController {
+public class KernelVersionPreferenceController extends PreferenceController<Preference> {
 
-    public KernelVersionPreferenceController(Context context,
-            String preferenceKey,
-            FragmentController fragmentController) {
-        super(context, preferenceKey, fragmentController);
+    public KernelVersionPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
     }
 
     @Override
-    public CharSequence getSummary() {
-        return DeviceInfoUtils.getFormattedKernelVersion(mContext);
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setSummary(DeviceInfoUtils.getFormattedKernelVersion(getContext()));
     }
 }
diff --git a/src/com/android/car/settings/system/LegalInformationFragment.java b/src/com/android/car/settings/system/LegalInformationFragment.java
index 21c07f0..69b9bc6 100644
--- a/src/com/android/car/settings/system/LegalInformationFragment.java
+++ b/src/com/android/car/settings/system/LegalInformationFragment.java
@@ -19,12 +19,12 @@
 import androidx.annotation.XmlRes;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.BasePreferenceFragment;
+import com.android.car.settings.common.SettingsFragment;
 
 /**
  * Fragment showing legal information.
  */
-public class LegalInformationFragment extends BasePreferenceFragment {
+public class LegalInformationFragment extends SettingsFragment {
 
     @Override
     @XmlRes
diff --git a/src/com/android/car/settings/system/MasterClearEntryPreferenceController.java b/src/com/android/car/settings/system/MasterClearEntryPreferenceController.java
index ea2c1b9..b48920f 100644
--- a/src/com/android/car/settings/system/MasterClearEntryPreferenceController.java
+++ b/src/com/android/car/settings/system/MasterClearEntryPreferenceController.java
@@ -16,35 +16,43 @@
 
 package com.android.car.settings.system;
 
+import android.car.drivingstate.CarUxRestrictions;
 import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.os.UserManager;
 
 import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.NoSetupPreferenceController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.common.RestrictedPreference;
 
 /**
  * Controller which determines if master clear (aka "factory reset") should be displayed based on
  * user status.
  */
-public class MasterClearEntryPreferenceController extends NoSetupPreferenceController {
+public class MasterClearEntryPreferenceController extends
+        PreferenceController<RestrictedPreference> {
 
     private final CarUserManagerHelper mCarUserManagerHelper;
 
     public MasterClearEntryPreferenceController(Context context, String preferenceKey,
-            FragmentController fragmentController) {
-        super(context, preferenceKey, fragmentController);
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
         mCarUserManagerHelper = new CarUserManagerHelper(context);
     }
 
     @Override
+    protected Class<RestrictedPreference> getPreferenceType() {
+        return RestrictedPreference.class;
+    }
+
+    @Override
     public int getAvailabilityStatus() {
         return (mCarUserManagerHelper.isCurrentProcessAdminUser() || isDemoUser()) ? AVAILABLE
                 : DISABLED_FOR_USER;
     }
 
     private boolean isDemoUser() {
-        return UserManager.isDeviceInDemoMode(mContext)
+        return UserManager.isDeviceInDemoMode(getContext())
                 && mCarUserManagerHelper.isCurrentProcessDemoUser();
     }
 }
diff --git a/src/com/android/car/settings/system/ModelInfoPreferenceController.java b/src/com/android/car/settings/system/ModelInfoPreferenceController.java
index f23ec65..4fd8b53 100644
--- a/src/com/android/car/settings/system/ModelInfoPreferenceController.java
+++ b/src/com/android/car/settings/system/ModelInfoPreferenceController.java
@@ -16,24 +16,31 @@
 
 package com.android.car.settings.system;
 
+import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
 import android.os.Build;
 
+import androidx.preference.Preference;
+
 import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.NoSetupPreferenceController;
+import com.android.car.settings.common.PreferenceController;
 import com.android.settingslib.DeviceInfoUtils;
 
 /** Updates the model info entry summary with the model info. */
-public class ModelInfoPreferenceController extends NoSetupPreferenceController {
+public class ModelInfoPreferenceController extends PreferenceController<Preference> {
 
-    public ModelInfoPreferenceController(Context context,
-            String preferenceKey,
-            FragmentController fragmentController) {
-        super(context, preferenceKey, fragmentController);
+    public ModelInfoPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
     }
 
     @Override
-    public CharSequence getSummary() {
-        return Build.MODEL + DeviceInfoUtils.getMsvSuffix();
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setSummary(Build.MODEL + DeviceInfoUtils.getMsvSuffix());
     }
 }
diff --git a/src/com/android/car/settings/system/ResetAppPrefFragment.java b/src/com/android/car/settings/system/ResetAppPrefFragment.java
index 2f50e05..70725e9 100644
--- a/src/com/android/car/settings/system/ResetAppPrefFragment.java
+++ b/src/com/android/car/settings/system/ResetAppPrefFragment.java
@@ -38,8 +38,8 @@
 import androidx.annotation.XmlRes;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.BasePreferenceFragment;
 import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.SettingsFragment;
 
 import java.lang.ref.WeakReference;
 import java.util.List;
@@ -47,7 +47,7 @@
 /**
  * Presents the user with information about resetting app preferences.
  */
-public class ResetAppPrefFragment extends BasePreferenceFragment {
+public class ResetAppPrefFragment extends SettingsFragment {
 
     private static final Logger LOG = new Logger(ResetAppPrefFragment.class);
 
diff --git a/src/com/android/car/settings/system/ResetEsimPreferenceController.java b/src/com/android/car/settings/system/ResetEsimPreferenceController.java
index 6b11408..863d819 100644
--- a/src/com/android/car/settings/system/ResetEsimPreferenceController.java
+++ b/src/com/android/car/settings/system/ResetEsimPreferenceController.java
@@ -16,23 +16,31 @@
 
 package com.android.car.settings.system;
 
+import android.car.drivingstate.CarUxRestrictions;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.provider.Settings;
 import android.telephony.euicc.EuiccManager;
 
+import androidx.preference.TwoStatePreference;
+
 import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.NoSetupPreferenceController;
+import com.android.car.settings.common.PreferenceController;
 
 /**
  * Controller which determines if a checkbox to reset the device's eSIMs is shown. Not all
  * devices support eSIMs.
  */
-public class ResetEsimPreferenceController extends NoSetupPreferenceController {
+public class ResetEsimPreferenceController extends PreferenceController<TwoStatePreference> {
 
     public ResetEsimPreferenceController(Context context, String preferenceKey,
-            FragmentController fragmentController) {
-        super(context, preferenceKey, fragmentController);
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<TwoStatePreference> getPreferenceType() {
+        return TwoStatePreference.class;
     }
 
     @Override
@@ -41,11 +49,12 @@
     }
 
     private boolean showEuiccSettings() {
-        EuiccManager euiccManager = (EuiccManager) mContext.getSystemService(Context.EUICC_SERVICE);
+        EuiccManager euiccManager = (EuiccManager) getContext().getSystemService(
+                Context.EUICC_SERVICE);
         if (!euiccManager.isEnabled()) {
             return false;
         }
-        ContentResolver resolver = mContext.getContentResolver();
+        ContentResolver resolver = getContext().getContentResolver();
         return Settings.Global.getInt(resolver, Settings.Global.EUICC_PROVISIONED, 0) != 0
                 || Settings.Global.getInt(resolver, Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0)
                 != 0;
diff --git a/src/com/android/car/settings/system/ResetNetworkConfirmFragment.java b/src/com/android/car/settings/system/ResetNetworkConfirmFragment.java
index 9759498..29c2453 100644
--- a/src/com/android/car/settings/system/ResetNetworkConfirmFragment.java
+++ b/src/com/android/car/settings/system/ResetNetworkConfirmFragment.java
@@ -45,14 +45,14 @@
 import androidx.preference.PreferenceManager;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.BasePreferenceFragment;
 import com.android.car.settings.common.ErrorDialog;
+import com.android.car.settings.common.SettingsFragment;
 
 /**
  * Final warning presented to user to confirm restoring network settings to the factory default.
  * If a user confirms, all settings are reset for connectivity, Wi-Fi, and Bluetooth.
  */
-public class ResetNetworkConfirmFragment extends BasePreferenceFragment {
+public class ResetNetworkConfirmFragment extends SettingsFragment {
 
     // Copied from com.android.settings.network.ApnSettings.
     @VisibleForTesting
diff --git a/src/com/android/car/settings/system/ResetNetworkEntryPreferenceController.java b/src/com/android/car/settings/system/ResetNetworkEntryPreferenceController.java
index d2e3e27..10632d7 100644
--- a/src/com/android/car/settings/system/ResetNetworkEntryPreferenceController.java
+++ b/src/com/android/car/settings/system/ResetNetworkEntryPreferenceController.java
@@ -16,24 +16,32 @@
 
 package com.android.car.settings.system;
 
+import android.car.drivingstate.CarUxRestrictions;
 import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 
 import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.NoSetupPreferenceController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.common.RestrictedPreference;
 
 /** Controller which determines if network reset should be displayed based on user status. */
-public class ResetNetworkEntryPreferenceController extends NoSetupPreferenceController {
+public class ResetNetworkEntryPreferenceController extends
+        PreferenceController<RestrictedPreference> {
 
     private final CarUserManagerHelper mCarUserManagerHelper;
 
     public ResetNetworkEntryPreferenceController(Context context, String preferenceKey,
-            FragmentController fragmentController) {
-        super(context, preferenceKey, fragmentController);
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
         mCarUserManagerHelper = new CarUserManagerHelper(context);
     }
 
     @Override
+    protected Class<RestrictedPreference> getPreferenceType() {
+        return RestrictedPreference.class;
+    }
+
+    @Override
     public int getAvailabilityStatus() {
         return mCarUserManagerHelper.isCurrentProcessAdminUser() ? AVAILABLE : DISABLED_FOR_USER;
     }
diff --git a/src/com/android/car/settings/system/ResetNetworkFragment.java b/src/com/android/car/settings/system/ResetNetworkFragment.java
index 956a8d6..ef81b8b 100644
--- a/src/com/android/car/settings/system/ResetNetworkFragment.java
+++ b/src/com/android/car/settings/system/ResetNetworkFragment.java
@@ -28,8 +28,8 @@
 import androidx.annotation.XmlRes;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.BasePreferenceFragment;
 import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.SettingsFragment;
 import com.android.car.settings.security.CheckLockActivity;
 
 /**
@@ -37,7 +37,7 @@
  * values. If a user confirms, they will first be required to authenticate then presented with a
  * secondary confirmation: {@link ResetNetworkConfirmFragment}.
  */
-public class ResetNetworkFragment extends BasePreferenceFragment {
+public class ResetNetworkFragment extends SettingsFragment {
 
     // Arbitrary request code for starting CheckLockActivity when the reset button is clicked.
     private static final int REQUEST_CODE = 123;
diff --git a/src/com/android/car/settings/system/ResetNetworkItemsPreferenceController.java b/src/com/android/car/settings/system/ResetNetworkItemsPreferenceController.java
index 4375e2d..d018c3c 100644
--- a/src/com/android/car/settings/system/ResetNetworkItemsPreferenceController.java
+++ b/src/com/android/car/settings/system/ResetNetworkItemsPreferenceController.java
@@ -16,39 +16,51 @@
 
 package com.android.car.settings.system;
 
+import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
 import android.content.pm.PackageManager;
 
+import androidx.preference.Preference;
+
 import com.android.car.settings.R;
 import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.NoSetupPreferenceController;
+import com.android.car.settings.common.PreferenceController;
 
 import java.util.StringJoiner;
 
 /** Controller to determine which items appear as resetable within the reset network description. */
-public class ResetNetworkItemsPreferenceController extends NoSetupPreferenceController {
+public class ResetNetworkItemsPreferenceController extends PreferenceController<Preference> {
 
     public ResetNetworkItemsPreferenceController(Context context, String preferenceKey,
-            FragmentController fragmentController) {
-        super(context, preferenceKey, fragmentController);
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
     }
 
     @Override
-    public CharSequence getSummary() {
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setSummary(getSummary());
+    }
+
+    private CharSequence getSummary() {
         StringJoiner joiner = new StringJoiner(System.lineSeparator());
         if (hasFeature(PackageManager.FEATURE_WIFI)) {
-            joiner.add(mContext.getString(R.string.reset_network_item_wifi));
+            joiner.add(getContext().getString(R.string.reset_network_item_wifi));
         }
         if (hasFeature(PackageManager.FEATURE_TELEPHONY)) {
-            joiner.add(mContext.getString(R.string.reset_network_item_mobile));
+            joiner.add(getContext().getString(R.string.reset_network_item_mobile));
         }
         if (hasFeature(PackageManager.FEATURE_BLUETOOTH)) {
-            joiner.add(mContext.getString(R.string.reset_network_item_bluetooth));
+            joiner.add(getContext().getString(R.string.reset_network_item_bluetooth));
         }
         return joiner.toString();
     }
 
     private boolean hasFeature(String feature) {
-        return mContext.getPackageManager().hasSystemFeature(feature);
+        return getContext().getPackageManager().hasSystemFeature(feature);
     }
 }
diff --git a/src/com/android/car/settings/system/ResetNetworkSubscriptionPreferenceController.java b/src/com/android/car/settings/system/ResetNetworkSubscriptionPreferenceController.java
index 9ebd355..fab9b03 100644
--- a/src/com/android/car/settings/system/ResetNetworkSubscriptionPreferenceController.java
+++ b/src/com/android/car/settings/system/ResetNetworkSubscriptionPreferenceController.java
@@ -16,6 +16,7 @@
 
 package com.android.car.settings.system;
 
+import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.telephony.SubscriptionInfo;
@@ -23,12 +24,10 @@
 import android.text.TextUtils;
 
 import androidx.preference.ListPreference;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
 
 import com.android.car.settings.R;
 import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.NoSetupPreferenceController;
+import com.android.car.settings.common.PreferenceController;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -38,40 +37,41 @@
  * network subscriptions, a user may select the network to reset.
  */
 public class ResetNetworkSubscriptionPreferenceController extends
-        NoSetupPreferenceController implements Preference.OnPreferenceChangeListener {
+        PreferenceController<ListPreference> {
 
     private final SubscriptionManager mSubscriptionManager;
-    private ListPreference mListPreference;
 
     public ResetNetworkSubscriptionPreferenceController(Context context, String preferenceKey,
-            FragmentController fragmentController) {
-        super(context, preferenceKey, fragmentController);
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
         mSubscriptionManager = (SubscriptionManager) context.getSystemService(
                 Context.TELEPHONY_SUBSCRIPTION_SERVICE);
     }
 
     @Override
+    protected Class<ListPreference> getPreferenceType() {
+        return ListPreference.class;
+    }
+
+    @Override
     public int getAvailabilityStatus() {
-        return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
+        return getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
                 ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
     }
 
     @Override
-    public void displayPreference(PreferenceScreen screen) {
-        super.displayPreference(screen);
-        mListPreference = (ListPreference) screen.findPreference(getPreferenceKey());
-
+    protected void updateState(ListPreference preference) {
         List<SubscriptionInfo> subscriptions = mSubscriptionManager.getActiveSubscriptionInfoList();
         if (subscriptions == null || subscriptions.isEmpty()) {
             // No subscriptions to reset.
-            mListPreference.setValue(String.valueOf(SubscriptionManager.INVALID_SUBSCRIPTION_ID));
-            mListPreference.setVisible(false);
+            preference.setValue(String.valueOf(SubscriptionManager.INVALID_SUBSCRIPTION_ID));
+            preference.setVisible(false);
             return;
         }
         if (subscriptions.size() == 1) {
             // Only one subscription, so nothing else to select. Use it and hide the preference.
-            mListPreference.setValue(String.valueOf(subscriptions.get(0).getSubscriptionId()));
-            mListPreference.setVisible(false);
+            preference.setValue(String.valueOf(subscriptions.get(0).getSubscriptionId()));
+            preference.setVisible(false);
             return;
         }
 
@@ -91,10 +91,19 @@
             subscriptionIds.add(String.valueOf(subscriptionId));
         }
 
-        mListPreference.setEntries(toCharSequenceArray(subscriptionNames));
-        mListPreference.setEntryValues(toCharSequenceArray(subscriptionIds));
-        mListPreference.setTitle(subscriptionNames.get(selectedIndex));
-        mListPreference.setValueIndex(selectedIndex);
+        preference.setEntries(toCharSequenceArray(subscriptionNames));
+        preference.setEntryValues(toCharSequenceArray(subscriptionIds));
+        preference.setTitle(subscriptionNames.get(selectedIndex));
+        preference.setValueIndex(selectedIndex);
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(ListPreference preference, Object newValue) {
+        String subscriptionIdStr = (String) newValue;
+        int index = preference.findIndexOfValue(subscriptionIdStr);
+        CharSequence subscriptionName = preference.getEntries()[index];
+        preference.setTitle(subscriptionName);
+        return true;
     }
 
     /**
@@ -127,7 +136,7 @@
             name = subscription.getCarrierName().toString();
         }
         if (TextUtils.isEmpty(name)) {
-            name = mContext.getString(R.string.reset_network_fallback_subscription_name,
+            name = getContext().getString(R.string.reset_network_fallback_subscription_name,
                     subscription.getMcc(), subscription.getMnc(), subscription.getSimSlotIndex(),
                     subscription.getSubscriptionId());
         }
@@ -139,13 +148,4 @@
         list.toArray(array);
         return array;
     }
-
-    @Override
-    public boolean onPreferenceChange(Preference preference, Object newValue) {
-        String subscriptionIdStr = (String) newValue;
-        int index = mListPreference.findIndexOfValue(subscriptionIdStr);
-        CharSequence subscriptionName = mListPreference.getEntries()[index];
-        mListPreference.setTitle(subscriptionName);
-        return true;
-    }
 }
diff --git a/src/com/android/car/settings/system/ResetOptionsFragment.java b/src/com/android/car/settings/system/ResetOptionsFragment.java
index 8af0e38..a0643cf 100644
--- a/src/com/android/car/settings/system/ResetOptionsFragment.java
+++ b/src/com/android/car/settings/system/ResetOptionsFragment.java
@@ -17,12 +17,12 @@
 package com.android.car.settings.system;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.BasePreferenceFragment;
+import com.android.car.settings.common.SettingsFragment;
 
 /**
  * Shows options to reset network settings, reset app preferences, and factory reset the device.
  */
-public class ResetOptionsFragment extends BasePreferenceFragment {
+public class ResetOptionsFragment extends SettingsFragment {
 
     @Override
     protected int getPreferenceScreenResId() {
diff --git a/src/com/android/car/settings/system/SecurityPatchPreferenceController.java b/src/com/android/car/settings/system/SecurityPatchPreferenceController.java
index 54e68cc..f48357c 100644
--- a/src/com/android/car/settings/system/SecurityPatchPreferenceController.java
+++ b/src/com/android/car/settings/system/SecurityPatchPreferenceController.java
@@ -16,23 +16,30 @@
 
 package com.android.car.settings.system;
 
+import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
 
+import androidx.preference.Preference;
+
 import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.NoSetupPreferenceController;
+import com.android.car.settings.common.PreferenceController;
 import com.android.settingslib.DeviceInfoUtils;
 
 /** Updates the security patch entry summary with the security patch. */
-public class SecurityPatchPreferenceController extends NoSetupPreferenceController {
+public class SecurityPatchPreferenceController extends PreferenceController<Preference> {
 
-    public SecurityPatchPreferenceController(Context context,
-            String preferenceKey,
-            FragmentController fragmentController) {
-        super(context, preferenceKey, fragmentController);
+    public SecurityPatchPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
     }
 
     @Override
-    public CharSequence getSummary() {
-        return DeviceInfoUtils.getSecurityPatch();
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setSummary(DeviceInfoUtils.getSecurityPatch());
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/system/BuildNumberPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/BuildNumberPreferenceControllerTest.java
index c0ff970..f9e9a6c 100644
--- a/tests/robotests/src/com/android/car/settings/system/BuildNumberPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/BuildNumberPreferenceControllerTest.java
@@ -20,7 +20,6 @@
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import android.car.userlib.CarUserManagerHelper;
@@ -29,11 +28,12 @@
 import android.os.UserManager;
 import android.provider.Settings;
 
+import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
 
 import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
-import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.development.DevelopmentSettingsUtil;
 import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 
@@ -51,9 +51,9 @@
 @Config(shadows = {ShadowCarUserManagerHelper.class})
 public class BuildNumberPreferenceControllerTest {
 
-    private static final String PREFERENCE_KEY = "preference_key";
-
     private Context mContext;
+    private PreferenceControllerTestHelper<BuildNumberPreferenceController>
+            mPreferenceControllerHelper;
     private BuildNumberPreferenceController mController;
     private Preference mPreference;
     @Mock
@@ -64,10 +64,10 @@
         MockitoAnnotations.initMocks(this);
         ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
         mContext = RuntimeEnvironment.application;
-        mController = new BuildNumberPreferenceController(mContext, PREFERENCE_KEY,
-                mock(FragmentController.class));
         mPreference = new Preference(mContext);
-        mPreference.setKey(PREFERENCE_KEY);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                BuildNumberPreferenceController.class, mPreference);
+        mController = mPreferenceControllerHelper.getController();
 
         // By default, user is an admin user.
         when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
@@ -79,13 +79,13 @@
                 any(UserInfo.class))).thenReturn(false);
 
         // By default device is provisioned.
-        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED,
-                1);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVICE_PROVISIONED, 1);
 
         // By default development settings is disabled.
         Settings.Global.putInt(mContext.getContentResolver(),
                 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0);
-        mController.onResume();
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_RESUME);
     }
 
     @After
@@ -94,48 +94,43 @@
     }
 
     @Test
-    public void testHandlePreferenceTreeClick_wrongPreference_returnFalse() {
-        assertThat(mController.handlePreferenceTreeClick(new Preference(mContext))).isFalse();
+    public void testHandlePreferenceClicked_notProvisioned_returnFalse() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVICE_PROVISIONED, 0);
+        assertThat(mController.handlePreferenceClicked(mPreference)).isFalse();
     }
 
     @Test
-    public void testHandlePreferenceTreeClick_notProvisioned_returnFalse() {
-        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED,
-                0);
-        assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
-    }
-
-    @Test
-    public void testHandlePreferenceTreeClick_nonAdmin_returnFalse() {
+    public void testHandlePreferenceClicked_nonAdmin_returnFalse() {
         when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
         when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
 
-        assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
+        assertThat(mController.handlePreferenceClicked(mPreference)).isFalse();
     }
 
     @Test
-    public void testHandlePreferenceTreeClick_demoUser_returnsTrue() {
+    public void testHandlePreferenceClicked_demoUser_returnsTrue() {
         when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
         when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(true);
 
-        assertThat(mController.handlePreferenceTreeClick(mPreference)).isTrue();
+        assertThat(mController.handlePreferenceClicked(mPreference)).isTrue();
     }
 
     @Test
-    public void testHandlePreferenceTreeClick_adminUser_returnsTrue() {
-        assertThat(mController.handlePreferenceTreeClick(mPreference)).isTrue();
+    public void testHandlePreferenceClicked_adminUser_returnsTrue() {
+        assertThat(mController.handlePreferenceClicked(mPreference)).isTrue();
     }
 
     @Test
-    public void testHandlePreferenceTreeClick_devSettingsDisabled_firstClick_noToast() {
-        mController.handlePreferenceTreeClick(mPreference);
+    public void testHandlePreferenceClicked_devSettingsDisabled_firstClick_noToast() {
+        mPreference.performClick();
         assertThat(ShadowToast.shownToastCount()).isEqualTo(0);
     }
 
     @Test
-    public void testHandlePreferenceTreeClick_devSettingsDisabled_someClicks_showToast() {
+    public void testHandlePreferenceClicked_devSettingsDisabled_someClicks_showToast() {
         for (int i = 0; i < getTapsToShowToast(); i++) {
-            mController.handlePreferenceTreeClick(mPreference);
+            mPreference.performClick();
         }
 
         int remainingClicks = getTapsToBecomeDeveloper() - getTapsToShowToast();
@@ -145,39 +140,40 @@
     }
 
     @Test
-    public void testHandlePreferenceTreeClick_devSettingsDisabled_allClicks_showDevEnabledToast() {
+    public void testHandlePreferenceClicked_devSettingsDisabled_allClicks_showDevEnabledToast() {
         for (int i = 0; i < getTapsToBecomeDeveloper(); i++) {
-            mController.handlePreferenceTreeClick(mPreference);
+            mPreference.performClick();
         }
         assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
                 mContext.getString(R.string.show_dev_on));
     }
 
     @Test
-    public void testHandlePreferenceTreeClick_devSettingsDisabled_allClicks_devSettingsEnabled() {
+    public void testHandlePreferenceClicked_devSettingsDisabled_allClicks_devSettingsEnabled() {
         for (int i = 0; i < getTapsToBecomeDeveloper(); i++) {
-            mController.handlePreferenceTreeClick(mPreference);
+            mPreference.performClick();
         }
         assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
                 mCarUserManagerHelper)).isTrue();
     }
 
     @Test
-    public void testHandlePreferenceTreeClick_devSettingsDisabled_extraClicks_noAlreadyDevToast() {
+    public void testHandlePreferenceClicked_devSettingsDisabled_extraClicks_noAlreadyDevToast() {
         int extraClicks = 100;
         for (int i = 0; i < getTapsToBecomeDeveloper() + extraClicks; i++) {
-            mController.handlePreferenceTreeClick(mPreference);
+            mPreference.performClick();
         }
         assertThat(
                 ShadowToast.showedToast(mContext.getString(R.string.show_dev_already))).isFalse();
     }
 
     @Test
-    public void testHandlePreferenceTreeClick_devSettingsEnabled_click_showAlreadyDevToast() {
+    public void testHandlePreferenceClicked_devSettingsEnabled_click_showAlreadyDevToast() {
         Settings.Global.putInt(mContext.getContentResolver(),
                 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
-        mController.onResume();
-        mController.handlePreferenceTreeClick(mPreference);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_PAUSE);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_RESUME);
+        mPreference.performClick();
         assertThat(ShadowToast.showedToast(mContext.getString(R.string.show_dev_already))).isTrue();
     }
 
diff --git a/tests/robotests/src/com/android/car/settings/system/MasterClearEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/MasterClearEntryPreferenceControllerTest.java
index a8283d2..c596741 100644
--- a/tests/robotests/src/com/android/car/settings/system/MasterClearEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/MasterClearEntryPreferenceControllerTest.java
@@ -21,14 +21,15 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
 import android.provider.Settings;
 
 import com.android.car.settings.CarSettingsRobolectricTestRunner;
-import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.common.RestrictedPreference;
 import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 
 import org.junit.After;
@@ -45,24 +46,25 @@
 @Config(shadows = {ShadowCarUserManagerHelper.class})
 public class MasterClearEntryPreferenceControllerTest {
 
-    private static final String PREFERENCE_KEY = "preference_key";
-
+    private Context mContext;
+    private MasterClearEntryPreferenceController mController;
     @Mock
     private CarUserManagerHelper mCarUserManagerHelper;
-    private MasterClearEntryPreferenceController mController;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        mContext = RuntimeEnvironment.application;
 
-        mController = new MasterClearEntryPreferenceController(RuntimeEnvironment.application,
-                PREFERENCE_KEY, mock(FragmentController.class));
+        mController = new PreferenceControllerTestHelper<>(mContext,
+                MasterClearEntryPreferenceController.class,
+                new RestrictedPreference(mContext)).getController();
     }
 
     @After
     public void tearDown() {
-        Settings.Global.putInt(RuntimeEnvironment.application.getContentResolver(),
+        Settings.Global.putInt(mContext.getContentResolver(),
                 Settings.Global.DEVICE_DEMO_MODE, 0);
         ShadowCarUserManagerHelper.reset();
     }
@@ -85,7 +87,7 @@
     public void getAvailabilityStatus_demoMode_demoUser_available() {
         when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
         when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(true);
-        Settings.Global.putInt(RuntimeEnvironment.application.getContentResolver(),
+        Settings.Global.putInt(mContext.getContentResolver(),
                 Settings.Global.DEVICE_DEMO_MODE, 1);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
diff --git a/tests/robotests/src/com/android/car/settings/system/ResetEsimPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/ResetEsimPreferenceControllerTest.java
index e7065e9..623fbd3 100644
--- a/tests/robotests/src/com/android/car/settings/system/ResetEsimPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/ResetEsimPreferenceControllerTest.java
@@ -21,13 +21,13 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.mock;
-
 import android.content.Context;
 import android.provider.Settings;
 
+import androidx.preference.SwitchPreference;
+
 import com.android.car.settings.CarSettingsRobolectricTestRunner;
-import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
 
 import org.junit.After;
 import org.junit.Before;
@@ -41,8 +41,6 @@
 @RunWith(CarSettingsRobolectricTestRunner.class)
 public class ResetEsimPreferenceControllerTest {
 
-    private static final String PREFERENCE_KEY = "preference_key";
-
     private Context mContext;
     private ShadowEuiccManager mShadowEuiccManager;
     private ResetEsimPreferenceController mController;
@@ -51,8 +49,9 @@
     public void setUp() {
         mContext = RuntimeEnvironment.application;
         mShadowEuiccManager = Shadow.extract(mContext.getSystemService(Context.EUICC_SERVICE));
-        mController = new ResetEsimPreferenceController(mContext, PREFERENCE_KEY,
-                mock(FragmentController.class));
+        mController = new PreferenceControllerTestHelper<>(mContext,
+                ResetEsimPreferenceController.class,
+                new SwitchPreference(mContext)).getController();
     }
 
     @After
diff --git a/tests/robotests/src/com/android/car/settings/system/ResetNetworkEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/ResetNetworkEntryPreferenceControllerTest.java
index 6b45392..422c5ef 100644
--- a/tests/robotests/src/com/android/car/settings/system/ResetNetworkEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/ResetNetworkEntryPreferenceControllerTest.java
@@ -21,13 +21,14 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
 
 import com.android.car.settings.CarSettingsRobolectricTestRunner;
-import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.common.RestrictedPreference;
 import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 
 import org.junit.After;
@@ -44,8 +45,6 @@
 @Config(shadows = {ShadowCarUserManagerHelper.class})
 public class ResetNetworkEntryPreferenceControllerTest {
 
-    private static final String PREFERENCE_KEY = "preference_key";
-
     @Mock
     private CarUserManagerHelper mCarUserManagerHelper;
     private ResetNetworkEntryPreferenceController mController;
@@ -54,9 +53,11 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        Context context = RuntimeEnvironment.application;
 
-        mController = new ResetNetworkEntryPreferenceController(RuntimeEnvironment.application,
-                PREFERENCE_KEY, mock(FragmentController.class));
+        mController = new PreferenceControllerTestHelper<>(context,
+                ResetNetworkEntryPreferenceController.class,
+                new RestrictedPreference(context)).getController();
     }
 
     @After
diff --git a/tests/robotests/src/com/android/car/settings/system/ResetNetworkSubscriptionPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/ResetNetworkSubscriptionPreferenceControllerTest.java
index 046aee0..2794d86 100644
--- a/tests/robotests/src/com/android/car/settings/system/ResetNetworkSubscriptionPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/ResetNetworkSubscriptionPreferenceControllerTest.java
@@ -31,12 +31,11 @@
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 
+import androidx.lifecycle.Lifecycle;
 import androidx.preference.ListPreference;
-import androidx.preference.PreferenceManager;
-import androidx.preference.PreferenceScreen;
 
 import com.android.car.settings.CarSettingsRobolectricTestRunner;
-import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -54,8 +53,6 @@
 @RunWith(CarSettingsRobolectricTestRunner.class)
 public class ResetNetworkSubscriptionPreferenceControllerTest {
 
-    private static final String PREFERENCE_KEY = "preference_key";
-
     private static final int SUBID_1 = MIN_SUBSCRIPTION_ID_VALUE;
     private static final int SUBID_2 = SUBID_1 + 1;
     private static final int SUBID_3 = SUBID_2 + 1;
@@ -63,8 +60,9 @@
 
     private Context mContext;
     private ShadowSubscriptionManager mShadowSubscriptionManager;
-    private PreferenceScreen mScreen;
     private ListPreference mListPreference;
+    private PreferenceControllerTestHelper<ResetNetworkSubscriptionPreferenceController>
+            mPreferenceControllerHelper;
     private ResetNetworkSubscriptionPreferenceController mController;
 
     @Before
@@ -73,17 +71,16 @@
         mShadowSubscriptionManager = Shadow.extract(
                 mContext.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE));
 
-        mScreen = new PreferenceManager(mContext).createPreferenceScreen(mContext);
         mListPreference = new ListPreference(mContext);
-        mListPreference.setKey(PREFERENCE_KEY);
-        mScreen.addPreference(mListPreference);
-        mController = new ResetNetworkSubscriptionPreferenceController(mContext, PREFERENCE_KEY,
-                mock(FragmentController.class));
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                ResetNetworkSubscriptionPreferenceController.class, mListPreference);
+        mController = mPreferenceControllerHelper.getController();
 
         // Default to AVAILABLE status. Tests for this behavior will do their own setup.
         ShadowPackageManager shadowPackageManager = Shadows.shadowOf(mContext.getPackageManager());
         shadowPackageManager.setSystemFeature(PackageManager.FEATURE_TELEPHONY, /* supported= */
                 true);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
     }
 
     @Test
@@ -105,78 +102,78 @@
     }
 
     @Test
-    public void displayPreference_nullSubscriptions_hidesPreference() {
-        mController.displayPreference(mScreen);
+    public void refreshUi_nullSubscriptions_hidesPreference() {
+        mController.refreshUi();
 
         assertThat(mListPreference.isVisible()).isFalse();
     }
 
     @Test
-    public void displayPreference_nullSubscriptions_setsValue() {
-        mController.displayPreference(mScreen);
+    public void refreshUi_nullSubscriptions_setsValue() {
+        mController.refreshUi();
 
         assertThat(mListPreference.getValue()).isEqualTo(
                 String.valueOf(SubscriptionManager.INVALID_SUBSCRIPTION_ID));
     }
 
     @Test
-    public void displayPreference_noSubscriptions_hidesPreference() {
+    public void refreshUi_noSubscriptions_hidesPreference() {
         mShadowSubscriptionManager.setActiveSubscriptionInfoList(Collections.emptyList());
 
-        mController.displayPreference(mScreen);
+        mController.refreshUi();
 
         assertThat(mListPreference.isVisible()).isFalse();
     }
 
     @Test
-    public void displayPreference_noSubscriptions_setsValue() {
+    public void refreshUi_noSubscriptions_setsValue() {
         mShadowSubscriptionManager.setActiveSubscriptionInfoList(Collections.emptyList());
 
-        mController.displayPreference(mScreen);
+        mController.refreshUi();
 
         assertThat(mListPreference.getValue()).isEqualTo(
                 String.valueOf(SubscriptionManager.INVALID_SUBSCRIPTION_ID));
     }
 
     @Test
-    public void displayPreference_oneSubscription_hidesPreference() {
+    public void refreshUi_oneSubscription_hidesPreference() {
         mShadowSubscriptionManager.setActiveSubscriptionInfoList(
                 Collections.singletonList(createSubInfo(SUBID_1, "sub1")));
 
-        mController.displayPreference(mScreen);
+        mController.refreshUi();
 
         assertThat(mListPreference.isVisible()).isFalse();
     }
 
     @Test
-    public void displayPreference_oneSubscription_setsValue() {
+    public void refreshUi_oneSubscription_setsValue() {
         mShadowSubscriptionManager.setActiveSubscriptionInfoList(
                 Collections.singletonList(createSubInfo(SUBID_1, "sub1")));
 
-        mController.displayPreference(mScreen);
+        mController.refreshUi();
 
         assertThat(mListPreference.getValue()).isEqualTo(String.valueOf(SUBID_1));
     }
 
     @Test
-    public void displayPreference_multipleSubscriptions_showsPreference() {
+    public void refreshUi_multipleSubscriptions_showsPreference() {
         mShadowSubscriptionManager.setActiveSubscriptionInfoList(
                 Arrays.asList(createSubInfo(SUBID_1, "sub1"), createSubInfo(SUBID_2, "sub2")));
 
-        mController.displayPreference(mScreen);
+        mController.refreshUi();
 
         assertThat(mListPreference.isVisible()).isTrue();
     }
 
     @Test
-    public void displayPreference_multipleSubscriptions_populatesEntries() {
+    public void refreshUi_multipleSubscriptions_populatesEntries() {
         String displayName1 = "sub1";
         String displayName2 = "sub2";
         mShadowSubscriptionManager.setActiveSubscriptionInfoList(
                 Arrays.asList(createSubInfo(SUBID_1, displayName1),
                         createSubInfo(SUBID_2, displayName2)));
 
-        mController.displayPreference(mScreen);
+        mController.refreshUi();
 
         assertThat(Arrays.asList(mListPreference.getEntries())).containsExactly(displayName1,
                 displayName2);
@@ -186,32 +183,32 @@
     }
 
     @Test
-    public void displayPreference_defaultSelection_fourthPriority_system() {
+    public void refreshUi_defaultSelection_fourthPriority_system() {
         mShadowSubscriptionManager.setActiveSubscriptionInfoList(
                 Arrays.asList(createSubInfo(SUBID_1, "sub1"), createSubInfo(SUBID_2, "sub2"),
                         createSubInfo(SUBID_3, "sub3"), createSubInfo(SUBID_4, "sub4")));
 
         ShadowSubscriptionManager.setDefaultSubscriptionId(SUBID_4);
-        mController.displayPreference(mScreen);
+        mController.refreshUi();
 
         assertThat(mListPreference.getValue()).isEqualTo(String.valueOf(SUBID_4));
     }
 
     @Test
-    public void displayPreference_defaultSelection_thirdPriority_sms() {
+    public void refreshUi_defaultSelection_thirdPriority_sms() {
         mShadowSubscriptionManager.setActiveSubscriptionInfoList(
                 Arrays.asList(createSubInfo(SUBID_1, "sub1"), createSubInfo(SUBID_2, "sub2"),
                         createSubInfo(SUBID_3, "sub3"), createSubInfo(SUBID_4, "sub4")));
 
         ShadowSubscriptionManager.setDefaultSubscriptionId(SUBID_4);
         ShadowSubscriptionManager.setDefaultSmsSubscriptionId(SUBID_3);
-        mController.displayPreference(mScreen);
+        mController.refreshUi();
 
         assertThat(mListPreference.getValue()).isEqualTo(String.valueOf(SUBID_3));
     }
 
     @Test
-    public void displayPreference_defaultSelection_secondPriority_voice() {
+    public void refreshUi_defaultSelection_secondPriority_voice() {
         mShadowSubscriptionManager.setActiveSubscriptionInfoList(
                 Arrays.asList(createSubInfo(SUBID_1, "sub1"), createSubInfo(SUBID_2, "sub2"),
                         createSubInfo(SUBID_3, "sub3"), createSubInfo(SUBID_4, "sub4")));
@@ -219,13 +216,13 @@
         ShadowSubscriptionManager.setDefaultSubscriptionId(SUBID_4);
         ShadowSubscriptionManager.setDefaultSmsSubscriptionId(SUBID_3);
         ShadowSubscriptionManager.setDefaultVoiceSubscriptionId(SUBID_2);
-        mController.displayPreference(mScreen);
+        mController.refreshUi();
 
         assertThat(mListPreference.getValue()).isEqualTo(String.valueOf(SUBID_2));
     }
 
     @Test
-    public void displayPreference_defaultSelection_firstPriority_data() {
+    public void refreshUi_defaultSelection_firstPriority_data() {
         mShadowSubscriptionManager.setActiveSubscriptionInfoList(
                 Arrays.asList(createSubInfo(SUBID_1, "sub1"), createSubInfo(SUBID_2, "sub2"),
                         createSubInfo(SUBID_3, "sub3"), createSubInfo(SUBID_4, "sub4")));
@@ -234,13 +231,13 @@
         ShadowSubscriptionManager.setDefaultSmsSubscriptionId(SUBID_3);
         ShadowSubscriptionManager.setDefaultVoiceSubscriptionId(SUBID_2);
         ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUBID_1);
-        mController.displayPreference(mScreen);
+        mController.refreshUi();
 
         assertThat(mListPreference.getValue()).isEqualTo(String.valueOf(SUBID_1));
     }
 
     @Test
-    public void displayPreference_title_fourthPriority_subscriptionNetworkIds() {
+    public void refreshUi_title_fourthPriority_subscriptionNetworkIds() {
         SubscriptionInfo subInfo = createSubInfo(
                 SUBID_1,
                 /* displayName= */ "",
@@ -251,7 +248,7 @@
                 Arrays.asList(subInfo, createSubInfo(SUBID_2, "sub2")));
         ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUBID_1);
 
-        mController.displayPreference(mScreen);
+        mController.refreshUi();
 
         String title = mListPreference.getTitle().toString();
         assertThat(title).contains(String.valueOf(subInfo.getMcc()));
@@ -261,7 +258,7 @@
     }
 
     @Test
-    public void displayPreference_title_thirdPriority_subscriptionCarrierName() {
+    public void refreshUi_title_thirdPriority_subscriptionCarrierName() {
         SubscriptionInfo subInfo = createSubInfo(
                 SUBID_1,
                 /* displayName= */ "",
@@ -272,13 +269,13 @@
                 Arrays.asList(subInfo, createSubInfo(SUBID_2, "sub2")));
         ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUBID_1);
 
-        mController.displayPreference(mScreen);
+        mController.refreshUi();
 
         assertThat(mListPreference.getTitle()).isEqualTo(subInfo.getCarrierName());
     }
 
     @Test
-    public void displayPreference_title_secondPriority_subscriptionNumber() {
+    public void refreshUi_title_secondPriority_subscriptionNumber() {
         SubscriptionInfo subInfo = createSubInfo(
                 SUBID_1,
                 /* displayName= */ "",
@@ -289,13 +286,13 @@
                 Arrays.asList(subInfo, createSubInfo(SUBID_2, "sub2")));
         ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUBID_1);
 
-        mController.displayPreference(mScreen);
+        mController.refreshUi();
 
         assertThat(mListPreference.getTitle()).isEqualTo(subInfo.getNumber());
     }
 
     @Test
-    public void displayPreference_title_firstPriority_subscriptionDisplayName() {
+    public void refreshUi_title_firstPriority_subscriptionDisplayName() {
         SubscriptionInfo subInfo = createSubInfo(
                 SUBID_1,
                 "displayName",
@@ -306,32 +303,32 @@
                 Arrays.asList(subInfo, createSubInfo(SUBID_2, "sub2")));
         ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUBID_1);
 
-        mController.displayPreference(mScreen);
+        mController.refreshUi();
 
         assertThat(mListPreference.getTitle()).isEqualTo(subInfo.getDisplayName());
     }
 
     @Test
-    public void onPreferenceChange_updatesTitle() {
+    public void handlePreferenceChanged_updatesTitle() {
         mShadowSubscriptionManager.setActiveSubscriptionInfoList(
                 Arrays.asList(createSubInfo(SUBID_1, "sub1"), createSubInfo(SUBID_2, "sub2")));
         ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUBID_1);
-        mController.displayPreference(mScreen);
+        mController.refreshUi();
 
-        mController.onPreferenceChange(mListPreference, String.valueOf(SUBID_2));
+        mListPreference.callChangeListener(String.valueOf(SUBID_2));
 
         assertThat(mListPreference.getTitle()).isEqualTo("sub2");
     }
 
     @Test
-    public void onPreferenceChange_returnsTrue() {
+    public void handlePreferenceChanged_returnsTrue() {
         mShadowSubscriptionManager.setActiveSubscriptionInfoList(
                 Arrays.asList(createSubInfo(SUBID_1, "sub1"), createSubInfo(SUBID_2, "sub2")));
         ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUBID_1);
-        mController.displayPreference(mScreen);
+        mController.refreshUi();
 
-        assertThat(
-                mController.onPreferenceChange(mListPreference, String.valueOf(SUBID_2))).isTrue();
+        assertThat(mController.handlePreferenceChanged(mListPreference,
+                String.valueOf(SUBID_2))).isTrue();
     }
 
     /** Reduce SubscriptionInfo constructor args to the ones we care about here. */