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

Commit b4d736c7 authored by Jacky Wang's avatar Jacky Wang
Browse files

[Supervision] Add PreferenceDataProvider.packageName

Decouple SupervisionHelper from SupervisionPromoFooterPreference.

Bug: 412899640
Flag: android.app.supervision.flags.enable_supervision_settings_screen
Test: manual
Change-Id: Ic1f7fd60ffe6b8f08c9626c0d1f2b7394535b7fe
parent 64112e9c
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -26,6 +26,9 @@ import com.android.settings.supervision.ipc.PreferenceData
 */
interface PreferenceDataProvider {

    /** Package of preference data provider. */
    val packageName: String?

    /**
     * Retrieves preference data for the specified keys.
     *
+7 −6
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
 */
package com.android.settings.supervision

import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.graphics.drawable.Icon
@@ -51,21 +52,20 @@ class SupervisionPromoFooterPreference(

        var intent: Intent? = null
        if (initialized) {
            val context = preference.context
            val targetIntent =
                Intent(preferenceData?.action).apply {
                    `package` = preferenceData?.targetPackage
                    addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                }
            intent = if (targetIntent.isValid(preference.context)) targetIntent else null
            intent = if (targetIntent.isValid(context)) targetIntent else null

            val leadingIconResId = preferenceData?.icon
            val leadingIcon =
                leadingIconResId?.let {
                    val resourcePackage =
                        SupervisionHelper.getInstance(preference.context)
                            .getSupervisionPackageName()
                    val icon = Icon.createWithResource(resourcePackage, leadingIconResId)
                    icon.loadDrawable(preference.context)
                    val resourcePackage = preferenceDataProvider.packageName
                    val icon = Icon.createWithResource(resourcePackage, it)
                    icon.loadDrawable(context)
                }

            preference.intent = intent
@@ -79,6 +79,7 @@ class SupervisionPromoFooterPreference(
                    // TODO(b/411279121): add content description once we have the finalized string.
                    contentDescription = "",
                ) {
                    @SuppressLint("RestrictedApi")
                    it.performClick()
                }
            }
+3 −4
Original line number Diff line number Diff line
@@ -35,10 +35,9 @@ import com.android.settingslib.supervision.SupervisionLog
class SupervisionMessengerClient(context: Context) :
    MessengerServiceClient(context), PreferenceDataProvider {

    override val serviceIntentFactory: () -> Intent
        get() = { Intent(SUPERVISION_MESSENGER_SERVICE_BIND_ACTION) }
    override val serviceIntentFactory = { Intent(SUPERVISION_MESSENGER_SERVICE_BIND_ACTION) }

    private val supervisionPackageName: String? by lazy {
    override val packageName: String? by lazy {
        SupervisionHelper.getInstance(context).getSupervisionPackageName()
    }

@@ -55,7 +54,7 @@ class SupervisionMessengerClient(context: Context) :
     */
    override suspend fun getPreferenceData(keys: List<String>): Map<String, PreferenceData> =
        try {
            val targetPackageName = supervisionPackageName ?: return mapOf()
            val targetPackageName = packageName ?: return mapOf()

            invoke(targetPackageName, PreferenceDataApi(), PreferenceDataRequest(keys = keys))
                .await()
+2 −21
Original line number Diff line number Diff line
@@ -15,7 +15,6 @@
 */
package com.android.settings.supervision

import android.app.role.RoleManager
import android.content.Context
import android.content.ContextWrapper
import android.content.pm.PackageManager
@@ -32,7 +31,6 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.any
@@ -48,18 +46,8 @@ class SupervisionPromoFooterPreferenceTest {
    private val mockPackageManager: PackageManager = mock()
    private val context: Context =
        object : ContextWrapper(ApplicationProvider.getApplicationContext()) {
            override fun getSystemService(name: String): Any? =
                when (name) {
                    ROLE_SERVICE -> mockRoleManager
                    else -> super.getSystemService(name)
            override fun getPackageManager() = mockPackageManager
        }

            override fun getPackageManager(): PackageManager {
                return mockPackageManager
            }
        }
    private val mockRoleManager =
        mock<RoleManager> { on { getRoleHolders(any()) } doReturn listOf("test.package") }
    private val preference = CardPreference(context)

    private var preferenceData: PreferenceData? = null
@@ -82,11 +70,6 @@ class SupervisionPromoFooterPreferenceTest {
            }
    }

    @Before
    fun setUp() {
        SupervisionHelper.sInstance = null
    }

    @Test
    fun onResume_setTitle() =
        testScope.runTest {
@@ -123,15 +106,13 @@ class SupervisionPromoFooterPreferenceTest {
    fun onResume_loadingIconSetFromSupervisionPackage() =
        testScope.runTest {
            preferenceData = PreferenceData(icon = 123)
            SupervisionHelper.sInstance = SupervisionHelper.getInstance(context)
            preferenceDataProvider.stub { on { packageName } doReturn "test.package" }
            val promoPreference =
                SupervisionPromoFooterPreference(preferenceDataProvider, testDispatcher)

            promoPreference.onResume(preferenceLifecycleContext)
            verify(preferenceLifecycleContext).notifyPreferenceChange(KEY)
            promoPreference.bind(preference, mock())

            verify(mockRoleManager).getRoleHolders(RoleManager.ROLE_SYSTEM_SUPERVISION)
        }

    @Test