From b1bcb4166f9d88b633e9289853471ba1600db6fb Mon Sep 17 00:00:00 2001 From: Michael Mikhail Date: Fri, 5 May 2023 15:27:41 +0000 Subject: Add UiEventLogger to TemporaryView Adds three UiEvents for temporary view and introduce instance id in the logs to match with the events comming from Media TTT. Adds instance id in the temporary view info for logging purposes. Bug: 280338222. Test: manually tested with adb commands with some logs added to make sure the same instance id is being logged in both tap-to-transfer and temporary view UI events. Test: atest MediaTttChipControllerReceiverTest Test: atest MediaTttReceiverUiEventLoggerTest Test: atest MediaTttSenderCoordinatorTest Test: atest MediaTttSenderLoggerTest Test: atest MediaTttSenderUiEventLoggerTest Test: atest TemporaryViewDisplayControllerTest Test: atest TemporaryViewLoggerTest Test: atest TemporaryViewUiEventLoggerTest Test: atest TemporaryViewUiEventLoggerTest Change-Id: I0e8c8ddb5b366305f51881169361a11b855ef580 --- .../receiver/MediaTttChipControllerReceiver.kt | 21 ++++++- .../receiver/MediaTttReceiverUiEventLogger.kt | 5 +- .../sender/MediaTttSenderCoordinator.kt | 21 +++++-- .../taptotransfer/sender/MediaTttSenderLogger.kt | 3 +- .../sender/MediaTttSenderUiEventLogger.kt | 14 +++-- .../TemporaryViewDisplayController.kt | 2 + .../systemui/temporarydisplay/TemporaryViewInfo.kt | 5 ++ .../temporarydisplay/TemporaryViewUiEventLogger.kt | 56 ++++++++++++++++++ .../temporarydisplay/chipbar/ChipbarCoordinator.kt | 4 ++ .../temporarydisplay/chipbar/ChipbarInfo.kt | 2 + .../receiver/FakeMediaTttChipControllerReceiver.kt | 3 + .../receiver/MediaTttChipControllerReceiverTest.kt | 40 ++++++++++++- .../receiver/MediaTttReceiverUiEventLoggerTest.kt | 5 +- .../sender/MediaTttSenderCoordinatorTest.kt | 49 +++++++++++---- .../sender/MediaTttSenderLoggerTest.kt | 13 +++- .../sender/MediaTttSenderUiEventLoggerTest.kt | 13 +++- .../TemporaryViewDisplayControllerTest.kt | 17 ++++++ .../temporarydisplay/TemporaryViewLoggerTest.kt | 2 + .../TemporaryViewUiEventLoggerTest.kt | 69 ++++++++++++++++++++++ .../chipbar/ChipbarCoordinatorTest.kt | 18 +++++- 20 files changed, 327 insertions(+), 35 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewUiEventLogger.kt create mode 100644 packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewUiEventLoggerTest.kt diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt index 77ff0362851a..bbd3d33e45c8 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt @@ -37,6 +37,7 @@ import android.view.View.ACCESSIBILITY_LIVE_REGION_NONE import com.android.internal.widget.CachingIconView import com.android.systemui.R import com.android.app.animation.Interpolators +import com.android.internal.logging.InstanceId import com.android.systemui.common.shared.model.ContentDescription import com.android.systemui.common.ui.binder.TintedIconViewBinder import com.android.systemui.dagger.SysUISingleton @@ -49,6 +50,7 @@ import com.android.systemui.statusbar.CommandQueue import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.temporarydisplay.TemporaryViewDisplayController import com.android.systemui.temporarydisplay.TemporaryViewInfo +import com.android.systemui.temporarydisplay.TemporaryViewUiEventLogger import com.android.systemui.temporarydisplay.ViewPriority import com.android.systemui.util.animation.AnimationUtil.Companion.frames import com.android.systemui.util.concurrency.DelayableExecutor @@ -82,6 +84,7 @@ open class MediaTttChipControllerReceiver @Inject constructor( wakeLockBuilder: WakeLock.Builder, systemClock: SystemClock, private val rippleController: MediaTttReceiverRippleController, + private val temporaryViewUiEventLogger: TemporaryViewUiEventLogger, ) : TemporaryViewDisplayController( context, logger, @@ -94,6 +97,7 @@ open class MediaTttChipControllerReceiver @Inject constructor( R.layout.media_ttt_chip_receiver, wakeLockBuilder, systemClock, + temporaryViewUiEventLogger, ) { @SuppressLint("WrongConstant") // We're allowed to use LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS override val windowLayoutParams = commonWindowLayoutParams.apply { @@ -125,6 +129,11 @@ open class MediaTttChipControllerReceiver @Inject constructor( } } + // A map to store instance id per route info id. + private var instanceMap: MutableMap = mutableMapOf() + + private val displayListener = Listener { id, _ -> instanceMap.remove(id) } + private fun updateMediaTapToTransferReceiverDisplay( @StatusBarManager.MediaTransferReceiverState displayState: Int, routeInfo: MediaRoute2Info, @@ -139,12 +148,18 @@ open class MediaTttChipControllerReceiver @Inject constructor( logger.logStateChangeError(displayState) return } - uiEventLogger.logReceiverStateChange(chipState) + + val instanceId: InstanceId = instanceMap[routeInfo.id] + ?: temporaryViewUiEventLogger.getNewInstanceId() + uiEventLogger.logReceiverStateChange(chipState, instanceId) if (chipState != ChipStateReceiver.CLOSE_TO_SENDER) { removeView(routeInfo.id, removalReason = chipState.name) return } + + // Save instance id to use for logging view events. + instanceMap[routeInfo.id] = instanceId if (appIcon == null) { displayView( ChipReceiverInfo( @@ -152,6 +167,7 @@ open class MediaTttChipControllerReceiver @Inject constructor( appIconDrawableOverride = null, appName, id = routeInfo.id, + instanceId = instanceId, ) ) return @@ -166,6 +182,7 @@ open class MediaTttChipControllerReceiver @Inject constructor( drawable, appName, id = routeInfo.id, + instanceId = instanceId, ) ) }, @@ -180,6 +197,7 @@ open class MediaTttChipControllerReceiver @Inject constructor( if (mediaTttFlags.isMediaTttEnabled()) { commandQueue.addCallback(commandQueueCallbacks) } + registerListener(displayListener) } override fun updateView(newInfo: ChipReceiverInfo, currentView: ViewGroup) { @@ -342,4 +360,5 @@ data class ChipReceiverInfo( override val wakeReason: String = MediaTttUtils.WAKE_REASON_RECEIVER, override val id: String, override val priority: ViewPriority = ViewPriority.NORMAL, + override val instanceId: InstanceId, ) : TemporaryViewInfo() diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverUiEventLogger.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverUiEventLogger.kt index 6e515f27c25e..2294ce180d72 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverUiEventLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverUiEventLogger.kt @@ -16,6 +16,7 @@ package com.android.systemui.media.taptotransfer.receiver +import com.android.internal.logging.InstanceId import com.android.internal.logging.UiEvent import com.android.internal.logging.UiEventLogger import com.android.systemui.dagger.SysUISingleton @@ -25,8 +26,8 @@ import javax.inject.Inject @SysUISingleton class MediaTttReceiverUiEventLogger @Inject constructor(private val logger: UiEventLogger) { /** Logs that the receiver chip has changed states. */ - fun logReceiverStateChange(chipState: ChipStateReceiver) { - logger.log(chipState.uiEvent) + fun logReceiverStateChange(chipState: ChipStateReceiver, instanceId: InstanceId) { + logger.log(chipState.uiEvent, instanceId) } } diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinator.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinator.kt index c7c72a9cd120..f75f8b9a18f7 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinator.kt @@ -20,6 +20,7 @@ import android.app.StatusBarManager import android.content.Context import android.media.MediaRoute2Info import android.view.View +import com.android.internal.logging.InstanceId import com.android.internal.logging.UiEventLogger import com.android.internal.statusbar.IUndoMediaTransferCallback import com.android.systemui.CoreStartable @@ -59,8 +60,8 @@ constructor( // Since the media transfer display is similar to a heads-up notification, use the same timeout. private val defaultTimeout = context.resources.getInteger(R.integer.heads_up_notification_decay) - // A map to store current chip state per id. - private var stateMap: MutableMap = mutableMapOf() + // A map to store instance id and current chip state per id. + private var stateMap: MutableMap> = mutableMapOf() private val commandQueueCallbacks = object : CommandQueue.Callbacks { @@ -98,7 +99,10 @@ constructor( return } - val currentStateForId: ChipStateSender? = stateMap[routeInfo.id] + val currentStateForId: ChipStateSender? = stateMap[routeInfo.id]?.second + val instanceId: InstanceId = + stateMap[routeInfo.id]?.first + ?: chipbarCoordinator.tempViewUiEventLogger.getNewInstanceId() if (!ChipStateSender.isValidStateTransition(currentStateForId, chipState)) { // ChipStateSender.FAR_FROM_RECEIVER is the default state when there is no state. logger.logInvalidStateTransitionError( @@ -107,7 +111,7 @@ constructor( ) return } - uiEventLogger.logSenderStateChange(chipState) + uiEventLogger.logSenderStateChange(chipState, instanceId) if (chipState == ChipStateSender.FAR_FROM_RECEIVER) { // Return early if we're not displaying a chip for this ID anyway @@ -131,7 +135,7 @@ constructor( removeIdFromStore(routeInfo.id, reason = removalReason) chipbarCoordinator.removeView(routeInfo.id, removalReason) } else { - stateMap[routeInfo.id] = chipState + stateMap[routeInfo.id] = Pair(instanceId, chipState) logger.logStateMap(stateMap) chipbarCoordinator.registerListener(displayListener) chipbarCoordinator.displayView( @@ -141,6 +145,7 @@ constructor( undoCallback, context, logger, + instanceId, ) ) } @@ -155,6 +160,7 @@ constructor( undoCallback: IUndoMediaTransferCallback?, context: Context, logger: MediaTttSenderLogger, + instanceId: InstanceId, ): ChipbarInfo { val packageName = routeInfo.clientPackageName val otherDeviceName = @@ -190,6 +196,7 @@ constructor( chipStateSender.endItem.uiEventOnClick, chipStateSender.endItem.newState, routeInfo, + instanceId, ) } else { null @@ -203,6 +210,7 @@ constructor( timeoutMs = timeout, id = routeInfo.id, priority = ViewPriority.NORMAL, + instanceId = instanceId, ) } @@ -217,10 +225,11 @@ constructor( uiEvent: UiEventLogger.UiEventEnum, @StatusBarManager.MediaTransferSenderState newState: Int, routeInfo: MediaRoute2Info, + instanceId: InstanceId, ): ChipbarEndItem.Button { val onClickListener = View.OnClickListener { - uiEventLogger.logUndoClicked(uiEvent) + uiEventLogger.logUndoClicked(uiEvent, instanceId) undoCallback.onUndoTriggered() // The external service should eventually send us a new TransferTriggered state, but diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLogger.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLogger.kt index 03bcfc8113e3..206e5e3ee090 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLogger.kt @@ -17,6 +17,7 @@ package com.android.systemui.media.taptotransfer.sender import android.app.StatusBarManager +import com.android.internal.logging.InstanceId import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.LogBuffer import com.android.systemui.log.LogLevel @@ -86,7 +87,7 @@ constructor( } /** Logs the current contents of the state map. */ - fun logStateMap(map: Map) { + fun logStateMap(map: Map>) { buffer.log( TAG, LogLevel.DEBUG, diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderUiEventLogger.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderUiEventLogger.kt index af3c1b60bacf..56dbd7a23858 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderUiEventLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderUiEventLogger.kt @@ -17,6 +17,7 @@ package com.android.systemui.media.taptotransfer.sender import android.util.Log +import com.android.internal.logging.InstanceId import com.android.internal.logging.UiEvent import com.android.internal.logging.UiEventLogger import com.android.systemui.dagger.SysUISingleton @@ -26,8 +27,8 @@ import javax.inject.Inject @SysUISingleton class MediaTttSenderUiEventLogger @Inject constructor(private val logger: UiEventLogger) { /** Logs that the sender chip has changed states. */ - fun logSenderStateChange(chipState: ChipStateSender) { - logger.log(chipState.uiEvent) + fun logSenderStateChange(chipState: ChipStateSender, instanceId: InstanceId) { + logger.log(chipState.uiEvent, instanceId) } /** @@ -35,10 +36,11 @@ class MediaTttSenderUiEventLogger @Inject constructor(private val logger: UiEven * * @param undoUiEvent the uiEvent specific to which undo button was clicked. */ - fun logUndoClicked(undoUiEvent: UiEventLogger.UiEventEnum) { + fun logUndoClicked(undoUiEvent: UiEventLogger.UiEventEnum, instanceId: InstanceId) { val isUndoEvent = - undoUiEvent == MediaTttSenderUiEvents.MEDIA_TTT_SENDER_UNDO_TRANSFER_TO_RECEIVER_CLICKED - || undoUiEvent == + undoUiEvent == + MediaTttSenderUiEvents.MEDIA_TTT_SENDER_UNDO_TRANSFER_TO_RECEIVER_CLICKED || + undoUiEvent == MediaTttSenderUiEvents.MEDIA_TTT_SENDER_UNDO_TRANSFER_TO_THIS_DEVICE_CLICKED if (!isUndoEvent) { Log.w( @@ -47,7 +49,7 @@ class MediaTttSenderUiEventLogger @Inject constructor(private val logger: UiEven ) return } - logger.log(undoUiEvent) + logger.log(undoUiEvent, instanceId) } } diff --git a/packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewDisplayController.kt b/packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewDisplayController.kt index 59122aff7f21..8f0489631ae0 100644 --- a/packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewDisplayController.kt +++ b/packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewDisplayController.kt @@ -79,6 +79,7 @@ abstract class TemporaryViewDisplayController( context, @@ -105,6 +107,7 @@ constructor( R.layout.chipbar, wakeLockBuilder, systemClock, + tempViewUiEventLogger, ) { private lateinit var parent: ChipbarRootView @@ -315,6 +318,7 @@ constructor( ) return } + tempViewUiEventLogger.logViewManuallyDismissed(currentDisplayInfo.info.instanceId) removeView(currentDisplayInfo.info.id, SWIPE_UP_GESTURE_REASON) updateGestureListening() } diff --git a/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarInfo.kt b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarInfo.kt index 52f2d11f814e..1d50241f4586 100644 --- a/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarInfo.kt +++ b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarInfo.kt @@ -19,6 +19,7 @@ package com.android.systemui.temporarydisplay.chipbar import android.os.VibrationEffect import android.view.View import androidx.annotation.AttrRes +import com.android.internal.logging.InstanceId import com.android.systemui.R import com.android.systemui.common.shared.model.Text import com.android.systemui.common.shared.model.TintedIcon @@ -47,6 +48,7 @@ data class ChipbarInfo( override val timeoutMs: Int, override val id: String, override val priority: ViewPriority, + override val instanceId: InstanceId?, ) : TemporaryViewInfo() { companion object { // LINT.IfChange diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/FakeMediaTttChipControllerReceiver.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/FakeMediaTttChipControllerReceiver.kt index bd042c23856d..ffbf62aad2b3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/FakeMediaTttChipControllerReceiver.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/FakeMediaTttChipControllerReceiver.kt @@ -26,6 +26,7 @@ import com.android.systemui.dump.DumpManager import com.android.systemui.media.taptotransfer.MediaTttFlags import com.android.systemui.statusbar.CommandQueue import com.android.systemui.statusbar.policy.ConfigurationController +import com.android.systemui.temporarydisplay.TemporaryViewUiEventLogger import com.android.systemui.util.concurrency.DelayableExecutor import com.android.systemui.util.time.SystemClock import com.android.systemui.util.view.ViewUtil @@ -48,6 +49,7 @@ class FakeMediaTttChipControllerReceiver( wakeLockBuilder: WakeLock.Builder, systemClock: SystemClock, rippleController: MediaTttReceiverRippleController, + temporaryViewUiEventLogger: TemporaryViewUiEventLogger, ) : MediaTttChipControllerReceiver( commandQueue, @@ -66,6 +68,7 @@ class FakeMediaTttChipControllerReceiver( wakeLockBuilder, systemClock, rippleController, + temporaryViewUiEventLogger, ) { override fun animateViewOut(view: ViewGroup, removalReason: String?, onAnimationEnd: Runnable) { // Just bypass the animation in tests diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt index 19dd2f035c62..2b66e7b3cd80 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt @@ -31,6 +31,7 @@ import android.view.WindowManager import android.view.accessibility.AccessibilityManager import android.widget.ImageView import androidx.test.filters.SmallTest +import com.android.internal.logging.InstanceId import com.android.internal.logging.testing.UiEventLoggerFake import com.android.systemui.R import com.android.systemui.SysuiTestCase @@ -38,6 +39,7 @@ import com.android.systemui.dump.DumpManager import com.android.systemui.media.taptotransfer.MediaTttFlags import com.android.systemui.statusbar.CommandQueue import com.android.systemui.statusbar.policy.ConfigurationController +import com.android.systemui.temporarydisplay.TemporaryViewUiEventLogger import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.eq @@ -90,6 +92,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() { private lateinit var fakeAppIconDrawable: Drawable private lateinit var uiEventLoggerFake: UiEventLoggerFake private lateinit var receiverUiEventLogger: MediaTttReceiverUiEventLogger + private lateinit var temporaryViewUiEventLogger: TemporaryViewUiEventLogger private lateinit var fakeClock: FakeSystemClock private lateinit var fakeExecutor: FakeExecutor private lateinit var fakeWakeLockBuilder: WakeLockFake.Builder @@ -114,6 +117,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() { uiEventLoggerFake = UiEventLoggerFake() receiverUiEventLogger = MediaTttReceiverUiEventLogger(uiEventLoggerFake) + temporaryViewUiEventLogger = TemporaryViewUiEventLogger(uiEventLoggerFake) fakeWakeLock = WakeLockFake() fakeWakeLockBuilder = WakeLockFake.Builder(context) @@ -136,6 +140,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() { fakeWakeLockBuilder, fakeClock, rippleController, + temporaryViewUiEventLogger, ) controllerReceiver.start() @@ -166,6 +171,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() { fakeWakeLockBuilder, fakeClock, rippleController, + temporaryViewUiEventLogger, ) controllerReceiver.start() @@ -186,6 +192,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() { assertThat(uiEventLoggerFake.eventId(0)).isEqualTo( MediaTttReceiverUiEvents.MEDIA_TTT_RECEIVER_CLOSE_TO_SENDER.id ) + assertThat(uiEventLoggerFake.logs[0].instanceId).isNotNull() } @Test @@ -201,6 +208,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() { assertThat(uiEventLoggerFake.eventId(0)).isEqualTo( MediaTttReceiverUiEvents.MEDIA_TTT_RECEIVER_FAR_FROM_SENDER.id ) + assertThat(uiEventLoggerFake.logs[0].instanceId).isNotNull() } @Test @@ -216,6 +224,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() { assertThat(uiEventLoggerFake.eventId(0)).isEqualTo( MediaTttReceiverUiEvents.MEDIA_TTT_RECEIVER_TRANSFER_TO_RECEIVER_SUCCEEDED.id ) + assertThat(uiEventLoggerFake.logs[0].instanceId).isNotNull() } @Test @@ -231,6 +240,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() { assertThat(uiEventLoggerFake.eventId(0)).isEqualTo( MediaTttReceiverUiEvents.MEDIA_TTT_RECEIVER_TRANSFER_TO_RECEIVER_FAILED.id ) + assertThat(uiEventLoggerFake.logs[0].instanceId).isNotNull() } @Test @@ -275,6 +285,25 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() { verify(windowManager).removeView(viewCaptor.value) } + @Test + fun commandQueueCallback_closeThenSucceeded_sameViewInstanceId() { + commandQueueCallback.updateMediaTapToTransferReceiverDisplay( + StatusBarManager.MEDIA_TRANSFER_RECEIVER_STATE_CLOSE_TO_SENDER, + routeInfo, + null, + null + ) + + commandQueueCallback.updateMediaTapToTransferReceiverDisplay( + StatusBarManager.MEDIA_TRANSFER_RECEIVER_STATE_TRANSFER_TO_RECEIVER_SUCCEEDED, + routeInfo, + null, + null + ) + + assertThat(uiEventLoggerFake[0].instanceId).isEqualTo(uiEventLoggerFake[1].instanceId) + } + @Test fun commandQueueCallback_closeThenFailed_chipShownThenHidden() { commandQueueCallback.updateMediaTapToTransferReceiverDisplay( @@ -349,6 +378,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() { appIconDrawableOverride = null, appNameOverride = null, id = "id", + instanceId = InstanceId.fakeInstanceId(0), ) ) @@ -371,6 +401,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() { drawableOverride, appNameOverride = null, id = "id", + instanceId = InstanceId.fakeInstanceId(0), ) ) @@ -388,6 +419,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() { appIconDrawableOverride = null, appNameOverride, id = "id", + instanceId = InstanceId.fakeInstanceId(0), ) ) @@ -442,7 +474,13 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() { .addFeature("feature") .setClientPackageName(packageName) .build() - return ChipReceiverInfo(routeInfo, null, null, id = "id") + return ChipReceiverInfo( + routeInfo, + null, + null, + id = "id", + instanceId = InstanceId.fakeInstanceId(0), + ) } private fun ViewGroup.getAppIconView() = this.requireViewById(R.id.app_icon) diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverUiEventLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverUiEventLoggerTest.kt index ee10ddc521f1..f55771362cb2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverUiEventLoggerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverUiEventLoggerTest.kt @@ -1,6 +1,7 @@ package com.android.systemui.media.taptotransfer.receiver import androidx.test.filters.SmallTest +import com.android.internal.logging.InstanceId import com.android.internal.logging.testing.UiEventLoggerFake import com.android.systemui.SysuiTestCase import com.google.common.truth.Truth.assertThat @@ -21,10 +22,12 @@ class MediaTttReceiverUiEventLoggerTest : SysuiTestCase() { @Test fun logReceiverStateChange_eventAssociatedWithStateIsLogged() { val state = ChipStateReceiver.CLOSE_TO_SENDER + val instanceId = InstanceId.fakeInstanceId(0) - logger.logReceiverStateChange(state) + logger.logReceiverStateChange(state, instanceId) assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1) assertThat(uiEventLoggerFake.eventId(0)).isEqualTo(state.uiEvent.id) + assertThat(uiEventLoggerFake.logs[0].instanceId).isEqualTo(instanceId) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinatorTest.kt index 349fac0bf6ea..ea25f712f06a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinatorTest.kt @@ -46,6 +46,7 @@ import com.android.systemui.statusbar.CommandQueue import com.android.systemui.statusbar.VibratorHelper import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.temporarydisplay.TemporaryViewDisplayController +import com.android.systemui.temporarydisplay.TemporaryViewUiEventLogger import com.android.systemui.temporarydisplay.chipbar.ChipbarAnimator import com.android.systemui.temporarydisplay.chipbar.ChipbarCoordinator import com.android.systemui.temporarydisplay.chipbar.ChipbarLogger @@ -108,6 +109,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() { private lateinit var fakeExecutor: FakeExecutor private lateinit var uiEventLoggerFake: UiEventLoggerFake private lateinit var uiEventLogger: MediaTttSenderUiEventLogger + private lateinit var tempViewUiEventLogger: TemporaryViewUiEventLogger private val defaultTimeout = context.resources.getInteger(R.integer.heads_up_notification_decay) @Before @@ -137,6 +139,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() { uiEventLoggerFake = UiEventLoggerFake() uiEventLogger = MediaTttSenderUiEventLogger(uiEventLoggerFake) + tempViewUiEventLogger = TemporaryViewUiEventLogger(uiEventLoggerFake) chipbarCoordinator = ChipbarCoordinator( @@ -156,6 +159,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() { vibratorHelper, fakeWakeLockBuilder, fakeClock, + tempViewUiEventLogger, ) chipbarCoordinator.start() @@ -352,8 +356,8 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() { .isEqualTo(ChipStateSender.TRANSFER_TO_RECEIVER_SUCCEEDED.getExpectedStateText()) assertThat(chipbarView.getLoadingIcon().visibility).isEqualTo(View.GONE) assertThat(chipbarView.getUndoButton().visibility).isEqualTo(View.GONE) - // Event index 1 since initially displaying the triggered chip would also log an event. - assertThat(uiEventLoggerFake.eventId(1)) + // Event index 2 since initially displaying the triggered chip would also log two events. + assertThat(uiEventLoggerFake.eventId(2)) .isEqualTo(MediaTttSenderUiEvents.MEDIA_TTT_SENDER_TRANSFER_TO_RECEIVER_SUCCEEDED.id) verify(vibratorHelper, never()) .vibrate( @@ -365,6 +369,24 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() { ) } + @Test + fun commandQueueCallback_transferToReceiverSucceeded_sameViewInstanceId() { + displayReceiverTriggered() + reset(vibratorHelper) + commandQueueCallback.updateMediaTapToTransferSenderDisplay( + StatusBarManager.MEDIA_TRANSFER_SENDER_STATE_TRANSFER_TO_RECEIVER_SUCCEEDED, + routeInfo, + null + ) + + // Event index 2 since initially displaying the triggered chip would also log two events. + assertThat(uiEventLoggerFake.eventId(2)) + .isEqualTo(MediaTttSenderUiEvents.MEDIA_TTT_SENDER_TRANSFER_TO_RECEIVER_SUCCEEDED.id) + verify(vibratorHelper, never()).vibrate(any()) + assertThat(uiEventLoggerFake.logs[0].instanceId) + .isEqualTo(uiEventLoggerFake.logs[2].instanceId) + } + @Test fun transferToReceiverSucceeded_nullUndoCallback_noUndo() { displayReceiverTriggered() @@ -410,9 +432,9 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() { getChipbarView().getUndoButton().performClick() - // Event index 2 since initially displaying the triggered and succeeded chip would also log + // Event index 3 since initially displaying the triggered and succeeded chip would also log // events. - assertThat(uiEventLoggerFake.eventId(2)) + assertThat(uiEventLoggerFake.eventId(3)) .isEqualTo(MediaTttSenderUiEvents.MEDIA_TTT_SENDER_UNDO_TRANSFER_TO_RECEIVER_CLICKED.id) assertThat(undoCallbackCalled).isTrue() assertThat(getChipbarView().getChipText()) @@ -436,8 +458,8 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() { .isEqualTo(ChipStateSender.TRANSFER_TO_THIS_DEVICE_SUCCEEDED.getExpectedStateText()) assertThat(chipbarView.getLoadingIcon().visibility).isEqualTo(View.GONE) assertThat(chipbarView.getUndoButton().visibility).isEqualTo(View.GONE) - // Event index 1 since initially displaying the triggered chip would also log an event. - assertThat(uiEventLoggerFake.eventId(1)) + // Event index 2 since initially displaying the triggered chip would also log two events. + assertThat(uiEventLoggerFake.eventId(2)) .isEqualTo(MediaTttSenderUiEvents.MEDIA_TTT_SENDER_TRANSFER_TO_THIS_DEVICE_SUCCEEDED.id) verify(vibratorHelper, never()) .vibrate( @@ -494,9 +516,9 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() { getChipbarView().getUndoButton().performClick() - // Event index 2 since initially displaying the triggered and succeeded chip would also log + // Event index 3 since initially displaying the triggered and succeeded chip would also log // events. - assertThat(uiEventLoggerFake.eventId(2)) + assertThat(uiEventLoggerFake.eventId(3)) .isEqualTo( MediaTttSenderUiEvents.MEDIA_TTT_SENDER_UNDO_TRANSFER_TO_THIS_DEVICE_CLICKED.id ) @@ -523,8 +545,8 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() { assertThat(chipbarView.getLoadingIcon().visibility).isEqualTo(View.GONE) assertThat(chipbarView.getUndoButton().visibility).isEqualTo(View.GONE) assertThat(chipbarView.getErrorIcon().visibility).isEqualTo(View.VISIBLE) - // Event index 1 since initially displaying the triggered chip would also log an event. - assertThat(uiEventLoggerFake.eventId(1)) + // Event index 2 since initially displaying the triggered chip would also log two events. + assertThat(uiEventLoggerFake.eventId(2)) .isEqualTo(MediaTttSenderUiEvents.MEDIA_TTT_SENDER_TRANSFER_TO_RECEIVER_FAILED.id) verify(vibratorHelper) .vibrate( @@ -559,7 +581,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() { assertThat(chipbarView.getUndoButton().visibility).isEqualTo(View.GONE) assertThat(chipbarView.getErrorIcon().visibility).isEqualTo(View.VISIBLE) // Event index 1 since initially displaying the triggered chip would also log an event. - assertThat(uiEventLoggerFake.eventId(1)) + assertThat(uiEventLoggerFake.eventId(2)) .isEqualTo(MediaTttSenderUiEvents.MEDIA_TTT_SENDER_TRANSFER_TO_THIS_DEVICE_FAILED.id) verify(vibratorHelper) .vibrate( @@ -1082,6 +1104,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() { @Test fun newState_viewListenerRegistered() { val mockChipbarCoordinator = mock() + whenever(mockChipbarCoordinator.tempViewUiEventLogger).thenReturn(tempViewUiEventLogger) underTest = MediaTttSenderCoordinator( mockChipbarCoordinator, @@ -1109,6 +1132,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() { @Test fun onInfoPermanentlyRemoved_viewListenerUnregistered() { val mockChipbarCoordinator = mock() + whenever(mockChipbarCoordinator.tempViewUiEventLogger).thenReturn(tempViewUiEventLogger) underTest = MediaTttSenderCoordinator( mockChipbarCoordinator, @@ -1142,6 +1166,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() { @Test fun onInfoPermanentlyRemoved_wrongId_viewListenerNotUnregistered() { val mockChipbarCoordinator = mock() + whenever(mockChipbarCoordinator.tempViewUiEventLogger).thenReturn(tempViewUiEventLogger) underTest = MediaTttSenderCoordinator( mockChipbarCoordinator, @@ -1174,6 +1199,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() { @Test fun farFromReceiverState_viewListenerUnregistered() { val mockChipbarCoordinator = mock() + whenever(mockChipbarCoordinator.tempViewUiEventLogger).thenReturn(tempViewUiEventLogger) underTest = MediaTttSenderCoordinator( mockChipbarCoordinator, @@ -1210,6 +1236,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() { @Test fun statesWithDifferentIds_onInfoPermanentlyRemovedForOneId_viewListenerNotUnregistered() { val mockChipbarCoordinator = mock() + whenever(mockChipbarCoordinator.tempViewUiEventLogger).thenReturn(tempViewUiEventLogger) underTest = MediaTttSenderCoordinator( mockChipbarCoordinator, diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLoggerTest.kt index 2287da572795..ee3704c1e9e9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLoggerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLoggerTest.kt @@ -17,6 +17,7 @@ package com.android.systemui.media.taptotransfer.sender import androidx.test.filters.SmallTest +import com.android.internal.logging.InstanceId import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager import com.android.systemui.log.LogBuffer @@ -91,8 +92,16 @@ class MediaTttSenderLoggerTest : SysuiTestCase() { fun logStateMap_bufferHasInfo() { val map = mapOf( - "123" to ChipStateSender.ALMOST_CLOSE_TO_START_CAST, - "456" to ChipStateSender.TRANSFER_TO_THIS_DEVICE_TRIGGERED, + "123" to + Pair( + InstanceId.fakeInstanceId(100), + ChipStateSender.ALMOST_CLOSE_TO_START_CAST + ), + "456" to + Pair( + InstanceId.fakeInstanceId(200), + ChipStateSender.TRANSFER_TO_THIS_DEVICE_TRIGGERED + ), ) logger.logStateMap(map) diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderUiEventLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderUiEventLoggerTest.kt index 263637a6b6e5..bf26a2f53b4c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderUiEventLoggerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderUiEventLoggerTest.kt @@ -1,6 +1,7 @@ package com.android.systemui.media.taptotransfer.sender import androidx.test.filters.SmallTest +import com.android.internal.logging.InstanceId import com.android.internal.logging.testing.UiEventLoggerFake import com.android.systemui.SysuiTestCase import com.google.common.truth.Truth.assertThat @@ -21,26 +22,32 @@ class MediaTttSenderUiEventLoggerTest : SysuiTestCase() { @Test fun logSenderStateChange_eventAssociatedWithStateIsLogged() { val state = ChipStateSender.ALMOST_CLOSE_TO_END_CAST - logger.logSenderStateChange(state) + logger.logSenderStateChange(state, instanceId) assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1) assertThat(uiEventLoggerFake.eventId(0)).isEqualTo(state.uiEvent.id) + assertThat(uiEventLoggerFake.get(0).instanceId).isEqualTo(instanceId) } @Test fun logUndoClicked_undoEventLogged() { val undoEvent = MediaTttSenderUiEvents.MEDIA_TTT_SENDER_UNDO_TRANSFER_TO_THIS_DEVICE_CLICKED - logger.logUndoClicked(undoEvent) + logger.logUndoClicked(undoEvent, instanceId) assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1) assertThat(uiEventLoggerFake.eventId(0)).isEqualTo(undoEvent.id) + assertThat(uiEventLoggerFake.get(0).instanceId).isEqualTo(instanceId) } @Test fun logUndoClicked_notUndoEvent_eventNotLogged() { - logger.logUndoClicked(MediaTttSenderUiEvents.MEDIA_TTT_SENDER_TRANSFER_TO_RECEIVER_FAILED) + val state = MediaTttSenderUiEvents.MEDIA_TTT_SENDER_TRANSFER_TO_RECEIVER_FAILED + + logger.logUndoClicked(state, instanceId) assertThat(uiEventLoggerFake.numLogs()).isEqualTo(0) } } + +private val instanceId = InstanceId.fakeInstanceId(0) diff --git a/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewDisplayControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewDisplayControllerTest.kt index c7c6b945f09a..98bbb26eb703 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewDisplayControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewDisplayControllerTest.kt @@ -24,6 +24,8 @@ import android.view.ViewGroup import android.view.WindowManager import android.view.accessibility.AccessibilityManager import androidx.test.filters.SmallTest +import com.android.internal.logging.InstanceId +import com.android.internal.logging.testing.UiEventLoggerFake import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.dagger.qualifiers.Main @@ -60,6 +62,9 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() { private lateinit var fakeWakeLockBuilder: WakeLockFake.Builder private lateinit var fakeWakeLock: WakeLockFake + private lateinit var fakeUiEventLogger: UiEventLoggerFake + private lateinit var uiEventLogger: TemporaryViewUiEventLogger + @Mock private lateinit var logger: TemporaryViewLogger @Mock @@ -87,6 +92,9 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() { fakeWakeLockBuilder = WakeLockFake.Builder(context) fakeWakeLockBuilder.setWakeLock(fakeWakeLock) + fakeUiEventLogger = UiEventLoggerFake() + uiEventLogger = TemporaryViewUiEventLogger(fakeUiEventLogger) + underTest = TestController( context, logger, @@ -98,6 +106,7 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() { powerManager, fakeWakeLockBuilder, fakeClock, + uiEventLogger, ) underTest.start() } @@ -126,6 +135,8 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() { underTest.displayView(info) verify(logger).logViewAddition(info) + assertThat(fakeUiEventLogger.eventId(0)) + .isEqualTo(TemporaryViewUiEvent.TEMPORARY_VIEW_ADDED.id) } @Test @@ -1029,6 +1040,9 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() { verify(logger).logViewRemoval(DEFAULT_ID, reason) verify(configurationController).removeCallback(any()) assertThat(listener.permanentlyRemovedIds).containsExactly(DEFAULT_ID) + assertThat(fakeUiEventLogger.logs.size).isEqualTo(1) + assertThat(fakeUiEventLogger.eventId(0)) + .isEqualTo(TemporaryViewUiEvent.TEMPORARY_VIEW_ADDED.id) } @Test @@ -1133,6 +1147,7 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() { powerManager: PowerManager, wakeLockBuilder: WakeLock.Builder, systemClock: SystemClock, + uiEventLogger: TemporaryViewUiEventLogger, ) : TemporaryViewDisplayController>( context, logger, @@ -1145,6 +1160,7 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() { R.layout.chipbar, wakeLockBuilder, systemClock, + uiEventLogger, ) { var mostRecentViewInfo: ViewInfo? = null @@ -1168,6 +1184,7 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() { override val timeoutMs: Int = TIMEOUT_MS.toInt(), override val id: String = DEFAULT_ID, override val priority: ViewPriority = ViewPriority.NORMAL, + override val instanceId: InstanceId = InstanceId.fakeInstanceId(0), ) : TemporaryViewInfo() inner class Listener : TemporaryViewDisplayController.Listener { diff --git a/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewLoggerTest.kt index 451424927b23..38c1a785d1e9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewLoggerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewLoggerTest.kt @@ -17,6 +17,7 @@ package com.android.systemui.temporarydisplay import androidx.test.filters.SmallTest +import com.android.internal.logging.InstanceId import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager import com.android.systemui.log.LogBuffer @@ -50,6 +51,7 @@ class TemporaryViewLoggerTest : SysuiTestCase() { override val priority: ViewPriority = ViewPriority.CRITICAL override val windowTitle: String = "Test Window Title" override val wakeReason: String = "wake reason" + override val instanceId: InstanceId = InstanceId.fakeInstanceId(0) } logger.logViewAddition(info) diff --git a/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewUiEventLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewUiEventLoggerTest.kt new file mode 100644 index 000000000000..f707a8dafeda --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewUiEventLoggerTest.kt @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.temporarydisplay + +import androidx.test.filters.SmallTest +import com.android.internal.logging.InstanceId +import com.android.internal.logging.testing.UiEventLoggerFake +import com.android.systemui.SysuiTestCase +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test + +@SmallTest +class TemporaryViewUiEventLoggerTest : SysuiTestCase() { + private lateinit var uiEventLoggerFake: UiEventLoggerFake + private lateinit var logger: TemporaryViewUiEventLogger + + @Before + fun setup() { + uiEventLoggerFake = UiEventLoggerFake() + logger = TemporaryViewUiEventLogger(uiEventLoggerFake) + } + + @Test + fun testViewAdded() { + logger.logViewAdded(InstanceId.fakeInstanceId(123)) + + assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1) + assertThat(uiEventLoggerFake.eventId(0)) + .isEqualTo(TemporaryViewUiEvent.TEMPORARY_VIEW_ADDED.id) + } + + @Test + fun testMultipleViewsAdded_differentInstanceIds() { + logger.logViewAdded(logger.getNewInstanceId()) + logger.logViewAdded(logger.getNewInstanceId()) + + assertThat(uiEventLoggerFake.numLogs()).isEqualTo(2) + assertThat(uiEventLoggerFake.eventId(0)) + .isEqualTo(TemporaryViewUiEvent.TEMPORARY_VIEW_ADDED.id) + assertThat(uiEventLoggerFake.eventId(1)) + .isEqualTo(TemporaryViewUiEvent.TEMPORARY_VIEW_ADDED.id) + assertThat(uiEventLoggerFake.logs[0].instanceId.id) + .isNotEqualTo(uiEventLoggerFake.logs[1].instanceId.id) + } + + @Test + fun testViewManuallyDismissed() { + logger.logViewManuallyDismissed(InstanceId.fakeInstanceId(123)) + + assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1) + assertThat(uiEventLoggerFake.eventId(0)) + .isEqualTo(TemporaryViewUiEvent.TEMPORARY_VIEW_MANUALLY_DISMISSED.id) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/chipbar/ChipbarCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/chipbar/ChipbarCoordinatorTest.kt index d33271b9d88f..03834e057418 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/chipbar/ChipbarCoordinatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/chipbar/ChipbarCoordinatorTest.kt @@ -30,6 +30,7 @@ import android.widget.ImageView import android.widget.TextView import androidx.core.animation.doOnCancel import androidx.test.filters.SmallTest +import com.android.internal.logging.InstanceId import com.android.internal.logging.testing.UiEventLoggerFake import com.android.systemui.R import com.android.systemui.SysuiTestCase @@ -43,6 +44,8 @@ import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.FalsingManager import com.android.systemui.statusbar.VibratorHelper import com.android.systemui.statusbar.policy.ConfigurationController +import com.android.systemui.temporarydisplay.TemporaryViewUiEvent +import com.android.systemui.temporarydisplay.TemporaryViewUiEventLogger import com.android.systemui.temporarydisplay.ViewPriority import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.any @@ -87,6 +90,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() { private lateinit var fakeClock: FakeSystemClock private lateinit var fakeExecutor: FakeExecutor private lateinit var uiEventLoggerFake: UiEventLoggerFake + private lateinit var uiEventLogger: TemporaryViewUiEventLogger @Before fun setUp() { @@ -101,6 +105,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() { fakeWakeLockBuilder.setWakeLock(fakeWakeLock) uiEventLoggerFake = UiEventLoggerFake() + uiEventLogger = TemporaryViewUiEventLogger(uiEventLoggerFake) chipbarAnimator = TestChipbarAnimator() underTest = @@ -121,6 +126,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() { vibratorHelper, fakeWakeLockBuilder, fakeClock, + uiEventLogger, ) underTest.start() } @@ -632,7 +638,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() { } @Test - fun swipeToDismiss_swipeOccurs_viewDismissed() { + fun swipeToDismiss_swipeOccurs_viewDismissed_manuallyDismissedLogged() { underTest.displayView( createChipbarInfo( Icon.Resource(R.drawable.ic_cake, contentDescription = null), @@ -649,6 +655,9 @@ class ChipbarCoordinatorTest : SysuiTestCase() { callbackCaptor.value.invoke(MotionEvent.obtain(0L, 0L, 0, 0f, 0f, 0)) verify(windowManager).removeView(view) + assertThat(uiEventLoggerFake.numLogs()).isEqualTo(2) + assertThat(uiEventLoggerFake.eventId(1)) + .isEqualTo(TemporaryViewUiEvent.TEMPORARY_VIEW_MANUALLY_DISMISSED.id) } @Test @@ -665,6 +674,11 @@ class ChipbarCoordinatorTest : SysuiTestCase() { val callbackCaptor = argumentCaptor<(MotionEvent) -> Unit>() verify(swipeGestureHandler).addOnGestureDetectedCallback(any(), capture(callbackCaptor)) + // only one log for view addition + assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1) + assertThat(uiEventLoggerFake.eventId(0)) + .isEqualTo(TemporaryViewUiEvent.TEMPORARY_VIEW_ADDED.id) + // WHEN the view is updated to not allow swipe-to-dismiss underTest.displayView( createChipbarInfo( @@ -683,6 +697,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() { // THEN it is ignored and view isn't removed verify(windowManager, never()).removeView(view) + assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1) } private fun createChipbarInfo( @@ -703,6 +718,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() { timeoutMs = TIMEOUT, id = DEVICE_ID, priority = ViewPriority.NORMAL, + instanceId = InstanceId.fakeInstanceId(0), ) } -- cgit v1.2.3-59-g8ed1b