Merge "[Catalyst] Add the store and get API into BrightnessLevelPreference" into main
diff --git a/src/com/android/settings/display/BrightnessLevelPreference.kt b/src/com/android/settings/display/BrightnessLevelPreference.kt
index 5e2f6f2..73a2280 100644
--- a/src/com/android/settings/display/BrightnessLevelPreference.kt
+++ b/src/com/android/settings/display/BrightnessLevelPreference.kt
@@ -31,16 +31,20 @@
 import com.android.settings.Utils
 import com.android.settings.core.SettingsBaseActivity
 import com.android.settingslib.RestrictedPreference
+import com.android.settingslib.datastore.AbstractKeyedDataObservable
+import com.android.settingslib.datastore.DataChangeReason
 import com.android.settingslib.datastore.HandlerExecutor
+import com.android.settingslib.datastore.KeyValueStore
 import com.android.settingslib.datastore.KeyedObserver
 import com.android.settingslib.datastore.SettingsSystemStore
 import com.android.settingslib.display.BrightnessUtils.GAMMA_SPACE_MAX
 import com.android.settingslib.display.BrightnessUtils.GAMMA_SPACE_MIN
 import com.android.settingslib.display.BrightnessUtils.convertLinearToGammaFloat
-import com.android.settingslib.metadata.PreferenceLifecycleContext
-import com.android.settingslib.metadata.PreferenceLifecycleProvider
+import com.android.settingslib.metadata.PersistentPreference
 import com.android.settingslib.metadata.PreferenceMetadata
 import com.android.settingslib.metadata.PreferenceSummaryProvider
+import com.android.settingslib.metadata.ReadWritePermit
+import com.android.settingslib.metadata.SensitivityLevel
 import com.android.settingslib.preference.PreferenceBinding
 import com.android.settingslib.transition.SettingsTransitionHelper
 import java.text.NumberFormat
@@ -48,15 +52,12 @@
 // LINT.IfChange
 class BrightnessLevelPreference :
     PreferenceMetadata,
+    PersistentPreference<Float>,
     PreferenceBinding,
     PreferenceRestrictionMixin,
     PreferenceSummaryProvider,
-    PreferenceLifecycleProvider,
     Preference.OnPreferenceClickListener {
 
-    private var brightnessObserver: KeyedObserver<String>? = null
-    private var displayListener: DisplayListener? = null
-
     override val key: String
         get() = KEY
 
@@ -67,7 +68,7 @@
         get() = R.string.keywords_display_brightness_level
 
     override fun getSummary(context: Context): CharSequence? =
-        NumberFormat.getPercentInstance().format(getCurrentBrightness(context))
+        NumberFormat.getPercentInstance().format(context.brightness)
 
     override fun isEnabled(context: Context) = super<PreferenceRestrictionMixin>.isEnabled(context)
 
@@ -77,91 +78,113 @@
     override val useAdminDisabledSummary: Boolean
         get() = true
 
+    override fun intent(context: Context) =
+        Intent(ACTION_SHOW_BRIGHTNESS_DIALOG)
+            .setPackage(Utils.SYSTEMUI_PACKAGE_NAME)
+            .putExtra(
+                SettingsBaseActivity.EXTRA_PAGE_TRANSITION_TYPE,
+                SettingsTransitionHelper.TransitionType.TRANSITION_NONE,
+            )
+            .putExtra(EXTRA_BRIGHTNESS_DIALOG_IS_FULL_WIDTH, true)
+
     override fun createWidget(context: Context) = RestrictedPreference(context)
 
     override fun bind(preference: Preference, metadata: PreferenceMetadata) {
         super.bind(preference, metadata)
         preference.onPreferenceClickListener = this
+        preference.isPersistent = false
     }
 
-    override fun onStart(context: PreferenceLifecycleContext) {
-        val observer = KeyedObserver<String> { _, _ -> context.notifyPreferenceChange(KEY) }
-        brightnessObserver = observer
-        SettingsSystemStore.get(context)
-            .addObserver(System.SCREEN_AUTO_BRIGHTNESS_ADJ, observer, HandlerExecutor.main)
+    override fun getReadPermit(context: Context, callingPid: Int, callingUid: Int) =
+        ReadWritePermit.ALLOW
 
-        val listener =
-            object : DisplayListener {
-                override fun onDisplayAdded(displayId: Int) {}
+    override fun getWritePermit(context: Context, value: Float?, callingPid: Int, callingUid: Int) =
+        ReadWritePermit.DISALLOW
 
-                override fun onDisplayRemoved(displayId: Int) {}
+    override val sensitivityLevel
+        get() = SensitivityLevel.NO_SENSITIVITY
 
-                override fun onDisplayChanged(displayId: Int) {
-                    context.notifyPreferenceChange(KEY)
-                }
-            }
-        displayListener = listener
-        context.displayManager.registerDisplayListener(
-            listener,
-            HandlerExecutor.main,
-            /* eventFlags= */ 0,
-            DisplayManager.PRIVATE_EVENT_FLAG_DISPLAY_BRIGHTNESS,
-        )
-    }
+    override fun storage(context: Context): KeyValueStore = BrightnessStorage(context)
 
-    override fun onStop(context: PreferenceLifecycleContext) {
-        brightnessObserver?.let {
-            SettingsSystemStore.get(context).removeObserver(System.SCREEN_AUTO_BRIGHTNESS_ADJ, it)
-            brightnessObserver = null
+    private class BrightnessStorage(private val context: Context) :
+        AbstractKeyedDataObservable<String>(),
+        KeyValueStore,
+        KeyedObserver<String>,
+        DisplayListener {
+
+        override fun contains(key: String) = key == KEY
+
+        @Suppress("UNCHECKED_CAST")
+        override fun <T : Any> getValue(key: String, valueType: Class<T>) =
+            context.brightness.toFloat() as T
+
+        override fun <T : Any> setValue(key: String, valueType: Class<T>, value: T?) {}
+
+        override fun onFirstObserverAdded() {
+            SettingsSystemStore.get(context)
+                .addObserver(System.SCREEN_AUTO_BRIGHTNESS_ADJ, this, HandlerExecutor.main)
+
+            context.displayManager.registerDisplayListener(
+                this,
+                HandlerExecutor.main,
+                /* eventFlags= */ 0,
+                DisplayManager.PRIVATE_EVENT_FLAG_DISPLAY_BRIGHTNESS,
+            )
         }
 
-        displayListener?.let {
-            context.displayManager.unregisterDisplayListener(it)
-            displayListener = null
+        override fun onLastObserverRemoved() {
+            SettingsSystemStore.get(context).removeObserver(System.SCREEN_AUTO_BRIGHTNESS_ADJ, this)
+
+            context.displayManager.unregisterDisplayListener(this)
+        }
+
+        override fun onKeyChanged(key: String, reason: Int) {
+            notifyChange(KEY, DataChangeReason.UPDATE)
+        }
+
+        override fun onDisplayAdded(displayId: Int) {}
+
+        override fun onDisplayRemoved(displayId: Int) {}
+
+        override fun onDisplayChanged(displayId: Int) {
+            notifyChange(KEY, DataChangeReason.UPDATE)
         }
     }
 
-    private val Context.displayManager: DisplayManager
-        get() = getSystemService(DisplayManager::class.java)!!
-
     override fun onPreferenceClick(preference: Preference): Boolean {
         val context = preference.context
-        val intent =
-            Intent(ACTION_SHOW_BRIGHTNESS_DIALOG)
-                .setPackage(Utils.SYSTEMUI_PACKAGE_NAME)
-                .putExtra(
-                    SettingsBaseActivity.EXTRA_PAGE_TRANSITION_TYPE,
-                    SettingsTransitionHelper.TransitionType.TRANSITION_NONE,
-                )
-                .putExtra(EXTRA_BRIGHTNESS_DIALOG_IS_FULL_WIDTH, true)
         val options =
             ActivityOptions.makeCustomAnimation(
                 context,
                 android.R.anim.fade_in,
                 android.R.anim.fade_out,
             )
-        context.startActivityForResult(preference.key, intent, 0, options.toBundle())
+        context.startActivityForResult(preference.key, intent(context), 0, options.toBundle())
         return true
     }
 
-    private fun getCurrentBrightness(context: Context): Double {
-        val info: BrightnessInfo? = context.display.brightnessInfo
-        val value =
-            info?.run {
-                convertLinearToGammaFloat(brightness, brightnessMinimum, brightnessMaximum)
-            }
-        return getPercentage(value?.toDouble() ?: 0.0)
-    }
-
-    private fun getPercentage(value: Double): Double =
-        when {
-            value > GAMMA_SPACE_MAX -> 1.0
-            value < GAMMA_SPACE_MIN -> 0.0
-            else -> (value - GAMMA_SPACE_MIN) / (GAMMA_SPACE_MAX - GAMMA_SPACE_MIN)
-        }
-
     companion object {
         const val KEY = "brightness"
+
+        private val Context.displayManager: DisplayManager
+            get() = getSystemService(DisplayManager::class.java)!!
+
+        private val Context.brightness: Double
+            get() {
+                val info: BrightnessInfo? = display.brightnessInfo
+                val value =
+                    info?.run {
+                        convertLinearToGammaFloat(brightness, brightnessMinimum, brightnessMaximum)
+                    }
+                return getPercentage(value?.toDouble() ?: 0.0)
+            }
+
+        private fun getPercentage(value: Double): Double =
+            when {
+                value > GAMMA_SPACE_MAX -> 1.0
+                value < GAMMA_SPACE_MIN -> 0.0
+                else -> (value - GAMMA_SPACE_MIN) / (GAMMA_SPACE_MAX - GAMMA_SPACE_MIN)
+            }
     }
 }
 // LINT.ThenChange(BrightnessLevelPreferenceController.java)