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

Commit 74f35cb9 authored by Ioana Alexandru's avatar Ioana Alexandru Committed by Android (Google) Code Review
Browse files

Merge changes Iead9f8bc,I8f608203 into main

* changes:
  Deactivate all modes from QS toggle
  Dual target modes tile
parents 9bccff3f e5f1dc59
Loading
Loading
Loading
Loading
+3 −10
Original line number Diff line number Diff line
@@ -94,11 +94,7 @@ class ModesTileTest : SysuiTestCase() {
    private val zenModeRepository = kosmos.zenModeRepository
    private val tileDataInteractor =
        ModesTileDataInteractor(context, kosmos.zenModeInteractor, testDispatcher)
    private val mapper =
        ModesTileMapper(
            context.resources,
            context.theme,
        )
    private val mapper = ModesTileMapper(context.resources, context.theme)

    private lateinit var userActionInteractor: ModesTileUserActionInteractor
    private lateinit var secureSettings: SecureSettings
@@ -127,10 +123,7 @@ class ModesTileTest : SysuiTestCase() {
            )

        userActionInteractor =
            ModesTileUserActionInteractor(
                inputHandler,
                dialogDelegate,
            )
            ModesTileUserActionInteractor(inputHandler, dialogDelegate, kosmos.zenModeInteractor)

        underTest =
            ModesTile(
@@ -185,7 +178,7 @@ class ModesTileTest : SysuiTestCase() {
                ModesTileModel(
                    isActivated = true,
                    activeModes = listOf("One", "Two"),
                    icon = TestStubDrawable().asIcon()
                    icon = TestStubDrawable().asIcon(),
                )

            underTest.handleUpdateState(tileState, model)
+73 −8
Original line number Diff line number Diff line
@@ -14,6 +14,8 @@
 * limitations under the License.
 */

@file:OptIn(ExperimentalCoroutinesApi::class)

package com.android.systemui.qs.tiles.impl.modes.domain.interactor

import android.graphics.drawable.TestStubDrawable
@@ -21,16 +23,23 @@ import android.platform.test.annotations.EnableFlags
import android.provider.Settings
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.settingslib.notification.modes.TestModeBuilder
import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
import com.android.systemui.animation.Expandable
import com.android.systemui.common.shared.model.asIcon
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.kosmos.testScope
import com.android.systemui.qs.tiles.base.actions.QSTileIntentUserInputHandlerSubject
import com.android.systemui.qs.tiles.base.actions.qsTileIntentUserInputHandler
import com.android.systemui.qs.tiles.base.interactor.QSTileInputTestKtx
import com.android.systemui.qs.tiles.impl.modes.domain.model.ModesTileModel
import com.android.systemui.statusbar.policy.data.repository.zenModeRepository
import com.android.systemui.statusbar.policy.domain.interactor.zenModeInteractor
import com.android.systemui.statusbar.policy.ui.dialog.mockModesDialogDelegate
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith
@@ -43,17 +52,17 @@ import org.mockito.kotlin.verify
@EnableFlags(android.app.Flags.FLAG_MODES_UI)
class ModesTileUserActionInteractorTest : SysuiTestCase() {
    private val kosmos = testKosmos()
    private val testScope = kosmos.testScope
    private val inputHandler = kosmos.qsTileIntentUserInputHandler
    private val mockDialogDelegate = kosmos.mockModesDialogDelegate
    private val zenModeRepository = kosmos.zenModeRepository
    private val zenModeInteractor = kosmos.zenModeInteractor

    private val underTest =
        ModesTileUserActionInteractor(
            inputHandler,
            mockDialogDelegate,
        )
        ModesTileUserActionInteractor(inputHandler, mockDialogDelegate, zenModeInteractor)

    @Test
    fun handleClick_active() = runTest {
    fun handleClick_active_showsDialog() = runTest {
        val expandable = mock<Expandable>()
        underTest.handleInput(
            QSTileInputTestKtx.click(data = modelOf(true, listOf("DND")), expandable = expandable)
@@ -63,7 +72,7 @@ class ModesTileUserActionInteractorTest : SysuiTestCase() {
    }

    @Test
    fun handleClick_inactive() = runTest {
    fun handleClick_inactive_showsDialog() = runTest {
        val expandable = mock<Expandable>()
        underTest.handleInput(
            QSTileInputTestKtx.click(data = modelOf(false, emptyList()), expandable = expandable)
@@ -73,7 +82,63 @@ class ModesTileUserActionInteractorTest : SysuiTestCase() {
    }

    @Test
    fun handleLongClick_active() = runTest {
    @EnableFlags(Flags.FLAG_QS_UI_REFACTOR_COMPOSE_FRAGMENT)
    fun handleToggleClick_multipleModesActive_deactivatesAll() =
        testScope.runTest {
            val activeModes by collectLastValue(zenModeInteractor.activeModes)

            zenModeRepository.addModes(
                listOf(
                    TestModeBuilder.MANUAL_DND_ACTIVE,
                    TestModeBuilder().setName("Mode 1").setActive(true).build(),
                    TestModeBuilder().setName("Mode 2").setActive(true).build(),
                )
            )
            assertThat(activeModes?.modeNames?.count()).isEqualTo(3)

            underTest.handleInput(
                QSTileInputTestKtx.toggleClick(
                    data = modelOf(true, listOf("DND", "Mode 1", "Mode 2"))
                )
            )

            assertThat(activeModes?.isAnyActive()).isFalse()
        }

    @Test
    @EnableFlags(Flags.FLAG_QS_UI_REFACTOR_COMPOSE_FRAGMENT)
    fun handleToggleClick_dndActive_deactivatesDnd() =
        testScope.runTest {
            val dndMode by collectLastValue(zenModeInteractor.dndMode)

            zenModeRepository.addMode(TestModeBuilder.MANUAL_DND_ACTIVE)
            assertThat(dndMode?.isActive).isTrue()

            underTest.handleInput(
                QSTileInputTestKtx.toggleClick(data = modelOf(true, listOf("DND")))
            )

            assertThat(dndMode?.isActive).isFalse()
        }

    @Test
    @EnableFlags(Flags.FLAG_QS_UI_REFACTOR_COMPOSE_FRAGMENT)
    fun handleToggleClick_dndInactive_activatesDnd() =
        testScope.runTest {
            val dndMode by collectLastValue(zenModeInteractor.dndMode)

            zenModeRepository.addMode(TestModeBuilder.MANUAL_DND_INACTIVE)
            assertThat(dndMode?.isActive).isFalse()

            underTest.handleInput(
                QSTileInputTestKtx.toggleClick(data = modelOf(false, emptyList()))
            )

            assertThat(dndMode?.isActive).isTrue()
        }

    @Test
    fun handleLongClick_active_opensSettings() = runTest {
        underTest.handleInput(QSTileInputTestKtx.longClick(modelOf(true, listOf("DND"))))

        QSTileIntentUserInputHandlerSubject.assertThat(inputHandler).handledOneIntentInput {
@@ -82,7 +147,7 @@ class ModesTileUserActionInteractorTest : SysuiTestCase() {
    }

    @Test
    fun handleLongClick_inactive() = runTest {
    fun handleLongClick_inactive_opensSettings() = runTest {
        underTest.handleInput(QSTileInputTestKtx.longClick(modelOf(false, emptyList())))

        QSTileIntentUserInputHandlerSubject.assertThat(inputHandler).handledOneIntentInput {
+16 −0
Original line number Diff line number Diff line
@@ -250,6 +250,22 @@ class ZenModeInteractorTest : SysuiTestCase() {
                .isEqualTo(Duration.ofMinutes(60))
        }

    @Test
    fun deactivateAllModes_updatesCorrectModes() =
        testScope.runTest {
            zenModeRepository.addModes(
                listOf(
                    TestModeBuilder.MANUAL_DND_ACTIVE,
                    TestModeBuilder().setName("Inactive").setActive(false).build(),
                    TestModeBuilder().setName("Active").setActive(true).build(),
                )
            )

            underTest.deactivateAllModes()

            assertThat(zenModeRepository.getModes().filter { it.isActive }).isEmpty()
        }

    @Test
    fun activeModes_computesMainActiveMode() =
        testScope.runTest {
+2 −12
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@ import android.provider.Settings.Secure.ZEN_DURATION_PROMPT
import android.service.notification.ZenModeConfig
import android.util.Log
import com.android.settingslib.notification.modes.EnableZenModeDialog
import com.android.settingslib.notification.modes.ZenMode
import com.android.settingslib.notification.modes.ZenModeDialogMetricsLogger
import com.android.systemui.animation.Expandable
import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging
@@ -99,15 +98,6 @@ constructor(
    private var oldIsAvailable = false
    private var settingsValue: Int = 0

    private val dndMode: StateFlow<ZenMode?> by lazy {
        ModesUi.assertInNewMode()
        interactor.dndMode.stateIn(
            scope = backgroundScope,
            started = SharingStarted.Eagerly,
            initialValue = null,
        )
    }

    private val isAvailable: StateFlow<Boolean> by lazy {
        ModesUi.assertInNewMode()
        interactor.isZenAvailable.stateIn(
@@ -146,7 +136,7 @@ constructor(

    override val lockScreenState: Flow<KeyguardQuickAffordanceConfig.LockScreenState> =
        if (ModesUi.isEnabled) {
            combine(isAvailable, dndMode) { isAvailable, dndMode ->
            combine(isAvailable, interactor.dndMode) { isAvailable, dndMode ->
                if (!isAvailable) {
                    KeyguardQuickAffordanceConfig.LockScreenState.Hidden
                } else if (dndMode?.isActive == true) {
@@ -222,7 +212,7 @@ constructor(
            if (!isAvailable.value) {
                KeyguardQuickAffordanceConfig.OnTriggeredResult.Handled
            } else {
                val dnd = dndMode.value
                val dnd = interactor.dndMode.value
                if (dnd == null) {
                    Log.wtf(TAG, "Triggered DND but it's null!?")
                    return KeyguardQuickAffordanceConfig.OnTriggeredResult.Handled
+6 −0
Original line number Diff line number Diff line
@@ -109,6 +109,11 @@ constructor(
        userActionInteractor.handleClick(expandable)
    }

    override fun handleSecondaryClick(expandable: Expandable?) = runBlocking {
        val model = dataInteractor.getCurrentTileModel()
        userActionInteractor.handleToggleClick(model)
    }

    override fun getLongClickIntent(): Intent = userActionInteractor.longClickIntent

    @VisibleForTesting
@@ -125,6 +130,7 @@ constructor(
            secondaryLabel = tileState.secondaryLabel
            contentDescription = tileState.contentDescription
            expandedAccessibilityClassName = tileState.expandedAccessibilityClassName
            handlesSecondaryClick = true
        }
    }

Loading