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

Commit c1a5662a authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[Device Supervision] Dynamically set settings group preference summary" into main

parents 440c6837 1a02cb1a
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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
            }
+47 −10
Original line number Diff line number Diff line
@@ -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
@@ -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,
@@ -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
@@ -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(
@@ -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) {
@@ -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)
        }

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

}
+27 −20
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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() {
@@ -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)
    }
@@ -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)
    }
@@ -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)
    }
@@ -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 {
@@ -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)
    }
}