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

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

Merge "Disables QS EditMode on Headless System User." into main

parents 8efd7df6 d7e24d34
Loading
Loading
Loading
Loading
+65 −1
Original line number Original line Diff line number Diff line
@@ -16,16 +16,25 @@


package com.android.systemui.qs.panels.ui.viewmodel
package com.android.systemui.qs.panels.ui.viewmodel


import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import androidx.test.filters.SmallTest
import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
import com.android.systemui.SysuiTestCase
import com.android.systemui.classifier.fakeFalsingManager
import com.android.systemui.classifier.fakeFalsingManager
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runCurrent
import com.android.systemui.kosmos.runCurrent
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testScope
import com.android.systemui.lifecycle.activateIn
import com.android.systemui.plugins.activityStarter
import com.android.systemui.plugins.activityStarter
import com.android.systemui.qs.panels.ui.viewmodel.toolbar.EditModeButtonViewModel
import com.android.systemui.qs.panels.ui.viewmodel.toolbar.editModeButtonViewModelFactory
import com.android.systemui.qs.panels.ui.viewmodel.toolbar.editModeButtonViewModelFactory
import com.android.systemui.testKosmos
import com.android.systemui.testKosmos
import com.android.systemui.user.domain.interactor.fakeHeadlessSystemUserMode
import com.android.systemui.user.domain.interactor.headlessSystemUserMode
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Before
import org.junit.Test
import org.junit.Test
@@ -39,7 +48,8 @@ import org.mockito.kotlin.whenever
class EditModeButtonViewModelTest : SysuiTestCase() {
class EditModeButtonViewModelTest : SysuiTestCase() {
    val kosmos = testKosmos()
    val kosmos = testKosmos()


    val underTest = kosmos.editModeButtonViewModelFactory.create()
    // NOTE: cannot instantiate EditModeButtonViewModel here because it would hydrate
    // showEditButton before the value on fakeHeadlessSystemUserMode is set


    @Before
    @Before
    fun setUp() {
    fun setUp() {
@@ -53,6 +63,7 @@ class EditModeButtonViewModelTest : SysuiTestCase() {
    @Test
    @Test
    fun falsingFalseTap_editModeDoesntStart() =
    fun falsingFalseTap_editModeDoesntStart() =
        kosmos.runTest {
        kosmos.runTest {
            val underTest = createEditModeButtonViewModel()
            val isEditing by collectLastValue(editModeViewModel.isEditing)
            val isEditing by collectLastValue(editModeViewModel.isEditing)


            fakeFalsingManager.setFalseTap(true)
            fakeFalsingManager.setFalseTap(true)
@@ -66,6 +77,7 @@ class EditModeButtonViewModelTest : SysuiTestCase() {
    @Test
    @Test
    fun falsingNotFalseTap_editModeStarted() =
    fun falsingNotFalseTap_editModeStarted() =
        kosmos.runTest {
        kosmos.runTest {
            val underTest = createEditModeButtonViewModel()
            val isEditing by collectLastValue(editModeViewModel.isEditing)
            val isEditing by collectLastValue(editModeViewModel.isEditing)


            fakeFalsingManager.setFalseTap(false)
            fakeFalsingManager.setFalseTap(false)
@@ -75,4 +87,56 @@ class EditModeButtonViewModelTest : SysuiTestCase() {


            assertThat(isEditing).isTrue()
            assertThat(isEditing).isTrue()
        }
        }

    @Test
    @DisableFlags(Flags.FLAG_HSU_BEHAVIOR_CHANGES)
    fun isEditButtonVisibleTrue_nonHsu_flagDisabled() =
        kosmos.runTest {
            val underTest = createEditModeButtonViewModel(false)

            runCurrent()

            assertThat(underTest.isEditButtonVisible).isTrue()
        }

    @Test
    @DisableFlags(Flags.FLAG_HSU_BEHAVIOR_CHANGES)
    fun isEditButtonVisibleTrue_hsu_flagDisabled() =
        kosmos.runTest {
            val underTest = createEditModeButtonViewModel(true)

            runCurrent()

            assertThat(underTest.isEditButtonVisible).isTrue()
        }

    @Test
    @EnableFlags(Flags.FLAG_HSU_BEHAVIOR_CHANGES)
    fun isEditButtonVisibleTrue_nonHsu_flagEnabled() =
        kosmos.runTest {
            val underTest = createEditModeButtonViewModel(false)

            runCurrent()

            assertThat(underTest.isEditButtonVisible).isTrue()
        }

    @Test
    @EnableFlags(Flags.FLAG_HSU_BEHAVIOR_CHANGES)
    fun isEditButtonVisibleFalse_hsu_flagEnabled() =
        kosmos.runTest {
            val underTest = createEditModeButtonViewModel(true)

            runCurrent()

            assertThat(underTest.isEditButtonVisible).isFalse()
        }

    private fun Kosmos.createEditModeButtonViewModel(
        isHeadlessSystemUser: Boolean = false
    ): EditModeButtonViewModel {
        headlessSystemUserMode = fakeHeadlessSystemUserMode
        fakeHeadlessSystemUserMode.setIsHeadlessSystemUser(isHeadlessSystemUser)
        return editModeButtonViewModelFactory.create().apply { activateIn(testScope) }
    }
}
}
+1 −1
Original line number Original line Diff line number Diff line
@@ -197,7 +197,7 @@ private fun FooterBar(
        )
        )
        Row(Modifier.weight(1f)) {
        Row(Modifier.weight(1f)) {
            Spacer(modifier = Modifier.weight(1f))
            Spacer(modifier = Modifier.weight(1f))
            EditModeButton(viewModel = editButtonViewModel)
            EditModeButton(editButtonViewModelFactory)
        }
        }
    }
    }
}
}
+9 −1
Original line number Original line Diff line number Diff line
@@ -29,12 +29,20 @@ import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.Modifier
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.dp
import com.android.systemui.lifecycle.rememberViewModel
import com.android.systemui.qs.panels.ui.viewmodel.toolbar.EditModeButtonViewModel
import com.android.systemui.qs.panels.ui.viewmodel.toolbar.EditModeButtonViewModel
import com.android.systemui.qs.ui.compose.borderOnFocus
import com.android.systemui.qs.ui.compose.borderOnFocus
import com.android.systemui.res.R
import com.android.systemui.res.R


@Composable
@Composable
fun EditModeButton(viewModel: EditModeButtonViewModel, modifier: Modifier = Modifier) {
fun EditModeButton(
    viewModelFactory: EditModeButtonViewModel.Factory,
    modifier: Modifier = Modifier,
) {
    val viewModel = rememberViewModel("editModeButtonViewModel") { viewModelFactory.create() }
    if (!viewModel.isEditButtonVisible) {
        return
    }
    CompositionLocalProvider(
    CompositionLocalProvider(
        value = LocalContentColor provides MaterialTheme.colorScheme.onSurface
        value = LocalContentColor provides MaterialTheme.colorScheme.onSurface
    ) {
    ) {
+2 −1
Original line number Original line Diff line number Diff line
@@ -22,6 +22,7 @@ import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.shape.CornerSize
import androidx.compose.foundation.shape.CornerSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalContext
@@ -45,7 +46,7 @@ fun Toolbar(viewModel: ToolbarViewModel, modifier: Modifier = Modifier) {
            )
            )
        }
        }


        EditModeButton(viewModel.editModeButtonViewModel)
        EditModeButton(viewModel.editModeButtonViewModelFactory)


        IconButton(
        IconButton(
            viewModel.settingsButtonViewModel,
            viewModel.settingsButtonViewModel,
+26 −1
Original line number Original line Diff line number Diff line
@@ -16,12 +16,19 @@


package com.android.systemui.qs.panels.ui.viewmodel.toolbar
package com.android.systemui.qs.panels.ui.viewmodel.toolbar


import androidx.compose.runtime.getValue
import com.android.systemui.Flags.hsuBehaviorChanges
import com.android.systemui.classifier.domain.interactor.FalsingInteractor
import com.android.systemui.classifier.domain.interactor.FalsingInteractor
import com.android.systemui.lifecycle.ExclusiveActivatable
import com.android.systemui.lifecycle.Hydrator
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.qs.panels.ui.viewmodel.EditModeViewModel
import com.android.systemui.qs.panels.ui.viewmodel.EditModeViewModel
import com.android.systemui.user.domain.interactor.HeadlessSystemUserMode
import com.android.systemui.user.domain.interactor.SelectedUserInteractor
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import dagger.assisted.AssistedInject
import kotlinx.coroutines.flow.map


class EditModeButtonViewModel
class EditModeButtonViewModel
@AssistedInject
@AssistedInject
@@ -29,7 +36,21 @@ constructor(
    private val editModeViewModel: EditModeViewModel,
    private val editModeViewModel: EditModeViewModel,
    private val falsingInteractor: FalsingInteractor,
    private val falsingInteractor: FalsingInteractor,
    private val activityStarter: ActivityStarter,
    private val activityStarter: ActivityStarter,
) {
    private val selectedUserInteractor: SelectedUserInteractor,
    private val hsum: HeadlessSystemUserMode,
) : ExclusiveActivatable() {

    private val hydrator = Hydrator("editModeButtonViewModel.hydrator")

    val isEditButtonVisible: Boolean by
        hydrator.hydratedStateOf(
            traceName = "isEditButtonVisible",
            initialValue = false,
            source =
                selectedUserInteractor.selectedUser.map { selectedUserId ->
                    !hsuBehaviorChanges() || !hsum.isHeadlessSystemUser(selectedUserId)
                },
        )


    fun onButtonClick() {
    fun onButtonClick() {
        if (!falsingInteractor.isFalseTap(FalsingManager.LOW_PENALTY)) {
        if (!falsingInteractor.isFalseTap(FalsingManager.LOW_PENALTY)) {
@@ -37,6 +58,10 @@ constructor(
        }
        }
    }
    }


    override suspend fun onActivated(): Nothing {
        hydrator.activate()
    }

    @AssistedFactory
    @AssistedFactory
    interface Factory {
    interface Factory {
        fun create(): EditModeButtonViewModel
        fun create(): EditModeButtonViewModel
Loading