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

Commit 55f3c9d8 authored by Xiaomiao Zhang's avatar Xiaomiao Zhang
Browse files

Update to use the inherited registerForActivityResult function in safesitess.

Test: atest SupervisionWebContentFiltersScreenTest
Test: atest SupervisionSafeSitesPreferenceTest
Flag: android.app.supervision.flags.enable_web_content_filters_screen
Bug: 407812368
Change-Id: Ib746233d297ae85a8ff2cd16737f53621b6295dd
parent 27a72e72
Loading
Loading
Loading
Loading
+12 −25
Original line number Diff line number Diff line
@@ -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
@@ -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

@@ -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) {
@@ -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
    }
}

@@ -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
    }
}

@@ -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
    }
}
+33 −41
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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)
@@ -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
@@ -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(
@@ -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(
@@ -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)
    }
+11 −11
Original line number Diff line number Diff line
@@ -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()
@@ -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()