summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Michael Mikhail <michaelmikhil@google.com> 2023-05-19 00:13:05 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-05-19 00:13:05 +0000
commit7dda1f9da07cdd4fcd061190b24c80de945f513a (patch)
treeae2713a16e22321380d1ec959225bd31a55a24a1
parent6247a27d31460cc4c4fba2e456bb4f6d4d4a087d (diff)
parentb1bcb4166f9d88b633e9289853471ba1600db6fb (diff)
Merge "Add UiEventLogger to TemporaryView" into udc-dev
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt21
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverUiEventLogger.kt5
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinator.kt21
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLogger.kt3
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderUiEventLogger.kt14
-rw-r--r--packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewDisplayController.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewInfo.kt5
-rw-r--r--packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewUiEventLogger.kt56
-rw-r--r--packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarCoordinator.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarInfo.kt2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/FakeMediaTttChipControllerReceiver.kt3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt40
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverUiEventLoggerTest.kt5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinatorTest.kt49
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLoggerTest.kt13
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderUiEventLoggerTest.kt13
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewDisplayControllerTest.kt17
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewLoggerTest.kt2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewUiEventLoggerTest.kt69
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/chipbar/ChipbarCoordinatorTest.kt18
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),
)
}