Loading src/com/android/settings/supervision/SupervisionSafeSitesPreference.kt +12 −25 Original line number Diff line number Diff line Loading @@ -18,6 +18,10 @@ package com.android.settings.supervision import android.app.Activity import android.content.Context import android.content.Intent import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult import androidx.annotation.VisibleForTesting import androidx.preference.Preference import com.android.settings.R import com.android.settingslib.datastore.Permissions Loading @@ -41,7 +45,7 @@ sealed class SupervisionSafeSitesPreference( PreferenceLifecycleProvider { private lateinit var lifeCycleContext: PreferenceLifecycleContext abstract val supervisionCredentialRequestCode: Int private lateinit var supervisionCredentialLauncher: ActivityResultLauncher<Intent> override fun storage(context: Context) = dataStore Loading @@ -66,16 +70,13 @@ sealed class SupervisionSafeSitesPreference( override fun onCreate(context: PreferenceLifecycleContext) { lifeCycleContext = context supervisionCredentialLauncher = context.registerForActivityResult(StartActivityForResult(), ::onConfirmCredentials) } override fun onRadioButtonClicked(emitter: SelectorWithWidgetPreference) { val intent = Intent(lifeCycleContext, ConfirmSupervisionCredentialsActivity::class.java) lifeCycleContext.startActivityForResult( intent, supervisionCredentialRequestCode, /* options= */ null, ) supervisionCredentialLauncher.launch(intent) } override fun bind(preference: Preference, metadata: PreferenceMetadata) { Loading @@ -86,24 +87,16 @@ sealed class SupervisionSafeSitesPreference( } } override fun onActivityResult( context: PreferenceLifecycleContext, requestCode: Int, resultCode: Int, data: Intent?, ): Boolean { if (requestCode != supervisionCredentialRequestCode) return false if (resultCode == Activity.RESULT_OK) { val preference = context.findPreference<SelectorWithWidgetPreference>(key) // Iterate through the SafeSites options and update the checked status. @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) fun onConfirmCredentials(result: ActivityResult) { if (result.resultCode == Activity.RESULT_OK) { val preference = lifeCycleContext.findPreference<SelectorWithWidgetPreference>(key) preference?.parent?.forEachRecursively { if (it is SelectorWithWidgetPreference) { it.isChecked = it.key == key } } return true } return false } } Loading @@ -119,11 +112,8 @@ class SupervisionBlockExplicitSitesPreference(dataStore: SupervisionSafeSitesDat override val summary get() = R.string.supervision_web_content_filters_browser_block_explicit_sites_summary override val supervisionCredentialRequestCode = REQUEST_CODE_SUPERVISION_CREDENTIALS companion object { const val KEY = "web_content_filters_browser_block_explicit_sites" const val REQUEST_CODE_SUPERVISION_CREDENTIALS = 10 } } Loading @@ -136,10 +126,7 @@ class SupervisionAllowAllSitesPreference(dataStore: SupervisionSafeSitesDataStor override val title get() = R.string.supervision_web_content_filters_browser_allow_all_sites_title override val supervisionCredentialRequestCode = REQUEST_CODE_SUPERVISION_CREDENTIALS companion object { const val KEY = "web_content_filters_browser_allow_all_sites" const val REQUEST_CODE_SUPERVISION_CREDENTIALS = 11 } } tests/robotests/src/com/android/settings/supervision/SupervisionSafeSitesPreferenceTest.kt +33 −41 Original line number Diff line number Diff line Loading @@ -21,6 +21,9 @@ import android.content.Intent import android.provider.Settings import android.provider.Settings.Secure.BROWSER_CONTENT_FILTERS_ENABLED import android.provider.Settings.SettingNotFoundException import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult import androidx.preference.Preference import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 Loading @@ -34,16 +37,19 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mockito.mock import org.mockito.Mockito.`when` import org.mockito.kotlin.any import org.mockito.kotlin.argumentCaptor import org.mockito.kotlin.doReturn import org.mockito.kotlin.eq import org.mockito.kotlin.stub import org.mockito.kotlin.verify @RunWith(AndroidJUnit4::class) class SupervisionSafeSitesPreferenceTest { private val mockLifeCycleContext = mock(PreferenceLifecycleContext::class.java) private val context: Context = ApplicationProvider.getApplicationContext() private lateinit var mockLifeCycleContext: PreferenceLifecycleContext private lateinit var mockActivityResultLauncher: ActivityResultLauncher<Intent> private lateinit var dataStore: SupervisionSafeSitesDataStore private lateinit var allowAllSitesPreference: SupervisionAllowAllSitesPreference private lateinit var blockExplicitSitesPreference: SupervisionBlockExplicitSitesPreference Loading @@ -51,6 +57,10 @@ class SupervisionSafeSitesPreferenceTest { @Before fun setUp() { dataStore = SupervisionSafeSitesDataStore(context) mockLifeCycleContext = mock(PreferenceLifecycleContext::class.java) mockActivityResultLauncher = mock(ActivityResultLauncher::class.java) as ActivityResultLauncher<Intent> mockConfirmSupervisionCredentialsActivity() allowAllSitesPreference = SupervisionAllowAllSitesPreference(dataStore) allowAllSitesPreference.onCreate(mockLifeCycleContext) blockExplicitSitesPreference = SupervisionBlockExplicitSitesPreference(dataStore) Loading Loading @@ -101,19 +111,19 @@ class SupervisionSafeSitesPreferenceTest { blockExplicitSitesWidget.performClick() verifyConfirmSupervisionCredentialsActivityStarted( SupervisionBlockExplicitSitesPreference.REQUEST_CODE_SUPERVISION_CREDENTIALS verifyConfirmSupervisionCredentialsActivity() blockExplicitSitesPreference.onConfirmCredentials( ActivityResult(Activity.RESULT_CANCELED, null) ) val result = blockExplicitSitesPreference.onActivityResult( mockLifeCycleContext, SupervisionBlockExplicitSitesPreference.REQUEST_CODE_SUPERVISION_CREDENTIALS, Activity.RESULT_CANCELED, null, assertThat(blockExplicitSitesWidget.isChecked).isFalse() assertThat( Settings.Secure.getInt( context.getContentResolver(), BROWSER_CONTENT_FILTERS_ENABLED, ) assertThat(result).isFalse() ) .isEqualTo(0) } @Test Loading @@ -124,19 +134,9 @@ class SupervisionSafeSitesPreferenceTest { blockExplicitSitesWidget.performClick() verifyConfirmSupervisionCredentialsActivityStarted( SupervisionBlockExplicitSitesPreference.REQUEST_CODE_SUPERVISION_CREDENTIALS ) verifyConfirmSupervisionCredentialsActivity() blockExplicitSitesPreference.onConfirmCredentials(ActivityResult(Activity.RESULT_OK, null)) val result = blockExplicitSitesPreference.onActivityResult( mockLifeCycleContext, SupervisionBlockExplicitSitesPreference.REQUEST_CODE_SUPERVISION_CREDENTIALS, Activity.RESULT_OK, null, ) assertThat(result).isTrue() assertThat(blockExplicitSitesWidget.isChecked).isTrue() assertThat( Settings.Secure.getInt( Loading @@ -154,19 +154,9 @@ class SupervisionSafeSitesPreferenceTest { assertThat(allowAllSitesWidget.isChecked).isFalse() allowAllSitesWidget.performClick() verifyConfirmSupervisionCredentialsActivityStarted( SupervisionAllowAllSitesPreference.REQUEST_CODE_SUPERVISION_CREDENTIALS ) val result = allowAllSitesPreference.onActivityResult( mockLifeCycleContext, SupervisionAllowAllSitesPreference.REQUEST_CODE_SUPERVISION_CREDENTIALS, Activity.RESULT_OK, null, ) verifyConfirmSupervisionCredentialsActivity() allowAllSitesPreference.onConfirmCredentials(ActivityResult(Activity.RESULT_OK, null)) assertThat(result).isTrue() assertThat(allowAllSitesWidget.isChecked).isTrue() assertThat( Settings.Secure.getInt( Loading Loading @@ -202,14 +192,16 @@ class SupervisionSafeSitesPreferenceTest { return widget } private fun verifyConfirmSupervisionCredentialsActivityStarted(requestCode: Int) { val intentCaptor = argumentCaptor<Intent>() private fun mockConfirmSupervisionCredentialsActivity() { `when`(mockLifeCycleContext.registerForActivityResult(any<StartActivityForResult>(), any())) .thenReturn(mockActivityResultLauncher) } verify(mockLifeCycleContext) .startActivityForResult(intentCaptor.capture(), eq(requestCode), eq(null)) private fun verifyConfirmSupervisionCredentialsActivity() { val intentCaptor = argumentCaptor<Intent>() verify(mockActivityResultLauncher).launch(intentCaptor.capture()) assertThat(intentCaptor.allValues.size).isEqualTo(1) assertThat(intentCaptor.firstValue.component?.className) .isEqualTo(ConfirmSupervisionCredentialsActivity::class.java.name) } Loading tests/robotests/src/com/android/settings/supervision/SupervisionWebContentFiltersScreenTest.kt +11 −11 Original line number Diff line number Diff line Loading @@ -81,18 +81,18 @@ class SupervisionWebContentFiltersScreenTest { fragment.findPreference<SelectorWithWidgetPreference>( SupervisionBlockExplicitSitesPreference.KEY )!! assertThat(allowAllSitesPreference.isChecked).isTrue() assertThat(blockExplicitSitesPreference.isChecked).isFalse() blockExplicitSitesPreference.performClick() // Pretend the PIN verification succeeded. fragment.onActivityResult( requestCode = SupervisionBlockExplicitSitesPreference .REQUEST_CODE_SUPERVISION_CREDENTIALS, resultCode = Activity.RESULT_OK, data = null, val activity = shadowOf(fragment.activity) activity.receiveResult( activity.nextStartedActivityForResult.intent, Activity.RESULT_OK, null, ) assertThat(blockExplicitSitesPreference.isChecked).isTrue() Loading Loading @@ -120,11 +120,11 @@ class SupervisionWebContentFiltersScreenTest { blockExplicitSitesPreference.performClick() // Pretend the PIN verification succeeded. fragment.onActivityResult( requestCode = SupervisionAllowAllSitesPreference.REQUEST_CODE_SUPERVISION_CREDENTIALS, resultCode = Activity.RESULT_CANCELED, data = null, val activity = shadowOf(fragment.activity) activity.receiveResult( activity.nextStartedActivityForResult.intent, Activity.RESULT_CANCELED, null, ) assertThat(blockExplicitSitesPreference.isChecked).isFalse() Loading Loading
src/com/android/settings/supervision/SupervisionSafeSitesPreference.kt +12 −25 Original line number Diff line number Diff line Loading @@ -18,6 +18,10 @@ package com.android.settings.supervision import android.app.Activity import android.content.Context import android.content.Intent import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult import androidx.annotation.VisibleForTesting import androidx.preference.Preference import com.android.settings.R import com.android.settingslib.datastore.Permissions Loading @@ -41,7 +45,7 @@ sealed class SupervisionSafeSitesPreference( PreferenceLifecycleProvider { private lateinit var lifeCycleContext: PreferenceLifecycleContext abstract val supervisionCredentialRequestCode: Int private lateinit var supervisionCredentialLauncher: ActivityResultLauncher<Intent> override fun storage(context: Context) = dataStore Loading @@ -66,16 +70,13 @@ sealed class SupervisionSafeSitesPreference( override fun onCreate(context: PreferenceLifecycleContext) { lifeCycleContext = context supervisionCredentialLauncher = context.registerForActivityResult(StartActivityForResult(), ::onConfirmCredentials) } override fun onRadioButtonClicked(emitter: SelectorWithWidgetPreference) { val intent = Intent(lifeCycleContext, ConfirmSupervisionCredentialsActivity::class.java) lifeCycleContext.startActivityForResult( intent, supervisionCredentialRequestCode, /* options= */ null, ) supervisionCredentialLauncher.launch(intent) } override fun bind(preference: Preference, metadata: PreferenceMetadata) { Loading @@ -86,24 +87,16 @@ sealed class SupervisionSafeSitesPreference( } } override fun onActivityResult( context: PreferenceLifecycleContext, requestCode: Int, resultCode: Int, data: Intent?, ): Boolean { if (requestCode != supervisionCredentialRequestCode) return false if (resultCode == Activity.RESULT_OK) { val preference = context.findPreference<SelectorWithWidgetPreference>(key) // Iterate through the SafeSites options and update the checked status. @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) fun onConfirmCredentials(result: ActivityResult) { if (result.resultCode == Activity.RESULT_OK) { val preference = lifeCycleContext.findPreference<SelectorWithWidgetPreference>(key) preference?.parent?.forEachRecursively { if (it is SelectorWithWidgetPreference) { it.isChecked = it.key == key } } return true } return false } } Loading @@ -119,11 +112,8 @@ class SupervisionBlockExplicitSitesPreference(dataStore: SupervisionSafeSitesDat override val summary get() = R.string.supervision_web_content_filters_browser_block_explicit_sites_summary override val supervisionCredentialRequestCode = REQUEST_CODE_SUPERVISION_CREDENTIALS companion object { const val KEY = "web_content_filters_browser_block_explicit_sites" const val REQUEST_CODE_SUPERVISION_CREDENTIALS = 10 } } Loading @@ -136,10 +126,7 @@ class SupervisionAllowAllSitesPreference(dataStore: SupervisionSafeSitesDataStor override val title get() = R.string.supervision_web_content_filters_browser_allow_all_sites_title override val supervisionCredentialRequestCode = REQUEST_CODE_SUPERVISION_CREDENTIALS companion object { const val KEY = "web_content_filters_browser_allow_all_sites" const val REQUEST_CODE_SUPERVISION_CREDENTIALS = 11 } }
tests/robotests/src/com/android/settings/supervision/SupervisionSafeSitesPreferenceTest.kt +33 −41 Original line number Diff line number Diff line Loading @@ -21,6 +21,9 @@ import android.content.Intent import android.provider.Settings import android.provider.Settings.Secure.BROWSER_CONTENT_FILTERS_ENABLED import android.provider.Settings.SettingNotFoundException import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult import androidx.preference.Preference import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 Loading @@ -34,16 +37,19 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mockito.mock import org.mockito.Mockito.`when` import org.mockito.kotlin.any import org.mockito.kotlin.argumentCaptor import org.mockito.kotlin.doReturn import org.mockito.kotlin.eq import org.mockito.kotlin.stub import org.mockito.kotlin.verify @RunWith(AndroidJUnit4::class) class SupervisionSafeSitesPreferenceTest { private val mockLifeCycleContext = mock(PreferenceLifecycleContext::class.java) private val context: Context = ApplicationProvider.getApplicationContext() private lateinit var mockLifeCycleContext: PreferenceLifecycleContext private lateinit var mockActivityResultLauncher: ActivityResultLauncher<Intent> private lateinit var dataStore: SupervisionSafeSitesDataStore private lateinit var allowAllSitesPreference: SupervisionAllowAllSitesPreference private lateinit var blockExplicitSitesPreference: SupervisionBlockExplicitSitesPreference Loading @@ -51,6 +57,10 @@ class SupervisionSafeSitesPreferenceTest { @Before fun setUp() { dataStore = SupervisionSafeSitesDataStore(context) mockLifeCycleContext = mock(PreferenceLifecycleContext::class.java) mockActivityResultLauncher = mock(ActivityResultLauncher::class.java) as ActivityResultLauncher<Intent> mockConfirmSupervisionCredentialsActivity() allowAllSitesPreference = SupervisionAllowAllSitesPreference(dataStore) allowAllSitesPreference.onCreate(mockLifeCycleContext) blockExplicitSitesPreference = SupervisionBlockExplicitSitesPreference(dataStore) Loading Loading @@ -101,19 +111,19 @@ class SupervisionSafeSitesPreferenceTest { blockExplicitSitesWidget.performClick() verifyConfirmSupervisionCredentialsActivityStarted( SupervisionBlockExplicitSitesPreference.REQUEST_CODE_SUPERVISION_CREDENTIALS verifyConfirmSupervisionCredentialsActivity() blockExplicitSitesPreference.onConfirmCredentials( ActivityResult(Activity.RESULT_CANCELED, null) ) val result = blockExplicitSitesPreference.onActivityResult( mockLifeCycleContext, SupervisionBlockExplicitSitesPreference.REQUEST_CODE_SUPERVISION_CREDENTIALS, Activity.RESULT_CANCELED, null, assertThat(blockExplicitSitesWidget.isChecked).isFalse() assertThat( Settings.Secure.getInt( context.getContentResolver(), BROWSER_CONTENT_FILTERS_ENABLED, ) assertThat(result).isFalse() ) .isEqualTo(0) } @Test Loading @@ -124,19 +134,9 @@ class SupervisionSafeSitesPreferenceTest { blockExplicitSitesWidget.performClick() verifyConfirmSupervisionCredentialsActivityStarted( SupervisionBlockExplicitSitesPreference.REQUEST_CODE_SUPERVISION_CREDENTIALS ) verifyConfirmSupervisionCredentialsActivity() blockExplicitSitesPreference.onConfirmCredentials(ActivityResult(Activity.RESULT_OK, null)) val result = blockExplicitSitesPreference.onActivityResult( mockLifeCycleContext, SupervisionBlockExplicitSitesPreference.REQUEST_CODE_SUPERVISION_CREDENTIALS, Activity.RESULT_OK, null, ) assertThat(result).isTrue() assertThat(blockExplicitSitesWidget.isChecked).isTrue() assertThat( Settings.Secure.getInt( Loading @@ -154,19 +154,9 @@ class SupervisionSafeSitesPreferenceTest { assertThat(allowAllSitesWidget.isChecked).isFalse() allowAllSitesWidget.performClick() verifyConfirmSupervisionCredentialsActivityStarted( SupervisionAllowAllSitesPreference.REQUEST_CODE_SUPERVISION_CREDENTIALS ) val result = allowAllSitesPreference.onActivityResult( mockLifeCycleContext, SupervisionAllowAllSitesPreference.REQUEST_CODE_SUPERVISION_CREDENTIALS, Activity.RESULT_OK, null, ) verifyConfirmSupervisionCredentialsActivity() allowAllSitesPreference.onConfirmCredentials(ActivityResult(Activity.RESULT_OK, null)) assertThat(result).isTrue() assertThat(allowAllSitesWidget.isChecked).isTrue() assertThat( Settings.Secure.getInt( Loading Loading @@ -202,14 +192,16 @@ class SupervisionSafeSitesPreferenceTest { return widget } private fun verifyConfirmSupervisionCredentialsActivityStarted(requestCode: Int) { val intentCaptor = argumentCaptor<Intent>() private fun mockConfirmSupervisionCredentialsActivity() { `when`(mockLifeCycleContext.registerForActivityResult(any<StartActivityForResult>(), any())) .thenReturn(mockActivityResultLauncher) } verify(mockLifeCycleContext) .startActivityForResult(intentCaptor.capture(), eq(requestCode), eq(null)) private fun verifyConfirmSupervisionCredentialsActivity() { val intentCaptor = argumentCaptor<Intent>() verify(mockActivityResultLauncher).launch(intentCaptor.capture()) assertThat(intentCaptor.allValues.size).isEqualTo(1) assertThat(intentCaptor.firstValue.component?.className) .isEqualTo(ConfirmSupervisionCredentialsActivity::class.java.name) } Loading
tests/robotests/src/com/android/settings/supervision/SupervisionWebContentFiltersScreenTest.kt +11 −11 Original line number Diff line number Diff line Loading @@ -81,18 +81,18 @@ class SupervisionWebContentFiltersScreenTest { fragment.findPreference<SelectorWithWidgetPreference>( SupervisionBlockExplicitSitesPreference.KEY )!! assertThat(allowAllSitesPreference.isChecked).isTrue() assertThat(blockExplicitSitesPreference.isChecked).isFalse() blockExplicitSitesPreference.performClick() // Pretend the PIN verification succeeded. fragment.onActivityResult( requestCode = SupervisionBlockExplicitSitesPreference .REQUEST_CODE_SUPERVISION_CREDENTIALS, resultCode = Activity.RESULT_OK, data = null, val activity = shadowOf(fragment.activity) activity.receiveResult( activity.nextStartedActivityForResult.intent, Activity.RESULT_OK, null, ) assertThat(blockExplicitSitesPreference.isChecked).isTrue() Loading Loading @@ -120,11 +120,11 @@ class SupervisionWebContentFiltersScreenTest { blockExplicitSitesPreference.performClick() // Pretend the PIN verification succeeded. fragment.onActivityResult( requestCode = SupervisionAllowAllSitesPreference.REQUEST_CODE_SUPERVISION_CREDENTIALS, resultCode = Activity.RESULT_CANCELED, data = null, val activity = shadowOf(fragment.activity) activity.receiveResult( activity.nextStartedActivityForResult.intent, Activity.RESULT_CANCELED, null, ) assertThat(blockExplicitSitesPreference.isChecked).isFalse() Loading