diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 6f89a26ce7c..e745d9c4fa5 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1930,6 +1930,20 @@
android:value="@string/menu_key_apps"/>
+
+
+
+
+
+
+
+
+
+
diff --git a/res/values/styles_preference_expressive.xml b/res/values/styles_preference_expressive.xml
new file mode 100644
index 00000000000..a6fe2f18068
--- /dev/null
+++ b/res/values/styles_preference_expressive.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
diff --git a/res/values/themes_expressive.xml b/res/values/themes_expressive.xml
new file mode 100644
index 00000000000..8342fe0c9e0
--- /dev/null
+++ b/res/values/themes_expressive.xml
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/xml/accessibility_autoclick_settings.xml b/res/xml/accessibility_autoclick_settings.xml
index 7a199285bb7..3a1bcd3aa05 100644
--- a/res/xml/accessibility_autoclick_settings.xml
+++ b/res/xml/accessibility_autoclick_settings.xml
@@ -21,7 +21,8 @@
+ android:title="@string/accessibility_autoclick_intro_text"
+ settings:searchable="false"/>
+
+
+
+
+
Display
Settings.AdaptiveBrightnessActivity.class.getName(),
diff --git a/src/com/android/settings/display/AutoBrightnessScreen.kt b/src/com/android/settings/display/AutoBrightnessScreen.kt
index 2e8c7088ae9..0e682ff92df 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.PreferenceAvailabilityProvider
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 @@ class AutoBrightnessScreen :
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/DisplayScreen.kt b/src/com/android/settings/display/DisplayScreen.kt
index b1a822d8932..5435ae25228 100644
--- a/src/com/android/settings/display/DisplayScreen.kt
+++ b/src/com/android/settings/display/DisplayScreen.kt
@@ -30,7 +30,7 @@ import com.android.settingslib.metadata.preferenceHierarchy
import com.android.settingslib.preference.PreferenceScreenCreator
@ProvidePreferenceScreen
-class DisplayScreen :
+open class DisplayScreen :
PreferenceScreenCreator, PreferenceAvailabilityProvider, PreferenceIconProvider {
override val key: String
get() = KEY
diff --git a/src/com/android/settings/display/PeakRefreshRateSwitchPreference.kt b/src/com/android/settings/display/PeakRefreshRateSwitchPreference.kt
index 5302fce5451..e60a4c71ce0 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.PreferenceAvailabilityProvider
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 @@ class PeakRefreshRateSwitchPreference :
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 263958cd335..1124b3abcb2 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.PreferenceLifecycleProvider
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 @@ class DarkModeScreen :
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 0126e139d44..3c14ae4fafb 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.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
@@ -82,6 +83,9 @@ open class CallVolumePreference :
}
}
+ 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 13fd0297540..acb8f8d3af1 100644
--- a/src/com/android/settings/notification/MediaVolumePreference.kt
+++ b/src/com/android/settings/notification/MediaVolumePreference.kt
@@ -25,7 +25,13 @@ import com.android.settings.R
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 @@ open class MediaVolumePreference :
}
}
+ 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 2f696b1c0f9..6831daad683 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.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
@@ -94,6 +95,9 @@ open class SeparateRingVolumePreference :
}
}
+ 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 e074301ca6c..c0694b9a7ca 100644
--- a/src/com/android/settings/notification/SoundScreen.kt
+++ b/src/com/android/settings/notification/SoundScreen.kt
@@ -18,8 +18,11 @@ package com.android.settings.notification
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 @@ class SoundScreen : PreferenceScreenCreator, PreferenceIconProvider {
+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 6dd9708b478..d05b258574d 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 android.view.LayoutInflater
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 @@ class AutoBrightnessScreenTest {
@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 @@ class AutoBrightnessScreenTest {
private fun getPrimarySwitchPreference(): PrimarySwitchPreference =
preferenceScreenCreator.run {
val preference = createWidget(context)
+ preference.preferenceDataStore = PreferenceDataStoreAdapter(storage(context))
bind(preference, this)
val holder =
PreferenceViewHolder.createInstanceForTests(
diff --git a/tests/robotests/src/com/android/settings/network/AdaptiveConnectivityTogglePreferenceTest.kt b/tests/robotests/src/com/android/settings/network/AdaptiveConnectivityTogglePreferenceTest.kt
index 913adf6d7ad..d85980efe67 100644
--- a/tests/robotests/src/com/android/settings/network/AdaptiveConnectivityTogglePreferenceTest.kt
+++ b/tests/robotests/src/com/android/settings/network/AdaptiveConnectivityTogglePreferenceTest.kt
@@ -22,6 +22,7 @@ import android.platform.test.flag.junit.SetFlagsRule
import android.provider.Settings
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settingslib.preference.createAndBindWidget
import com.android.settingslib.widget.MainSwitchPreference
import com.google.common.truth.Truth.assertThat
import org.junit.Before
@@ -78,10 +79,6 @@ class AdaptiveConnectivityTogglePreferenceTest {
}
private fun getMainSwitchPreferenceCompat(): MainSwitchPreference =
- adaptiveConnectivityTogglePreference.run {
- val preference = createWidget(appContext)
- bind(preference, this)
- preference as MainSwitchPreference
- }
+ adaptiveConnectivityTogglePreference.createAndBindWidget(appContext)
}
// LINT.ThenChange(AdaptiveConnectivityTogglePreferenceControllerTest.java)
diff --git a/tests/robotests/src/com/android/settings/notification/DialPadTonePreferenceTest.kt b/tests/robotests/src/com/android/settings/notification/DialPadTonePreferenceTest.kt
index 63e8e3d53ef..ef14166dd64 100644
--- a/tests/robotests/src/com/android/settings/notification/DialPadTonePreferenceTest.kt
+++ b/tests/robotests/src/com/android/settings/notification/DialPadTonePreferenceTest.kt
@@ -23,7 +23,7 @@ import androidx.preference.SwitchPreferenceCompat
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settingslib.datastore.SettingsSystemStore
-import com.android.settingslib.preference.DefaultPreferenceBindingFactory
+import com.android.settingslib.preference.createAndBindWidget
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith
@@ -93,11 +93,7 @@ class DialPadTonePreferenceTest {
}
private fun getSwitchPreference(): SwitchPreferenceCompat =
- DefaultPreferenceBindingFactory.getPreferenceBinding(dialPadTonePreference).run {
- val preference = createWidget(context)
- bind(preference, dialPadTonePreference)
- preference as SwitchPreferenceCompat
- }
+ dialPadTonePreference.createAndBindWidget(context)
private fun enableDialPadTone(enabled: Boolean) =
SettingsSystemStore.get(context).setBoolean(DTMF_TONE_WHEN_DIALING, enabled)