Merge "Fix catalyst settings test failure" into main
diff --git a/src/com/android/settings/display/AutoBrightnessScreen.kt b/src/com/android/settings/display/AutoBrightnessScreen.kt
index 2e8c708..0e682ff 100644
--- a/src/com/android/settings/display/AutoBrightnessScreen.kt
+++ b/src/com/android/settings/display/AutoBrightnessScreen.kt
@@ -37,6 +37,7 @@
 import com.android.settingslib.metadata.PreferenceMetadata
 import com.android.settingslib.metadata.PreferenceRestrictionProvider
 import com.android.settingslib.metadata.ProvidePreferenceScreen
+import com.android.settingslib.metadata.ReadWritePermit
 import com.android.settingslib.metadata.preferenceHierarchy
 import com.android.settingslib.preference.PreferenceScreenBinding
 import com.android.settingslib.preference.PreferenceScreenCreator
@@ -66,6 +67,9 @@
     override fun storage(context: Context): KeyValueStore =
         AutoBrightnessDataStore(SettingsSystemStore.get(context))
 
+    override fun getWritePermit(context: Context, value: Boolean?, myUid: Int, callingUid: Int) =
+        ReadWritePermit.ALLOW
+
     override fun isAvailable(context: Context) =
         context.resources.getBoolean(
             com.android.internal.R.bool.config_automatic_brightness_available
diff --git a/src/com/android/settings/display/PeakRefreshRateSwitchPreference.kt b/src/com/android/settings/display/PeakRefreshRateSwitchPreference.kt
index 5302fce..e60a4c7 100644
--- a/src/com/android/settings/display/PeakRefreshRateSwitchPreference.kt
+++ b/src/com/android/settings/display/PeakRefreshRateSwitchPreference.kt
@@ -33,6 +33,7 @@
 import com.android.settingslib.metadata.PreferenceLifecycleContext
 import com.android.settingslib.metadata.PreferenceLifecycleProvider
 import com.android.settingslib.metadata.PreferenceSummaryProvider
+import com.android.settingslib.metadata.ReadWritePermit
 import com.android.settingslib.metadata.SwitchPreference
 import kotlin.math.roundToInt
 
@@ -48,6 +49,9 @@
     override fun storage(context: Context): KeyValueStore =
         PeakRefreshRateStore(context, SettingsSystemStore.get(context))
 
+    override fun getWritePermit(context: Context, value: Boolean?, myUid: Int, callingUid: Int) =
+        ReadWritePermit.ALLOW
+
     override fun isAvailable(context: Context) =
         context.resources.getBoolean(R.bool.config_show_smooth_display) &&
             context.peakRefreshRate > DEFAULT_REFRESH_RATE
diff --git a/src/com/android/settings/display/darkmode/DarkModeScreen.kt b/src/com/android/settings/display/darkmode/DarkModeScreen.kt
index 263958c..1124b3a 100644
--- a/src/com/android/settings/display/darkmode/DarkModeScreen.kt
+++ b/src/com/android/settings/display/darkmode/DarkModeScreen.kt
@@ -36,6 +36,7 @@
 import com.android.settingslib.metadata.PreferenceMetadata
 import com.android.settingslib.metadata.PreferenceSummaryProvider
 import com.android.settingslib.metadata.ProvidePreferenceScreen
+import com.android.settingslib.metadata.ReadWritePermit
 import com.android.settingslib.metadata.preferenceHierarchy
 import com.android.settingslib.preference.PreferenceScreenBinding
 import com.android.settingslib.preference.PreferenceScreenCreator
@@ -69,6 +70,9 @@
     override val keywords: Int
         get() = R.string.keywords_dark_ui_mode
 
+    override fun getWritePermit(context: Context, value: Boolean?, myUid: Int, callingUid: Int) =
+        ReadWritePermit.ALLOW
+
     override fun isFlagEnabled(context: Context) = Flags.catalystDarkUiMode()
 
     override fun fragmentClass() = DarkModeSettingsFragment::class.java
diff --git a/src/com/android/settings/notification/CallVolumePreference.kt b/src/com/android/settings/notification/CallVolumePreference.kt
index 0126e13..3c14ae4 100644
--- a/src/com/android/settings/notification/CallVolumePreference.kt
+++ b/src/com/android/settings/notification/CallVolumePreference.kt
@@ -33,6 +33,7 @@
 import com.android.settingslib.metadata.PreferenceMetadata
 import com.android.settingslib.metadata.PreferenceRestrictionProvider
 import com.android.settingslib.metadata.RangeValue
+import com.android.settingslib.metadata.ReadWritePermit
 import com.android.settingslib.preference.PreferenceBinding
 
 // LINT.IfChange
@@ -82,6 +83,9 @@
         }
     }
 
+    override fun getWritePermit(context: Context, value: Int?, myUid: Int, callingUid: Int) =
+        ReadWritePermit.ALLOW
+
     override fun getMinValue(context: Context) =
         createAudioHelper(context).getMinVolume(getAudioStream(context))
 
diff --git a/src/com/android/settings/notification/MediaVolumePreference.kt b/src/com/android/settings/notification/MediaVolumePreference.kt
index 13fd029..acb8f8d 100644
--- a/src/com/android/settings/notification/MediaVolumePreference.kt
+++ b/src/com/android/settings/notification/MediaVolumePreference.kt
@@ -25,7 +25,13 @@
 import com.android.settingslib.RestrictedLockUtilsInternal
 import com.android.settingslib.datastore.KeyValueStore
 import com.android.settingslib.datastore.NoOpKeyedObservable
-import com.android.settingslib.metadata.*
+import com.android.settingslib.metadata.PersistentPreference
+import com.android.settingslib.metadata.PreferenceAvailabilityProvider
+import com.android.settingslib.metadata.PreferenceIconProvider
+import com.android.settingslib.metadata.PreferenceMetadata
+import com.android.settingslib.metadata.PreferenceRestrictionProvider
+import com.android.settingslib.metadata.RangeValue
+import com.android.settingslib.metadata.ReadWritePermit
 import com.android.settingslib.preference.PreferenceBinding
 
 // LINT.IfChange
@@ -79,6 +85,9 @@
         }
     }
 
+    override fun getWritePermit(context: Context, value: Int?, myUid: Int, callingUid: Int) =
+        ReadWritePermit.ALLOW
+
     override fun getMinValue(context: Context) =
         createAudioHelper(context).getMinVolume(STREAM_MUSIC)
 
diff --git a/src/com/android/settings/notification/SeparateRingVolumePreference.kt b/src/com/android/settings/notification/SeparateRingVolumePreference.kt
index 2f696b1..6831daa 100644
--- a/src/com/android/settings/notification/SeparateRingVolumePreference.kt
+++ b/src/com/android/settings/notification/SeparateRingVolumePreference.kt
@@ -40,6 +40,7 @@
 import com.android.settingslib.metadata.PreferenceMetadata
 import com.android.settingslib.metadata.PreferenceRestrictionProvider
 import com.android.settingslib.metadata.RangeValue
+import com.android.settingslib.metadata.ReadWritePermit
 import com.android.settingslib.preference.PreferenceBinding
 
 // LINT.IfChange
@@ -94,6 +95,9 @@
         }
     }
 
+    override fun getWritePermit(context: Context, value: Int?, myUid: Int, callingUid: Int) =
+        ReadWritePermit.ALLOW
+
     override fun getMinValue(context: Context) =
         createAudioHelper(context).getMinVolume(STREAM_RING)
 
diff --git a/src/com/android/settings/notification/SoundScreen.kt b/src/com/android/settings/notification/SoundScreen.kt
index e074301..c0694b9 100644
--- a/src/com/android/settings/notification/SoundScreen.kt
+++ b/src/com/android/settings/notification/SoundScreen.kt
@@ -18,8 +18,11 @@
 import android.content.Context
 import androidx.fragment.app.Fragment
 import com.android.settings.R
+import com.android.settings.Settings.SoundSettingsActivity
 import com.android.settings.flags.Flags
+import com.android.settings.utils.makeLaunchIntent
 import com.android.settingslib.metadata.PreferenceIconProvider
+import com.android.settingslib.metadata.PreferenceMetadata
 import com.android.settingslib.metadata.ProvidePreferenceScreen
 import com.android.settingslib.metadata.preferenceHierarchy
 import com.android.settingslib.preference.PreferenceScreenCreator
@@ -55,6 +58,9 @@
             +DialPadTonePreference() order -50
         }
 
+    override fun getLaunchIntent(context: Context, metadata: PreferenceMetadata?) =
+        makeLaunchIntent(context, SoundSettingsActivity::class.java, metadata?.key)
+
     companion object {
         const val KEY = "sound_screen"
     }
diff --git a/tests/robotests/src/com/android/settings/display/AutoBrightnessScreenTest.kt b/tests/robotests/src/com/android/settings/display/AutoBrightnessScreenTest.kt
index 6dd9708..d05b258 100644
--- a/tests/robotests/src/com/android/settings/display/AutoBrightnessScreenTest.kt
+++ b/tests/robotests/src/com/android/settings/display/AutoBrightnessScreenTest.kt
@@ -15,7 +15,8 @@
  */
 package com.android.settings.display
 
-import android.content.Context
+import android.content.ContextWrapper
+import android.content.res.Resources
 import android.provider.Settings
 import android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
 import android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL
@@ -23,26 +24,30 @@
 import androidx.preference.PreferenceViewHolder
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
-import com.android.settings.testutils.shadow.SettingsShadowResources
 import com.android.settingslib.PrimarySwitchPreference
+import com.android.settingslib.preference.PreferenceDataStoreAdapter
 import com.android.settingslib.widget.SettingsThemeHelper.isExpressiveTheme
 import com.android.settingslib.widget.theme.R
 import com.google.common.truth.Truth.assertThat
-import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
-import org.robolectric.annotation.Config
+import org.mockito.kotlin.any
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.mock
 
 // LINT.IfChange
 @RunWith(AndroidJUnit4::class)
-@Config(shadows = [SettingsShadowResources::class])
-@Ignore("robolectric runtime")
 class AutoBrightnessScreenTest {
 
-    private val context: Context = ApplicationProvider.getApplicationContext()
-
     private val preferenceScreenCreator = AutoBrightnessScreen()
 
+    private var mockResources: Resources? = null
+
+    private val context =
+        object : ContextWrapper(ApplicationProvider.getApplicationContext()) {
+            override fun getResources(): Resources = mockResources ?: super.getResources()
+        }
+
     @Test
     fun switchClick_defaultScreenBrightnessModeTurnOffAuto_returnTrue() {
         setScreenBrightnessMode(SCREEN_BRIGHTNESS_MODE_MANUAL)
@@ -100,20 +105,14 @@
 
     @Test
     fun isAvailable_configTrueSet_shouldReturnTrue() {
-        SettingsShadowResources.overrideResource(
-            com.android.internal.R.bool.config_automatic_brightness_available,
-            true,
-        )
+        mockResources = mock { on { getBoolean(any()) } doReturn true }
 
         assertThat(preferenceScreenCreator.isAvailable(context)).isTrue()
     }
 
     @Test
     fun isAvailable_configFalseSet_shouldReturnFalse() {
-        SettingsShadowResources.overrideResource(
-            com.android.internal.R.bool.config_automatic_brightness_available,
-            false,
-        )
+        mockResources = mock { on { getBoolean(any()) } doReturn false }
 
         assertThat(preferenceScreenCreator.isAvailable(context)).isFalse()
     }
@@ -121,6 +120,7 @@
     private fun getPrimarySwitchPreference(): PrimarySwitchPreference =
         preferenceScreenCreator.run {
             val preference = createWidget(context)
+            preference.preferenceDataStore = PreferenceDataStoreAdapter(storage(context))
             bind(preference, this)
             val holder =
                 PreferenceViewHolder.createInstanceForTests(