Merge "Update the isEnabled state of preferences in supervision features group according to main switch" into main
This commit is contained in:
@@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user