From 1da0d108fc52bd10b4d49753bca606347d54f2e4 Mon Sep 17 00:00:00 2001 From: Michael Mikhail Date: Fri, 19 May 2023 13:14:29 +0000 Subject: [PATCH] Revert^2 "Add UiEventLogger to TemporaryView" CL was reverted due to a build failure b/283344577, seems the changes of ActiveUnlockChipbarManager didn't go through because of a merge conflict in udc-mainline-prod b/283327895. f85101832e5003455787676485f6102dd70bcf5a Change-Id: I25c9ae4e26057ba45c4304f1ce64298d3f18deda --- .../MediaTttChipControllerReceiver.kt | 21 +++++- .../receiver/MediaTttReceiverUiEventLogger.kt | 5 +- .../sender/MediaTttSenderCoordinator.kt | 21 ++++-- .../sender/MediaTttSenderLogger.kt | 3 +- .../sender/MediaTttSenderUiEventLogger.kt | 14 ++-- .../TemporaryViewDisplayController.kt | 2 + .../temporarydisplay/TemporaryViewInfo.kt | 5 ++ .../TemporaryViewUiEventLogger.kt | 56 +++++++++++++++ .../chipbar/ChipbarCoordinator.kt | 4 ++ .../temporarydisplay/chipbar/ChipbarInfo.kt | 2 + .../FakeMediaTttChipControllerReceiver.kt | 3 + .../MediaTttChipControllerReceiverTest.kt | 40 ++++++++++- .../MediaTttReceiverUiEventLoggerTest.kt | 5 +- .../sender/MediaTttSenderCoordinatorTest.kt | 49 ++++++++++--- .../sender/MediaTttSenderLoggerTest.kt | 13 +++- .../sender/MediaTttSenderUiEventLoggerTest.kt | 13 +++- .../TemporaryViewDisplayControllerTest.kt | 17 +++++ .../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 77ff0362851a6..bbd3d33e45c8e 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 6e515f27c25eb..2294ce180d72a 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 c7c72a9cd1203..f75f8b9a18f75 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 03bcfc8113e34..206e5e3ee0905 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 af3c1b60bacfa..56dbd7a238588 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 59122aff7f216..8f0489631ae01 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 52f2d11f814e3..1d50241f45866 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 bd042c23856d9..ffbf62aad2b31 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 19dd2f035c627..2b66e7b3cd805 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 ee10ddc521f13..f55771362cb22 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 349fac0bf6ea9..ea25f712f06a4 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 2287da5727957..ee3704c1e9e95 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 263637a6b6e5c..bf26a2f53b4cc 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 c7c6b945f09a3..98bbb26eb7038 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 451424927b23d..38c1a785d1e9f 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 0000000000000..f707a8dafedaf --- /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 d33271b9d88f9..03834e0574188 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), ) }