Updated PreferenceController to enable or disable the preference based
on availability status.

PreferenceController now disables the preference if availability status
is AVAILABLE_FOR_VIEWING.

Bug: 139534680
Test: Manual, robolectric
Merged-In: I82a2321d3195a68f27d42b20183c93d07e238bf7
Change-Id: I82a2321d3195a68f27d42b20183c93d07e238bf7
diff --git a/src/com/android/car/settings/common/PreferenceController.java b/src/com/android/car/settings/common/PreferenceController.java
index 5dfe4ee..4aa8fcf 100644
--- a/src/com/android/car/settings/common/PreferenceController.java
+++ b/src/com/android/car/settings/common/PreferenceController.java
@@ -94,7 +94,8 @@
      * @see #getAvailabilityStatus()
      */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({AVAILABLE, CONDITIONALLY_UNAVAILABLE, UNSUPPORTED_ON_DEVICE, DISABLED_FOR_USER})
+    @IntDef({AVAILABLE, CONDITIONALLY_UNAVAILABLE, UNSUPPORTED_ON_DEVICE, DISABLED_FOR_USER,
+        AVAILABLE_FOR_VIEWING})
     public @interface AvailabilityStatus {
     }
 
@@ -120,6 +121,11 @@
     public static final int DISABLED_FOR_USER = 3;
 
     /**
+     * The setting cannot be changed.
+     */
+    public static final int AVAILABLE_FOR_VIEWING = 4;
+
+    /**
      * Indicates whether all Preferences are configured to ignore UX Restrictions Event.
      */
     private final boolean mAlwaysIgnoreUxRestrictions;
@@ -236,9 +242,10 @@
         if (!mIsCreated) {
             return;
         }
-        if (getAvailabilityStatus() == AVAILABLE) {
+
+        if (isAvailable()) {
             mPreference.setVisible(true);
-            mPreference.setEnabled(true);
+            mPreference.setEnabled(getAvailabilityStatus() != AVAILABLE_FOR_VIEWING);
             updateState(mPreference);
             onApplyUxRestrictions(mUxRestrictions);
         } else {
@@ -246,6 +253,11 @@
         }
     }
 
+    private boolean isAvailable() {
+        int availabilityStatus = getAvailabilityStatus();
+        return availabilityStatus == AVAILABLE || availabilityStatus == AVAILABLE_FOR_VIEWING;
+    }
+
     // Controller lifecycle ========================================================================
 
     /**
@@ -346,8 +358,8 @@
 
     /**
      * Returns the {@link AvailabilityStatus} for the setting. This status is used to determine
-     * if the setting should be shown or hidden. Defaults to {@link #AVAILABLE}. This will be
-     * called before the controller lifecycle begins and on refresh events.
+     * if the setting should be shown, hidden, or disabled. Defaults to {@link #AVAILABLE}. This
+     * will be called before the controller lifecycle begins and on refresh events.
      */
     @AvailabilityStatus
     protected int getAvailabilityStatus() {
diff --git a/src/com/android/car/settings/system/BluetoothMacAddressPreferenceController.java b/src/com/android/car/settings/system/BluetoothMacAddressPreferenceController.java
index 05f9c60..e26db97 100644
--- a/src/com/android/car/settings/system/BluetoothMacAddressPreferenceController.java
+++ b/src/com/android/car/settings/system/BluetoothMacAddressPreferenceController.java
@@ -48,7 +48,7 @@
         if (!getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)) {
             return UNSUPPORTED_ON_DEVICE;
         }
-        return super.getAvailabilityStatus();
+        return AVAILABLE_FOR_VIEWING;
     }
 
     @Override
diff --git a/src/com/android/car/settings/system/FirmwareVersionPreferenceController.java b/src/com/android/car/settings/system/FirmwareVersionPreferenceController.java
index 0d24dec..31aef17 100644
--- a/src/com/android/car/settings/system/FirmwareVersionPreferenceController.java
+++ b/src/com/android/car/settings/system/FirmwareVersionPreferenceController.java
@@ -44,4 +44,9 @@
         preference.setSummary(
                 getContext().getString(R.string.about_summary, Build.VERSION.RELEASE));
     }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        return AVAILABLE_FOR_VIEWING;
+    }
 }
diff --git a/src/com/android/car/settings/system/KernelVersionPreferenceController.java b/src/com/android/car/settings/system/KernelVersionPreferenceController.java
index 1d18523..2e82084 100644
--- a/src/com/android/car/settings/system/KernelVersionPreferenceController.java
+++ b/src/com/android/car/settings/system/KernelVersionPreferenceController.java
@@ -42,4 +42,9 @@
     protected void updateState(Preference preference) {
         preference.setSummary(DeviceInfoUtils.getFormattedKernelVersion(getContext()));
     }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        return AVAILABLE_FOR_VIEWING;
+    }
 }
diff --git a/src/com/android/car/settings/system/ModelInfoPreferenceController.java b/src/com/android/car/settings/system/ModelInfoPreferenceController.java
index 4fd8b53..126176f 100644
--- a/src/com/android/car/settings/system/ModelInfoPreferenceController.java
+++ b/src/com/android/car/settings/system/ModelInfoPreferenceController.java
@@ -43,4 +43,9 @@
     protected void updateState(Preference preference) {
         preference.setSummary(Build.MODEL + DeviceInfoUtils.getMsvSuffix());
     }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        return AVAILABLE_FOR_VIEWING;
+    }
 }
diff --git a/src/com/android/car/settings/system/SecurityPatchPreferenceController.java b/src/com/android/car/settings/system/SecurityPatchPreferenceController.java
index f48357c..fa697a2 100644
--- a/src/com/android/car/settings/system/SecurityPatchPreferenceController.java
+++ b/src/com/android/car/settings/system/SecurityPatchPreferenceController.java
@@ -42,4 +42,9 @@
     protected void updateState(Preference preference) {
         preference.setSummary(DeviceInfoUtils.getSecurityPatch());
     }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        return AVAILABLE_FOR_VIEWING;
+    }
 }
diff --git a/src/com/android/car/settings/system/WifiMacAddressPreferenceController.java b/src/com/android/car/settings/system/WifiMacAddressPreferenceController.java
index 0ef369a..0a0d063 100644
--- a/src/com/android/car/settings/system/WifiMacAddressPreferenceController.java
+++ b/src/com/android/car/settings/system/WifiMacAddressPreferenceController.java
@@ -50,7 +50,7 @@
                 || !getContext().getResources().getBoolean(R.bool.config_show_wifi_mac_address)) {
             return UNSUPPORTED_ON_DEVICE;
         }
-        return super.getAvailabilityStatus();
+        return AVAILABLE_FOR_VIEWING;
     }
 
     protected void init(Context context) {
diff --git a/tests/robotests/src/com/android/car/settings/common/PreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/common/PreferenceControllerTest.java
index b51db10..29d0622 100644
--- a/tests/robotests/src/com/android/car/settings/common/PreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/common/PreferenceControllerTest.java
@@ -17,6 +17,7 @@
 package com.android.car.settings.common;
 
 import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
 import static com.android.car.settings.common.PreferenceController.CONDITIONALLY_UNAVAILABLE;
 import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
 
@@ -25,7 +26,7 @@
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.Mockito.inOrder;
 import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.verify;
 import static org.testng.Assert.assertThrows;
 
@@ -246,24 +247,35 @@
     }
 
     @Test
-    public void refreshUi_created_available_preferenceShown() {
+    public void refreshUi_created_available_preferenceShownAndEnabled() {
         mControllerHelper.markState(Lifecycle.State.CREATED);
+        reset(mPreference);
 
         mController.refreshUi();
 
-        // onCreate, refreshUi.
-        verify(mPreference, times(2)).setVisible(true);
+        verify(mPreference).setVisible(true);
+        verify(mPreference).setEnabled(true);
     }
+    @Test
+    public void refreshUi_created_availableForViewing_preferenceShownAndDisabled() {
+        mController.setAvailabilityStatus(AVAILABLE_FOR_VIEWING);
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+        reset(mPreference);
 
+        mController.refreshUi();
+
+        verify(mPreference).setVisible(true);
+        verify(mPreference).setEnabled(false);
+    }
     @Test
     public void refreshUi_created_notAvailable_preferenceHidden() {
         mController.setAvailabilityStatus(CONDITIONALLY_UNAVAILABLE);
         mControllerHelper.markState(Lifecycle.State.CREATED);
+        reset(mPreference);
 
         mController.refreshUi();
 
-        // onCreate, refreshUi.
-        verify(mPreference, times(2)).setVisible(false);
+        verify(mPreference).setVisible(false);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/car/settings/system/BluetoothMacAddressPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/BluetoothMacAddressPreferenceControllerTest.java
index ade3c89..a96d0a1 100644
--- a/tests/robotests/src/com/android/car/settings/system/BluetoothMacAddressPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/BluetoothMacAddressPreferenceControllerTest.java
@@ -18,7 +18,7 @@
 
 import static android.content.pm.PackageManager.FEATURE_BLUETOOTH;
 
-import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
 import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -98,12 +98,12 @@
     }
 
     @Test
-    public void getAvailabilityStatus_enableDefaultAdapter_available() {
+    public void getAvailabilityStatus_enableDefaultAdapter_availableForViewing() {
         Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
                 FEATURE_BLUETOOTH, /* supported= */ true);
 
         assertThat(mControllerHelper.getController().getAvailabilityStatus()).isEqualTo(
-                AVAILABLE);
+                AVAILABLE_FOR_VIEWING);
     }
 
     private ShadowBluetoothAdapter getShadowBluetoothAdapter() {
diff --git a/tests/robotests/src/com/android/car/settings/system/WifiMacAddressPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/WifiMacAddressPreferenceControllerTest.java
index 512aa42..f475dcb 100644
--- a/tests/robotests/src/com/android/car/settings/system/WifiMacAddressPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/WifiMacAddressPreferenceControllerTest.java
@@ -16,7 +16,7 @@
 
 package com.android.car.settings.system;
 
-import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.AVAILABLE_FOR_VIEWING;
 import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -76,12 +76,12 @@
     }
 
     @Test
-    public void getAvailabilityStatus_wifiAvailable_available() {
+    public void getAvailabilityStatus_wifiAvailable_availableForViewing() {
         Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
                 PackageManager.FEATURE_WIFI, /* supported= */ true);
 
         assertThat(mControllerHelper.getController().getAvailabilityStatus())
-                .isEqualTo(AVAILABLE);
+                .isEqualTo(AVAILABLE_FOR_VIEWING);
     }
 
     @Test