[Catalyst] Support restriction for Display settings

NO_IFTTT=Catalyst only

Bug: 377600992
Flag: com.android.settings.flags.catalyst_display_settings_screen
Test: testdpc
Change-Id: I0a9a125a24614ea8d93e870891c7db6f73f4ac9e
This commit is contained in:
Jacky Wang
2024-11-06 16:49:27 +08:00
parent 2c4aec3a23
commit 33c580ec45
3 changed files with 32 additions and 50 deletions

View File

@@ -16,17 +16,15 @@
package com.android.settings.display package com.android.settings.display
import android.content.Context import android.content.Context
import android.os.Process
import android.os.UserHandle
import android.os.UserManager import android.os.UserManager
import android.provider.Settings import android.provider.Settings
import android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC import android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
import android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL import android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL
import androidx.preference.Preference import androidx.preference.Preference
import com.android.settings.PreferenceRestrictionMixin
import com.android.settings.R import com.android.settings.R
import com.android.settings.flags.Flags import com.android.settings.flags.Flags
import com.android.settingslib.PrimarySwitchPreference import com.android.settingslib.PrimarySwitchPreference
import com.android.settingslib.RestrictedLockUtilsInternal
import com.android.settingslib.datastore.KeyValueStore import com.android.settingslib.datastore.KeyValueStore
import com.android.settingslib.datastore.KeyedObservableDelegate import com.android.settingslib.datastore.KeyedObservableDelegate
import com.android.settingslib.datastore.SettingsStore import com.android.settingslib.datastore.SettingsStore
@@ -35,7 +33,6 @@ import com.android.settingslib.metadata.BooleanValue
import com.android.settingslib.metadata.PersistentPreference import com.android.settingslib.metadata.PersistentPreference
import com.android.settingslib.metadata.PreferenceAvailabilityProvider import com.android.settingslib.metadata.PreferenceAvailabilityProvider
import com.android.settingslib.metadata.PreferenceMetadata import com.android.settingslib.metadata.PreferenceMetadata
import com.android.settingslib.metadata.PreferenceRestrictionProvider
import com.android.settingslib.metadata.ProvidePreferenceScreen import com.android.settingslib.metadata.ProvidePreferenceScreen
import com.android.settingslib.metadata.ReadWritePermit import com.android.settingslib.metadata.ReadWritePermit
import com.android.settingslib.metadata.preferenceHierarchy import com.android.settingslib.metadata.preferenceHierarchy
@@ -47,7 +44,7 @@ class AutoBrightnessScreen :
PreferenceScreenCreator, PreferenceScreenCreator,
PreferenceScreenBinding, PreferenceScreenBinding,
PreferenceAvailabilityProvider, PreferenceAvailabilityProvider,
PreferenceRestrictionProvider, PreferenceRestrictionMixin,
PersistentPreference<Boolean>, PersistentPreference<Boolean>,
BooleanValue { BooleanValue {
override val key: String override val key: String
@@ -75,23 +72,19 @@ class AutoBrightnessScreen :
com.android.internal.R.bool.config_automatic_brightness_available com.android.internal.R.bool.config_automatic_brightness_available
) )
override fun isEnabled(context: Context) = override fun isEnabled(context: Context) = super<PreferenceRestrictionMixin>.isEnabled(context)
!UserManager.get(context)
.hasBaseUserRestriction(UserManager.DISALLOW_CONFIG_BRIGHTNESS, Process.myUserHandle())
override fun isRestricted(context: Context) = override val restrictionKey: String
RestrictedLockUtilsInternal.checkIfRestrictionEnforced( get() = UserManager.DISALLOW_CONFIG_BRIGHTNESS
context,
UserManager.DISALLOW_CONFIG_BRIGHTNESS, override val useAdminDisabledSummary: Boolean
UserHandle.myUserId(), get() = true
) != null
override fun createWidget(context: Context) = PrimarySwitchPreference(context) override fun createWidget(context: Context) = PrimarySwitchPreference(context)
override fun bind(preference: Preference, metadata: PreferenceMetadata) { override fun bind(preference: Preference, metadata: PreferenceMetadata) {
super.bind(preference, metadata) super.bind(preference, metadata)
(preference as PrimarySwitchPreference).apply { (preference as PrimarySwitchPreference).apply {
useAdminDisabledSummary(true)
isSwitchEnabled = isEnabled isSwitchEnabled = isEnabled
// "true" is not the real default value (it is provided by AutoBrightnessDataStore) // "true" is not the real default value (it is provided by AutoBrightnessDataStore)
isChecked = preferenceDataStore!!.getBoolean(key, true) isChecked = preferenceDataStore!!.getBoolean(key, true)

View File

@@ -23,15 +23,13 @@ import android.content.Intent.EXTRA_BRIGHTNESS_DIALOG_IS_FULL_WIDTH
import android.hardware.display.BrightnessInfo import android.hardware.display.BrightnessInfo
import android.hardware.display.DisplayManager import android.hardware.display.DisplayManager
import android.hardware.display.DisplayManager.DisplayListener import android.hardware.display.DisplayManager.DisplayListener
import android.os.Process
import android.os.UserHandle
import android.os.UserManager import android.os.UserManager
import android.provider.Settings.System import android.provider.Settings.System
import androidx.preference.Preference import androidx.preference.Preference
import com.android.settings.PreferenceRestrictionMixin
import com.android.settings.R import com.android.settings.R
import com.android.settings.Utils import com.android.settings.Utils
import com.android.settings.core.SettingsBaseActivity import com.android.settings.core.SettingsBaseActivity
import com.android.settingslib.RestrictedLockUtilsInternal
import com.android.settingslib.RestrictedPreference import com.android.settingslib.RestrictedPreference
import com.android.settingslib.datastore.HandlerExecutor import com.android.settingslib.datastore.HandlerExecutor
import com.android.settingslib.datastore.KeyedObserver import com.android.settingslib.datastore.KeyedObserver
@@ -42,7 +40,6 @@ import com.android.settingslib.display.BrightnessUtils.convertLinearToGammaFloat
import com.android.settingslib.metadata.PreferenceLifecycleContext import com.android.settingslib.metadata.PreferenceLifecycleContext
import com.android.settingslib.metadata.PreferenceLifecycleProvider import com.android.settingslib.metadata.PreferenceLifecycleProvider
import com.android.settingslib.metadata.PreferenceMetadata import com.android.settingslib.metadata.PreferenceMetadata
import com.android.settingslib.metadata.PreferenceRestrictionProvider
import com.android.settingslib.metadata.PreferenceSummaryProvider import com.android.settingslib.metadata.PreferenceSummaryProvider
import com.android.settingslib.preference.PreferenceBinding import com.android.settingslib.preference.PreferenceBinding
import com.android.settingslib.transition.SettingsTransitionHelper import com.android.settingslib.transition.SettingsTransitionHelper
@@ -52,7 +49,7 @@ import java.text.NumberFormat
class BrightnessLevelRestrictedPreference : class BrightnessLevelRestrictedPreference :
PreferenceMetadata, PreferenceMetadata,
PreferenceBinding, PreferenceBinding,
PreferenceRestrictionProvider, PreferenceRestrictionMixin,
PreferenceSummaryProvider, PreferenceSummaryProvider,
PreferenceLifecycleProvider, PreferenceLifecycleProvider,
Preference.OnPreferenceClickListener { Preference.OnPreferenceClickListener {
@@ -69,34 +66,28 @@ class BrightnessLevelRestrictedPreference :
override val keywords: Int override val keywords: Int
get() = R.string.keywords_display_brightness_level get() = R.string.keywords_display_brightness_level
override fun getSummary(context: Context) = override fun getSummary(context: Context): CharSequence? =
NumberFormat.getPercentInstance().format(getCurrentBrightness(context)) NumberFormat.getPercentInstance().format(getCurrentBrightness(context))
override fun isEnabled(context: Context) = override fun isEnabled(context: Context) = super<PreferenceRestrictionMixin>.isEnabled(context)
!UserManager.get(context)
.hasBaseUserRestriction(UserManager.DISALLOW_CONFIG_BRIGHTNESS, Process.myUserHandle())
override fun isRestricted(context: Context) = override val restrictionKey: String
RestrictedLockUtilsInternal.checkIfRestrictionEnforced( get() = UserManager.DISALLOW_CONFIG_BRIGHTNESS
context,
UserManager.DISALLOW_CONFIG_BRIGHTNESS, override val useAdminDisabledSummary: Boolean
UserHandle.myUserId(), get() = true
) != null
override fun createWidget(context: Context) = RestrictedPreference(context) override fun createWidget(context: Context) = RestrictedPreference(context)
override fun bind(preference: Preference, metadata: PreferenceMetadata) { override fun bind(preference: Preference, metadata: PreferenceMetadata) {
super.bind(preference, metadata) super.bind(preference, metadata)
if (preference is RestrictedPreference) preference.useAdminDisabledSummary(true)
preference.onPreferenceClickListener = this preference.onPreferenceClickListener = this
} }
override fun onStart(context: PreferenceLifecycleContext) { override fun onStart(context: PreferenceLifecycleContext) {
val observer = val observer =
object : KeyedObserver<String> { KeyedObserver<String> { _, _ ->
override fun onKeyChanged(key: String, reason: Int) { context.notifyPreferenceChange(this@BrightnessLevelRestrictedPreference)
context.notifyPreferenceChange(this@BrightnessLevelRestrictedPreference)
}
} }
brightnessObserver = observer brightnessObserver = observer
SettingsSystemStore.get(context) SettingsSystemStore.get(context)
@@ -113,13 +104,11 @@ class BrightnessLevelRestrictedPreference :
} }
} }
displayListener = listener displayListener = listener
context context.displayManager.registerDisplayListener(
.getSystemService(DisplayManager::class.java) listener,
.registerDisplayListener( HandlerExecutor.main,
listener, DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS,
HandlerExecutor.main, )
DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS,
)
} }
override fun onStop(context: PreferenceLifecycleContext) { override fun onStop(context: PreferenceLifecycleContext) {
@@ -129,11 +118,14 @@ class BrightnessLevelRestrictedPreference :
} }
displayListener?.let { displayListener?.let {
context.getSystemService(DisplayManager::class.java).unregisterDisplayListener(it) context.displayManager.unregisterDisplayListener(it)
displayListener = null displayListener = null
} }
} }
private val Context.displayManager: DisplayManager
get() = getSystemService(DisplayManager::class.java)!!
override fun onPreferenceClick(preference: Preference): Boolean { override fun onPreferenceClick(preference: Preference): Boolean {
val context = preference.context val context = preference.context
val intent = val intent =

View File

@@ -25,7 +25,7 @@ import androidx.preference.PreferenceViewHolder
import androidx.test.core.app.ApplicationProvider import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settingslib.PrimarySwitchPreference import com.android.settingslib.PrimarySwitchPreference
import com.android.settingslib.preference.PreferenceDataStoreAdapter import com.android.settingslib.preference.createAndBindWidget
import com.android.settingslib.widget.SettingsThemeHelper.isExpressiveTheme import com.android.settingslib.widget.SettingsThemeHelper.isExpressiveTheme
import com.android.settingslib.widget.theme.R import com.android.settingslib.widget.theme.R
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
@@ -117,17 +117,14 @@ class AutoBrightnessScreenTest {
assertThat(preferenceScreenCreator.isAvailable(context)).isFalse() assertThat(preferenceScreenCreator.isAvailable(context)).isFalse()
} }
private fun getPrimarySwitchPreference(): PrimarySwitchPreference = private fun getPrimarySwitchPreference() =
preferenceScreenCreator.run { preferenceScreenCreator.createAndBindWidget<PrimarySwitchPreference>(context).also {
val preference = createWidget(context)
preference.preferenceDataStore = PreferenceDataStoreAdapter(storage(context))
bind(preference, this)
val holder = val holder =
PreferenceViewHolder.createInstanceForTests( PreferenceViewHolder.createInstanceForTests(
LayoutInflater.from(context).inflate(getResId(), /* root= */ null) LayoutInflater.from(context).inflate(getResId(), /* root= */ null)
) )
.apply { findViewById(androidx.preference.R.id.switchWidget) } .apply { findViewById(androidx.preference.R.id.switchWidget) }
preference.apply { onBindViewHolder(holder) } it.onBindViewHolder(holder)
} }
private fun setScreenBrightnessMode(value: Int) = private fun setScreenBrightnessMode(value: Int) =