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

Commit d7b76a6a authored by Ioana Alexandru's avatar Ioana Alexandru
Browse files

Toggle modes when pressing tile

Bug: 346519570
Test: ModesDialogViewModelTest
Flag: android.app.modes_ui
Change-Id: Ibab0f9de0d96d44c8474dad7db4deed0cd22409f
parent 88ac3268
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.app.NotificationManager
import android.provider.Settings
import com.android.settingslib.notification.modes.TestModeBuilder
import com.android.settingslib.notification.modes.ZenMode
import java.time.Duration
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
@@ -63,6 +64,20 @@ class FakeZenModeRepository : ZenModeRepository {
        mutableModesFlow.value = mutableModesFlow.value.filter { it.id != id }
    }

    override fun activateMode(zenMode: ZenMode, duration: Duration?) {
        activateMode(zenMode.id)
    }

    override fun deactivateMode(zenMode: ZenMode) {
        deactivateMode(zenMode.id)
    }

    fun activateMode(id: String) {
        val oldMode = mutableModesFlow.value.find { it.id == id } ?: return
        removeMode(id)
        mutableModesFlow.value += TestModeBuilder(oldMode).setActive(true).build()
    }

    fun deactivateMode(id: String) {
        val oldMode = mutableModesFlow.value.find { it.id == id } ?: return
        removeMode(id)
+13 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.provider.Settings
import com.android.settingslib.flags.Flags
import com.android.settingslib.notification.modes.ZenMode
import com.android.settingslib.notification.modes.ZenModesBackend
import java.time.Duration
import kotlin.coroutines.CoroutineContext
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.awaitClose
@@ -56,6 +57,10 @@ interface ZenModeRepository {

    /** A list of all existing priority modes. */
    val modes: Flow<List<ZenMode>>

    fun activateMode(zenMode: ZenMode, duration: Duration? = null)

    fun deactivateMode(zenMode: ZenMode)
}

class ZenModeRepositoryImpl(
@@ -177,4 +182,12 @@ class ZenModeRepositoryImpl(
            flowOf(emptyList())
        }
    }

    override fun activateMode(zenMode: ZenMode, duration: Duration?) {
        backend.activateMode(zenMode, duration)
    }

    override fun deactivateMode(zenMode: ZenMode) {
        backend.deactivateMode(zenMode)
    }
}
+33 −0
Original line number Diff line number Diff line
@@ -128,4 +128,37 @@ class ModesDialogViewModelTest : SysuiTestCase() {
                assertThat(this.enabled).isEqualTo(false)
            }
        }

    @Test
    fun onClick_togglesTileState() =
        testScope.runTest {
            val tiles by collectLastValue(underTest.tiles)

            val modeId = "id"
            repository.addModes(
                listOf(
                    TestModeBuilder()
                        .setId(modeId)
                        .setName("Test")
                        .setManualInvocationAllowed(true)
                        .build()
                )
            )
            runCurrent()

            assertThat(tiles?.size).isEqualTo(1)
            assertThat(tiles?.elementAt(0)?.enabled).isFalse()

            // Trigger onClick
            tiles?.first()?.onClick?.let { it() }
            runCurrent()

            assertThat(tiles?.first()?.enabled).isTrue()

            // Trigger onClick
            tiles?.first()?.onClick?.let { it() }
            runCurrent()

            assertThat(tiles?.first()?.enabled).isFalse()
        }
}
+10 −1
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import com.android.settingslib.notification.data.repository.ZenModeRepository
import com.android.settingslib.notification.modes.ZenIconLoader
import com.android.settingslib.notification.modes.ZenMode
import com.android.systemui.common.shared.model.Icon
import java.time.Duration
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
@@ -33,7 +34,7 @@ import kotlinx.coroutines.flow.map
 * An interactor that performs business logic related to the status and configuration of Zen Mode
 * (or Do Not Disturb/DND Mode).
 */
class ZenModeInteractor @Inject constructor(repository: ZenModeRepository) {
class ZenModeInteractor @Inject constructor(private val repository: ZenModeRepository) {
    private val iconLoader: ZenIconLoader = ZenIconLoader.getInstance()

    val isZenModeEnabled: Flow<Boolean> =
@@ -65,4 +66,12 @@ class ZenModeInteractor @Inject constructor(repository: ZenModeRepository) {
    suspend fun getModeIcon(mode: ZenMode, context: Context): Icon {
        return Icon.Loaded(mode.getIcon(context, iconLoader).await(), contentDescription = null)
    }

    fun activateMode(zenMode: ZenMode, duration: Duration? = null) {
        repository.activateMode(zenMode, duration)
    }

    fun deactivateMode(zenMode: ZenMode) {
        repository.deactivateMode(zenMode)
    }
}
+6 −1
Original line number Diff line number Diff line
@@ -63,7 +63,12 @@ constructor(
                        //  "ON: Do Not Disturb, Until Mon 08:09"; see DndTile.
                        contentDescription = "",
                        onClick = {
                            // TODO(b/346519570): Toggle mode.
                            if (mode.isActive) {
                                zenModeInteractor.deactivateMode(mode)
                            } else {
                                // TODO(b/346519570): Handle duration for DND mode.
                                zenModeInteractor.activateMode(mode)
                            }
                        },
                        onLongClick = {
                            // TODO(b/346519570): Open settings page for mode.