From 60bb228f70da7e6dc8a0616bcfb237b5592c82a9 Mon Sep 17 00:00:00 2001 From: Caitlin Cassidy Date: Thu, 13 Jan 2022 20:13:11 +0000 Subject: [PATCH] [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 --- .../mediattt/IDeviceSenderCallback.aidl | 12 ++++++++++ .../MediaTttCommandLineHelper.kt | 23 +++++++----------- .../taptotransfer/sender/ChipStateSender.kt | 7 ++++-- .../sender/MediaTttChipControllerSender.kt | 2 +- .../sender/MediaTttSenderService.kt | 17 +++++++++++++ .../MediaTttCommandLineHelperTest.kt | 14 +++++++---- .../MediaTttChipControllerSenderTest.kt | 24 +++++++++---------- .../sender/MediaTttSenderServiceTest.kt | 16 +++++++++++-- 8 files changed, 79 insertions(+), 36 deletions(-) diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/mediattt/IDeviceSenderCallback.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/mediattt/IDeviceSenderCallback.aidl index 9aae7d993185f..8db3e9d135a06 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/mediattt/IDeviceSenderCallback.aidl +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/mediattt/IDeviceSenderCallback.aidl @@ -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. * diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelper.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelper.kt index 280f5ed862626..e8a847f6ae418 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelper.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelper.kt @@ -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 diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/ChipStateSender.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/ChipStateSender.kt index 37f962ee8ecd4..1fd3af4ce8d94 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/ChipStateSender.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/ChipStateSender.kt @@ -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 diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSender.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSender.kt index 0918f0fbeff1e..84672ab9a31cc 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSender.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSender.kt @@ -49,7 +49,7 @@ class MediaTttChipControllerSender @Inject constructor( } // Loading - val showLoading = chipState is TransferInitiated + val showLoading = chipState is TransferToReceiverTriggered currentChipView.requireViewById(R.id.loading).visibility = if (showLoading) { View.VISIBLE } else { View.GONE } diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderService.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderService.kt index 84794cb098f01..0fe324eb557df 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderService.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderService.kt @@ -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) + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelperTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelperTest.kt index 4e34789bdc6ed..cf5d47747e4c4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelperTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelperTest.kt @@ -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() + 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 = + private fun getTransferToReceiverTriggeredCommand(): Array = arrayOf( ADD_CHIP_COMMAND_SENDER_TAG, DEVICE_NAME, - TRANSFER_INITIATED_COMMAND_NAME + TRANSFER_TO_RECEIVER_TRIGGERED_COMMAND_NAME ) private fun getTransferSucceededCommand(): Array = diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSenderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSenderTest.kt index f18a7ab68fafe..e9ddf3d857b1c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSenderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSenderTest.kt @@ -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( diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderServiceTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderServiceTest.kt index 66e3fe6c5fdaf..ca909450c1445 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderServiceTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderServiceTest.kt @@ -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() + verify(controller).displayChip(capture(chipStateCaptor)) + + val chipState = chipStateCaptor.value!! + assertThat(chipState.otherDeviceName).isEqualTo(name) + } + @Test fun transferFailed_controllerTriggeredWithTransferFailedState() { callback.transferFailed(mediaInfo, DeviceInfo("Fake name"))