Merge "Update the isEnabled state of preferences in supervision features group according to main switch" into main

This commit is contained in:
Zhou Liu
2025-02-25 18:40:31 -08:00
committed by Android (Google) Code Review
3 changed files with 72 additions and 3 deletions

View File

@@ -57,7 +57,7 @@ class SupervisionDashboardScreen : PreferenceScreenCreator {
override fun getPreferenceHierarchy(context: Context) = override fun getPreferenceHierarchy(context: Context) =
preferenceHierarchy(context, this) { preferenceHierarchy(context, this) {
+SupervisionMainSwitchPreference() +SupervisionMainSwitchPreference()
+TitlelessPreferenceGroup("supervision_features_group_1") += { +TitlelessPreferenceGroup(SUPERVISION_DYNAMIC_GROUP_1) += {
// Empty category for dynamic injection targeting. // Empty category for dynamic injection targeting.
} }
+SupervisionPinManagementScreen.KEY +SupervisionPinManagementScreen.KEY
@@ -65,5 +65,6 @@ class SupervisionDashboardScreen : PreferenceScreenCreator {
companion object { companion object {
const val KEY = "top_level_supervision" const val KEY = "top_level_supervision"
internal const val SUPERVISION_DYNAMIC_GROUP_1 = "supervision_features_group_1"
} }
} }

View File

@@ -17,17 +17,27 @@ package com.android.settings.supervision
import android.app.supervision.SupervisionManager import android.app.supervision.SupervisionManager
import android.content.Context import android.content.Context
import androidx.preference.Preference
import com.android.settings.R import com.android.settings.R
import com.android.settingslib.datastore.KeyValueStore import com.android.settingslib.datastore.KeyValueStore
import com.android.settingslib.datastore.NoOpKeyedObservable import com.android.settingslib.datastore.NoOpKeyedObservable
import com.android.settingslib.metadata.MainSwitchPreference import com.android.settingslib.metadata.MainSwitchPreference
import com.android.settingslib.metadata.PreferenceLifecycleContext
import com.android.settingslib.metadata.PreferenceLifecycleProvider
import com.android.settingslib.metadata.PreferenceMetadata
import com.android.settingslib.metadata.PreferenceSummaryProvider import com.android.settingslib.metadata.PreferenceSummaryProvider
import com.android.settingslib.metadata.ReadWritePermit import com.android.settingslib.metadata.ReadWritePermit
import com.android.settingslib.metadata.SensitivityLevel import com.android.settingslib.metadata.SensitivityLevel
import com.android.settingslib.preference.MainSwitchPreferenceBinding
import com.android.settingslib.preference.forEachRecursively
/** Main toggle to enable or disable device supervision. */ /** Main toggle to enable or disable device supervision. */
class SupervisionMainSwitchPreference : class SupervisionMainSwitchPreference :
MainSwitchPreference(KEY, R.string.device_supervision_switch_title), PreferenceSummaryProvider { MainSwitchPreference(KEY, R.string.device_supervision_switch_title),
PreferenceSummaryProvider,
MainSwitchPreferenceBinding,
Preference.OnPreferenceChangeListener,
PreferenceLifecycleProvider {
// TODO(b/383568136): Make presence of summary conditional on whether PIN // TODO(b/383568136): Make presence of summary conditional on whether PIN
// has been set up before or not. // has been set up before or not.
@@ -45,6 +55,43 @@ class SupervisionMainSwitchPreference :
override val sensitivityLevel: Int override val sensitivityLevel: Int
get() = SensitivityLevel.HIGH_SENSITIVITY get() = SensitivityLevel.HIGH_SENSITIVITY
override fun bind(preference: Preference, metadata: PreferenceMetadata) {
super.bind(preference, metadata)
preference.onPreferenceChangeListener = this
}
override fun onResume(context: PreferenceLifecycleContext) {
val currentValue = storage(context.applicationContext)?.getBoolean(key) ?: false
updateDependentPreferencesEnabledState(
context.findPreference<Preference>(KEY),
currentValue,
)
}
override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean {
if (newValue !is Boolean) return true
updateDependentPreferencesEnabledState(preference, newValue)
return true
}
private fun updateDependentPreferencesEnabledState(
preference: Preference?,
isChecked: Boolean,
) {
preference?.parent?.forEachRecursively {
if (
it.parent?.key?.toString() ==
SupervisionDashboardScreen.SUPERVISION_DYNAMIC_GROUP_1 ||
it.key?.toString() == SupervisionPinManagementScreen.KEY
) {
it.isEnabled = isChecked
}
}
}
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
private class SupervisionMainSwitchStorage(private val context: Context) : private class SupervisionMainSwitchStorage(private val context: Context) :
NoOpKeyedObservable<String>(), KeyValueStore { NoOpKeyedObservable<String>(), KeyValueStore {
@@ -59,7 +106,7 @@ class SupervisionMainSwitchPreference :
// TODO(b/392694561): add PIN protection to main toggle. // TODO(b/392694561): add PIN protection to main toggle.
if (key == KEY && value is Boolean) { if (key == KEY && value is Boolean) {
val supervisionManager = context.getSystemService(SupervisionManager::class.java) val supervisionManager = context.getSystemService(SupervisionManager::class.java)
supervisionManager.setSupervisionEnabled(value) supervisionManager?.setSupervisionEnabled(value)
} }
} }
} }

View File

@@ -20,8 +20,11 @@ import android.content.Context
import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.SetFlagsRule import android.platform.test.flag.junit.SetFlagsRule
import androidx.fragment.app.testing.FragmentScenario
import androidx.preference.Preference
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.widget.MainSwitchPreference
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
@@ -51,4 +54,22 @@ class SupervisionDashboardScreenTest {
fun flagDisabled() { fun flagDisabled() {
assertThat(preferenceScreenCreator.isFlagEnabled(context)).isFalse() assertThat(preferenceScreenCreator.isFlagEnabled(context)).isFalse()
} }
@Test
@EnableFlags(Flags.FLAG_ENABLE_SUPERVISION_SETTINGS_SCREEN)
fun toggleMainSwitch_disablesChildPreferences() {
FragmentScenario.launchInContainer(preferenceScreenCreator.fragmentClass()).onFragment {
fragment ->
val mainSwitchPreference =
fragment.findPreference<MainSwitchPreference>(SupervisionMainSwitchPreference.KEY)!!
val childPreference =
fragment.findPreference<Preference>(SupervisionPinManagementScreen.KEY)!!
assertThat(childPreference.isEnabled).isFalse()
mainSwitchPreference.performClick()
assertThat(childPreference.isEnabled).isTrue()
}
}
} }