diff options
| author | 2023-05-19 00:13:05 +0000 | |
|---|---|---|
| committer | 2023-05-19 00:13:05 +0000 | |
| commit | 7dda1f9da07cdd4fcd061190b24c80de945f513a (patch) | |
| tree | ae2713a16e22321380d1ec959225bd31a55a24a1 | |
| parent | 6247a27d31460cc4c4fba2e456bb4f6d4d4a087d (diff) | |
| parent | b1bcb4166f9d88b633e9289853471ba1600db6fb (diff) | |
Merge "Add UiEventLogger to TemporaryView" into udc-dev
20 files changed, 327 insertions, 35 deletions
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<ChipReceiverInfo, MediaTttReceiverLogger>( 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<String, InstanceId> = 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<String, ChipStateSender> = mutableMapOf() + // A map to store instance id and current chip state per id. + private var stateMap: MutableMap<String, Pair<InstanceId, ChipStateSender>> = 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<String, ChipStateSender>) { + fun logStateMap(map: Map<String, Pair<InstanceId, ChipStateSender>>) { 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<T : TemporaryViewInfo, U : Tempora @LayoutRes private val viewLayoutRes: Int, private val wakeLockBuilder: WakeLock.Builder, private val systemClock: SystemClock, + internal val tempViewUiEventLogger: TemporaryViewUiEventLogger, ) : CoreStartable, Dumpable { /** * Window layout params that will be used as a starting point for the [windowLayoutParams] of @@ -207,6 +208,7 @@ abstract class TemporaryViewDisplayController<T : TemporaryViewInfo, U : Tempora private fun showNewView(newDisplayInfo: DisplayInfo, timeout: Int) { logger.logViewAddition(newDisplayInfo.info) + tempViewUiEventLogger.logViewAdded(newDisplayInfo.info.instanceId) createAndAcquireWakeLock(newDisplayInfo) updateTimeout(newDisplayInfo, timeout) inflateAndUpdateView(newDisplayInfo) diff --git a/packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewInfo.kt b/packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewInfo.kt index 5596cf68b4bc..48bd047a6f9b 100644 --- a/packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewInfo.kt +++ b/packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewInfo.kt @@ -16,6 +16,8 @@ package com.android.systemui.temporarydisplay +import com.android.internal.logging.InstanceId + /** * A superclass view state used with [TemporaryViewDisplayController]. */ @@ -45,6 +47,9 @@ abstract class TemporaryViewInfo { /** The priority for this view. */ abstract val priority: ViewPriority + + /** Instance ID for logging purposes */ + abstract val instanceId: InstanceId? } const val DEFAULT_TIMEOUT_MILLIS = 10000 diff --git a/packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewUiEventLogger.kt b/packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewUiEventLogger.kt new file mode 100644 index 000000000000..1345851bea43 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewUiEventLogger.kt @@ -0,0 +1,56 @@ +/* + * 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 com.android.internal.logging.InstanceId +import com.android.internal.logging.InstanceIdSequence +import com.android.internal.logging.UiEvent +import com.android.internal.logging.UiEventLogger +import com.android.systemui.dagger.SysUISingleton +import javax.inject.Inject + +private const val INSTANCE_ID_MAX = 1 shl 20 + +/** A helper class to log events related to the temporary view */ +@SysUISingleton +class TemporaryViewUiEventLogger @Inject constructor(val logger: UiEventLogger) { + + private val instanceIdSequence = InstanceIdSequence(INSTANCE_ID_MAX) + + /** Get a new instance ID for a new media control */ + fun getNewInstanceId(): InstanceId { + return instanceIdSequence.newInstanceId() + } + + /** Logs that view is added */ + fun logViewAdded(instanceId: InstanceId?) { + logger.log(TemporaryViewUiEvent.TEMPORARY_VIEW_ADDED, instanceId) + } + + /** Logs that view is manually dismissed by user */ + fun logViewManuallyDismissed(instanceId: InstanceId?) { + logger.log(TemporaryViewUiEvent.TEMPORARY_VIEW_MANUALLY_DISMISSED, instanceId) + } +} + +enum class TemporaryViewUiEvent(val metricId: Int) : UiEventLogger.UiEventEnum { + @UiEvent(doc = "The temporary view was added to window manager") TEMPORARY_VIEW_ADDED(1389), + @UiEvent(doc = "The temporary view was manually dismissed") + TEMPORARY_VIEW_MANUALLY_DISMISSED(1390); + + override fun getId() = metricId +} diff --git a/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarCoordinator.kt b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarCoordinator.kt index ab6409b5f9b3..7ed56e72f759 100644 --- a/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarCoordinator.kt @@ -52,6 +52,7 @@ import com.android.systemui.plugins.FalsingManager 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.util.concurrency.DelayableExecutor import com.android.systemui.util.time.SystemClock import com.android.systemui.util.view.ViewUtil @@ -92,6 +93,7 @@ constructor( private val vibratorHelper: VibratorHelper, wakeLockBuilder: WakeLock.Builder, systemClock: SystemClock, + tempViewUiEventLogger: TemporaryViewUiEventLogger, ) : TemporaryViewDisplayController<ChipbarInfo, ChipbarLogger>( 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 @@ -276,6 +286,25 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() { } @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( StatusBarManager.MEDIA_TRANSFER_RECEIVER_STATE_CLOSE_TO_SENDER, @@ -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<ImageView>(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( @@ -366,6 +370,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<VibrationEffect>()) + assertThat(uiEventLoggerFake.logs[0].instanceId) + .isEqualTo(uiEventLoggerFake.logs[2].instanceId) + } + + @Test fun transferToReceiverSucceeded_nullUndoCallback_noUndo() { displayReceiverTriggered() commandQueueCallback.updateMediaTapToTransferSenderDisplay( @@ -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<ChipbarCoordinator>() + whenever(mockChipbarCoordinator.tempViewUiEventLogger).thenReturn(tempViewUiEventLogger) underTest = MediaTttSenderCoordinator( mockChipbarCoordinator, @@ -1109,6 +1132,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() { @Test fun onInfoPermanentlyRemoved_viewListenerUnregistered() { val mockChipbarCoordinator = mock<ChipbarCoordinator>() + whenever(mockChipbarCoordinator.tempViewUiEventLogger).thenReturn(tempViewUiEventLogger) underTest = MediaTttSenderCoordinator( mockChipbarCoordinator, @@ -1142,6 +1166,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() { @Test fun onInfoPermanentlyRemoved_wrongId_viewListenerNotUnregistered() { val mockChipbarCoordinator = mock<ChipbarCoordinator>() + whenever(mockChipbarCoordinator.tempViewUiEventLogger).thenReturn(tempViewUiEventLogger) underTest = MediaTttSenderCoordinator( mockChipbarCoordinator, @@ -1174,6 +1199,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() { @Test fun farFromReceiverState_viewListenerUnregistered() { val mockChipbarCoordinator = mock<ChipbarCoordinator>() + whenever(mockChipbarCoordinator.tempViewUiEventLogger).thenReturn(tempViewUiEventLogger) underTest = MediaTttSenderCoordinator( mockChipbarCoordinator, @@ -1210,6 +1236,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() { @Test fun statesWithDifferentIds_onInfoPermanentlyRemovedForOneId_viewListenerNotUnregistered() { val mockChipbarCoordinator = mock<ChipbarCoordinator>() + 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<ViewInfo> @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<ViewInfo, TemporaryViewLogger<ViewInfo>>( 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), ) } |