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

Commit 74fa573a authored by Jacky Wang's avatar Jacky Wang
Browse files

[Supervision] Add Context.supervisionPackageName extension

Remove getSupervisionPackageName from SupervisionHelper.

Bug: 412899640
Flag: android.app.supervision.flags.enable_supervision_settings_screen
Test: atest&manual
Change-Id: I2d045a38236b3ce0c336b098f8c06dd06f661bb8
parent b4d736c7
Loading
Loading
Loading
Loading
+20 −23
Original line number Diff line number Diff line
@@ -23,9 +23,10 @@ import android.os.UserManager
import android.os.UserManager.USER_TYPE_PROFILE_SUPERVISING
import android.util.Log
import androidx.annotation.VisibleForTesting
import com.android.settingslib.supervision.SupervisionLog.TAG

/** Convenience methods for interacting with the supervising user profile. */
open class SupervisionHelper private constructor(private val context: Context) {
open class SupervisionHelper private constructor(context: Context) {
    private val mUserManager = context.getSystemService(UserManager::class.java)
    private val mKeyguardManager = context.getSystemService(KeyguardManager::class.java)

@@ -40,31 +41,10 @@ open class SupervisionHelper private constructor(private val context: Context) {

    fun isSupervisingCredentialSet(): Boolean {
        val supervisingUserId = getSupervisingUserHandle()?.identifier ?: return false
        return mKeyguardManager?.isDeviceSecure(supervisingUserId) ?: false
    }

    /**
     * Retrieves the package name of the system supervision app.
     *
     * @return The package name of the system supervision app, or null if not found.
     */
    fun getSupervisionPackageName(): String? {
        val roleManager = context.getSystemService(RoleManager::class.java)
        if (roleManager == null) {
            Log.w(TAG, "RoleManager service not available.")
            return null
        }

        val roleHolders = roleManager.getRoleHolders(RoleManager.ROLE_SYSTEM_SUPERVISION)
        if (roleHolders.isEmpty()) Log.w(TAG, "No package holding the system supervision role.")

        // supervision role is exclusive, only one app may hold this role in a user
        return roleHolders.firstOrNull()
        return mKeyguardManager?.isDeviceSecure(supervisingUserId) == true
    }

    companion object {
        private const val TAG = "SupervisionSettings"

        @Volatile @VisibleForTesting var sInstance: SupervisionHelper? = null

        fun getInstance(context: Context): SupervisionHelper {
@@ -75,3 +55,20 @@ open class SupervisionHelper private constructor(private val context: Context) {
        }
    }
}

/** Returns the package name of the system supervision app, or null if not found. */
val Context.supervisionPackageName: String?
    get() {
        val roleManager = getSystemService(RoleManager::class.java)
        if (roleManager == null) {
            Log.w(TAG, "RoleManager service not available.")
            return null
        }

        val roleHolders =
            roleManager.getRoleHolders(RoleManager.ROLE_SYSTEM_SUPERVISION) ?: emptyList<String>()
        if (roleHolders.isEmpty()) Log.w(TAG, "No package holding the system supervision role.")

        // supervision role is exclusive, only one app may hold this role in a user
        return roleHolders.firstOrNull()
    }
+1 −2
Original line number Diff line number Diff line
@@ -29,8 +29,7 @@ class TopLevelSupervisionPreferenceController(
    private val context: Context,
    private val key: String,
) : BasePreferenceController(context, key) {
    private val supervisionPackage =
        SupervisionHelper.getInstance(context).getSupervisionPackageName()
    private val supervisionPackage = context.supervisionPackageName

    private var missingAppStoreLink = false

+2 −4
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@ import android.content.Context
import android.content.Intent
import android.util.Log
import com.android.settings.supervision.PreferenceDataProvider
import com.android.settings.supervision.SupervisionHelper
import com.android.settings.supervision.supervisionPackageName
import com.android.settingslib.ipc.MessengerServiceClient
import com.android.settingslib.supervision.SupervisionLog

@@ -37,9 +37,7 @@ class SupervisionMessengerClient(context: Context) :

    override val serviceIntentFactory = { Intent(SUPERVISION_MESSENGER_SERVICE_BIND_ACTION) }

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

    /**
     * Retrieves preference data from the system supervision app.
+9 −27
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@ import android.content.ContextWrapper
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.doReturn
@@ -32,56 +31,40 @@ import org.mockito.kotlin.verify
@RunWith(AndroidJUnit4::class)
class SupervisionHelperTest {

    private lateinit var context: Context
    private val mockRoleManager = mock<RoleManager>()
    private lateinit var supervisionHelper: SupervisionHelper

    @Before
    fun setUp() {
        context = contextOfRoleManager(mockRoleManager)
        SupervisionHelper.sInstance = null
    }
    private var context = contextOfRoleManager(mockRoleManager)

    @Test
    fun getSupervisionPackageName_roleManagerReturnsPackageName_shouldReturnPackageName() {
    fun supervisionPackageName_roleManagerReturnsPackageName_shouldReturnPackageName() {
        val testPackageName = "com.android.supervision"
        mockRoleManager.stub {
            on { getRoleHolders(RoleManager.ROLE_SYSTEM_SUPERVISION) } doReturn
                listOf(testPackageName)
        }

        supervisionHelper = SupervisionHelper.getInstance(context)
        val result = supervisionHelper.getSupervisionPackageName()

        assertThat(result).isEqualTo(testPackageName)
        assertThat(context.supervisionPackageName).isEqualTo(testPackageName)
        verify(mockRoleManager).getRoleHolders(RoleManager.ROLE_SYSTEM_SUPERVISION)
    }

    @Test
    fun getSupervisionPackageName_roleManagerReturnsEmptyList_shouldReturnNull() {
    fun supervisionPackageName_roleManagerReturnsEmptyList_shouldReturnNull() {
        mockRoleManager.stub {
            on { getRoleHolders(RoleManager.ROLE_SYSTEM_SUPERVISION) } doReturn emptyList()
        }

        supervisionHelper = SupervisionHelper.getInstance(context)
        val result = supervisionHelper.getSupervisionPackageName()

        assertThat(result).isNull()
        assertThat(context.supervisionPackageName).isNull()
        verify(mockRoleManager).getRoleHolders(RoleManager.ROLE_SYSTEM_SUPERVISION)
    }

    @Test
    fun getSupervisionPackageName_roleManagerReturnsNull_shouldReturnNull() {
    fun supervisionPackageName_roleManagerReturnsNull_shouldReturnNull() {
        context = contextOfRoleManager(null)

        supervisionHelper = SupervisionHelper.getInstance(context)
        val result = supervisionHelper.getSupervisionPackageName()

        assertThat(result).isNull()
        assertThat(context.supervisionPackageName).isNull()
    }

    private fun contextOfRoleManager(roleManager: RoleManager?): Context {
        return object : ContextWrapper(ApplicationProvider.getApplicationContext()) {
    private fun contextOfRoleManager(roleManager: RoleManager?): Context =
        object : ContextWrapper(ApplicationProvider.getApplicationContext()) {
            override fun getSystemService(name: String): Any? =
                when (name) {
                    ROLE_SERVICE -> roleManager
@@ -89,4 +72,3 @@ class SupervisionHelperTest {
                }
        }
}
}