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

Commit 0a9108cd authored by Anton Potapov's avatar Anton Potapov
Browse files

Reset dialog timeout when warning appears

Flag: com.android.systemui.volume_redesign
Change-Id: Ic0564f08e9ca56aa567b2e3e8b4081c60d512644
Test: VolumeDialogPluginViewModelTest
parent 87ae0365
Loading
Loading
Loading
Loading
+82 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.volume.dialog.ui.viewmodel

import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.accessibility.data.repository.accessibilityRepository
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testScope
import com.android.systemui.testKosmos
import com.android.systemui.volume.Events
import com.android.systemui.volume.dialog.data.repository.volumeDialogVisibilityRepository
import com.android.systemui.volume.dialog.domain.interactor.volumeDialogVisibilityInteractor
import com.android.systemui.volume.dialog.shared.model.VolumeDialogVisibilityModel
import com.google.common.truth.Truth.assertThat
import kotlin.time.Duration.Companion.seconds
import kotlinx.coroutines.test.advanceTimeBy
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith

@SmallTest
@RunWith(AndroidJUnit4::class)
class VolumeDialogPluginViewModelTest : SysuiTestCase() {

    private val kosmos: Kosmos = testKosmos()

    private val underTest: VolumeDialogPluginViewModel by lazy {
        kosmos.volumeDialogPluginViewModel
    }

    @Before
    fun setUp() =
        with(kosmos) {
            volumeDialogVisibilityRepository.updateVisibility {
                VolumeDialogVisibilityModel.Visible(Events.SHOW_REASON_VOLUME_CHANGED, false, 0)
            }
        }

    @Test
    fun safetyWarningAppears_timeoutReset() =
        kosmos.runTest {
            accessibilityRepository.setRecommendedTimeout(3.seconds)
            val visibility by collectLastValue(volumeDialogVisibilityInteractor.dialogVisibility)
            testScope.advanceTimeBy(2.seconds)
            assertThat(visibility).isInstanceOf(VolumeDialogVisibilityModel.Visible::class.java)

            underTest.onSafetyWarningDialogShown()
            testScope.advanceTimeBy(2.seconds)
            assertThat(visibility).isInstanceOf(VolumeDialogVisibilityModel.Visible::class.java)
        }

    @Test
    fun csdWarningAppears_timeoutReset() =
        kosmos.runTest {
            accessibilityRepository.setRecommendedTimeout(3.seconds)
            val visibility by collectLastValue(volumeDialogVisibilityInteractor.dialogVisibility)
            testScope.advanceTimeBy(2.seconds)
            assertThat(visibility).isInstanceOf(VolumeDialogVisibilityModel.Visible::class.java)

            underTest.onCsdWarningDialogShown()
            testScope.advanceTimeBy(2.seconds)
            assertThat(visibility).isInstanceOf(VolumeDialogVisibilityModel.Visible::class.java)
        }
}
+2 −0
Original line number Diff line number Diff line
@@ -68,6 +68,7 @@ constructor(
        viewModel.isShowingSafetyWarning
            .mapLatest { isShowingSafetyWarning ->
                if (isShowingSafetyWarning) {
                    viewModel.onSafetyWarningDialogShown()
                    showSafetyWarningVisibility { viewModel.onSafetyWarningDismissed() }
                }
            }
@@ -76,6 +77,7 @@ constructor(
        viewModel.csdWarning
            .mapLatest { csdWarning ->
                if (csdWarning != null) {
                    viewModel.onCsdWarningDialogShown()
                    showCsdWarningDialog(csdWarning, viewModel.csdWarningConfigModel.actions) {
                        viewModel.onCsdWarningDismissed()
                    }
+8 −0
Original line number Diff line number Diff line
@@ -70,10 +70,18 @@ constructor(
    val isShowingSafetyWarning: Flow<Boolean> = dialogSafetyWarningInteractor.isShowingSafetyWarning
    val csdWarning: Flow<Int?> = dialogCsdWarningInteractor.csdWarning

    fun onSafetyWarningDialogShown() {
        dialogVisibilityInteractor.resetDismissTimeout()
    }

    fun onSafetyWarningDismissed() {
        dialogSafetyWarningInteractor.onSafetyWarningDismissed()
    }

    fun onCsdWarningDialogShown() {
        dialogVisibilityInteractor.resetDismissTimeout()
    }

    fun onCsdWarningDismissed() {
        dialogCsdWarningInteractor.onCsdWarningDismissed()
    }
+26 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.volume.dialog.domain.interactor

import com.android.systemui.kosmos.Kosmos
import com.android.systemui.volume.dialog.shared.model.CsdWarningConfigModel

val Kosmos.volumeDialogCsdWarningInteractor: VolumeDialogCsdWarningInteractor by
    Kosmos.Fixture { VolumeDialogCsdWarningInteractor(volumeDialogStateInteractor) }

val Kosmos.csdWarningConfigModel: CsdWarningConfigModel by
    Kosmos.Fixture { CsdWarningConfigModel(emptyList()) }
+41 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.volume.dialog.ui.viewmodel

import com.android.internal.logging.uiEventLogger
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.backgroundScope
import com.android.systemui.volume.dialog.domain.interactor.csdWarningConfigModel
import com.android.systemui.volume.dialog.domain.interactor.volumeDialogCsdWarningInteractor
import com.android.systemui.volume.dialog.domain.interactor.volumeDialogSafetyWarningInteractor
import com.android.systemui.volume.dialog.domain.interactor.volumeDialogVisibilityInteractor
import com.android.systemui.volume.dialog.shared.volumeDialogLogger
import com.android.systemui.volume.dialog.volumeDialog

val Kosmos.volumeDialogPluginViewModel: VolumeDialogPluginViewModel by
    Kosmos.Fixture {
        VolumeDialogPluginViewModel(
            backgroundScope,
            volumeDialogVisibilityInteractor,
            volumeDialogSafetyWarningInteractor,
            volumeDialogCsdWarningInteractor,
            { volumeDialog },
            volumeDialogLogger,
            csdWarningConfigModel,
            uiEventLogger,
        )
    }