Loading packages/SystemUI/src/com/android/systemui/user/domain/interactor/HeadlessSystemUserMode.kt +26 −1 Original line number Diff line number Diff line Loading @@ -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 } } } packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/HeadlessSystemUserModeImplTest.kt +46 −1 Original line number Diff line number Diff line Loading @@ -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() Loading Loading @@ -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 } } packages/SystemUI/tests/utils/src/com/android/systemui/user/domain/interactor/HeadlessSystemUserModeKosmos.kt +2 −1 Original line number Diff line number Diff line Loading @@ -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) } Loading
packages/SystemUI/src/com/android/systemui/user/domain/interactor/HeadlessSystemUserMode.kt +26 −1 Original line number Diff line number Diff line Loading @@ -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 } } }
packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/HeadlessSystemUserModeImplTest.kt +46 −1 Original line number Diff line number Diff line Loading @@ -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() Loading Loading @@ -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 } }
packages/SystemUI/tests/utils/src/com/android/systemui/user/domain/interactor/HeadlessSystemUserModeKosmos.kt +2 −1 Original line number Diff line number Diff line Loading @@ -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) }