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

Commit f1b34937 authored by Felipe Leme's avatar Felipe Leme Committed by Android (Google) Code Review
Browse files

Merge "Added HeadlessSystemUserMode.isHeadlessSystemUser(userId) helper" into main

parents ecb68e0e c4f1dc93
Loading
Loading
Loading
Loading
+26 −1
Original line number Diff line number Diff line
@@ -16,20 +16,45 @@

package com.android.systemui.user.domain.interactor

import android.annotation.UserIdInt
import android.os.UserHandle
import android.os.UserManager
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.withContext

/** Encapsulates logic related to Headless System User Mode (`HSUM`). */
interface HeadlessSystemUserMode {

    /** Returns `true` if the device is `HSUM`. */
    fun isHeadlessSystemUserMode(): Boolean

    /**
     * Returns `true` if the given `userId` is the Headless System User (i.e., it's the system user
     * in a HSUM device)
     */
    suspend fun isHeadlessSystemUser(@UserIdInt userId: Int): Boolean
}

@SysUISingleton
class HeadlessSystemUserModeImpl @Inject constructor() : HeadlessSystemUserMode {
class HeadlessSystemUserModeImpl
@Inject
constructor(@Background private val backgroundDispatcher: CoroutineDispatcher) :
    HeadlessSystemUserMode {

    override fun isHeadlessSystemUserMode(): Boolean {
        return UserManager.isHeadlessSystemUserMode()
    }

    override suspend fun isHeadlessSystemUser(@UserIdInt userId: Int): Boolean {
        return withContext(backgroundDispatcher) {
            // NOTE: ideally it should use UserManager.isSystem() instead of checking the userId
            // directly, but it would overcomplicate it (for example, it would require callers to
            // use a UserContextProvider to get the proper user context, and that would just work
            // for the current user). And pragmatically speaking, the system user is always 0.
            isHeadlessSystemUserMode() && userId == UserHandle.USER_SYSTEM
        }
    }
}
+46 −1
Original line number Diff line number Diff line
@@ -16,30 +16,40 @@
 */
package com.android.systemui.user.domain.interactor

import android.os.UserHandle
import android.os.UserManager
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.dx.mockito.inline.extended.ExtendedMockito
import com.android.systemui.SysuiTestCase
import com.android.systemui.kosmos.runTest
import com.android.systemui.testKosmos
import com.google.common.truth.Expect
import com.google.common.truth.Truth.assertWithMessage
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.MockitoSession
import org.mockito.quality.Strictness

@SmallTest
@RunWith(AndroidJUnit4::class)
class HeadlessSystemUserModeImplTest : SysuiTestCase() {

    @get:Rule val expect: Expect = Expect.create()

    private lateinit var mockitoSession: MockitoSession

    private val underTest = HeadlessSystemUserModeImpl()
    private val kosmos = testKosmos()
    private val underTest = kosmos.headlessSystemUserMode

    @Before
    fun startSession() {
        mockitoSession =
            ExtendedMockito.mockitoSession()
                .strictness(Strictness.LENIENT)
                .initMocks(this)
                .mockStatic(UserManager::class.java)
                .startMocking()
@@ -68,7 +78,42 @@ class HeadlessSystemUserModeImplTest : SysuiTestCase() {
            .isTrue()
    }

    @Test
    fun isHeadlessSystemUser_whenDeviceIsNotHsum() =
        kosmos.runTest {
            mockIsHsum(false)

            expect
                .withMessage("HeadlessSystemUserMode.isHeadlessSystemUser(%s)", SYSTEM_USER)
                .that(underTest.isHeadlessSystemUser(SYSTEM_USER))
                .isFalse()
            expect
                .withMessage("HeadlessSystemUserMode.isHeadlessSystemUser(%s)", NON_SYSTEM_USER)
                .that(underTest.isHeadlessSystemUser(NON_SYSTEM_USER))
                .isFalse()
        }

    @Test
    fun isHeadlessSystemUser_whenDeviceIsHsum() =
        kosmos.runTest {
            mockIsHsum(true)

            expect
                .withMessage("HeadlessSystemUserMode.isHeadlessSystemUser(%s)", SYSTEM_USER)
                .that(underTest.isHeadlessSystemUser(SYSTEM_USER))
                .isTrue()
            expect
                .withMessage("HeadlessSystemUserMode.isHeadlessSystemUser(%s)", NON_SYSTEM_USER)
                .that(underTest.isHeadlessSystemUser(NON_SYSTEM_USER))
                .isFalse()
        }

    private fun mockIsHsum(hsum: Boolean) {
        ExtendedMockito.doReturn(hsum).`when`(UserManager::isHeadlessSystemUserMode)
    }

    companion object {
        private const val SYSTEM_USER = UserHandle.USER_SYSTEM
        private const val NON_SYSTEM_USER = 42
    }
}
+2 −1
Original line number Diff line number Diff line
@@ -17,5 +17,6 @@
package com.android.systemui.user.domain.interactor

import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.testDispatcher

val Kosmos.headlessSystemUserMode by Kosmos.Fixture { HeadlessSystemUserModeImpl() }
val Kosmos.headlessSystemUserMode by Kosmos.Fixture { HeadlessSystemUserModeImpl(testDispatcher) }