Loading src/com/android/settings/supervision/SupervisionDashboardScreen.kt +1 −1 Original line number Diff line number Diff line Loading @@ -57,7 +57,7 @@ class SupervisionDashboardScreen : PreferenceScreenCreator { override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(context, this) { +SupervisionMainSwitchPreference(context) +SupervisionMainSwitchPreference(context, SupervisionMessengerClient(context)) +TitlelessPreferenceGroup(SUPERVISION_DYNAMIC_GROUP_1) += { +SupervisionWebContentFiltersScreen.KEY } Loading src/com/android/settings/supervision/SupervisionMainSwitchPreference.kt +47 −10 Original line number Diff line number Diff line Loading @@ -19,10 +19,10 @@ import android.app.Activity import android.app.supervision.SupervisionManager import android.content.Context import android.content.Intent import android.util.Log import androidx.annotation.VisibleForTesting import androidx.preference.Preference import com.android.settings.R import com.android.settings.supervision.ipc.PreferenceData import com.android.settingslib.datastore.KeyValueStore import com.android.settingslib.datastore.NoOpKeyedObservable import com.android.settingslib.metadata.BooleanValuePreference Loading @@ -35,9 +35,17 @@ import com.android.settingslib.metadata.SensitivityLevel import com.android.settingslib.preference.forEachRecursively import com.android.settingslib.widget.MainSwitchPreference import com.android.settingslib.widget.MainSwitchPreferenceBinding import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext /** Main toggle to enable or disable device supervision. */ class SupervisionMainSwitchPreference(context: Context) : class SupervisionMainSwitchPreference( context: Context, private val preferenceDataProvider: PreferenceDataProvider, private val coroutineDispatcher: CoroutineDispatcher = Dispatchers.IO, ) : BooleanValuePreference, MainSwitchPreferenceBinding, PreferenceSummaryProvider, Loading @@ -45,6 +53,7 @@ class SupervisionMainSwitchPreference(context: Context) : PreferenceLifecycleProvider { private val supervisionMainSwitchStorage = SupervisionMainSwitchStorage(context) private var preferenceDataMap: Map<String, PreferenceData>? = null private lateinit var lifeCycleContext: PreferenceLifecycleContext override val key Loading Loading @@ -74,10 +83,27 @@ class SupervisionMainSwitchPreference(context: Context) : } override fun onResume(context: PreferenceLifecycleContext) { val mainSwitchPreference = context.findPreference<Preference>(KEY) updateDependentPreferencesEnabledState( context.findPreference<Preference>(KEY), mainSwitchPreference, supervisionMainSwitchStorage.getBoolean(KEY)!!, ) val preferenceKeys = buildList<String> { mainSwitchPreference?.parent?.forEachRecursively { if (it.parent?.key == SupervisionDashboardScreen.SUPERVISION_DYNAMIC_GROUP_1) { add(it.key) } } } context.lifecycleScope.launch { preferenceDataMap = withContext(coroutineDispatcher) { preferenceDataProvider.getPreferenceData(preferenceKeys) } updateDependentPreferenceSummary(mainSwitchPreference) } } override fun onActivityResult( Loading @@ -86,8 +112,10 @@ class SupervisionMainSwitchPreference(context: Context) : resultCode: Int, data: Intent?, ): Boolean { if (requestCode != REQUEST_CODE_SET_UP_SUPERVISION && requestCode != REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS) { if ( requestCode != REQUEST_CODE_SET_UP_SUPERVISION && requestCode != REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS ) { return false } if (resultCode == Activity.RESULT_OK) { Loading @@ -95,6 +123,7 @@ class SupervisionMainSwitchPreference(context: Context) : val newValue = !supervisionMainSwitchStorage.getBoolean(KEY)!! mainSwitchPreference.setChecked(newValue) updateDependentPreferencesEnabledState(mainSwitchPreference, newValue) updateDependentPreferenceSummary(mainSwitchPreference) lifeCycleContext.notifyPreferenceChange(SupervisionPinManagementScreen.KEY) } Loading Loading @@ -139,6 +168,17 @@ class SupervisionMainSwitchPreference(context: Context) : } } private fun updateDependentPreferenceSummary(preference: Preference?) { preference?.parent?.forEachRecursively { if (it.parent?.key == SupervisionDashboardScreen.SUPERVISION_DYNAMIC_GROUP_1) { val newSummary = preferenceDataMap?.get(it.key)?.summary if (newSummary != null) { it.summary = newSummary } } } } @Suppress("UNCHECKED_CAST") private class SupervisionMainSwitchStorage(private val context: Context) : NoOpKeyedObservable<String>(), KeyValueStore { Loading @@ -159,10 +199,7 @@ class SupervisionMainSwitchPreference(context: Context) : companion object { const val KEY = "device_supervision_switch" @VisibleForTesting const val REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS = 0 @VisibleForTesting const val REQUEST_CODE_SET_UP_SUPERVISION = 1 @VisibleForTesting const val REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS = 0 @VisibleForTesting const val REQUEST_CODE_SET_UP_SUPERVISION = 1 } } tests/robotests/src/com/android/settings/supervision/SupervisionMainSwitchPreferenceTest.kt +27 −20 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.settings.supervision.SupervisionMainSwitchPreference.Companion.REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS import com.android.settings.supervision.SupervisionMainSwitchPreference.Companion.REQUEST_CODE_SET_UP_SUPERVISION import com.android.settings.supervision.ipc.PreferenceData import com.android.settingslib.metadata.PreferenceLifecycleContext import com.android.settingslib.preference.createAndBindWidget import com.android.settingslib.widget.MainSwitchPreference Loading @@ -37,6 +38,7 @@ import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.kotlin.any import org.mockito.kotlin.argumentCaptor import org.mockito.kotlin.doReturn import org.mockito.kotlin.eq Loading @@ -63,7 +65,10 @@ class SupervisionMainSwitchPreferenceTest { } } private val preference = SupervisionMainSwitchPreference(context) private val preferenceDataProvider: PreferenceDataProvider = mock { onBlocking { getPreferenceData(any()) }.thenAnswer { mapOf<String, PreferenceData>() } } private val preference = SupervisionMainSwitchPreference(context, preferenceDataProvider) @Before fun setUp() { Loading Loading @@ -95,8 +100,10 @@ class SupervisionMainSwitchPreferenceTest { widget.performClick() verifyActivityStarted(REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS, ConfirmSupervisionCredentialsActivity::class.java.name) verifyActivityStarted( REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS, ConfirmSupervisionCredentialsActivity::class.java.name, ) assertThat(widget.isChecked).isFalse() verify(mockSupervisionManager, never()).setSupervisionEnabled(false) } Loading @@ -111,8 +118,10 @@ class SupervisionMainSwitchPreferenceTest { widget.performClick() verifyActivityStarted(REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS, ConfirmSupervisionCredentialsActivity::class.java.name) verifyActivityStarted( REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS, ConfirmSupervisionCredentialsActivity::class.java.name, ) assertThat(widget.isChecked).isTrue() verify(mockSupervisionManager, never()).setSupervisionEnabled(false) } Loading @@ -127,8 +136,10 @@ class SupervisionMainSwitchPreferenceTest { widget.performClick() verifyActivityStarted(REQUEST_CODE_SET_UP_SUPERVISION, SetupSupervisionActivity::class.java.name) verifyActivityStarted( REQUEST_CODE_SET_UP_SUPERVISION, SetupSupervisionActivity::class.java.name, ) assertThat(widget.isChecked).isFalse() verify(mockSupervisionManager, never()).setSupervisionEnabled(false) } Loading Loading @@ -239,7 +250,8 @@ class SupervisionMainSwitchPreferenceTest { else listOf(MAIN_USER) } mockKeyguardManager.stub { on { isDeviceSecure(SUPERVISING_PROFILE.id) } doReturn supervisingProfileCreated } on { isDeviceSecure(SUPERVISING_PROFILE.id) } doReturn supervisingProfileCreated } } private fun getMainSwitchPreference(): MainSwitchPreference { Loading @@ -257,19 +269,14 @@ class SupervisionMainSwitchPreferenceTest { private fun verifyActivityStarted(requestCode: Int, className: String) { val intentCaptor = argumentCaptor<Intent>() verify(mockLifeCycleContext) .startActivityForResult( intentCaptor.capture(), eq(requestCode), eq(null), ) .startActivityForResult(intentCaptor.capture(), eq(requestCode), eq(null)) assertThat(intentCaptor.allValues.size).isEqualTo(1) assertThat(intentCaptor.firstValue.component?.className) .isEqualTo(className) assertThat(intentCaptor.firstValue.component?.className).isEqualTo(className) } companion object { private val MAIN_USER = UserInfo(0, "Main", null, 0, USER_TYPE_FULL_SYSTEM) private val SUPERVISING_PROFILE = UserInfo(10, "Supervising", null, 0, USER_TYPE_PROFILE_SUPERVISING) private val SUPERVISING_PROFILE = UserInfo(10, "Supervising", null, 0, USER_TYPE_PROFILE_SUPERVISING) } } Loading
src/com/android/settings/supervision/SupervisionDashboardScreen.kt +1 −1 Original line number Diff line number Diff line Loading @@ -57,7 +57,7 @@ class SupervisionDashboardScreen : PreferenceScreenCreator { override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(context, this) { +SupervisionMainSwitchPreference(context) +SupervisionMainSwitchPreference(context, SupervisionMessengerClient(context)) +TitlelessPreferenceGroup(SUPERVISION_DYNAMIC_GROUP_1) += { +SupervisionWebContentFiltersScreen.KEY } Loading
src/com/android/settings/supervision/SupervisionMainSwitchPreference.kt +47 −10 Original line number Diff line number Diff line Loading @@ -19,10 +19,10 @@ import android.app.Activity import android.app.supervision.SupervisionManager import android.content.Context import android.content.Intent import android.util.Log import androidx.annotation.VisibleForTesting import androidx.preference.Preference import com.android.settings.R import com.android.settings.supervision.ipc.PreferenceData import com.android.settingslib.datastore.KeyValueStore import com.android.settingslib.datastore.NoOpKeyedObservable import com.android.settingslib.metadata.BooleanValuePreference Loading @@ -35,9 +35,17 @@ import com.android.settingslib.metadata.SensitivityLevel import com.android.settingslib.preference.forEachRecursively import com.android.settingslib.widget.MainSwitchPreference import com.android.settingslib.widget.MainSwitchPreferenceBinding import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext /** Main toggle to enable or disable device supervision. */ class SupervisionMainSwitchPreference(context: Context) : class SupervisionMainSwitchPreference( context: Context, private val preferenceDataProvider: PreferenceDataProvider, private val coroutineDispatcher: CoroutineDispatcher = Dispatchers.IO, ) : BooleanValuePreference, MainSwitchPreferenceBinding, PreferenceSummaryProvider, Loading @@ -45,6 +53,7 @@ class SupervisionMainSwitchPreference(context: Context) : PreferenceLifecycleProvider { private val supervisionMainSwitchStorage = SupervisionMainSwitchStorage(context) private var preferenceDataMap: Map<String, PreferenceData>? = null private lateinit var lifeCycleContext: PreferenceLifecycleContext override val key Loading Loading @@ -74,10 +83,27 @@ class SupervisionMainSwitchPreference(context: Context) : } override fun onResume(context: PreferenceLifecycleContext) { val mainSwitchPreference = context.findPreference<Preference>(KEY) updateDependentPreferencesEnabledState( context.findPreference<Preference>(KEY), mainSwitchPreference, supervisionMainSwitchStorage.getBoolean(KEY)!!, ) val preferenceKeys = buildList<String> { mainSwitchPreference?.parent?.forEachRecursively { if (it.parent?.key == SupervisionDashboardScreen.SUPERVISION_DYNAMIC_GROUP_1) { add(it.key) } } } context.lifecycleScope.launch { preferenceDataMap = withContext(coroutineDispatcher) { preferenceDataProvider.getPreferenceData(preferenceKeys) } updateDependentPreferenceSummary(mainSwitchPreference) } } override fun onActivityResult( Loading @@ -86,8 +112,10 @@ class SupervisionMainSwitchPreference(context: Context) : resultCode: Int, data: Intent?, ): Boolean { if (requestCode != REQUEST_CODE_SET_UP_SUPERVISION && requestCode != REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS) { if ( requestCode != REQUEST_CODE_SET_UP_SUPERVISION && requestCode != REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS ) { return false } if (resultCode == Activity.RESULT_OK) { Loading @@ -95,6 +123,7 @@ class SupervisionMainSwitchPreference(context: Context) : val newValue = !supervisionMainSwitchStorage.getBoolean(KEY)!! mainSwitchPreference.setChecked(newValue) updateDependentPreferencesEnabledState(mainSwitchPreference, newValue) updateDependentPreferenceSummary(mainSwitchPreference) lifeCycleContext.notifyPreferenceChange(SupervisionPinManagementScreen.KEY) } Loading Loading @@ -139,6 +168,17 @@ class SupervisionMainSwitchPreference(context: Context) : } } private fun updateDependentPreferenceSummary(preference: Preference?) { preference?.parent?.forEachRecursively { if (it.parent?.key == SupervisionDashboardScreen.SUPERVISION_DYNAMIC_GROUP_1) { val newSummary = preferenceDataMap?.get(it.key)?.summary if (newSummary != null) { it.summary = newSummary } } } } @Suppress("UNCHECKED_CAST") private class SupervisionMainSwitchStorage(private val context: Context) : NoOpKeyedObservable<String>(), KeyValueStore { Loading @@ -159,10 +199,7 @@ class SupervisionMainSwitchPreference(context: Context) : companion object { const val KEY = "device_supervision_switch" @VisibleForTesting const val REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS = 0 @VisibleForTesting const val REQUEST_CODE_SET_UP_SUPERVISION = 1 @VisibleForTesting const val REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS = 0 @VisibleForTesting const val REQUEST_CODE_SET_UP_SUPERVISION = 1 } }
tests/robotests/src/com/android/settings/supervision/SupervisionMainSwitchPreferenceTest.kt +27 −20 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.settings.supervision.SupervisionMainSwitchPreference.Companion.REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS import com.android.settings.supervision.SupervisionMainSwitchPreference.Companion.REQUEST_CODE_SET_UP_SUPERVISION import com.android.settings.supervision.ipc.PreferenceData import com.android.settingslib.metadata.PreferenceLifecycleContext import com.android.settingslib.preference.createAndBindWidget import com.android.settingslib.widget.MainSwitchPreference Loading @@ -37,6 +38,7 @@ import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.kotlin.any import org.mockito.kotlin.argumentCaptor import org.mockito.kotlin.doReturn import org.mockito.kotlin.eq Loading @@ -63,7 +65,10 @@ class SupervisionMainSwitchPreferenceTest { } } private val preference = SupervisionMainSwitchPreference(context) private val preferenceDataProvider: PreferenceDataProvider = mock { onBlocking { getPreferenceData(any()) }.thenAnswer { mapOf<String, PreferenceData>() } } private val preference = SupervisionMainSwitchPreference(context, preferenceDataProvider) @Before fun setUp() { Loading Loading @@ -95,8 +100,10 @@ class SupervisionMainSwitchPreferenceTest { widget.performClick() verifyActivityStarted(REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS, ConfirmSupervisionCredentialsActivity::class.java.name) verifyActivityStarted( REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS, ConfirmSupervisionCredentialsActivity::class.java.name, ) assertThat(widget.isChecked).isFalse() verify(mockSupervisionManager, never()).setSupervisionEnabled(false) } Loading @@ -111,8 +118,10 @@ class SupervisionMainSwitchPreferenceTest { widget.performClick() verifyActivityStarted(REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS, ConfirmSupervisionCredentialsActivity::class.java.name) verifyActivityStarted( REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS, ConfirmSupervisionCredentialsActivity::class.java.name, ) assertThat(widget.isChecked).isTrue() verify(mockSupervisionManager, never()).setSupervisionEnabled(false) } Loading @@ -127,8 +136,10 @@ class SupervisionMainSwitchPreferenceTest { widget.performClick() verifyActivityStarted(REQUEST_CODE_SET_UP_SUPERVISION, SetupSupervisionActivity::class.java.name) verifyActivityStarted( REQUEST_CODE_SET_UP_SUPERVISION, SetupSupervisionActivity::class.java.name, ) assertThat(widget.isChecked).isFalse() verify(mockSupervisionManager, never()).setSupervisionEnabled(false) } Loading Loading @@ -239,7 +250,8 @@ class SupervisionMainSwitchPreferenceTest { else listOf(MAIN_USER) } mockKeyguardManager.stub { on { isDeviceSecure(SUPERVISING_PROFILE.id) } doReturn supervisingProfileCreated } on { isDeviceSecure(SUPERVISING_PROFILE.id) } doReturn supervisingProfileCreated } } private fun getMainSwitchPreference(): MainSwitchPreference { Loading @@ -257,19 +269,14 @@ class SupervisionMainSwitchPreferenceTest { private fun verifyActivityStarted(requestCode: Int, className: String) { val intentCaptor = argumentCaptor<Intent>() verify(mockLifeCycleContext) .startActivityForResult( intentCaptor.capture(), eq(requestCode), eq(null), ) .startActivityForResult(intentCaptor.capture(), eq(requestCode), eq(null)) assertThat(intentCaptor.allValues.size).isEqualTo(1) assertThat(intentCaptor.firstValue.component?.className) .isEqualTo(className) assertThat(intentCaptor.firstValue.component?.className).isEqualTo(className) } companion object { private val MAIN_USER = UserInfo(0, "Main", null, 0, USER_TYPE_FULL_SYSTEM) private val SUPERVISING_PROFILE = UserInfo(10, "Supervising", null, 0, USER_TYPE_PROFILE_SUPERVISING) private val SUPERVISING_PROFILE = UserInfo(10, "Supervising", null, 0, USER_TYPE_PROFILE_SUPERVISING) } }