From a6d18d89f953644ec0f96062214a1bc8bd970ece Mon Sep 17 00:00:00 2001 From: Caitlin Cassidy Date: Fri, 14 Jan 2022 19:05:23 +0000 Subject: [PATCH] [Media TTT] Add the #transferToReceiverSucceeded callback. Bug: 203800643 Bug: 203800347 Test: verify `adb shell cmd statusbar media-ttt-chip-add-sender Device TransferToReceiverSucceeded` shows the chip Test: media.taptotransfer tests Change-Id: Id5aef5c4f5fe61d26ad556b28f6d6cdb4d6ad31d --- .../mediattt/IDeviceSenderCallback.aidl | 12 ++++++++ .../MediaTttCommandLineHelper.kt | 25 +++++----------- .../taptotransfer/sender/ChipStateSender.kt | 4 +-- .../sender/MediaTttChipControllerSender.kt | 2 +- .../sender/MediaTttSenderService.kt | 19 ++++++++++++ .../MediaTttCommandLineHelperTest.kt | 14 +++++---- .../MediaTttChipControllerSenderTest.kt | 29 ++++++++++--------- .../sender/MediaTttSenderServiceTest.kt | 12 ++++++++ 8 files changed, 77 insertions(+), 40 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 eb026e2187c46..4e230c3517f48 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 @@ -84,6 +84,18 @@ interface IDeviceSenderCallback { oneway void transferToThisDeviceTriggered( 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 finished successfully. + * + * Important notes: + * - This callback is for *starting* a cast. It should be used when this device had previously + * been playing media locally and the media has successfully been transferred to the + * receiver device instead. + */ + oneway void transferToReceiverSucceeded( + 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 5ce9d56c15375..5c12f6800dd4f 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelper.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelper.kt @@ -37,7 +37,7 @@ import com.android.systemui.media.taptotransfer.sender.MoveCloserToStartCast import com.android.systemui.media.taptotransfer.sender.TransferFailed import com.android.systemui.media.taptotransfer.sender.TransferToReceiverTriggered import com.android.systemui.media.taptotransfer.sender.TransferToThisDeviceTriggered -import com.android.systemui.media.taptotransfer.sender.TransferSucceeded +import com.android.systemui.media.taptotransfer.sender.TransferToReceiverSucceeded import com.android.systemui.shared.mediattt.DeviceInfo import com.android.systemui.shared.mediattt.IDeviceSenderCallback import com.android.systemui.statusbar.commandline.Command @@ -104,17 +104,10 @@ class MediaTttCommandLineHelper @Inject constructor( senderCallback.transferToThisDeviceTriggered(mediaInfo, otherDeviceInfo) } } - // TODO(b/203800643): Migrate this command to invoke the service instead of the - // controller. - TRANSFER_SUCCEEDED_COMMAND_NAME -> { - mediaTttChipControllerSender.displayChip( - TransferSucceeded( - appIconDrawable, - APP_ICON_CONTENT_DESCRIPTION, - otherDeviceName, - fakeUndoRunnable - ) - ) + TRANSFER_TO_RECEIVER_SUCCEEDED_COMMAND_NAME -> { + runOnService { senderCallback -> + senderCallback.transferToReceiverSucceeded(mediaInfo, otherDeviceInfo) + } } TRANSFER_FAILED_COMMAND_NAME -> { runOnService { senderCallback -> @@ -127,7 +120,7 @@ class MediaTttCommandLineHelper @Inject constructor( "$MOVE_CLOSER_TO_END_CAST_COMMAND_NAME, " + "$TRANSFER_TO_RECEIVER_TRIGGERED_COMMAND_NAME, " + "$TRANSFER_TO_THIS_DEVICE_TRIGGERED_COMMAND_NAME, " + - "$TRANSFER_SUCCEEDED_COMMAND_NAME, " + + "$TRANSFER_TO_RECEIVER_SUCCEEDED_COMMAND_NAME, " + TRANSFER_FAILED_COMMAND_NAME ) } @@ -217,10 +210,6 @@ class MediaTttCommandLineHelper @Inject constructor( /** Runs the command on the provided [senderCallback]. */ fun run(senderCallback: IDeviceSenderCallback) } - - private val fakeUndoRunnable = Runnable { - Log.i(TAG, "Undo runnable triggered") - } } @VisibleForTesting @@ -241,7 +230,7 @@ val TRANSFER_TO_RECEIVER_TRIGGERED_COMMAND_NAME = TransferToReceiverTriggered::c val TRANSFER_TO_THIS_DEVICE_TRIGGERED_COMMAND_NAME = TransferToThisDeviceTriggered::class.simpleName!! @VisibleForTesting -val TRANSFER_SUCCEEDED_COMMAND_NAME = TransferSucceeded::class.simpleName!! +val TRANSFER_TO_RECEIVER_SUCCEEDED_COMMAND_NAME = TransferToReceiverSucceeded::class.simpleName!! @VisibleForTesting val TRANSFER_FAILED_COMMAND_NAME = TransferFailed::class.simpleName!! 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 abfd9d3e498af..2edbe272b02cc 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 @@ -111,13 +111,13 @@ class TransferToThisDeviceTriggered( } /** - * A state representing that a transfer has been successfully completed. + * A state representing that a transfer to the receiver device has been successfully completed. * * @property otherDeviceName the name of the other device involved in the transfer. * @property undoRunnable if present, the runnable that should be run to undo the transfer. We will * show an Undo button on the chip if this runnable is present. */ -class TransferSucceeded( +class TransferToReceiverSucceeded( appIconDrawable: Drawable, appIconContentDescription: String, private val 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 5cfd674b21cb7..e400530f15337 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 @@ -54,7 +54,7 @@ class MediaTttChipControllerSender @Inject constructor( // Undo val undoClickListener: View.OnClickListener? = - if (chipState is TransferSucceeded && chipState.undoRunnable != null) + if (chipState is TransferToReceiverSucceeded && chipState.undoRunnable != null) View.OnClickListener { chipState.undoRunnable.run() } else null 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 56f33a8dcf755..9473e4c6af5f5 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 @@ -67,6 +67,12 @@ class MediaTttSenderService @Inject constructor( ) { this@MediaTttSenderService.transferToThisDeviceTriggered(mediaInfo) } + + override fun transferToReceiverSucceeded( + mediaInfo: MediaRoute2Info, otherDeviceInfo: DeviceInfo + ) { + this@MediaTttSenderService.transferToReceiverSucceeded(mediaInfo, otherDeviceInfo) + } } // TODO(b/203800643): Use the app icon from the media info instead of a fake one. @@ -123,4 +129,17 @@ class MediaTttSenderService @Inject constructor( ) controller.displayChip(chipState) } + + private fun transferToReceiverSucceeded( + mediaInfo: MediaRoute2Info, otherDeviceInfo: DeviceInfo + ) { + val chipState = TransferToReceiverSucceeded( + appIconDrawable = fakeAppIconDrawable, + appIconContentDescription = mediaInfo.name.toString(), + otherDeviceName = otherDeviceInfo.name + // TODO(b/203800643): Implement the undo API correctly so we can provide an undo + // callback here. + ) + 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 6275c240921a1..7aa9bce158e9e 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 @@ -154,10 +154,14 @@ class MediaTttCommandLineHelperTest : SysuiTestCase() { } @Test - fun sender_transferSucceeded_chipDisplayWithCorrectState() { - commandRegistry.onShellCommand(pw, getTransferSucceededCommand()) + fun sender_transferToReceiverSucceeded_chipDisplayWithCorrectState() { + commandRegistry.onShellCommand(pw, getTransferToReceiverSucceededCommand()) - verify(mediaTttChipControllerSender).displayChip(any(TransferSucceeded::class.java)) + assertThat(context.isBound(mediaSenderServiceComponentName)).isTrue() + + val deviceInfoCaptor = argumentCaptor() + verify(mediaSenderService).transferToReceiverSucceeded(any(), capture(deviceInfoCaptor)) + assertThat(deviceInfoCaptor.value!!.name).isEqualTo(DEVICE_NAME) } @Test @@ -217,11 +221,11 @@ class MediaTttCommandLineHelperTest : SysuiTestCase() { TRANSFER_TO_THIS_DEVICE_TRIGGERED_COMMAND_NAME ) - private fun getTransferSucceededCommand(): Array = + private fun getTransferToReceiverSucceededCommand(): Array = arrayOf( ADD_CHIP_COMMAND_SENDER_TAG, DEVICE_NAME, - TRANSFER_SUCCEEDED_COMMAND_NAME + TRANSFER_TO_RECEIVER_SUCCEEDED_COMMAND_NAME ) private fun getTransferFailedCommand(): 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 703f6b0d57458..1682b1d730e7a 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 @@ -108,8 +108,8 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() { } @Test - fun transferSucceeded_appIcon_deviceName_noLoadingIcon_noFailureIcon() { - val state = transferSucceeded() + fun transferToReceiverSucceeded_appIcon_deviceName_noLoadingIcon_noFailureIcon() { + val state = transferToReceiverSucceeded() controllerSender.displayChip(state) val chipView = getChipView() @@ -121,16 +121,16 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() { } @Test - fun transferSucceededNullUndoRunnable_noUndo() { - controllerSender.displayChip(transferSucceeded(undoRunnable = null)) + fun transferToReceiverSucceeded_nullUndoRunnable_noUndo() { + controllerSender.displayChip(transferToReceiverSucceeded(undoRunnable = null)) val chipView = getChipView() assertThat(chipView.getUndoButton().visibility).isEqualTo(View.GONE) } @Test - fun transferSucceededWithUndoRunnable_undoWithClick() { - controllerSender.displayChip(transferSucceeded { }) + fun transferToReceiverSucceeded_withUndoRunnable_undoWithClick() { + controllerSender.displayChip(transferToReceiverSucceeded { }) val chipView = getChipView() assertThat(chipView.getUndoButton().visibility).isEqualTo(View.VISIBLE) @@ -138,11 +138,11 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() { } @Test - fun transferSucceededWithUndoRunnable_undoButtonClickRunsRunnable() { + fun transferToReceiverSucceeded_withUndoRunnable_undoButtonClickRunsRunnable() { var runnableRun = false val runnable = Runnable { runnableRun = true } - controllerSender.displayChip(transferSucceeded(undoRunnable = runnable)) + controllerSender.displayChip(transferToReceiverSucceeded(undoRunnable = runnable)) getChipView().getUndoButton().performClick() assertThat(runnableRun).isTrue() @@ -173,7 +173,7 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() { @Test fun changeFromTransferTriggeredToTransferSucceeded_loadingIconDisappears() { controllerSender.displayChip(transferToReceiverTriggered()) - controllerSender.displayChip(transferSucceeded()) + controllerSender.displayChip(transferToReceiverSucceeded()) assertThat(getChipView().getLoadingIconVisibility()).isEqualTo(View.GONE) } @@ -181,14 +181,14 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() { @Test fun changeFromTransferTriggeredToTransferSucceeded_undoButtonAppears() { controllerSender.displayChip(transferToReceiverTriggered()) - controllerSender.displayChip(transferSucceeded { }) + controllerSender.displayChip(transferToReceiverSucceeded { }) assertThat(getChipView().getUndoButton().visibility).isEqualTo(View.VISIBLE) } @Test fun changeFromTransferSucceededToMoveCloserToStart_undoButtonDisappears() { - controllerSender.displayChip(transferSucceeded()) + controllerSender.displayChip(transferToReceiverSucceeded()) controllerSender.displayChip(moveCloserToStartCast()) assertThat(getChipView().getUndoButton().visibility).isEqualTo(View.GONE) @@ -237,9 +237,10 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() { TransferToThisDeviceTriggered(appIconDrawable, APP_ICON_CONTENT_DESC) /** Helper method providing default parameters to not clutter up the tests. */ - private fun transferSucceeded( - undoRunnable: Runnable? = null - ) = TransferSucceeded(appIconDrawable, APP_ICON_CONTENT_DESC, DEVICE_NAME, undoRunnable) + private fun transferToReceiverSucceeded(undoRunnable: Runnable? = null) = + TransferToReceiverSucceeded( + appIconDrawable, APP_ICON_CONTENT_DESC, DEVICE_NAME, undoRunnable + ) /** Helper method providing default parameters to not clutter up the tests. */ private fun transferFailed() = TransferFailed(appIconDrawable, APP_ICON_CONTENT_DESC) 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 1abf49f2c4bf6..36c3a884cd460 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 @@ -78,6 +78,18 @@ class MediaTttSenderServiceTest : SysuiTestCase() { assertThat(chipState.getChipTextString(context)).contains(name) } + @Test + fun transferToReceiverSucceeded_controllerTriggeredWithCorrectState() { + val name = "Fake name" + callback.transferToReceiverSucceeded(mediaInfo, DeviceInfo(name)) + + val chipStateCaptor = argumentCaptor() + verify(controller).displayChip(capture(chipStateCaptor)) + + val chipState = chipStateCaptor.value!! + assertThat(chipState.getChipTextString(context)).contains(name) + } + @Test fun transferFailed_controllerTriggeredWithTransferFailedState() { callback.transferFailed(mediaInfo, DeviceInfo("Fake name"))