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

Commit 08d7cc4e authored by Matías Hernández's avatar Matías Hernández
Browse files

When deactivating multiple modes, do so in reverse order of priority

The important part is that the highest-priority mode gets deactivated last. This has two positive results:
* The icon will in the tile and status bar won't rapidly update while the modes are being deactivated.
* If the Modes Tile ever uses the "last manually used mode" as the quick mode, it will be the highest-priority mode (the one that was previously shown) instead of a random one.

Bug: 405988332
Test: atest ZenModeInteractorTest
Flag: android.app.modes_ui_tile_reactivates_last
Change-Id: Id8b800cdc08fbafaba436ec72efb7b93a078e9a4
parent 1caf584c
Loading
Loading
Loading
Loading
+50 −0
Original line number Diff line number Diff line
@@ -17,6 +17,9 @@
package com.android.systemui.statusbar.policy.domain.interactor

import android.app.AutomaticZenRule
import android.app.AutomaticZenRule.TYPE_BEDTIME
import android.app.AutomaticZenRule.TYPE_DRIVING
import android.app.AutomaticZenRule.TYPE_OTHER
import android.app.Flags
import android.app.NotificationManager.Policy
import android.media.AudioManager
@@ -34,9 +37,11 @@ import com.android.internal.R
import com.android.settingslib.notification.data.repository.updateNotificationPolicy
import com.android.settingslib.notification.modes.TestModeBuilder
import com.android.settingslib.notification.modes.TestModeBuilder.MANUAL_DND
import com.android.settingslib.notification.modes.ZenMode
import com.android.settingslib.volume.shared.model.AudioStream
import com.android.systemui.SysuiTestCase
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.collectValues
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.shared.settings.data.repository.secureSettingsRepository
@@ -229,6 +234,51 @@ class ZenModeInteractorTest : SysuiTestCase() {
            assertThat(zenModeRepository.getModes().filter { it.isActive }).isEmpty()
        }

    @Test
    @EnableFlags(Flags.FLAG_MODES_UI_TILE_REACTIVATES_LAST)
    fun deactivateAllModes_deactivatesInOrder() =
        kosmos.runTest {
            zenModeRepository.activateMode(MANUAL_DND) // Priority 1
            zenModeRepository.addModes(
                listOf(
                    TestModeBuilder()
                        .setName("Priority 2")
                        .setType(TYPE_BEDTIME)
                        .setActive(true)
                        .build(),
                    TestModeBuilder()
                        .setName("Priority 4")
                        .setType(TYPE_OTHER)
                        .setActive(true)
                        .build(),
                    TestModeBuilder()
                        .setName("Priority 3")
                        .setType(TYPE_DRIVING)
                        .setActive(true)
                        .build(),
                )
            )
            val modesHistory: List<List<ZenMode>> by collectValues(underTest.modes)
            assertThat(zenModeRepository.getModes().filter { it.isActive }).hasSize(4)

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

            fun activeModeNames(modes: List<ZenMode>) = modes.filter { it.isActive }.map { it.name }

            // Verify that modes were deactivated from lower to higher priority.
            // 4 individual deactivation events, so 5 emissions.
            assertThat(modesHistory).hasSize(5)
            assertThat(activeModeNames(modesHistory[0]))
                .containsExactly("Do Not Disturb", "Priority 2", "Priority 3", "Priority 4")
            assertThat(activeModeNames(modesHistory[1]))
                .containsExactly("Do Not Disturb", "Priority 2", "Priority 3")
            assertThat(activeModeNames(modesHistory[2]))
                .containsExactly("Do Not Disturb", "Priority 2")
            assertThat(activeModeNames(modesHistory[3])).containsExactly("Do Not Disturb")
            assertThat(activeModeNames(modesHistory[4])).isEmpty()
        }

    @Test
    fun activeModes_computesMainActiveMode() =
        kosmos.runTest {
+15 −2
Original line number Diff line number Diff line
@@ -239,12 +239,25 @@ constructor(
    }

    fun deactivateAllModes() {
        if (android.app.Flags.modesUiTileReactivatesLast()) {
            // Deactivate in reverse order of priority. This will prevent flickering in the
            // "active mode" icon (which is the highest-priority one).
            val modesToDeactivate =
                zenModeRepository
                    .getModes()
                    .filter { it.isActive }
                    .sortedWith(ZenMode.PRIORITIZING_COMPARATOR.reversed())
            for (mode in modesToDeactivate) {
                deactivateMode(mode)
            }
        } else {
            for (mode in zenModeRepository.getModes()) {
                if (mode.isActive) {
                    deactivateMode(mode)
                }
            }
        }
    }

    private val zenDuration
        get() = notificationSettingsRepository.zenDuration.value