diff --git a/src/com/android/settings/PreferenceRestrictionMixin.kt b/src/com/android/settings/PreferenceRestrictionMixin.kt index c70b94bf500..8a3640756fd 100644 --- a/src/com/android/settings/PreferenceRestrictionMixin.kt +++ b/src/com/android/settings/PreferenceRestrictionMixin.kt @@ -18,27 +18,42 @@ package com.android.settings import android.content.Context import android.os.UserHandle +import android.os.UserManager import androidx.annotation.CallSuper +import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin import com.android.settingslib.RestrictedLockUtilsInternal import com.android.settingslib.metadata.PreferenceRestrictionProvider /** Mixin to support restriction. */ interface PreferenceRestrictionMixin : PreferenceRestrictionProvider { - val restrictionKey: String + /** + * Keys for restriction. + * + * Preference is restricted when **ANY** key in the list is restricted. + */ + val restrictionKeys: Array val useAdminDisabledSummary: Boolean get() = false - @CallSuper fun isEnabled(context: Context) = !context.hasBaseUserRestriction(restrictionKey) + @CallSuper fun isEnabled(context: Context) = !context.hasBaseUserRestriction(restrictionKeys) override fun isRestricted(context: Context) = - RestrictedLockUtilsInternal.checkIfRestrictionEnforced( - context, - restrictionKey, - UserHandle.myUserId(), - ) != null + context.getRestrictionEnforcedAdmin(restrictionKeys) != null } -fun Context.hasBaseUserRestriction(restrictionKey: String) = - RestrictedLockUtilsInternal.hasBaseUserRestriction(this, restrictionKey, UserHandle.myUserId()) +/** Returns the admin that has enforced restriction on given keys. */ +fun Context.getRestrictionEnforcedAdmin(restrictionKeys: Array): EnforcedAdmin? { + val userId = UserHandle.myUserId() + return restrictionKeys.firstNotNullOfOrNull { + RestrictedLockUtilsInternal.checkIfRestrictionEnforced(this, it, userId) + } +} + +/** Returns if there is **any** base user restriction on given keys. */ +fun Context.hasBaseUserRestriction(restrictionKeys: Array): Boolean { + val userManager = getSystemService(UserManager::class.java) ?: return false + val userHandle = UserHandle.of(UserHandle.myUserId()) + return restrictionKeys.any { userManager.hasBaseUserRestriction(it, userHandle) } +} diff --git a/src/com/android/settings/SettingsPreferenceBindingFactory.kt b/src/com/android/settings/SettingsPreferenceBindingFactory.kt index 53e5d0f45b5..b0fa4d98d7b 100644 --- a/src/com/android/settings/SettingsPreferenceBindingFactory.kt +++ b/src/com/android/settings/SettingsPreferenceBindingFactory.kt @@ -16,7 +16,6 @@ package com.android.settings -import android.os.UserHandle import androidx.preference.Preference import com.android.settingslib.RestrictedPreferenceHelperProvider import com.android.settingslib.metadata.PreferenceHierarchyNode @@ -37,10 +36,11 @@ class SettingsPreferenceBindingFactory : DefaultPreferenceBindingFactory() { if (metadata is PreferenceRestrictionMixin) { if (preference is RestrictedPreferenceHelperProvider) { preference.getRestrictedPreferenceHelper().apply { - val restrictionKey = metadata.restrictionKey - if (!preference.context.hasBaseUserRestriction(restrictionKey)) { - useAdminDisabledSummary(metadata.useAdminDisabledSummary) - checkRestrictionAndSetDisabled(restrictionKey, UserHandle.myUserId()) + useAdminDisabledSummary(metadata.useAdminDisabledSummary) + val context = preference.context + val restrictionKeys = metadata.restrictionKeys + if (!context.hasBaseUserRestriction(restrictionKeys)) { + setDisabledByAdmin(context.getRestrictionEnforcedAdmin(restrictionKeys)) } } } diff --git a/src/com/android/settings/display/AutoBrightnessScreen.kt b/src/com/android/settings/display/AutoBrightnessScreen.kt index 5d08b1dfed1..ed667cc49bc 100644 --- a/src/com/android/settings/display/AutoBrightnessScreen.kt +++ b/src/com/android/settings/display/AutoBrightnessScreen.kt @@ -74,8 +74,8 @@ class AutoBrightnessScreen : override fun isEnabled(context: Context) = super.isEnabled(context) - override val restrictionKey: String - get() = UserManager.DISALLOW_CONFIG_BRIGHTNESS + override val restrictionKeys + get() = arrayOf(UserManager.DISALLOW_CONFIG_BRIGHTNESS) override val useAdminDisabledSummary: Boolean get() = true diff --git a/src/com/android/settings/display/BrightnessLevelPreference.kt b/src/com/android/settings/display/BrightnessLevelPreference.kt index 215f6b8d8ed..c053dfeeb71 100644 --- a/src/com/android/settings/display/BrightnessLevelPreference.kt +++ b/src/com/android/settings/display/BrightnessLevelPreference.kt @@ -71,8 +71,8 @@ class BrightnessLevelPreference : override fun isEnabled(context: Context) = super.isEnabled(context) - override val restrictionKey: String - get() = UserManager.DISALLOW_CONFIG_BRIGHTNESS + override val restrictionKeys + get() = arrayOf(UserManager.DISALLOW_CONFIG_BRIGHTNESS) override val useAdminDisabledSummary: Boolean get() = true diff --git a/src/com/android/settings/network/MobileNetworkListScreen.kt b/src/com/android/settings/network/MobileNetworkListScreen.kt index 51c068bfbb3..2e05e3aabb4 100644 --- a/src/com/android/settings/network/MobileNetworkListScreen.kt +++ b/src/com/android/settings/network/MobileNetworkListScreen.kt @@ -40,8 +40,8 @@ class MobileNetworkListScreen : PreferenceScreenCreator, PreferenceRestrictionMi override fun isEnabled(context: Context) = super.isEnabled(context) - override val restrictionKey: String - get() = UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS + override val restrictionKeys + get() = arrayOf(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS) override fun isFlagEnabled(context: Context) = Flags.catalystMobileNetworkList() diff --git a/src/com/android/settings/network/NetworkProviderScreen.kt b/src/com/android/settings/network/NetworkProviderScreen.kt index 77ecf3aaa85..7478761b882 100644 --- a/src/com/android/settings/network/NetworkProviderScreen.kt +++ b/src/com/android/settings/network/NetworkProviderScreen.kt @@ -45,8 +45,8 @@ class NetworkProviderScreen : override fun isEnabled(context: Context) = super.isEnabled(context) - override val restrictionKey: String - get() = UserManager.DISALLOW_CONFIG_WIFI + override val restrictionKeys + get() = arrayOf(UserManager.DISALLOW_CONFIG_WIFI) override fun isFlagEnabled(context: Context) = Flags.catalystInternetSettings() diff --git a/src/com/android/settings/network/tether/TetherScreen.kt b/src/com/android/settings/network/tether/TetherScreen.kt index 542fd5f743c..fd0d4c89487 100644 --- a/src/com/android/settings/network/tether/TetherScreen.kt +++ b/src/com/android/settings/network/tether/TetherScreen.kt @@ -54,8 +54,8 @@ class TetherScreen : override fun isEnabled(context: Context) = super.isEnabled(context) - override val restrictionKey: String - get() = UserManager.DISALLOW_CONFIG_TETHERING + override val restrictionKeys + get() = arrayOf(UserManager.DISALLOW_CONFIG_TETHERING) override fun isFlagEnabled(context: Context) = Flags.catalystTetherSettings() diff --git a/src/com/android/settings/notification/CallVolumePreference.kt b/src/com/android/settings/notification/CallVolumePreference.kt index df6c4275c94..2b1d318913a 100644 --- a/src/com/android/settings/notification/CallVolumePreference.kt +++ b/src/com/android/settings/notification/CallVolumePreference.kt @@ -57,8 +57,8 @@ open class CallVolumePreference : override fun isEnabled(context: Context) = super.isEnabled(context) - override val restrictionKey: String - get() = UserManager.DISALLOW_ADJUST_VOLUME + override val restrictionKeys + get() = arrayOf(UserManager.DISALLOW_ADJUST_VOLUME) override fun storage(context: Context): KeyValueStore { val helper = createAudioHelper(context) diff --git a/src/com/android/settings/notification/MediaVolumePreference.kt b/src/com/android/settings/notification/MediaVolumePreference.kt index a39023361f4..c747a651c54 100644 --- a/src/com/android/settings/notification/MediaVolumePreference.kt +++ b/src/com/android/settings/notification/MediaVolumePreference.kt @@ -58,8 +58,8 @@ open class MediaVolumePreference : override fun isEnabled(context: Context) = super.isEnabled(context) - override val restrictionKey: String - get() = UserManager.DISALLOW_ADJUST_VOLUME + override val restrictionKeys + get() = arrayOf(UserManager.DISALLOW_ADJUST_VOLUME) override fun storage(context: Context): KeyValueStore { val helper = createAudioHelper(context) diff --git a/src/com/android/settings/notification/SeparateRingVolumePreference.kt b/src/com/android/settings/notification/SeparateRingVolumePreference.kt index c6485686f52..64699c65587 100644 --- a/src/com/android/settings/notification/SeparateRingVolumePreference.kt +++ b/src/com/android/settings/notification/SeparateRingVolumePreference.kt @@ -67,8 +67,8 @@ open class SeparateRingVolumePreference : override fun isEnabled(context: Context) = super.isEnabled(context) - override val restrictionKey: String - get() = UserManager.DISALLOW_ADJUST_VOLUME + override val restrictionKeys + get() = arrayOf(UserManager.DISALLOW_ADJUST_VOLUME) override fun storage(context: Context): KeyValueStore { val helper = createAudioHelper(context) diff --git a/src/com/android/settings/restriction/UserRestrictionBindingHelper.kt b/src/com/android/settings/restriction/UserRestrictionBindingHelper.kt index fb7466aabd0..16104de782f 100644 --- a/src/com/android/settings/restriction/UserRestrictionBindingHelper.kt +++ b/src/com/android/settings/restriction/UserRestrictionBindingHelper.kt @@ -34,7 +34,9 @@ class UserRestrictionBindingHelper( screenBindingHelper.forEachRecursively { val metadata = it.metadata if (metadata is PreferenceRestrictionMixin) { - getOrPut(metadata.restrictionKey) { mutableSetOf() }.add(metadata.key) + for (restrictionKey in metadata.restrictionKeys) { + getOrPut(restrictionKey) { mutableSetOf() }.add(metadata.key) + } } } }