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

Commit bb4249ba authored by Anton Potapov's avatar Anton Potapov
Browse files

Fix volume dialog a11y show timeout

Flag: com.android.systemui.volume_redesign
Bug: 369993959
Test: manual on the phone. Make sure it takes longer for the dialog to
disappear when the voice over is enabled.
Change-Id: Ic1d81234e7495f7762f96cd7212ec754acc6b19c
parent dfd9d303
Loading
Loading
Loading
Loading
+12 −12
Original line number Diff line number Diff line
@@ -17,16 +17,17 @@
package com.android.systemui.volume.dialog.domain.interactor

import android.app.ActivityManager
import android.testing.TestableLooper
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.coroutines.collectLastValue
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.testScope
import com.android.systemui.plugins.fakeVolumeDialogController
import com.android.systemui.testKosmos
import com.android.systemui.volume.Events
import com.android.systemui.volume.dialog.shared.model.VolumeDialogSafetyWarningModel
import com.android.systemui.volume.dialog.shared.model.VolumeDialogVisibilityModel
import com.google.common.truth.Truth.assertThat
import kotlin.time.Duration.Companion.days
@@ -34,7 +35,6 @@ import kotlin.time.Duration.Companion.seconds
import kotlinx.coroutines.test.advanceTimeBy
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith

@@ -42,18 +42,19 @@ private val dialogTimeoutDuration = 3.seconds

@SmallTest
@RunWith(AndroidJUnit4::class)
@TestableLooper.RunWithLooper
@OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
class VolumeDialogVisibilityInteractorTest : SysuiTestCase() {

    private val kosmos: Kosmos = testKosmos()

    private lateinit var underTest: VolumeDialogVisibilityInteractor

    @Before
    fun setUp() {
        underTest = kosmos.volumeDialogVisibilityInteractor
    private val kosmos: Kosmos =
        testKosmos().apply {
            accessibilityRepository.setRecommendedTimeout(dialogTimeoutDuration)
            volumeDialogStateInteractor.setHovering(false)
            volumeDialogStateInteractor.setSafetyWarning(VolumeDialogSafetyWarningModel.Invisible)
        }

    private val underTest: VolumeDialogVisibilityInteractor =
        kosmos.volumeDialogVisibilityInteractor

    @Test
    fun testShowRequest_visible() =
        with(kosmos) {
@@ -92,6 +93,7 @@ class VolumeDialogVisibilityInteractorTest : SysuiTestCase() {
                runCurrent()

                fakeVolumeDialogController.onDismissRequested(Events.DISMISS_REASON_SCREEN_OFF)
                runCurrent()

                assertThat(visibilityModel!!)
                    .isEqualTo(
@@ -105,7 +107,6 @@ class VolumeDialogVisibilityInteractorTest : SysuiTestCase() {
        with(kosmos) {
            testScope.runTest {
                runCurrent()
                underTest.resetDismissTimeout()
                val visibilityModel by collectLastValue(underTest.dialogVisibility)
                fakeVolumeDialogController.onShowRequested(
                    Events.SHOW_REASON_VOLUME_CHANGED,
@@ -126,7 +127,6 @@ class VolumeDialogVisibilityInteractorTest : SysuiTestCase() {
        with(kosmos) {
            testScope.runTest {
                runCurrent()
                underTest.resetDismissTimeout()
                val visibilityModel by collectLastValue(underTest.dialogVisibility)
                fakeVolumeDialogController.onShowRequested(
                    Events.SHOW_REASON_VOLUME_CHANGED,
+5 −10
Original line number Diff line number Diff line
@@ -17,10 +17,10 @@
package com.android.systemui.volume.dialog.sliders.domain.interactor

import android.app.ActivityManager
import android.testing.TestableLooper
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.collectLastValue
import com.android.systemui.kosmos.testScope
import com.android.systemui.plugins.fakeVolumeDialogController
@@ -35,24 +35,19 @@ import kotlin.time.Duration.Companion.seconds
import kotlinx.coroutines.test.advanceTimeBy
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.runner.RunWith

private val volumeDialogTimeout = 3.seconds

@SmallTest
@RunWith(AndroidJUnit4::class)
@TestableLooper.RunWithLooper
class VolumeDialogSliderInputEventsInteractorTest : SysuiTestCase() {

    private val kosmos = testKosmos()
    private val kosmos =
        testKosmos().apply { accessibilityRepository.setRecommendedTimeout(volumeDialogTimeout) }

    private lateinit var underTest: VolumeDialogSliderInputEventsInteractor

    @Before
    fun setup() {
        underTest = kosmos.volumeDialogSliderInputEventsInteractor
    }
    private val underTest: VolumeDialogSliderInputEventsInteractor =
        kosmos.volumeDialogSliderInputEventsInteractor

    @Test
    fun inputEvents_resetDialogVisibilityTimeout() =
+0 −1
Original line number Diff line number Diff line
@@ -557,7 +557,6 @@
        <item name="android:backgroundDimEnabled">false</item>
        <item name="android:showWhenLocked">true</item>
        <item name="android:windowBackground">@color/transparent</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowIsFloating">false</item>
        <item name="android:windowNoTitle">true</item>
+12 −3
Original line number Diff line number Diff line
@@ -22,6 +22,8 @@ import com.android.app.tracing.FlowTracing.tracedAwaitClose
import com.android.app.tracing.FlowTracing.tracedConflatedCallbackFlow
import dagger.Module
import dagger.Provides
import kotlin.time.Duration
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.distinctUntilChanged

@@ -32,6 +34,8 @@ interface AccessibilityRepository {
    /** @see [AccessibilityManager.isEnabled] */
    val isEnabled: Flow<Boolean>

    fun getRecommendedTimeout(originalTimeout: Duration, uiFlags: Int): Duration

    companion object {
        operator fun invoke(a11yManager: AccessibilityManager): AccessibilityRepository =
            AccessibilityRepositoryImpl(a11yManager)
@@ -40,9 +44,8 @@ interface AccessibilityRepository {

private const val TAG = "AccessibilityRepository"

private class AccessibilityRepositoryImpl(
    manager: AccessibilityManager,
) : AccessibilityRepository {
private class AccessibilityRepositoryImpl(private val manager: AccessibilityManager) :
    AccessibilityRepository {
    override val isTouchExplorationEnabled: Flow<Boolean> =
        tracedConflatedCallbackFlow(TAG) {
                val listener = TouchExplorationStateChangeListener(::trySend)
@@ -62,6 +65,12 @@ private class AccessibilityRepositoryImpl(
                tracedAwaitClose(TAG) { manager.removeAccessibilityStateChangeListener(listener) }
            }
            .distinctUntilChanged()

    override fun getRecommendedTimeout(originalTimeout: Duration, uiFlags: Int): Duration {
        return manager
            .getRecommendedTimeoutMillis(originalTimeout.inWholeMilliseconds.toInt(), uiFlags)
            .milliseconds
    }
}

@Module
+0 −3
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@
package com.android.systemui.volume.dialog

import android.content.Context
import android.graphics.PixelFormat
import android.os.Bundle
import android.view.MotionEvent
import android.view.View
@@ -51,10 +50,8 @@ constructor(
                    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
            )
            addPrivateFlags(WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY)

            setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY)
            setWindowAnimations(-1)
            setFormat(PixelFormat.TRANSLUCENT)

            attributes =
                attributes.apply {
Loading