Merge "[Device Supervision] Implement createConfirmSupervisionCredentialsIntent API" into main

This commit is contained in:
Junchen Quan
2025-03-12 10:34:49 -07:00
committed by Android (Google) Code Review
8 changed files with 278 additions and 27 deletions

View File

@@ -15,6 +15,7 @@
*/
package com.android.settings.supervision
import android.app.Activity
import android.app.supervision.flags.Flags
import android.content.Context
import android.platform.test.annotations.DisableFlags
@@ -24,6 +25,7 @@ import androidx.fragment.app.testing.FragmentScenario
import androidx.preference.Preference
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.settingslib.widget.MainSwitchPreference
import com.google.common.truth.Truth.assertThat
import org.junit.Rule
@@ -57,7 +59,7 @@ class SupervisionDashboardScreenTest {
@Test
@EnableFlags(Flags.FLAG_ENABLE_SUPERVISION_SETTINGS_SCREEN)
fun toggleMainSwitch_disablesChildPreferences() {
fun toggleMainSwitch_pinVerificationSucceeded_enablesChildPreferences() {
FragmentScenario.launchInContainer(preferenceScreenCreator.fragmentClass()).onFragment {
fragment ->
val mainSwitchPreference =
@@ -68,8 +70,38 @@ class SupervisionDashboardScreenTest {
assertThat(childPreference.isEnabled).isFalse()
mainSwitchPreference.performClick()
// Pretend the PIN verification succeeded.
fragment.onActivityResult(
requestCode = REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS,
resultCode = Activity.RESULT_OK,
data = null,
)
assertThat(childPreference.isEnabled).isTrue()
}
}
@Test
@EnableFlags(Flags.FLAG_ENABLE_SUPERVISION_SETTINGS_SCREEN)
fun toggleMainSwitch_pinVerificationFailed_childPreferencesRemainDisabled() {
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()
// Pretend the PIN verification failed.
fragment.onActivityResult(
requestCode = REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS,
resultCode = Activity.RESULT_CANCELED,
data = null,
)
assertThat(childPreference.isEnabled).isFalse()
}
}
}

View File

@@ -15,25 +15,33 @@
*/
package com.android.settings.supervision
import android.app.Activity
import android.app.supervision.SupervisionManager
import android.content.Context
import android.content.ContextWrapper
import android.content.Intent
import androidx.preference.Preference
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.settingslib.metadata.PreferenceLifecycleContext
import com.android.settingslib.preference.createAndBindWidget
import com.android.settingslib.widget.MainSwitchPreference
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.argumentCaptor
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.eq
import org.mockito.kotlin.mock
import org.mockito.kotlin.never
import org.mockito.kotlin.stub
import org.mockito.kotlin.verify
@RunWith(AndroidJUnit4::class)
class SupervisionMainSwitchPreferenceTest {
private val preference = SupervisionMainSwitchPreference()
private val mockLifeCycleContext = mock<PreferenceLifecycleContext>()
private val mockSupervisionManager = mock<SupervisionManager>()
private val appContext: Context = ApplicationProvider.getApplicationContext()
@@ -46,6 +54,13 @@ class SupervisionMainSwitchPreferenceTest {
}
}
private val preference = SupervisionMainSwitchPreference(context)
@Before
fun setUp() {
preference.onCreate(mockLifeCycleContext)
}
@Test
fun checked_supervisionEnabled_returnTrue() {
setSupervisionEnabled(true)
@@ -61,7 +76,7 @@ class SupervisionMainSwitchPreferenceTest {
}
@Test
fun toggleOn() {
fun toggleOn_triggersPinVerification() {
setSupervisionEnabled(false)
val widget = getMainSwitchPreference()
@@ -69,26 +84,90 @@ class SupervisionMainSwitchPreferenceTest {
widget.performClick()
verifyConfirmSupervisionCredentialsActivityStarted()
assertThat(widget.isChecked).isFalse()
verify(mockSupervisionManager, never()).setSupervisionEnabled(false)
}
@Test
fun toggleOn_pinVerificationSucceeded_supervisionEnabled() {
setSupervisionEnabled(false)
val widget = getMainSwitchPreference()
assertThat(widget.isChecked).isFalse()
preference.onActivityResult(
mockLifeCycleContext,
REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS,
Activity.RESULT_OK,
null,
)
assertThat(widget.isChecked).isTrue()
verify(mockSupervisionManager).setSupervisionEnabled(true)
}
@Test
fun toggleOff() {
fun toggleOff_pinVerificationSucceeded_supervisionDisabled() {
setSupervisionEnabled(true)
val widget = getMainSwitchPreference()
assertThat(widget.isChecked).isTrue()
widget.performClick()
preference.onActivityResult(
mockLifeCycleContext,
REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS,
Activity.RESULT_OK,
null,
)
assertThat(widget.isChecked).isFalse()
verify(mockSupervisionManager).setSupervisionEnabled(false)
}
private fun getMainSwitchPreference(): MainSwitchPreference =
preference.createAndBindWidget(context)
@Test
fun toggleOff_pinVerificationFailed_supervisionNotEnabled() {
setSupervisionEnabled(true)
val widget = getMainSwitchPreference()
assertThat(widget.isChecked).isTrue()
preference.onActivityResult(
mockLifeCycleContext,
REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS,
Activity.RESULT_CANCELED,
null,
)
assertThat(widget.isChecked).isTrue()
verify(mockSupervisionManager, never()).setSupervisionEnabled(true)
}
private fun setSupervisionEnabled(enabled: Boolean) =
mockSupervisionManager.stub { on { isSupervisionEnabled } doReturn enabled }
private fun getMainSwitchPreference(): MainSwitchPreference {
val widget: MainSwitchPreference = preference.createAndBindWidget(context)
mockLifeCycleContext.stub {
on { findPreference<Preference>(SupervisionMainSwitchPreference.KEY) } doReturn widget
on {
requirePreference<MainSwitchPreference>(SupervisionMainSwitchPreference.KEY)
} doReturn widget
}
return widget
}
private fun verifyConfirmSupervisionCredentialsActivityStarted() {
val intentCaptor = argumentCaptor<Intent>()
verify(mockLifeCycleContext)
.startActivityForResult(
intentCaptor.capture(),
eq(REQUEST_CODE_CONFIRM_SUPERVISION_CREDENTIALS),
eq(null),
)
assertThat(intentCaptor.allValues.size).isEqualTo(1)
assertThat(intentCaptor.firstValue.component?.className)
.isEqualTo(ConfirmSupervisionCredentialsActivity::class.java.name)
}
}