Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 33c580ec authored by Jacky Wang's avatar Jacky Wang
Browse files

[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
parent 2c4aec3a
Loading
Loading
Loading
Loading
+8 −15
Original line number Diff line number Diff line
@@ -16,17 +16,15 @@
package com.android.settings.display

import android.content.Context
import android.os.Process
import android.os.UserHandle
import android.os.UserManager
import android.provider.Settings
import android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
import android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL
import androidx.preference.Preference
import com.android.settings.PreferenceRestrictionMixin
import com.android.settings.R
import com.android.settings.flags.Flags
import com.android.settingslib.PrimarySwitchPreference
import com.android.settingslib.RestrictedLockUtilsInternal
import com.android.settingslib.datastore.KeyValueStore
import com.android.settingslib.datastore.KeyedObservableDelegate
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.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
@@ -47,7 +44,7 @@ class AutoBrightnessScreen :
    PreferenceScreenCreator,
    PreferenceScreenBinding,
    PreferenceAvailabilityProvider,
    PreferenceRestrictionProvider,
    PreferenceRestrictionMixin,
    PersistentPreference<Boolean>,
    BooleanValue {
    override val key: String
@@ -75,23 +72,19 @@ class AutoBrightnessScreen :
            com.android.internal.R.bool.config_automatic_brightness_available
        )

    override fun isEnabled(context: Context) =
        !UserManager.get(context)
            .hasBaseUserRestriction(UserManager.DISALLOW_CONFIG_BRIGHTNESS, Process.myUserHandle())
    override fun isEnabled(context: Context) = super<PreferenceRestrictionMixin>.isEnabled(context)

    override fun isRestricted(context: Context) =
        RestrictedLockUtilsInternal.checkIfRestrictionEnforced(
            context,
            UserManager.DISALLOW_CONFIG_BRIGHTNESS,
            UserHandle.myUserId(),
        ) != null
    override val restrictionKey: String
        get() = UserManager.DISALLOW_CONFIG_BRIGHTNESS

    override val useAdminDisabledSummary: Boolean
        get() = true

    override fun createWidget(context: Context) = PrimarySwitchPreference(context)

    override fun bind(preference: Preference, metadata: PreferenceMetadata) {
        super.bind(preference, metadata)
        (preference as PrimarySwitchPreference).apply {
            useAdminDisabledSummary(true)
            isSwitchEnabled = isEnabled
            // "true" is not the real default value (it is provided by AutoBrightnessDataStore)
            isChecked = preferenceDataStore!!.getBoolean(key, true)
+20 −28
Original line number Diff line number Diff line
@@ -23,15 +23,13 @@ import android.content.Intent.EXTRA_BRIGHTNESS_DIALOG_IS_FULL_WIDTH
import android.hardware.display.BrightnessInfo
import android.hardware.display.DisplayManager
import android.hardware.display.DisplayManager.DisplayListener
import android.os.Process
import android.os.UserHandle
import android.os.UserManager
import android.provider.Settings.System
import androidx.preference.Preference
import com.android.settings.PreferenceRestrictionMixin
import com.android.settings.R
import com.android.settings.Utils
import com.android.settings.core.SettingsBaseActivity
import com.android.settingslib.RestrictedLockUtilsInternal
import com.android.settingslib.RestrictedPreference
import com.android.settingslib.datastore.HandlerExecutor
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.PreferenceLifecycleProvider
import com.android.settingslib.metadata.PreferenceMetadata
import com.android.settingslib.metadata.PreferenceRestrictionProvider
import com.android.settingslib.metadata.PreferenceSummaryProvider
import com.android.settingslib.preference.PreferenceBinding
import com.android.settingslib.transition.SettingsTransitionHelper
@@ -52,7 +49,7 @@ import java.text.NumberFormat
class BrightnessLevelRestrictedPreference :
    PreferenceMetadata,
    PreferenceBinding,
    PreferenceRestrictionProvider,
    PreferenceRestrictionMixin,
    PreferenceSummaryProvider,
    PreferenceLifecycleProvider,
    Preference.OnPreferenceClickListener {
@@ -69,35 +66,29 @@ class BrightnessLevelRestrictedPreference :
    override val keywords: Int
        get() = R.string.keywords_display_brightness_level

    override fun getSummary(context: Context) =
    override fun getSummary(context: Context): CharSequence? =
        NumberFormat.getPercentInstance().format(getCurrentBrightness(context))

    override fun isEnabled(context: Context) =
        !UserManager.get(context)
            .hasBaseUserRestriction(UserManager.DISALLOW_CONFIG_BRIGHTNESS, Process.myUserHandle())
    override fun isEnabled(context: Context) = super<PreferenceRestrictionMixin>.isEnabled(context)

    override fun isRestricted(context: Context) =
        RestrictedLockUtilsInternal.checkIfRestrictionEnforced(
            context,
            UserManager.DISALLOW_CONFIG_BRIGHTNESS,
            UserHandle.myUserId(),
        ) != null
    override val restrictionKey: String
        get() = UserManager.DISALLOW_CONFIG_BRIGHTNESS

    override val useAdminDisabledSummary: Boolean
        get() = true

    override fun createWidget(context: Context) = RestrictedPreference(context)

    override fun bind(preference: Preference, metadata: PreferenceMetadata) {
        super.bind(preference, metadata)
        if (preference is RestrictedPreference) preference.useAdminDisabledSummary(true)
        preference.onPreferenceClickListener = this
    }

    override fun onStart(context: PreferenceLifecycleContext) {
        val observer =
            object : KeyedObserver<String> {
                override fun onKeyChanged(key: String, reason: Int) {
            KeyedObserver<String> { _, _ ->
                context.notifyPreferenceChange(this@BrightnessLevelRestrictedPreference)
            }
            }
        brightnessObserver = observer
        SettingsSystemStore.get(context)
            .addObserver(System.SCREEN_AUTO_BRIGHTNESS_ADJ, observer, HandlerExecutor.main)
@@ -113,9 +104,7 @@ class BrightnessLevelRestrictedPreference :
                }
            }
        displayListener = listener
        context
            .getSystemService(DisplayManager::class.java)
            .registerDisplayListener(
        context.displayManager.registerDisplayListener(
            listener,
            HandlerExecutor.main,
            DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS,
@@ -129,11 +118,14 @@ class BrightnessLevelRestrictedPreference :
        }

        displayListener?.let {
            context.getSystemService(DisplayManager::class.java).unregisterDisplayListener(it)
            context.displayManager.unregisterDisplayListener(it)
            displayListener = null
        }
    }

    private val Context.displayManager: DisplayManager
        get() = getSystemService(DisplayManager::class.java)!!

    override fun onPreferenceClick(preference: Preference): Boolean {
        val context = preference.context
        val intent =
+4 −7
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@ import androidx.preference.PreferenceViewHolder
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
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.theme.R
import com.google.common.truth.Truth.assertThat
@@ -117,17 +117,14 @@ class AutoBrightnessScreenTest {
        assertThat(preferenceScreenCreator.isAvailable(context)).isFalse()
    }

    private fun getPrimarySwitchPreference(): PrimarySwitchPreference =
        preferenceScreenCreator.run {
            val preference = createWidget(context)
            preference.preferenceDataStore = PreferenceDataStoreAdapter(storage(context))
            bind(preference, this)
    private fun getPrimarySwitchPreference() =
        preferenceScreenCreator.createAndBindWidget<PrimarySwitchPreference>(context).also {
            val holder =
                PreferenceViewHolder.createInstanceForTests(
                        LayoutInflater.from(context).inflate(getResId(), /* root= */ null)
                    )
                    .apply { findViewById(androidx.preference.R.id.switchWidget) }
            preference.apply { onBindViewHolder(holder) }
            it.onBindViewHolder(holder)
        }

    private fun setScreenBrightnessMode(value: Int) =