Merge "[Media TTT] Update timeout to take accessibility settings into account. This will extend the timeout for the chip to at least 10s if a11y is on, or longer if the user has it set to longer." into tm-qpr-dev

This commit is contained in:
Caitlin Cassidy
2022-06-21 15:36:58 +00:00
committed by Android (Google) Code Review
7 changed files with 50 additions and 6 deletions

View File

@@ -27,4 +27,4 @@ interface ChipInfoCommon {
fun getTimeoutMs(): Long fun getTimeoutMs(): Long
} }
const val DEFAULT_TIMEOUT_MILLIS = 3000L const val DEFAULT_TIMEOUT_MILLIS = 4000L

View File

@@ -31,6 +31,10 @@ import android.view.MotionEvent
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.WindowManager import android.view.WindowManager
import android.view.accessibility.AccessibilityManager
import android.view.accessibility.AccessibilityManager.FLAG_CONTENT_CONTROLS
import android.view.accessibility.AccessibilityManager.FLAG_CONTENT_ICONS
import android.view.accessibility.AccessibilityManager.FLAG_CONTENT_TEXT
import android.widget.LinearLayout import android.widget.LinearLayout
import com.android.internal.widget.CachingIconView import com.android.internal.widget.CachingIconView
import com.android.settingslib.Utils import com.android.settingslib.Utils
@@ -56,6 +60,7 @@ abstract class MediaTttChipControllerCommon<T : ChipInfoCommon>(
private val windowManager: WindowManager, private val windowManager: WindowManager,
private val viewUtil: ViewUtil, private val viewUtil: ViewUtil,
@Main private val mainExecutor: DelayableExecutor, @Main private val mainExecutor: DelayableExecutor,
private val accessibilityManager: AccessibilityManager,
private val tapGestureDetector: TapGestureDetector, private val tapGestureDetector: TapGestureDetector,
private val powerManager: PowerManager, private val powerManager: PowerManager,
@LayoutRes private val chipLayoutRes: Int @LayoutRes private val chipLayoutRes: Int
@@ -110,10 +115,16 @@ abstract class MediaTttChipControllerCommon<T : ChipInfoCommon>(
} }
// Cancel and re-set the chip timeout each time we get a new state. // Cancel and re-set the chip timeout each time we get a new state.
val timeout = accessibilityManager.getRecommendedTimeoutMillis(
chipInfo.getTimeoutMs().toInt(),
// Not all chips have controls so FLAG_CONTENT_CONTROLS might be superfluous, but
// include it just to be safe.
FLAG_CONTENT_ICONS or FLAG_CONTENT_TEXT or FLAG_CONTENT_CONTROLS
)
cancelChipViewTimeout?.run() cancelChipViewTimeout?.run()
cancelChipViewTimeout = mainExecutor.executeDelayed( cancelChipViewTimeout = mainExecutor.executeDelayed(
{ removeChip(MediaTttRemovalReason.REASON_TIMEOUT) }, { removeChip(MediaTttRemovalReason.REASON_TIMEOUT) },
chipInfo.getTimeoutMs() timeout.toLong()
) )
} }

View File

@@ -26,6 +26,7 @@ import android.os.PowerManager
import android.util.Log import android.util.Log
import android.view.ViewGroup import android.view.ViewGroup
import android.view.WindowManager import android.view.WindowManager
import android.view.accessibility.AccessibilityManager
import com.android.systemui.R import com.android.systemui.R
import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dagger.qualifiers.Main
@@ -52,6 +53,7 @@ class MediaTttChipControllerReceiver @Inject constructor(
windowManager: WindowManager, windowManager: WindowManager,
viewUtil: ViewUtil, viewUtil: ViewUtil,
mainExecutor: DelayableExecutor, mainExecutor: DelayableExecutor,
accessibilityManager: AccessibilityManager,
tapGestureDetector: TapGestureDetector, tapGestureDetector: TapGestureDetector,
powerManager: PowerManager, powerManager: PowerManager,
@Main private val mainHandler: Handler, @Main private val mainHandler: Handler,
@@ -62,6 +64,7 @@ class MediaTttChipControllerReceiver @Inject constructor(
windowManager, windowManager,
viewUtil, viewUtil,
mainExecutor, mainExecutor,
accessibilityManager,
tapGestureDetector, tapGestureDetector,
powerManager, powerManager,
R.layout.media_ttt_chip_receiver R.layout.media_ttt_chip_receiver

View File

@@ -24,6 +24,7 @@ import android.util.Log
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.WindowManager import android.view.WindowManager
import android.view.accessibility.AccessibilityManager
import android.widget.TextView import android.widget.TextView
import com.android.internal.statusbar.IUndoMediaTransferCallback import com.android.internal.statusbar.IUndoMediaTransferCallback
import com.android.systemui.R import com.android.systemui.R
@@ -53,6 +54,7 @@ class MediaTttChipControllerSender @Inject constructor(
windowManager: WindowManager, windowManager: WindowManager,
viewUtil: ViewUtil, viewUtil: ViewUtil,
@Main mainExecutor: DelayableExecutor, @Main mainExecutor: DelayableExecutor,
accessibilityManager: AccessibilityManager,
tapGestureDetector: TapGestureDetector, tapGestureDetector: TapGestureDetector,
powerManager: PowerManager, powerManager: PowerManager,
private val uiEventLogger: MediaTttSenderUiEventLogger private val uiEventLogger: MediaTttSenderUiEventLogger
@@ -62,6 +64,7 @@ class MediaTttChipControllerSender @Inject constructor(
windowManager, windowManager,
viewUtil, viewUtil,
mainExecutor, mainExecutor,
accessibilityManager,
tapGestureDetector, tapGestureDetector,
powerManager, powerManager,
R.layout.media_ttt_chip R.layout.media_ttt_chip

View File

@@ -25,6 +25,7 @@ import android.view.MotionEvent
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.WindowManager import android.view.WindowManager
import android.view.accessibility.AccessibilityManager
import android.widget.ImageView import android.widget.ImageView
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
import com.android.systemui.R import com.android.systemui.R
@@ -65,6 +66,8 @@ class MediaTttChipControllerCommonTest : SysuiTestCase() {
@Mock @Mock
private lateinit var logger: MediaTttLogger private lateinit var logger: MediaTttLogger
@Mock @Mock
private lateinit var accessibilityManager: AccessibilityManager
@Mock
private lateinit var windowManager: WindowManager private lateinit var windowManager: WindowManager
@Mock @Mock
private lateinit var viewUtil: ViewUtil private lateinit var viewUtil: ViewUtil
@@ -88,11 +91,21 @@ class MediaTttChipControllerCommonTest : SysuiTestCase() {
)).thenReturn(applicationInfo) )).thenReturn(applicationInfo)
context.setMockPackageManager(packageManager) context.setMockPackageManager(packageManager)
whenever(accessibilityManager.getRecommendedTimeoutMillis(any(), any()))
.thenReturn(TIMEOUT_MS.toInt())
fakeClock = FakeSystemClock() fakeClock = FakeSystemClock()
fakeExecutor = FakeExecutor(fakeClock) fakeExecutor = FakeExecutor(fakeClock)
controllerCommon = TestControllerCommon( controllerCommon = TestControllerCommon(
context, logger, windowManager, viewUtil, fakeExecutor, tapGestureDetector, powerManager context,
logger,
windowManager,
viewUtil,
fakeExecutor,
accessibilityManager,
tapGestureDetector,
powerManager
) )
} }
@@ -344,6 +357,7 @@ class MediaTttChipControllerCommonTest : SysuiTestCase() {
windowManager: WindowManager, windowManager: WindowManager,
viewUtil: ViewUtil, viewUtil: ViewUtil,
@Main mainExecutor: DelayableExecutor, @Main mainExecutor: DelayableExecutor,
accessibilityManager: AccessibilityManager,
tapGestureDetector: TapGestureDetector, tapGestureDetector: TapGestureDetector,
powerManager: PowerManager powerManager: PowerManager
) : MediaTttChipControllerCommon<ChipInfo>( ) : MediaTttChipControllerCommon<ChipInfo>(
@@ -352,6 +366,7 @@ class MediaTttChipControllerCommonTest : SysuiTestCase() {
windowManager, windowManager,
viewUtil, viewUtil,
mainExecutor, mainExecutor,
accessibilityManager,
tapGestureDetector, tapGestureDetector,
powerManager, powerManager,
R.layout.media_ttt_chip R.layout.media_ttt_chip
@@ -364,7 +379,7 @@ class MediaTttChipControllerCommonTest : SysuiTestCase() {
} }
inner class ChipInfo : ChipInfoCommon { inner class ChipInfo : ChipInfoCommon {
override fun getTimeoutMs() = TIMEOUT_MS override fun getTimeoutMs() = 1L
} }
} }

View File

@@ -28,6 +28,7 @@ import android.testing.TestableLooper
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.WindowManager import android.view.WindowManager
import android.view.accessibility.AccessibilityManager
import android.widget.ImageView import android.widget.ImageView
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
import com.android.internal.logging.testing.UiEventLoggerFake import com.android.internal.logging.testing.UiEventLoggerFake
@@ -65,6 +66,8 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
@Mock @Mock
private lateinit var logger: MediaTttLogger private lateinit var logger: MediaTttLogger
@Mock @Mock
private lateinit var accessibilityManager: AccessibilityManager
@Mock
private lateinit var powerManager: PowerManager private lateinit var powerManager: PowerManager
@Mock @Mock
private lateinit var windowManager: WindowManager private lateinit var windowManager: WindowManager
@@ -99,6 +102,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
windowManager, windowManager,
viewUtil, viewUtil,
FakeExecutor(FakeSystemClock()), FakeExecutor(FakeSystemClock()),
accessibilityManager,
TapGestureDetector(context), TapGestureDetector(context),
powerManager, powerManager,
Handler.getMain(), Handler.getMain(),

View File

@@ -27,6 +27,7 @@ import android.testing.TestableLooper
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.WindowManager import android.view.WindowManager
import android.view.accessibility.AccessibilityManager
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
@@ -67,6 +68,8 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() {
@Mock @Mock
private lateinit var logger: MediaTttLogger private lateinit var logger: MediaTttLogger
@Mock @Mock
private lateinit var accessibilityManager: AccessibilityManager
@Mock
private lateinit var powerManager: PowerManager private lateinit var powerManager: PowerManager
@Mock @Mock
private lateinit var windowManager: WindowManager private lateinit var windowManager: WindowManager
@@ -95,9 +98,12 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() {
fakeClock = FakeSystemClock() fakeClock = FakeSystemClock()
fakeExecutor = FakeExecutor(fakeClock) fakeExecutor = FakeExecutor(fakeClock)
uiEventLoggerFake = UiEventLoggerFake() uiEventLoggerFake = UiEventLoggerFake()
senderUiEventLogger = MediaTttSenderUiEventLogger(uiEventLoggerFake) senderUiEventLogger = MediaTttSenderUiEventLogger(uiEventLoggerFake)
whenever(accessibilityManager.getRecommendedTimeoutMillis(any(), any())).thenReturn(TIMEOUT)
controllerSender = MediaTttChipControllerSender( controllerSender = MediaTttChipControllerSender(
commandQueue, commandQueue,
context, context,
@@ -105,6 +111,7 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() {
windowManager, windowManager,
viewUtil, viewUtil,
fakeExecutor, fakeExecutor,
accessibilityManager,
TapGestureDetector(context), TapGestureDetector(context),
powerManager, powerManager,
senderUiEventLogger senderUiEventLogger
@@ -592,7 +599,7 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() {
fakeClock.advanceTime(1000L) fakeClock.advanceTime(1000L)
controllerSender.removeChip("fakeRemovalReason") controllerSender.removeChip("fakeRemovalReason")
fakeClock.advanceTime(state.state.timeout + 1) fakeClock.advanceTime(TIMEOUT + 1L)
verify(windowManager).removeView(any()) verify(windowManager).removeView(any())
} }
@@ -615,7 +622,7 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() {
fakeClock.advanceTime(1000L) fakeClock.advanceTime(1000L)
controllerSender.removeChip("fakeRemovalReason") controllerSender.removeChip("fakeRemovalReason")
fakeClock.advanceTime(state.state.timeout + 1) fakeClock.advanceTime(TIMEOUT + 1L)
verify(windowManager).removeView(any()) verify(windowManager).removeView(any())
} }
@@ -674,6 +681,7 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() {
private const val APP_NAME = "Fake app name" private const val APP_NAME = "Fake app name"
private const val OTHER_DEVICE_NAME = "My Tablet" private const val OTHER_DEVICE_NAME = "My Tablet"
private const val PACKAGE_NAME = "com.android.systemui" private const val PACKAGE_NAME = "com.android.systemui"
private const val TIMEOUT = 10000
private val routeInfo = MediaRoute2Info.Builder("id", OTHER_DEVICE_NAME) private val routeInfo = MediaRoute2Info.Builder("id", OTHER_DEVICE_NAME)
.addFeature("feature") .addFeature("feature")