[Media TTT] Add the #transferToReceiverTriggered callback.

Also renames TransferInitiated -> TransferToReceiverTriggered, because
we also need a TransferToThisDeviceTriggered callback.

Bug: 203800643
Bug: 203800347
Test: verify `adb shell cmd statusbar media-ttt-chip-add-sender Tablet
TransferToReceiverTriggered` works
Test: media.taptotransfer tests

Change-Id: Ibb968d5c35391cf84e28fc2460148ea6bf396d14
This commit is contained in:
Caitlin Cassidy
2022-01-13 20:13:11 +00:00
parent 4d4b6c47ca
commit 60bb228f70
8 changed files with 79 additions and 36 deletions

View File

@@ -60,6 +60,18 @@ interface IDeviceSenderCallback {
oneway void closeToReceiverToEndCast(
in MediaRoute2Info mediaInfo, in DeviceInfo otherDeviceInfo);
/**
* Invoke to notify System UI that a media transfer from this device (the sender) to a receiver
* device has been started.
*
* Important notes:
* - This callback is for *starting* a cast. It should be used when this device is currently
* playing media locally and the media has started being transferred to the receiver device
* instead.
*/
oneway void transferToReceiverTriggered(
in MediaRoute2Info mediaInfo, in DeviceInfo otherDeviceInfo);
/**
* Invoke to notify System UI that the attempted transfer has failed.
*

View File

@@ -35,7 +35,7 @@ import com.android.systemui.media.taptotransfer.sender.MediaTttSenderService
import com.android.systemui.media.taptotransfer.sender.MoveCloserToEndCast
import com.android.systemui.media.taptotransfer.sender.MoveCloserToStartCast
import com.android.systemui.media.taptotransfer.sender.TransferFailed
import com.android.systemui.media.taptotransfer.sender.TransferInitiated
import com.android.systemui.media.taptotransfer.sender.TransferToReceiverTriggered
import com.android.systemui.media.taptotransfer.sender.TransferSucceeded
import com.android.systemui.shared.mediattt.DeviceInfo
import com.android.systemui.shared.mediattt.IDeviceSenderCallback
@@ -93,18 +93,13 @@ class MediaTttCommandLineHelper @Inject constructor(
senderCallback.closeToReceiverToEndCast(mediaInfo, otherDeviceInfo)
}
}
// TODO(b/203800643): Migrate other commands to invoke the service instead of the
// controller.
TRANSFER_INITIATED_COMMAND_NAME -> {
mediaTttChipControllerSender.displayChip(
TransferInitiated(
appIconDrawable,
APP_ICON_CONTENT_DESCRIPTION,
otherDeviceName
)
)
TRANSFER_TO_RECEIVER_TRIGGERED_COMMAND_NAME -> {
runOnService { senderCallback ->
senderCallback.transferToReceiverTriggered(mediaInfo, otherDeviceInfo)
}
}
// TODO(b/203800643): Migrate this command to invoke the service instead of the
// controller.
TRANSFER_SUCCEEDED_COMMAND_NAME -> {
mediaTttChipControllerSender.displayChip(
TransferSucceeded(
@@ -124,7 +119,7 @@ class MediaTttCommandLineHelper @Inject constructor(
pw.println("Chip type must be one of " +
"$MOVE_CLOSER_TO_START_CAST_COMMAND_NAME, " +
"$MOVE_CLOSER_TO_END_CAST_COMMAND_NAME, " +
"$TRANSFER_INITIATED_COMMAND_NAME, " +
"$TRANSFER_TO_RECEIVER_TRIGGERED_COMMAND_NAME, " +
"$TRANSFER_SUCCEEDED_COMMAND_NAME, " +
TRANSFER_FAILED_COMMAND_NAME
)
@@ -234,7 +229,7 @@ val MOVE_CLOSER_TO_START_CAST_COMMAND_NAME = MoveCloserToStartCast::class.simple
@VisibleForTesting
val MOVE_CLOSER_TO_END_CAST_COMMAND_NAME = MoveCloserToEndCast::class.simpleName!!
@VisibleForTesting
val TRANSFER_INITIATED_COMMAND_NAME = TransferInitiated::class.simpleName!!
val TRANSFER_TO_RECEIVER_TRIGGERED_COMMAND_NAME = TransferToReceiverTriggered::class.simpleName!!
@VisibleForTesting
val TRANSFER_SUCCEEDED_COMMAND_NAME = TransferSucceeded::class.simpleName!!
@VisibleForTesting

View File

@@ -70,8 +70,11 @@ class MoveCloserToEndCast(
otherDeviceName
)
/** A state representing that a transfer has been initiated (but not completed). */
class TransferInitiated(
/**
* A state representing that a transfer to the receiver device has been initiated (but not
* completed).
*/
class TransferToReceiverTriggered(
appIconDrawable: Drawable,
appIconContentDescription: String,
otherDeviceName: String

View File

@@ -49,7 +49,7 @@ class MediaTttChipControllerSender @Inject constructor(
}
// Loading
val showLoading = chipState is TransferInitiated
val showLoading = chipState is TransferToReceiverTriggered
currentChipView.requireViewById<View>(R.id.loading).visibility =
if (showLoading) { View.VISIBLE } else { View.GONE }

View File

@@ -55,6 +55,12 @@ class MediaTttSenderService @Inject constructor(
) {
this@MediaTttSenderService.transferFailed(mediaInfo, otherDeviceInfo)
}
override fun transferToReceiverTriggered(
mediaInfo: MediaRoute2Info, otherDeviceInfo: DeviceInfo
) {
this@MediaTttSenderService.transferToReceiverTriggered(mediaInfo, otherDeviceInfo)
}
}
// TODO(b/203800643): Use the app icon from the media info instead of a fake one.
@@ -93,4 +99,15 @@ class MediaTttSenderService @Inject constructor(
)
controller.displayChip(chipState)
}
private fun transferToReceiverTriggered(
mediaInfo: MediaRoute2Info, otherDeviceInfo: DeviceInfo
) {
val chipState = TransferToReceiverTriggered(
appIconDrawable = fakeAppIconDrawable,
appIconContentDescription = mediaInfo.name.toString(),
otherDeviceName = otherDeviceInfo.name
)
controller.displayChip(chipState)
}
}

View File

@@ -135,10 +135,14 @@ class MediaTttCommandLineHelperTest : SysuiTestCase() {
}
@Test
fun sender_transferInitiated_chipDisplayWithCorrectState() {
commandRegistry.onShellCommand(pw, getTransferInitiatedCommand())
fun sender_transferToReceiverTriggered_chipDisplayWithCorrectState() {
commandRegistry.onShellCommand(pw, getTransferToReceiverTriggeredCommand())
verify(mediaTttChipControllerSender).displayChip(any(TransferInitiated::class.java))
assertThat(context.isBound(mediaSenderServiceComponentName)).isTrue()
val deviceInfoCaptor = argumentCaptor<DeviceInfo>()
verify(mediaSenderService).transferToReceiverTriggered(any(), capture(deviceInfoCaptor))
assertThat(deviceInfoCaptor.value!!.name).isEqualTo(DEVICE_NAME)
}
@Test
@@ -191,11 +195,11 @@ class MediaTttCommandLineHelperTest : SysuiTestCase() {
MOVE_CLOSER_TO_END_CAST_COMMAND_NAME
)
private fun getTransferInitiatedCommand(): Array<String> =
private fun getTransferToReceiverTriggeredCommand(): Array<String> =
arrayOf(
ADD_CHIP_COMMAND_SENDER_TAG,
DEVICE_NAME,
TRANSFER_INITIATED_COMMAND_NAME
TRANSFER_TO_RECEIVER_TRIGGERED_COMMAND_NAME
)
private fun getTransferSucceededCommand(): Array<String> =

View File

@@ -78,8 +78,8 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() {
}
@Test
fun transferInitiated_appIcon_loadingIcon_noUndo_noFailureIcon() {
controllerSender.displayChip(transferInitiated())
fun transferToReceiverTriggered_appIcon_loadingIcon_noUndo_noFailureIcon() {
controllerSender.displayChip(transferToReceiverTriggered())
val chipView = getChipView()
assertThat(chipView.getAppIconView().drawable).isEqualTo(appIconDrawable)
@@ -144,24 +144,24 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() {
}
@Test
fun changeFromCloserToStartToTransferInitiated_loadingIconAppears() {
fun changeFromCloserToStartToTransferTriggered_loadingIconAppears() {
controllerSender.displayChip(moveCloserToStartCast())
controllerSender.displayChip(transferInitiated())
controllerSender.displayChip(transferToReceiverTriggered())
assertThat(getChipView().getLoadingIconVisibility()).isEqualTo(View.VISIBLE)
}
@Test
fun changeFromTransferInitiatedToTransferSucceeded_loadingIconDisappears() {
controllerSender.displayChip(transferInitiated())
fun changeFromTransferTriggeredToTransferSucceeded_loadingIconDisappears() {
controllerSender.displayChip(transferToReceiverTriggered())
controllerSender.displayChip(transferSucceeded())
assertThat(getChipView().getLoadingIconVisibility()).isEqualTo(View.GONE)
}
@Test
fun changeFromTransferInitiatedToTransferSucceeded_undoButtonAppears() {
controllerSender.displayChip(transferInitiated())
fun changeFromTransferTriggeredToTransferSucceeded_undoButtonAppears() {
controllerSender.displayChip(transferToReceiverTriggered())
controllerSender.displayChip(transferSucceeded { })
assertThat(getChipView().getUndoButton().visibility).isEqualTo(View.VISIBLE)
@@ -176,8 +176,8 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() {
}
@Test
fun changeFromTransferInitiatedToTransferFailed_failureIconAppears() {
controllerSender.displayChip(transferInitiated())
fun changeFromTransferTriggeredToTransferFailed_failureIconAppears() {
controllerSender.displayChip(transferToReceiverTriggered())
controllerSender.displayChip(transferFailed())
assertThat(getChipView().getFailureIcon().visibility).isEqualTo(View.VISIBLE)
@@ -210,8 +210,8 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() {
MoveCloserToEndCast(appIconDrawable, APP_ICON_CONTENT_DESC, DEVICE_NAME)
/** Helper method providing default parameters to not clutter up the tests. */
private fun transferInitiated() =
TransferInitiated(appIconDrawable, APP_ICON_CONTENT_DESC, DEVICE_NAME)
private fun transferToReceiverTriggered() =
TransferToReceiverTriggered(appIconDrawable, APP_ICON_CONTENT_DESC, DEVICE_NAME)
/** Helper method providing default parameters to not clutter up the tests. */
private fun transferSucceeded(

View File

@@ -36,7 +36,7 @@ class MediaTttSenderServiceTest : SysuiTestCase() {
}
@Test
fun closeToReceiverToStartCast_controllerTriggeredWithMoveCloserToStartCastState() {
fun closeToReceiverToStartCast_controllerTriggeredWithCorrectState() {
val name = "Fake name"
callback.closeToReceiverToStartCast(mediaInfo, DeviceInfo(name))
@@ -48,7 +48,7 @@ class MediaTttSenderServiceTest : SysuiTestCase() {
}
@Test
fun closeToReceiverToEndCast_controllerTriggeredWithMoveCloserToEndCastState() {
fun closeToReceiverToEndCast_controllerTriggeredWithCorrectState() {
val name = "Fake name"
callback.closeToReceiverToEndCast(mediaInfo, DeviceInfo(name))
@@ -59,6 +59,18 @@ class MediaTttSenderServiceTest : SysuiTestCase() {
assertThat(chipState.otherDeviceName).isEqualTo(name)
}
@Test
fun transferToReceiverTriggered_controllerTriggeredWithCorrectState() {
val name = "Fake name"
callback.transferToReceiverTriggered(mediaInfo, DeviceInfo(name))
val chipStateCaptor = argumentCaptor<TransferToReceiverTriggered>()
verify(controller).displayChip(capture(chipStateCaptor))
val chipState = chipStateCaptor.value!!
assertThat(chipState.otherDeviceName).isEqualTo(name)
}
@Test
fun transferFailed_controllerTriggeredWithTransferFailedState() {
callback.transferFailed(mediaInfo, DeviceInfo("Fake name"))