Migrate system settings page to PreferenceController and SettingsFragment.

Because ExtraSettingsLoader was migrated but this fragment was not, loading extra settings was no longer working on this page and blocking other development.

Bug: 112931076

Test: build and deploy, RunCarSettingsRoboTests
Change-Id: Ida9824cf189a3ecb25e2669401b0ad853fb9df28
diff --git a/src/com/android/car/settings/Utils.java b/src/com/android/car/settings/Utils.java
index 99c8701..ca1b11e 100644
--- a/src/com/android/car/settings/Utils.java
+++ b/src/com/android/car/settings/Utils.java
@@ -23,7 +23,6 @@
 import android.content.pm.ResolveInfo;
 
 import androidx.preference.Preference;
-import androidx.preference.PreferenceGroup;
 
 import java.util.List;
 
@@ -36,23 +35,16 @@
     public static final int UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY = 1;
 
     /**
-     * Finds a matching activity for a preference's intent. If no matching activity is found, the
-     * preference is removed from the parent group.
+     * Finds a matching activity for a preference's intent. If found, the preference's intent is
+     * updated to that activity. Only activities in the system image are considered.
      *
-     * @param context the context
-     * @param parentPreferenceGroup the preference group that contains the preference whose
-     *         intent is being resolved
-     * @param preferenceKey the key of the preference whose intent is being resolved
-     * @param flags 0 or one or more of
-     *         {@link #UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY}
-     * @return {@code true} if an activity was found. If {@code false}, the preference was removed.
+     * @param context the context to use.
+     * @param preference the preference whose intent is being resolved.
+     * @param flags 0 or {@link #UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY}.
+     * @return {@code true} if an activity was found and the preference was updated.
      */
-    public static boolean updatePreferenceToSpecificActivityOrRemove(Context context,
-            PreferenceGroup parentPreferenceGroup, String preferenceKey, int flags) {
-        Preference preference = parentPreferenceGroup.findPreference(preferenceKey);
-        if (preference == null) {
-            return false;
-        }
+    public static boolean updatePreferenceToSpecificActivity(Context context, Preference preference,
+            int flags) {
         Intent intent = preference.getIntent();
         if (intent != null) {
             // Find the activity that is in the system image.
@@ -75,8 +67,6 @@
                 }
             }
         }
-        // Did not find a matching activity, so remove the preference
-        parentPreferenceGroup.removePreference(preference);
         return false;
     }
 }
diff --git a/src/com/android/car/settings/system/AboutSettingsEntryPreferenceController.java b/src/com/android/car/settings/system/AboutSettingsEntryPreferenceController.java
index 42f59c6..8f13d9f 100644
--- a/src/com/android/car/settings/system/AboutSettingsEntryPreferenceController.java
+++ b/src/com/android/car/settings/system/AboutSettingsEntryPreferenceController.java
@@ -16,23 +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 about settings entry summary with the build version. */
-public class AboutSettingsEntryPreferenceController extends NoSetupPreferenceController {
+public class AboutSettingsEntryPreferenceController extends PreferenceController<Preference> {
 
     public AboutSettingsEntryPreferenceController(Context context, String preferenceKey,
-            FragmentController fragmentController) {
-        super(context, preferenceKey, fragmentController);
+            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/DeveloperOptionsEntryPreferenceController.java b/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java
index 7cf27f8..9b2b22b 100644
--- a/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java
+++ b/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java
@@ -16,28 +16,35 @@
 
 package com.android.car.settings.system;
 
+import android.car.drivingstate.CarUxRestrictions;
 import android.car.userlib.CarUserManagerHelper;
 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.car.settings.development.DevelopmentSettingsUtil;
 
 /** Controls the visibility of the developer options setting. */
-public class DeveloperOptionsEntryPreferenceController extends NoSetupPreferenceController {
+public class DeveloperOptionsEntryPreferenceController extends PreferenceController<Preference> {
 
     private CarUserManagerHelper mCarUserManagerHelper;
 
-    public DeveloperOptionsEntryPreferenceController(Context context,
-            String preferenceKey,
-            FragmentController fragmentController) {
-        super(context, preferenceKey, fragmentController);
-        mCarUserManagerHelper = new CarUserManagerHelper(mContext);
+    public DeveloperOptionsEntryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
     }
 
     @Override
-    public int getAvailabilityStatus() {
-        return DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext, mCarUserManagerHelper)
-                ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        return DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(getContext(),
+                mCarUserManagerHelper) ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
     }
 }
diff --git a/src/com/android/car/settings/system/SystemSettingsFragment.java b/src/com/android/car/settings/system/SystemSettingsFragment.java
index 85c1d1c..5b5efc2 100644
--- a/src/com/android/car/settings/system/SystemSettingsFragment.java
+++ b/src/com/android/car/settings/system/SystemSettingsFragment.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 basic info about the system and provide some actions like update, reset etc.
  */
-public class SystemSettingsFragment extends BasePreferenceFragment {
+public class SystemSettingsFragment extends SettingsFragment {
 
     @Override
     protected int getPreferenceScreenResId() {
diff --git a/src/com/android/car/settings/system/SystemUpdatePreferenceController.java b/src/com/android/car/settings/system/SystemUpdatePreferenceController.java
index 7f28af1..9a29e47 100644
--- a/src/com/android/car/settings/system/SystemUpdatePreferenceController.java
+++ b/src/com/android/car/settings/system/SystemUpdatePreferenceController.java
@@ -18,6 +18,7 @@
 
 import static android.content.Context.CARRIER_CONFIG_SERVICE;
 
+import android.car.drivingstate.CarUxRestrictions;
 import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.Intent;
@@ -26,13 +27,12 @@
 import android.text.TextUtils;
 
 import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
 
 import com.android.car.settings.R;
 import com.android.car.settings.Utils;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.Logger;
-import com.android.car.settings.common.NoSetupPreferenceController;
+import com.android.car.settings.common.PreferenceController;
 
 /**
  * Controller which determines if the system update preference should be displayed based on
@@ -41,46 +41,52 @@
  *
  * @see CarrierConfigManager#KEY_CI_ACTION_ON_SYS_UPDATE_BOOL
  */
-public class SystemUpdatePreferenceController extends NoSetupPreferenceController {
+public class SystemUpdatePreferenceController extends PreferenceController<Preference> {
 
     private static final Logger LOG = new Logger(SystemUpdatePreferenceController.class);
 
     private final CarUserManagerHelper mCarUserManagerHelper;
+    private boolean mActivityFound;
 
     public SystemUpdatePreferenceController(Context context, String preferenceKey,
-            FragmentController fragmentController) {
-        super(context, preferenceKey, fragmentController);
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
         mCarUserManagerHelper = new CarUserManagerHelper(context);
     }
 
     @Override
-    public int getAvailabilityStatus() {
-        if (!mContext.getResources().getBoolean(R.bool.config_show_system_update_settings)) {
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        if (!getContext().getResources().getBoolean(R.bool.config_show_system_update_settings)) {
             return UNSUPPORTED_ON_DEVICE;
         }
         return mCarUserManagerHelper.isCurrentProcessAdminUser() ? AVAILABLE : DISABLED_FOR_USER;
     }
 
     @Override
-    public void displayPreference(PreferenceScreen screen) {
-        super.displayPreference(screen);
-        if (isAvailable()) {
-            Utils.updatePreferenceToSpecificActivityOrRemove(mContext, screen, getPreferenceKey(),
-                    Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY);
-        }
+    protected void onCreateInternal() {
+        mActivityFound = Utils.updatePreferenceToSpecificActivity(getContext(), getPreference(),
+                Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY);
     }
 
     @Override
-    public boolean handlePreferenceTreeClick(Preference preference) {
-        if (TextUtils.equals(getPreferenceKey(), preference.getKey())) {
-            CarrierConfigManager configManager = (CarrierConfigManager) mContext.getSystemService(
-                    CARRIER_CONFIG_SERVICE);
-            PersistableBundle b = configManager.getConfig();
-            if (b != null && b.getBoolean(CarrierConfigManager.KEY_CI_ACTION_ON_SYS_UPDATE_BOOL)) {
-                ciActionOnSysUpdate(b);
-            }
+    protected void updateState(Preference preference) {
+        preference.setVisible(mActivityFound);
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(Preference preference) {
+        CarrierConfigManager configManager = (CarrierConfigManager) getContext().getSystemService(
+                CARRIER_CONFIG_SERVICE);
+        PersistableBundle b = configManager.getConfig();
+        if (b != null && b.getBoolean(CarrierConfigManager.KEY_CI_ACTION_ON_SYS_UPDATE_BOOL)) {
+            ciActionOnSysUpdate(b);
         }
-        // Return false as to not block other handlers.
+        // Don't handle so that preference framework will launch the preference intent.
         return false;
     }
 
@@ -100,7 +106,7 @@
             }
             LOG.d("ciActionOnSysUpdate: broadcasting intent " + intentStr + " with extra " + extra
                     + ", " + extraVal);
-            mContext.getApplicationContext().sendBroadcast(intent);
+            getContext().getApplicationContext().sendBroadcast(intent);
         }
     }
 }