Merge "[Catalyst] Introduce IntRangeValuePreference" into main
diff --git a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGraphBuilder.kt b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGraphBuilder.kt
index ce66a36..c0d2449 100644
--- a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGraphBuilder.kt
+++ b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGraphBuilder.kt
@@ -40,6 +40,7 @@
 import com.android.settingslib.graph.proto.PreferenceProto.ActionTarget
 import com.android.settingslib.graph.proto.PreferenceScreenProto
 import com.android.settingslib.graph.proto.TextProto
+import com.android.settingslib.metadata.IntRangeValuePreference
 import com.android.settingslib.metadata.PersistentPreference
 import com.android.settingslib.metadata.PreferenceAvailabilityProvider
 import com.android.settingslib.metadata.PreferenceHierarchy
@@ -50,7 +51,6 @@
 import com.android.settingslib.metadata.PreferenceScreenRegistry
 import com.android.settingslib.metadata.PreferenceSummaryProvider
 import com.android.settingslib.metadata.PreferenceTitleProvider
-import com.android.settingslib.metadata.RangeValue
 import com.android.settingslib.metadata.ReadWritePermit
 import com.android.settingslib.preference.PreferenceScreenFactory
 import com.android.settingslib.preference.PreferenceScreenProvider
@@ -407,22 +407,20 @@
         ) {
             val storage = metadata.storage(context)
             value = preferenceValueProto {
-                when (metadata) {
-                    is RangeValue -> storage.getInt(metadata.key)?.let { intValue = it }
-                    else -> {}
-                }
                 when (metadata.valueType) {
+                    Int::class.javaObjectType -> storage.getInt(metadata.key)?.let { intValue = it }
                     Boolean::class.javaObjectType ->
                         storage.getBoolean(metadata.key)?.let { booleanValue = it }
                     Float::class.javaObjectType ->
                         storage.getFloat(metadata.key)?.let { floatValue = it }
+                    else -> {}
                 }
             }
         }
         if (flags.includeValueDescriptor()) {
             valueDescriptor = preferenceValueDescriptorProto {
                 when (metadata) {
-                    is RangeValue -> rangeValue = rangeValueProto {
+                    is IntRangeValuePreference -> rangeValue = rangeValueProto {
                             min = metadata.getMinValue(context)
                             max = metadata.getMaxValue(context)
                             step = metadata.getIncrementStep(context)
diff --git a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceSetterApi.kt b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceSetterApi.kt
index 4719064..728055c 100644
--- a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceSetterApi.kt
+++ b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceSetterApi.kt
@@ -26,12 +26,12 @@
 import com.android.settingslib.ipc.ApiPermissionChecker
 import com.android.settingslib.ipc.IntMessageCodec
 import com.android.settingslib.ipc.MessageCodec
+import com.android.settingslib.metadata.IntRangeValuePreference
 import com.android.settingslib.metadata.PersistentPreference
 import com.android.settingslib.metadata.PreferenceAvailabilityProvider
 import com.android.settingslib.metadata.PreferenceMetadata
 import com.android.settingslib.metadata.PreferenceRestrictionProvider
 import com.android.settingslib.metadata.PreferenceScreenRegistry
-import com.android.settingslib.metadata.RangeValue
 import com.android.settingslib.metadata.ReadWritePermit
 import com.android.settingslib.metadata.SensitivityLevel.Companion.HIGH_SENSITIVITY
 import com.android.settingslib.metadata.SensitivityLevel.Companion.UNKNOWN_SENSITIVITY
@@ -157,7 +157,10 @@
                 val intValue = value.intValue
                 val resultCode = metadata.checkWritePermit(intValue)
                 if (resultCode != PreferenceSetterResult.OK) return resultCode
-                if (metadata is RangeValue && !metadata.isValidValue(application, intValue)) {
+                if (
+                    metadata is IntRangeValuePreference &&
+                        !metadata.isValidValue(application, intValue)
+                ) {
                     return PreferenceSetterResult.INVALID_REQUEST
                 }
                 storage.setInt(key, intValue)
diff --git a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PersistentPreference.kt b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PersistentPreference.kt
index be705b5..63f1050 100644
--- a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PersistentPreference.kt
+++ b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PersistentPreference.kt
@@ -75,7 +75,7 @@
     }
 }
 
-/** Preference interface that has a value persisted in datastore. */
+/** Preference metadata that has a value persisted in datastore. */
 interface PersistentPreference<T> : PreferenceMetadata {
 
     /**
@@ -204,18 +204,3 @@
     override fun getValue(context: Context, index: Int): Int =
         context.resources.getIntArray(values)[index]
 }
-
-/** Value is between a range. */
-interface RangeValue : ValueDescriptor {
-    /** The lower bound (inclusive) of the range. */
-    fun getMinValue(context: Context): Int
-
-    /** The upper bound (inclusive) of the range. */
-    fun getMaxValue(context: Context): Int
-
-    /** The increment step within the range. 0 means unset, which implies step size is 1. */
-    fun getIncrementStep(context: Context) = 0
-
-    override fun isValidValue(context: Context, index: Int) =
-        index in getMinValue(context)..getMaxValue(context)
-}
diff --git a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceTypes.kt b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceTypes.kt
index fecf3e5..edd45d3 100644
--- a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceTypes.kt
+++ b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceTypes.kt
@@ -16,6 +16,7 @@
 
 package com.android.settingslib.metadata
 
+import android.content.Context
 import androidx.annotation.StringRes
 
 /** A persistent preference that has a boolean value. */
@@ -30,6 +31,24 @@
         get() = Float::class.javaObjectType
 }
 
+/** A persistent preference that has a int value between a range. */
+interface IntRangeValuePreference : PersistentPreference<Int>, ValueDescriptor {
+    override val valueType: Class<Int>
+        get() = Int::class.javaObjectType
+
+    /** The lower bound (inclusive) of the range. */
+    fun getMinValue(context: Context): Int
+
+    /** The upper bound (inclusive) of the range. */
+    fun getMaxValue(context: Context): Int
+
+    /** The increment step within the range. 0 means unset, which implies step size is 1. */
+    fun getIncrementStep(context: Context) = 0
+
+    override fun isValidValue(context: Context, index: Int) =
+        index in getMinValue(context)..getMaxValue(context)
+}
+
 /** A preference that provides a two-state toggleable option. */
 open class SwitchPreference
 @JvmOverloads
diff --git a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBinding.kt b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBinding.kt
index c61c6a5..59141c9 100644
--- a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBinding.kt
+++ b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBinding.kt
@@ -25,10 +25,10 @@
 import androidx.preference.SeekBarPreference
 import com.android.settingslib.metadata.DiscreteIntValue
 import com.android.settingslib.metadata.DiscreteValue
+import com.android.settingslib.metadata.IntRangeValuePreference
 import com.android.settingslib.metadata.PreferenceAvailabilityProvider
 import com.android.settingslib.metadata.PreferenceMetadata
 import com.android.settingslib.metadata.PreferenceScreenMetadata
-import com.android.settingslib.metadata.RangeValue
 
 /** Binding of preference widget and preference metadata. */
 interface PreferenceBinding {
@@ -101,7 +101,7 @@
                 } else {
                     preference.setEntryValues(values)
                 }
-            } else if (preference is SeekBarPreference && this is RangeValue) {
+            } else if (preference is SeekBarPreference && this is IntRangeValuePreference) {
                 preference.min = getMinValue(context)
                 preference.max = getMaxValue(context)
                 preference.seekBarIncrement = getIncrementStep(context)