Merge "Revert^2 "Add UiEventLogger to TemporaryView"" into udc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
f69664925d
@@ -37,6 +37,7 @@ import android.view.View.ACCESSIBILITY_LIVE_REGION_NONE
|
|||||||
import com.android.internal.widget.CachingIconView
|
import com.android.internal.widget.CachingIconView
|
||||||
import com.android.systemui.R
|
import com.android.systemui.R
|
||||||
import com.android.app.animation.Interpolators
|
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.shared.model.ContentDescription
|
||||||
import com.android.systemui.common.ui.binder.TintedIconViewBinder
|
import com.android.systemui.common.ui.binder.TintedIconViewBinder
|
||||||
import com.android.systemui.dagger.SysUISingleton
|
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.statusbar.policy.ConfigurationController
|
||||||
import com.android.systemui.temporarydisplay.TemporaryViewDisplayController
|
import com.android.systemui.temporarydisplay.TemporaryViewDisplayController
|
||||||
import com.android.systemui.temporarydisplay.TemporaryViewInfo
|
import com.android.systemui.temporarydisplay.TemporaryViewInfo
|
||||||
|
import com.android.systemui.temporarydisplay.TemporaryViewUiEventLogger
|
||||||
import com.android.systemui.temporarydisplay.ViewPriority
|
import com.android.systemui.temporarydisplay.ViewPriority
|
||||||
import com.android.systemui.util.animation.AnimationUtil.Companion.frames
|
import com.android.systemui.util.animation.AnimationUtil.Companion.frames
|
||||||
import com.android.systemui.util.concurrency.DelayableExecutor
|
import com.android.systemui.util.concurrency.DelayableExecutor
|
||||||
@@ -82,6 +84,7 @@ open class MediaTttChipControllerReceiver @Inject constructor(
|
|||||||
wakeLockBuilder: WakeLock.Builder,
|
wakeLockBuilder: WakeLock.Builder,
|
||||||
systemClock: SystemClock,
|
systemClock: SystemClock,
|
||||||
private val rippleController: MediaTttReceiverRippleController,
|
private val rippleController: MediaTttReceiverRippleController,
|
||||||
|
private val temporaryViewUiEventLogger: TemporaryViewUiEventLogger,
|
||||||
) : TemporaryViewDisplayController<ChipReceiverInfo, MediaTttReceiverLogger>(
|
) : TemporaryViewDisplayController<ChipReceiverInfo, MediaTttReceiverLogger>(
|
||||||
context,
|
context,
|
||||||
logger,
|
logger,
|
||||||
@@ -94,6 +97,7 @@ open class MediaTttChipControllerReceiver @Inject constructor(
|
|||||||
R.layout.media_ttt_chip_receiver,
|
R.layout.media_ttt_chip_receiver,
|
||||||
wakeLockBuilder,
|
wakeLockBuilder,
|
||||||
systemClock,
|
systemClock,
|
||||||
|
temporaryViewUiEventLogger,
|
||||||
) {
|
) {
|
||||||
@SuppressLint("WrongConstant") // We're allowed to use LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
|
@SuppressLint("WrongConstant") // We're allowed to use LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
|
||||||
override val windowLayoutParams = commonWindowLayoutParams.apply {
|
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(
|
private fun updateMediaTapToTransferReceiverDisplay(
|
||||||
@StatusBarManager.MediaTransferReceiverState displayState: Int,
|
@StatusBarManager.MediaTransferReceiverState displayState: Int,
|
||||||
routeInfo: MediaRoute2Info,
|
routeInfo: MediaRoute2Info,
|
||||||
@@ -139,12 +148,18 @@ open class MediaTttChipControllerReceiver @Inject constructor(
|
|||||||
logger.logStateChangeError(displayState)
|
logger.logStateChangeError(displayState)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
uiEventLogger.logReceiverStateChange(chipState)
|
|
||||||
|
val instanceId: InstanceId = instanceMap[routeInfo.id]
|
||||||
|
?: temporaryViewUiEventLogger.getNewInstanceId()
|
||||||
|
uiEventLogger.logReceiverStateChange(chipState, instanceId)
|
||||||
|
|
||||||
if (chipState != ChipStateReceiver.CLOSE_TO_SENDER) {
|
if (chipState != ChipStateReceiver.CLOSE_TO_SENDER) {
|
||||||
removeView(routeInfo.id, removalReason = chipState.name)
|
removeView(routeInfo.id, removalReason = chipState.name)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Save instance id to use for logging view events.
|
||||||
|
instanceMap[routeInfo.id] = instanceId
|
||||||
if (appIcon == null) {
|
if (appIcon == null) {
|
||||||
displayView(
|
displayView(
|
||||||
ChipReceiverInfo(
|
ChipReceiverInfo(
|
||||||
@@ -152,6 +167,7 @@ open class MediaTttChipControllerReceiver @Inject constructor(
|
|||||||
appIconDrawableOverride = null,
|
appIconDrawableOverride = null,
|
||||||
appName,
|
appName,
|
||||||
id = routeInfo.id,
|
id = routeInfo.id,
|
||||||
|
instanceId = instanceId,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
@@ -166,6 +182,7 @@ open class MediaTttChipControllerReceiver @Inject constructor(
|
|||||||
drawable,
|
drawable,
|
||||||
appName,
|
appName,
|
||||||
id = routeInfo.id,
|
id = routeInfo.id,
|
||||||
|
instanceId = instanceId,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
@@ -180,6 +197,7 @@ open class MediaTttChipControllerReceiver @Inject constructor(
|
|||||||
if (mediaTttFlags.isMediaTttEnabled()) {
|
if (mediaTttFlags.isMediaTttEnabled()) {
|
||||||
commandQueue.addCallback(commandQueueCallbacks)
|
commandQueue.addCallback(commandQueueCallbacks)
|
||||||
}
|
}
|
||||||
|
registerListener(displayListener)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun updateView(newInfo: ChipReceiverInfo, currentView: ViewGroup) {
|
override fun updateView(newInfo: ChipReceiverInfo, currentView: ViewGroup) {
|
||||||
@@ -342,4 +360,5 @@ data class ChipReceiverInfo(
|
|||||||
override val wakeReason: String = MediaTttUtils.WAKE_REASON_RECEIVER,
|
override val wakeReason: String = MediaTttUtils.WAKE_REASON_RECEIVER,
|
||||||
override val id: String,
|
override val id: String,
|
||||||
override val priority: ViewPriority = ViewPriority.NORMAL,
|
override val priority: ViewPriority = ViewPriority.NORMAL,
|
||||||
|
override val instanceId: InstanceId,
|
||||||
) : TemporaryViewInfo()
|
) : TemporaryViewInfo()
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.android.systemui.media.taptotransfer.receiver
|
package com.android.systemui.media.taptotransfer.receiver
|
||||||
|
|
||||||
|
import com.android.internal.logging.InstanceId
|
||||||
import com.android.internal.logging.UiEvent
|
import com.android.internal.logging.UiEvent
|
||||||
import com.android.internal.logging.UiEventLogger
|
import com.android.internal.logging.UiEventLogger
|
||||||
import com.android.systemui.dagger.SysUISingleton
|
import com.android.systemui.dagger.SysUISingleton
|
||||||
@@ -25,8 +26,8 @@ import javax.inject.Inject
|
|||||||
@SysUISingleton
|
@SysUISingleton
|
||||||
class MediaTttReceiverUiEventLogger @Inject constructor(private val logger: UiEventLogger) {
|
class MediaTttReceiverUiEventLogger @Inject constructor(private val logger: UiEventLogger) {
|
||||||
/** Logs that the receiver chip has changed states. */
|
/** Logs that the receiver chip has changed states. */
|
||||||
fun logReceiverStateChange(chipState: ChipStateReceiver) {
|
fun logReceiverStateChange(chipState: ChipStateReceiver, instanceId: InstanceId) {
|
||||||
logger.log(chipState.uiEvent)
|
logger.log(chipState.uiEvent, instanceId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import android.app.StatusBarManager
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.media.MediaRoute2Info
|
import android.media.MediaRoute2Info
|
||||||
import android.view.View
|
import android.view.View
|
||||||
|
import com.android.internal.logging.InstanceId
|
||||||
import com.android.internal.logging.UiEventLogger
|
import com.android.internal.logging.UiEventLogger
|
||||||
import com.android.internal.statusbar.IUndoMediaTransferCallback
|
import com.android.internal.statusbar.IUndoMediaTransferCallback
|
||||||
import com.android.systemui.CoreStartable
|
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.
|
// 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)
|
private val defaultTimeout = context.resources.getInteger(R.integer.heads_up_notification_decay)
|
||||||
|
|
||||||
// A map to store current chip state per id.
|
// A map to store instance id and current chip state per id.
|
||||||
private var stateMap: MutableMap<String, ChipStateSender> = mutableMapOf()
|
private var stateMap: MutableMap<String, Pair<InstanceId, ChipStateSender>> = mutableMapOf()
|
||||||
|
|
||||||
private val commandQueueCallbacks =
|
private val commandQueueCallbacks =
|
||||||
object : CommandQueue.Callbacks {
|
object : CommandQueue.Callbacks {
|
||||||
@@ -98,7 +99,10 @@ constructor(
|
|||||||
return
|
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)) {
|
if (!ChipStateSender.isValidStateTransition(currentStateForId, chipState)) {
|
||||||
// ChipStateSender.FAR_FROM_RECEIVER is the default state when there is no state.
|
// ChipStateSender.FAR_FROM_RECEIVER is the default state when there is no state.
|
||||||
logger.logInvalidStateTransitionError(
|
logger.logInvalidStateTransitionError(
|
||||||
@@ -107,7 +111,7 @@ constructor(
|
|||||||
)
|
)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
uiEventLogger.logSenderStateChange(chipState)
|
uiEventLogger.logSenderStateChange(chipState, instanceId)
|
||||||
|
|
||||||
if (chipState == ChipStateSender.FAR_FROM_RECEIVER) {
|
if (chipState == ChipStateSender.FAR_FROM_RECEIVER) {
|
||||||
// Return early if we're not displaying a chip for this ID anyway
|
// Return early if we're not displaying a chip for this ID anyway
|
||||||
@@ -131,7 +135,7 @@ constructor(
|
|||||||
removeIdFromStore(routeInfo.id, reason = removalReason)
|
removeIdFromStore(routeInfo.id, reason = removalReason)
|
||||||
chipbarCoordinator.removeView(routeInfo.id, removalReason)
|
chipbarCoordinator.removeView(routeInfo.id, removalReason)
|
||||||
} else {
|
} else {
|
||||||
stateMap[routeInfo.id] = chipState
|
stateMap[routeInfo.id] = Pair(instanceId, chipState)
|
||||||
logger.logStateMap(stateMap)
|
logger.logStateMap(stateMap)
|
||||||
chipbarCoordinator.registerListener(displayListener)
|
chipbarCoordinator.registerListener(displayListener)
|
||||||
chipbarCoordinator.displayView(
|
chipbarCoordinator.displayView(
|
||||||
@@ -141,6 +145,7 @@ constructor(
|
|||||||
undoCallback,
|
undoCallback,
|
||||||
context,
|
context,
|
||||||
logger,
|
logger,
|
||||||
|
instanceId,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -155,6 +160,7 @@ constructor(
|
|||||||
undoCallback: IUndoMediaTransferCallback?,
|
undoCallback: IUndoMediaTransferCallback?,
|
||||||
context: Context,
|
context: Context,
|
||||||
logger: MediaTttSenderLogger,
|
logger: MediaTttSenderLogger,
|
||||||
|
instanceId: InstanceId,
|
||||||
): ChipbarInfo {
|
): ChipbarInfo {
|
||||||
val packageName = routeInfo.clientPackageName
|
val packageName = routeInfo.clientPackageName
|
||||||
val otherDeviceName =
|
val otherDeviceName =
|
||||||
@@ -190,6 +196,7 @@ constructor(
|
|||||||
chipStateSender.endItem.uiEventOnClick,
|
chipStateSender.endItem.uiEventOnClick,
|
||||||
chipStateSender.endItem.newState,
|
chipStateSender.endItem.newState,
|
||||||
routeInfo,
|
routeInfo,
|
||||||
|
instanceId,
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
@@ -203,6 +210,7 @@ constructor(
|
|||||||
timeoutMs = timeout,
|
timeoutMs = timeout,
|
||||||
id = routeInfo.id,
|
id = routeInfo.id,
|
||||||
priority = ViewPriority.NORMAL,
|
priority = ViewPriority.NORMAL,
|
||||||
|
instanceId = instanceId,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -217,10 +225,11 @@ constructor(
|
|||||||
uiEvent: UiEventLogger.UiEventEnum,
|
uiEvent: UiEventLogger.UiEventEnum,
|
||||||
@StatusBarManager.MediaTransferSenderState newState: Int,
|
@StatusBarManager.MediaTransferSenderState newState: Int,
|
||||||
routeInfo: MediaRoute2Info,
|
routeInfo: MediaRoute2Info,
|
||||||
|
instanceId: InstanceId,
|
||||||
): ChipbarEndItem.Button {
|
): ChipbarEndItem.Button {
|
||||||
val onClickListener =
|
val onClickListener =
|
||||||
View.OnClickListener {
|
View.OnClickListener {
|
||||||
uiEventLogger.logUndoClicked(uiEvent)
|
uiEventLogger.logUndoClicked(uiEvent, instanceId)
|
||||||
undoCallback.onUndoTriggered()
|
undoCallback.onUndoTriggered()
|
||||||
|
|
||||||
// The external service should eventually send us a new TransferTriggered state, but
|
// The external service should eventually send us a new TransferTriggered state, but
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
package com.android.systemui.media.taptotransfer.sender
|
package com.android.systemui.media.taptotransfer.sender
|
||||||
|
|
||||||
import android.app.StatusBarManager
|
import android.app.StatusBarManager
|
||||||
|
import com.android.internal.logging.InstanceId
|
||||||
import com.android.systemui.dagger.SysUISingleton
|
import com.android.systemui.dagger.SysUISingleton
|
||||||
import com.android.systemui.log.LogBuffer
|
import com.android.systemui.log.LogBuffer
|
||||||
import com.android.systemui.log.LogLevel
|
import com.android.systemui.log.LogLevel
|
||||||
@@ -86,7 +87,7 @@ constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Logs the current contents of the state map. */
|
/** Logs the current contents of the state map. */
|
||||||
fun logStateMap(map: Map<String, ChipStateSender>) {
|
fun logStateMap(map: Map<String, Pair<InstanceId, ChipStateSender>>) {
|
||||||
buffer.log(
|
buffer.log(
|
||||||
TAG,
|
TAG,
|
||||||
LogLevel.DEBUG,
|
LogLevel.DEBUG,
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
package com.android.systemui.media.taptotransfer.sender
|
package com.android.systemui.media.taptotransfer.sender
|
||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import com.android.internal.logging.InstanceId
|
||||||
import com.android.internal.logging.UiEvent
|
import com.android.internal.logging.UiEvent
|
||||||
import com.android.internal.logging.UiEventLogger
|
import com.android.internal.logging.UiEventLogger
|
||||||
import com.android.systemui.dagger.SysUISingleton
|
import com.android.systemui.dagger.SysUISingleton
|
||||||
@@ -26,8 +27,8 @@ import javax.inject.Inject
|
|||||||
@SysUISingleton
|
@SysUISingleton
|
||||||
class MediaTttSenderUiEventLogger @Inject constructor(private val logger: UiEventLogger) {
|
class MediaTttSenderUiEventLogger @Inject constructor(private val logger: UiEventLogger) {
|
||||||
/** Logs that the sender chip has changed states. */
|
/** Logs that the sender chip has changed states. */
|
||||||
fun logSenderStateChange(chipState: ChipStateSender) {
|
fun logSenderStateChange(chipState: ChipStateSender, instanceId: InstanceId) {
|
||||||
logger.log(chipState.uiEvent)
|
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.
|
* @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 =
|
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
|
MediaTttSenderUiEvents.MEDIA_TTT_SENDER_UNDO_TRANSFER_TO_THIS_DEVICE_CLICKED
|
||||||
if (!isUndoEvent) {
|
if (!isUndoEvent) {
|
||||||
Log.w(
|
Log.w(
|
||||||
@@ -47,7 +49,7 @@ class MediaTttSenderUiEventLogger @Inject constructor(private val logger: UiEven
|
|||||||
)
|
)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
logger.log(undoUiEvent)
|
logger.log(undoUiEvent, instanceId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ abstract class TemporaryViewDisplayController<T : TemporaryViewInfo, U : Tempora
|
|||||||
@LayoutRes private val viewLayoutRes: Int,
|
@LayoutRes private val viewLayoutRes: Int,
|
||||||
private val wakeLockBuilder: WakeLock.Builder,
|
private val wakeLockBuilder: WakeLock.Builder,
|
||||||
private val systemClock: SystemClock,
|
private val systemClock: SystemClock,
|
||||||
|
internal val tempViewUiEventLogger: TemporaryViewUiEventLogger,
|
||||||
) : CoreStartable, Dumpable {
|
) : CoreStartable, Dumpable {
|
||||||
/**
|
/**
|
||||||
* Window layout params that will be used as a starting point for the [windowLayoutParams] of
|
* 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) {
|
private fun showNewView(newDisplayInfo: DisplayInfo, timeout: Int) {
|
||||||
logger.logViewAddition(newDisplayInfo.info)
|
logger.logViewAddition(newDisplayInfo.info)
|
||||||
|
tempViewUiEventLogger.logViewAdded(newDisplayInfo.info.instanceId)
|
||||||
createAndAcquireWakeLock(newDisplayInfo)
|
createAndAcquireWakeLock(newDisplayInfo)
|
||||||
updateTimeout(newDisplayInfo, timeout)
|
updateTimeout(newDisplayInfo, timeout)
|
||||||
inflateAndUpdateView(newDisplayInfo)
|
inflateAndUpdateView(newDisplayInfo)
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package com.android.systemui.temporarydisplay
|
package com.android.systemui.temporarydisplay
|
||||||
|
|
||||||
|
import com.android.internal.logging.InstanceId
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A superclass view state used with [TemporaryViewDisplayController].
|
* A superclass view state used with [TemporaryViewDisplayController].
|
||||||
*/
|
*/
|
||||||
@@ -45,6 +47,9 @@ abstract class TemporaryViewInfo {
|
|||||||
|
|
||||||
/** The priority for this view. */
|
/** The priority for this view. */
|
||||||
abstract val priority: ViewPriority
|
abstract val priority: ViewPriority
|
||||||
|
|
||||||
|
/** Instance ID for logging purposes */
|
||||||
|
abstract val instanceId: InstanceId?
|
||||||
}
|
}
|
||||||
|
|
||||||
const val DEFAULT_TIMEOUT_MILLIS = 10000
|
const val DEFAULT_TIMEOUT_MILLIS = 10000
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -52,6 +52,7 @@ import com.android.systemui.plugins.FalsingManager
|
|||||||
import com.android.systemui.statusbar.VibratorHelper
|
import com.android.systemui.statusbar.VibratorHelper
|
||||||
import com.android.systemui.statusbar.policy.ConfigurationController
|
import com.android.systemui.statusbar.policy.ConfigurationController
|
||||||
import com.android.systemui.temporarydisplay.TemporaryViewDisplayController
|
import com.android.systemui.temporarydisplay.TemporaryViewDisplayController
|
||||||
|
import com.android.systemui.temporarydisplay.TemporaryViewUiEventLogger
|
||||||
import com.android.systemui.util.concurrency.DelayableExecutor
|
import com.android.systemui.util.concurrency.DelayableExecutor
|
||||||
import com.android.systemui.util.time.SystemClock
|
import com.android.systemui.util.time.SystemClock
|
||||||
import com.android.systemui.util.view.ViewUtil
|
import com.android.systemui.util.view.ViewUtil
|
||||||
@@ -92,6 +93,7 @@ constructor(
|
|||||||
private val vibratorHelper: VibratorHelper,
|
private val vibratorHelper: VibratorHelper,
|
||||||
wakeLockBuilder: WakeLock.Builder,
|
wakeLockBuilder: WakeLock.Builder,
|
||||||
systemClock: SystemClock,
|
systemClock: SystemClock,
|
||||||
|
tempViewUiEventLogger: TemporaryViewUiEventLogger,
|
||||||
) :
|
) :
|
||||||
TemporaryViewDisplayController<ChipbarInfo, ChipbarLogger>(
|
TemporaryViewDisplayController<ChipbarInfo, ChipbarLogger>(
|
||||||
context,
|
context,
|
||||||
@@ -105,6 +107,7 @@ constructor(
|
|||||||
R.layout.chipbar,
|
R.layout.chipbar,
|
||||||
wakeLockBuilder,
|
wakeLockBuilder,
|
||||||
systemClock,
|
systemClock,
|
||||||
|
tempViewUiEventLogger,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
private lateinit var parent: ChipbarRootView
|
private lateinit var parent: ChipbarRootView
|
||||||
@@ -315,6 +318,7 @@ constructor(
|
|||||||
)
|
)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
tempViewUiEventLogger.logViewManuallyDismissed(currentDisplayInfo.info.instanceId)
|
||||||
removeView(currentDisplayInfo.info.id, SWIPE_UP_GESTURE_REASON)
|
removeView(currentDisplayInfo.info.id, SWIPE_UP_GESTURE_REASON)
|
||||||
updateGestureListening()
|
updateGestureListening()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package com.android.systemui.temporarydisplay.chipbar
|
|||||||
import android.os.VibrationEffect
|
import android.os.VibrationEffect
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.annotation.AttrRes
|
import androidx.annotation.AttrRes
|
||||||
|
import com.android.internal.logging.InstanceId
|
||||||
import com.android.systemui.R
|
import com.android.systemui.R
|
||||||
import com.android.systemui.common.shared.model.Text
|
import com.android.systemui.common.shared.model.Text
|
||||||
import com.android.systemui.common.shared.model.TintedIcon
|
import com.android.systemui.common.shared.model.TintedIcon
|
||||||
@@ -47,6 +48,7 @@ data class ChipbarInfo(
|
|||||||
override val timeoutMs: Int,
|
override val timeoutMs: Int,
|
||||||
override val id: String,
|
override val id: String,
|
||||||
override val priority: ViewPriority,
|
override val priority: ViewPriority,
|
||||||
|
override val instanceId: InstanceId?,
|
||||||
) : TemporaryViewInfo() {
|
) : TemporaryViewInfo() {
|
||||||
companion object {
|
companion object {
|
||||||
// LINT.IfChange
|
// LINT.IfChange
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import com.android.systemui.dump.DumpManager
|
|||||||
import com.android.systemui.media.taptotransfer.MediaTttFlags
|
import com.android.systemui.media.taptotransfer.MediaTttFlags
|
||||||
import com.android.systemui.statusbar.CommandQueue
|
import com.android.systemui.statusbar.CommandQueue
|
||||||
import com.android.systemui.statusbar.policy.ConfigurationController
|
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.concurrency.DelayableExecutor
|
||||||
import com.android.systemui.util.time.SystemClock
|
import com.android.systemui.util.time.SystemClock
|
||||||
import com.android.systemui.util.view.ViewUtil
|
import com.android.systemui.util.view.ViewUtil
|
||||||
@@ -48,6 +49,7 @@ class FakeMediaTttChipControllerReceiver(
|
|||||||
wakeLockBuilder: WakeLock.Builder,
|
wakeLockBuilder: WakeLock.Builder,
|
||||||
systemClock: SystemClock,
|
systemClock: SystemClock,
|
||||||
rippleController: MediaTttReceiverRippleController,
|
rippleController: MediaTttReceiverRippleController,
|
||||||
|
temporaryViewUiEventLogger: TemporaryViewUiEventLogger,
|
||||||
) :
|
) :
|
||||||
MediaTttChipControllerReceiver(
|
MediaTttChipControllerReceiver(
|
||||||
commandQueue,
|
commandQueue,
|
||||||
@@ -66,6 +68,7 @@ class FakeMediaTttChipControllerReceiver(
|
|||||||
wakeLockBuilder,
|
wakeLockBuilder,
|
||||||
systemClock,
|
systemClock,
|
||||||
rippleController,
|
rippleController,
|
||||||
|
temporaryViewUiEventLogger,
|
||||||
) {
|
) {
|
||||||
override fun animateViewOut(view: ViewGroup, removalReason: String?, onAnimationEnd: Runnable) {
|
override fun animateViewOut(view: ViewGroup, removalReason: String?, onAnimationEnd: Runnable) {
|
||||||
// Just bypass the animation in tests
|
// Just bypass the animation in tests
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ import android.view.WindowManager
|
|||||||
import android.view.accessibility.AccessibilityManager
|
import android.view.accessibility.AccessibilityManager
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
import androidx.test.filters.SmallTest
|
import androidx.test.filters.SmallTest
|
||||||
|
import com.android.internal.logging.InstanceId
|
||||||
import com.android.internal.logging.testing.UiEventLoggerFake
|
import com.android.internal.logging.testing.UiEventLoggerFake
|
||||||
import com.android.systemui.R
|
import com.android.systemui.R
|
||||||
import com.android.systemui.SysuiTestCase
|
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.media.taptotransfer.MediaTttFlags
|
||||||
import com.android.systemui.statusbar.CommandQueue
|
import com.android.systemui.statusbar.CommandQueue
|
||||||
import com.android.systemui.statusbar.policy.ConfigurationController
|
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.concurrency.FakeExecutor
|
||||||
import com.android.systemui.util.mockito.any
|
import com.android.systemui.util.mockito.any
|
||||||
import com.android.systemui.util.mockito.eq
|
import com.android.systemui.util.mockito.eq
|
||||||
@@ -90,6 +92,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
|
|||||||
private lateinit var fakeAppIconDrawable: Drawable
|
private lateinit var fakeAppIconDrawable: Drawable
|
||||||
private lateinit var uiEventLoggerFake: UiEventLoggerFake
|
private lateinit var uiEventLoggerFake: UiEventLoggerFake
|
||||||
private lateinit var receiverUiEventLogger: MediaTttReceiverUiEventLogger
|
private lateinit var receiverUiEventLogger: MediaTttReceiverUiEventLogger
|
||||||
|
private lateinit var temporaryViewUiEventLogger: TemporaryViewUiEventLogger
|
||||||
private lateinit var fakeClock: FakeSystemClock
|
private lateinit var fakeClock: FakeSystemClock
|
||||||
private lateinit var fakeExecutor: FakeExecutor
|
private lateinit var fakeExecutor: FakeExecutor
|
||||||
private lateinit var fakeWakeLockBuilder: WakeLockFake.Builder
|
private lateinit var fakeWakeLockBuilder: WakeLockFake.Builder
|
||||||
@@ -114,6 +117,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
|
|||||||
|
|
||||||
uiEventLoggerFake = UiEventLoggerFake()
|
uiEventLoggerFake = UiEventLoggerFake()
|
||||||
receiverUiEventLogger = MediaTttReceiverUiEventLogger(uiEventLoggerFake)
|
receiverUiEventLogger = MediaTttReceiverUiEventLogger(uiEventLoggerFake)
|
||||||
|
temporaryViewUiEventLogger = TemporaryViewUiEventLogger(uiEventLoggerFake)
|
||||||
|
|
||||||
fakeWakeLock = WakeLockFake()
|
fakeWakeLock = WakeLockFake()
|
||||||
fakeWakeLockBuilder = WakeLockFake.Builder(context)
|
fakeWakeLockBuilder = WakeLockFake.Builder(context)
|
||||||
@@ -136,6 +140,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
|
|||||||
fakeWakeLockBuilder,
|
fakeWakeLockBuilder,
|
||||||
fakeClock,
|
fakeClock,
|
||||||
rippleController,
|
rippleController,
|
||||||
|
temporaryViewUiEventLogger,
|
||||||
)
|
)
|
||||||
controllerReceiver.start()
|
controllerReceiver.start()
|
||||||
|
|
||||||
@@ -166,6 +171,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
|
|||||||
fakeWakeLockBuilder,
|
fakeWakeLockBuilder,
|
||||||
fakeClock,
|
fakeClock,
|
||||||
rippleController,
|
rippleController,
|
||||||
|
temporaryViewUiEventLogger,
|
||||||
)
|
)
|
||||||
controllerReceiver.start()
|
controllerReceiver.start()
|
||||||
|
|
||||||
@@ -186,6 +192,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
|
|||||||
assertThat(uiEventLoggerFake.eventId(0)).isEqualTo(
|
assertThat(uiEventLoggerFake.eventId(0)).isEqualTo(
|
||||||
MediaTttReceiverUiEvents.MEDIA_TTT_RECEIVER_CLOSE_TO_SENDER.id
|
MediaTttReceiverUiEvents.MEDIA_TTT_RECEIVER_CLOSE_TO_SENDER.id
|
||||||
)
|
)
|
||||||
|
assertThat(uiEventLoggerFake.logs[0].instanceId).isNotNull()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -201,6 +208,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
|
|||||||
assertThat(uiEventLoggerFake.eventId(0)).isEqualTo(
|
assertThat(uiEventLoggerFake.eventId(0)).isEqualTo(
|
||||||
MediaTttReceiverUiEvents.MEDIA_TTT_RECEIVER_FAR_FROM_SENDER.id
|
MediaTttReceiverUiEvents.MEDIA_TTT_RECEIVER_FAR_FROM_SENDER.id
|
||||||
)
|
)
|
||||||
|
assertThat(uiEventLoggerFake.logs[0].instanceId).isNotNull()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -216,6 +224,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
|
|||||||
assertThat(uiEventLoggerFake.eventId(0)).isEqualTo(
|
assertThat(uiEventLoggerFake.eventId(0)).isEqualTo(
|
||||||
MediaTttReceiverUiEvents.MEDIA_TTT_RECEIVER_TRANSFER_TO_RECEIVER_SUCCEEDED.id
|
MediaTttReceiverUiEvents.MEDIA_TTT_RECEIVER_TRANSFER_TO_RECEIVER_SUCCEEDED.id
|
||||||
)
|
)
|
||||||
|
assertThat(uiEventLoggerFake.logs[0].instanceId).isNotNull()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -231,6 +240,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
|
|||||||
assertThat(uiEventLoggerFake.eventId(0)).isEqualTo(
|
assertThat(uiEventLoggerFake.eventId(0)).isEqualTo(
|
||||||
MediaTttReceiverUiEvents.MEDIA_TTT_RECEIVER_TRANSFER_TO_RECEIVER_FAILED.id
|
MediaTttReceiverUiEvents.MEDIA_TTT_RECEIVER_TRANSFER_TO_RECEIVER_FAILED.id
|
||||||
)
|
)
|
||||||
|
assertThat(uiEventLoggerFake.logs[0].instanceId).isNotNull()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -275,6 +285,25 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
|
|||||||
verify(windowManager).removeView(viewCaptor.value)
|
verify(windowManager).removeView(viewCaptor.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun commandQueueCallback_closeThenSucceeded_sameViewInstanceId() {
|
||||||
|
commandQueueCallback.updateMediaTapToTransferReceiverDisplay(
|
||||||
|
StatusBarManager.MEDIA_TRANSFER_RECEIVER_STATE_CLOSE_TO_SENDER,
|
||||||
|
routeInfo,
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
)
|
||||||
|
|
||||||
|
commandQueueCallback.updateMediaTapToTransferReceiverDisplay(
|
||||||
|
StatusBarManager.MEDIA_TRANSFER_RECEIVER_STATE_TRANSFER_TO_RECEIVER_SUCCEEDED,
|
||||||
|
routeInfo,
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
)
|
||||||
|
|
||||||
|
assertThat(uiEventLoggerFake[0].instanceId).isEqualTo(uiEventLoggerFake[1].instanceId)
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun commandQueueCallback_closeThenFailed_chipShownThenHidden() {
|
fun commandQueueCallback_closeThenFailed_chipShownThenHidden() {
|
||||||
commandQueueCallback.updateMediaTapToTransferReceiverDisplay(
|
commandQueueCallback.updateMediaTapToTransferReceiverDisplay(
|
||||||
@@ -349,6 +378,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
|
|||||||
appIconDrawableOverride = null,
|
appIconDrawableOverride = null,
|
||||||
appNameOverride = null,
|
appNameOverride = null,
|
||||||
id = "id",
|
id = "id",
|
||||||
|
instanceId = InstanceId.fakeInstanceId(0),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -371,6 +401,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
|
|||||||
drawableOverride,
|
drawableOverride,
|
||||||
appNameOverride = null,
|
appNameOverride = null,
|
||||||
id = "id",
|
id = "id",
|
||||||
|
instanceId = InstanceId.fakeInstanceId(0),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -388,6 +419,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
|
|||||||
appIconDrawableOverride = null,
|
appIconDrawableOverride = null,
|
||||||
appNameOverride,
|
appNameOverride,
|
||||||
id = "id",
|
id = "id",
|
||||||
|
instanceId = InstanceId.fakeInstanceId(0),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -442,7 +474,13 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
|
|||||||
.addFeature("feature")
|
.addFeature("feature")
|
||||||
.setClientPackageName(packageName)
|
.setClientPackageName(packageName)
|
||||||
.build()
|
.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)
|
private fun ViewGroup.getAppIconView() = this.requireViewById<ImageView>(R.id.app_icon)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.android.systemui.media.taptotransfer.receiver
|
package com.android.systemui.media.taptotransfer.receiver
|
||||||
|
|
||||||
import androidx.test.filters.SmallTest
|
import androidx.test.filters.SmallTest
|
||||||
|
import com.android.internal.logging.InstanceId
|
||||||
import com.android.internal.logging.testing.UiEventLoggerFake
|
import com.android.internal.logging.testing.UiEventLoggerFake
|
||||||
import com.android.systemui.SysuiTestCase
|
import com.android.systemui.SysuiTestCase
|
||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
@@ -21,10 +22,12 @@ class MediaTttReceiverUiEventLoggerTest : SysuiTestCase() {
|
|||||||
@Test
|
@Test
|
||||||
fun logReceiverStateChange_eventAssociatedWithStateIsLogged() {
|
fun logReceiverStateChange_eventAssociatedWithStateIsLogged() {
|
||||||
val state = ChipStateReceiver.CLOSE_TO_SENDER
|
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.numLogs()).isEqualTo(1)
|
||||||
assertThat(uiEventLoggerFake.eventId(0)).isEqualTo(state.uiEvent.id)
|
assertThat(uiEventLoggerFake.eventId(0)).isEqualTo(state.uiEvent.id)
|
||||||
|
assertThat(uiEventLoggerFake.logs[0].instanceId).isEqualTo(instanceId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ import com.android.systemui.statusbar.CommandQueue
|
|||||||
import com.android.systemui.statusbar.VibratorHelper
|
import com.android.systemui.statusbar.VibratorHelper
|
||||||
import com.android.systemui.statusbar.policy.ConfigurationController
|
import com.android.systemui.statusbar.policy.ConfigurationController
|
||||||
import com.android.systemui.temporarydisplay.TemporaryViewDisplayController
|
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.ChipbarAnimator
|
||||||
import com.android.systemui.temporarydisplay.chipbar.ChipbarCoordinator
|
import com.android.systemui.temporarydisplay.chipbar.ChipbarCoordinator
|
||||||
import com.android.systemui.temporarydisplay.chipbar.ChipbarLogger
|
import com.android.systemui.temporarydisplay.chipbar.ChipbarLogger
|
||||||
@@ -108,6 +109,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() {
|
|||||||
private lateinit var fakeExecutor: FakeExecutor
|
private lateinit var fakeExecutor: FakeExecutor
|
||||||
private lateinit var uiEventLoggerFake: UiEventLoggerFake
|
private lateinit var uiEventLoggerFake: UiEventLoggerFake
|
||||||
private lateinit var uiEventLogger: MediaTttSenderUiEventLogger
|
private lateinit var uiEventLogger: MediaTttSenderUiEventLogger
|
||||||
|
private lateinit var tempViewUiEventLogger: TemporaryViewUiEventLogger
|
||||||
private val defaultTimeout = context.resources.getInteger(R.integer.heads_up_notification_decay)
|
private val defaultTimeout = context.resources.getInteger(R.integer.heads_up_notification_decay)
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@@ -137,6 +139,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() {
|
|||||||
|
|
||||||
uiEventLoggerFake = UiEventLoggerFake()
|
uiEventLoggerFake = UiEventLoggerFake()
|
||||||
uiEventLogger = MediaTttSenderUiEventLogger(uiEventLoggerFake)
|
uiEventLogger = MediaTttSenderUiEventLogger(uiEventLoggerFake)
|
||||||
|
tempViewUiEventLogger = TemporaryViewUiEventLogger(uiEventLoggerFake)
|
||||||
|
|
||||||
chipbarCoordinator =
|
chipbarCoordinator =
|
||||||
ChipbarCoordinator(
|
ChipbarCoordinator(
|
||||||
@@ -156,6 +159,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() {
|
|||||||
vibratorHelper,
|
vibratorHelper,
|
||||||
fakeWakeLockBuilder,
|
fakeWakeLockBuilder,
|
||||||
fakeClock,
|
fakeClock,
|
||||||
|
tempViewUiEventLogger,
|
||||||
)
|
)
|
||||||
chipbarCoordinator.start()
|
chipbarCoordinator.start()
|
||||||
|
|
||||||
@@ -352,8 +356,8 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() {
|
|||||||
.isEqualTo(ChipStateSender.TRANSFER_TO_RECEIVER_SUCCEEDED.getExpectedStateText())
|
.isEqualTo(ChipStateSender.TRANSFER_TO_RECEIVER_SUCCEEDED.getExpectedStateText())
|
||||||
assertThat(chipbarView.getLoadingIcon().visibility).isEqualTo(View.GONE)
|
assertThat(chipbarView.getLoadingIcon().visibility).isEqualTo(View.GONE)
|
||||||
assertThat(chipbarView.getUndoButton().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.
|
// Event index 2 since initially displaying the triggered chip would also log two events.
|
||||||
assertThat(uiEventLoggerFake.eventId(1))
|
assertThat(uiEventLoggerFake.eventId(2))
|
||||||
.isEqualTo(MediaTttSenderUiEvents.MEDIA_TTT_SENDER_TRANSFER_TO_RECEIVER_SUCCEEDED.id)
|
.isEqualTo(MediaTttSenderUiEvents.MEDIA_TTT_SENDER_TRANSFER_TO_RECEIVER_SUCCEEDED.id)
|
||||||
verify(vibratorHelper, never())
|
verify(vibratorHelper, never())
|
||||||
.vibrate(
|
.vibrate(
|
||||||
@@ -365,6 +369,24 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun commandQueueCallback_transferToReceiverSucceeded_sameViewInstanceId() {
|
||||||
|
displayReceiverTriggered()
|
||||||
|
reset(vibratorHelper)
|
||||||
|
commandQueueCallback.updateMediaTapToTransferSenderDisplay(
|
||||||
|
StatusBarManager.MEDIA_TRANSFER_SENDER_STATE_TRANSFER_TO_RECEIVER_SUCCEEDED,
|
||||||
|
routeInfo,
|
||||||
|
null
|
||||||
|
)
|
||||||
|
|
||||||
|
// Event index 2 since initially displaying the triggered chip would also log two events.
|
||||||
|
assertThat(uiEventLoggerFake.eventId(2))
|
||||||
|
.isEqualTo(MediaTttSenderUiEvents.MEDIA_TTT_SENDER_TRANSFER_TO_RECEIVER_SUCCEEDED.id)
|
||||||
|
verify(vibratorHelper, never()).vibrate(any<VibrationEffect>())
|
||||||
|
assertThat(uiEventLoggerFake.logs[0].instanceId)
|
||||||
|
.isEqualTo(uiEventLoggerFake.logs[2].instanceId)
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun transferToReceiverSucceeded_nullUndoCallback_noUndo() {
|
fun transferToReceiverSucceeded_nullUndoCallback_noUndo() {
|
||||||
displayReceiverTriggered()
|
displayReceiverTriggered()
|
||||||
@@ -410,9 +432,9 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() {
|
|||||||
|
|
||||||
getChipbarView().getUndoButton().performClick()
|
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.
|
// events.
|
||||||
assertThat(uiEventLoggerFake.eventId(2))
|
assertThat(uiEventLoggerFake.eventId(3))
|
||||||
.isEqualTo(MediaTttSenderUiEvents.MEDIA_TTT_SENDER_UNDO_TRANSFER_TO_RECEIVER_CLICKED.id)
|
.isEqualTo(MediaTttSenderUiEvents.MEDIA_TTT_SENDER_UNDO_TRANSFER_TO_RECEIVER_CLICKED.id)
|
||||||
assertThat(undoCallbackCalled).isTrue()
|
assertThat(undoCallbackCalled).isTrue()
|
||||||
assertThat(getChipbarView().getChipText())
|
assertThat(getChipbarView().getChipText())
|
||||||
@@ -436,8 +458,8 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() {
|
|||||||
.isEqualTo(ChipStateSender.TRANSFER_TO_THIS_DEVICE_SUCCEEDED.getExpectedStateText())
|
.isEqualTo(ChipStateSender.TRANSFER_TO_THIS_DEVICE_SUCCEEDED.getExpectedStateText())
|
||||||
assertThat(chipbarView.getLoadingIcon().visibility).isEqualTo(View.GONE)
|
assertThat(chipbarView.getLoadingIcon().visibility).isEqualTo(View.GONE)
|
||||||
assertThat(chipbarView.getUndoButton().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.
|
// Event index 2 since initially displaying the triggered chip would also log two events.
|
||||||
assertThat(uiEventLoggerFake.eventId(1))
|
assertThat(uiEventLoggerFake.eventId(2))
|
||||||
.isEqualTo(MediaTttSenderUiEvents.MEDIA_TTT_SENDER_TRANSFER_TO_THIS_DEVICE_SUCCEEDED.id)
|
.isEqualTo(MediaTttSenderUiEvents.MEDIA_TTT_SENDER_TRANSFER_TO_THIS_DEVICE_SUCCEEDED.id)
|
||||||
verify(vibratorHelper, never())
|
verify(vibratorHelper, never())
|
||||||
.vibrate(
|
.vibrate(
|
||||||
@@ -494,9 +516,9 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() {
|
|||||||
|
|
||||||
getChipbarView().getUndoButton().performClick()
|
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.
|
// events.
|
||||||
assertThat(uiEventLoggerFake.eventId(2))
|
assertThat(uiEventLoggerFake.eventId(3))
|
||||||
.isEqualTo(
|
.isEqualTo(
|
||||||
MediaTttSenderUiEvents.MEDIA_TTT_SENDER_UNDO_TRANSFER_TO_THIS_DEVICE_CLICKED.id
|
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.getLoadingIcon().visibility).isEqualTo(View.GONE)
|
||||||
assertThat(chipbarView.getUndoButton().visibility).isEqualTo(View.GONE)
|
assertThat(chipbarView.getUndoButton().visibility).isEqualTo(View.GONE)
|
||||||
assertThat(chipbarView.getErrorIcon().visibility).isEqualTo(View.VISIBLE)
|
assertThat(chipbarView.getErrorIcon().visibility).isEqualTo(View.VISIBLE)
|
||||||
// Event index 1 since initially displaying the triggered chip would also log an event.
|
// Event index 2 since initially displaying the triggered chip would also log two events.
|
||||||
assertThat(uiEventLoggerFake.eventId(1))
|
assertThat(uiEventLoggerFake.eventId(2))
|
||||||
.isEqualTo(MediaTttSenderUiEvents.MEDIA_TTT_SENDER_TRANSFER_TO_RECEIVER_FAILED.id)
|
.isEqualTo(MediaTttSenderUiEvents.MEDIA_TTT_SENDER_TRANSFER_TO_RECEIVER_FAILED.id)
|
||||||
verify(vibratorHelper)
|
verify(vibratorHelper)
|
||||||
.vibrate(
|
.vibrate(
|
||||||
@@ -559,7 +581,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() {
|
|||||||
assertThat(chipbarView.getUndoButton().visibility).isEqualTo(View.GONE)
|
assertThat(chipbarView.getUndoButton().visibility).isEqualTo(View.GONE)
|
||||||
assertThat(chipbarView.getErrorIcon().visibility).isEqualTo(View.VISIBLE)
|
assertThat(chipbarView.getErrorIcon().visibility).isEqualTo(View.VISIBLE)
|
||||||
// Event index 1 since initially displaying the triggered chip would also log an event.
|
// 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)
|
.isEqualTo(MediaTttSenderUiEvents.MEDIA_TTT_SENDER_TRANSFER_TO_THIS_DEVICE_FAILED.id)
|
||||||
verify(vibratorHelper)
|
verify(vibratorHelper)
|
||||||
.vibrate(
|
.vibrate(
|
||||||
@@ -1082,6 +1104,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() {
|
|||||||
@Test
|
@Test
|
||||||
fun newState_viewListenerRegistered() {
|
fun newState_viewListenerRegistered() {
|
||||||
val mockChipbarCoordinator = mock<ChipbarCoordinator>()
|
val mockChipbarCoordinator = mock<ChipbarCoordinator>()
|
||||||
|
whenever(mockChipbarCoordinator.tempViewUiEventLogger).thenReturn(tempViewUiEventLogger)
|
||||||
underTest =
|
underTest =
|
||||||
MediaTttSenderCoordinator(
|
MediaTttSenderCoordinator(
|
||||||
mockChipbarCoordinator,
|
mockChipbarCoordinator,
|
||||||
@@ -1109,6 +1132,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() {
|
|||||||
@Test
|
@Test
|
||||||
fun onInfoPermanentlyRemoved_viewListenerUnregistered() {
|
fun onInfoPermanentlyRemoved_viewListenerUnregistered() {
|
||||||
val mockChipbarCoordinator = mock<ChipbarCoordinator>()
|
val mockChipbarCoordinator = mock<ChipbarCoordinator>()
|
||||||
|
whenever(mockChipbarCoordinator.tempViewUiEventLogger).thenReturn(tempViewUiEventLogger)
|
||||||
underTest =
|
underTest =
|
||||||
MediaTttSenderCoordinator(
|
MediaTttSenderCoordinator(
|
||||||
mockChipbarCoordinator,
|
mockChipbarCoordinator,
|
||||||
@@ -1142,6 +1166,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() {
|
|||||||
@Test
|
@Test
|
||||||
fun onInfoPermanentlyRemoved_wrongId_viewListenerNotUnregistered() {
|
fun onInfoPermanentlyRemoved_wrongId_viewListenerNotUnregistered() {
|
||||||
val mockChipbarCoordinator = mock<ChipbarCoordinator>()
|
val mockChipbarCoordinator = mock<ChipbarCoordinator>()
|
||||||
|
whenever(mockChipbarCoordinator.tempViewUiEventLogger).thenReturn(tempViewUiEventLogger)
|
||||||
underTest =
|
underTest =
|
||||||
MediaTttSenderCoordinator(
|
MediaTttSenderCoordinator(
|
||||||
mockChipbarCoordinator,
|
mockChipbarCoordinator,
|
||||||
@@ -1174,6 +1199,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() {
|
|||||||
@Test
|
@Test
|
||||||
fun farFromReceiverState_viewListenerUnregistered() {
|
fun farFromReceiverState_viewListenerUnregistered() {
|
||||||
val mockChipbarCoordinator = mock<ChipbarCoordinator>()
|
val mockChipbarCoordinator = mock<ChipbarCoordinator>()
|
||||||
|
whenever(mockChipbarCoordinator.tempViewUiEventLogger).thenReturn(tempViewUiEventLogger)
|
||||||
underTest =
|
underTest =
|
||||||
MediaTttSenderCoordinator(
|
MediaTttSenderCoordinator(
|
||||||
mockChipbarCoordinator,
|
mockChipbarCoordinator,
|
||||||
@@ -1210,6 +1236,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() {
|
|||||||
@Test
|
@Test
|
||||||
fun statesWithDifferentIds_onInfoPermanentlyRemovedForOneId_viewListenerNotUnregistered() {
|
fun statesWithDifferentIds_onInfoPermanentlyRemovedForOneId_viewListenerNotUnregistered() {
|
||||||
val mockChipbarCoordinator = mock<ChipbarCoordinator>()
|
val mockChipbarCoordinator = mock<ChipbarCoordinator>()
|
||||||
|
whenever(mockChipbarCoordinator.tempViewUiEventLogger).thenReturn(tempViewUiEventLogger)
|
||||||
underTest =
|
underTest =
|
||||||
MediaTttSenderCoordinator(
|
MediaTttSenderCoordinator(
|
||||||
mockChipbarCoordinator,
|
mockChipbarCoordinator,
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
package com.android.systemui.media.taptotransfer.sender
|
package com.android.systemui.media.taptotransfer.sender
|
||||||
|
|
||||||
import androidx.test.filters.SmallTest
|
import androidx.test.filters.SmallTest
|
||||||
|
import com.android.internal.logging.InstanceId
|
||||||
import com.android.systemui.SysuiTestCase
|
import com.android.systemui.SysuiTestCase
|
||||||
import com.android.systemui.dump.DumpManager
|
import com.android.systemui.dump.DumpManager
|
||||||
import com.android.systemui.log.LogBuffer
|
import com.android.systemui.log.LogBuffer
|
||||||
@@ -91,8 +92,16 @@ class MediaTttSenderLoggerTest : SysuiTestCase() {
|
|||||||
fun logStateMap_bufferHasInfo() {
|
fun logStateMap_bufferHasInfo() {
|
||||||
val map =
|
val map =
|
||||||
mapOf(
|
mapOf(
|
||||||
"123" to ChipStateSender.ALMOST_CLOSE_TO_START_CAST,
|
"123" to
|
||||||
"456" to ChipStateSender.TRANSFER_TO_THIS_DEVICE_TRIGGERED,
|
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)
|
logger.logStateMap(map)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.android.systemui.media.taptotransfer.sender
|
package com.android.systemui.media.taptotransfer.sender
|
||||||
|
|
||||||
import androidx.test.filters.SmallTest
|
import androidx.test.filters.SmallTest
|
||||||
|
import com.android.internal.logging.InstanceId
|
||||||
import com.android.internal.logging.testing.UiEventLoggerFake
|
import com.android.internal.logging.testing.UiEventLoggerFake
|
||||||
import com.android.systemui.SysuiTestCase
|
import com.android.systemui.SysuiTestCase
|
||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
@@ -21,26 +22,32 @@ class MediaTttSenderUiEventLoggerTest : SysuiTestCase() {
|
|||||||
@Test
|
@Test
|
||||||
fun logSenderStateChange_eventAssociatedWithStateIsLogged() {
|
fun logSenderStateChange_eventAssociatedWithStateIsLogged() {
|
||||||
val state = ChipStateSender.ALMOST_CLOSE_TO_END_CAST
|
val state = ChipStateSender.ALMOST_CLOSE_TO_END_CAST
|
||||||
logger.logSenderStateChange(state)
|
logger.logSenderStateChange(state, instanceId)
|
||||||
|
|
||||||
assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1)
|
assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1)
|
||||||
assertThat(uiEventLoggerFake.eventId(0)).isEqualTo(state.uiEvent.id)
|
assertThat(uiEventLoggerFake.eventId(0)).isEqualTo(state.uiEvent.id)
|
||||||
|
assertThat(uiEventLoggerFake.get(0).instanceId).isEqualTo(instanceId)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun logUndoClicked_undoEventLogged() {
|
fun logUndoClicked_undoEventLogged() {
|
||||||
val undoEvent = MediaTttSenderUiEvents.MEDIA_TTT_SENDER_UNDO_TRANSFER_TO_THIS_DEVICE_CLICKED
|
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.numLogs()).isEqualTo(1)
|
||||||
assertThat(uiEventLoggerFake.eventId(0)).isEqualTo(undoEvent.id)
|
assertThat(uiEventLoggerFake.eventId(0)).isEqualTo(undoEvent.id)
|
||||||
|
assertThat(uiEventLoggerFake.get(0).instanceId).isEqualTo(instanceId)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun logUndoClicked_notUndoEvent_eventNotLogged() {
|
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)
|
assertThat(uiEventLoggerFake.numLogs()).isEqualTo(0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val instanceId = InstanceId.fakeInstanceId(0)
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ import android.view.ViewGroup
|
|||||||
import android.view.WindowManager
|
import android.view.WindowManager
|
||||||
import android.view.accessibility.AccessibilityManager
|
import android.view.accessibility.AccessibilityManager
|
||||||
import androidx.test.filters.SmallTest
|
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.R
|
||||||
import com.android.systemui.SysuiTestCase
|
import com.android.systemui.SysuiTestCase
|
||||||
import com.android.systemui.dagger.qualifiers.Main
|
import com.android.systemui.dagger.qualifiers.Main
|
||||||
@@ -60,6 +62,9 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() {
|
|||||||
private lateinit var fakeWakeLockBuilder: WakeLockFake.Builder
|
private lateinit var fakeWakeLockBuilder: WakeLockFake.Builder
|
||||||
private lateinit var fakeWakeLock: WakeLockFake
|
private lateinit var fakeWakeLock: WakeLockFake
|
||||||
|
|
||||||
|
private lateinit var fakeUiEventLogger: UiEventLoggerFake
|
||||||
|
private lateinit var uiEventLogger: TemporaryViewUiEventLogger
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private lateinit var logger: TemporaryViewLogger<ViewInfo>
|
private lateinit var logger: TemporaryViewLogger<ViewInfo>
|
||||||
@Mock
|
@Mock
|
||||||
@@ -87,6 +92,9 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() {
|
|||||||
fakeWakeLockBuilder = WakeLockFake.Builder(context)
|
fakeWakeLockBuilder = WakeLockFake.Builder(context)
|
||||||
fakeWakeLockBuilder.setWakeLock(fakeWakeLock)
|
fakeWakeLockBuilder.setWakeLock(fakeWakeLock)
|
||||||
|
|
||||||
|
fakeUiEventLogger = UiEventLoggerFake()
|
||||||
|
uiEventLogger = TemporaryViewUiEventLogger(fakeUiEventLogger)
|
||||||
|
|
||||||
underTest = TestController(
|
underTest = TestController(
|
||||||
context,
|
context,
|
||||||
logger,
|
logger,
|
||||||
@@ -98,6 +106,7 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() {
|
|||||||
powerManager,
|
powerManager,
|
||||||
fakeWakeLockBuilder,
|
fakeWakeLockBuilder,
|
||||||
fakeClock,
|
fakeClock,
|
||||||
|
uiEventLogger,
|
||||||
)
|
)
|
||||||
underTest.start()
|
underTest.start()
|
||||||
}
|
}
|
||||||
@@ -126,6 +135,8 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() {
|
|||||||
underTest.displayView(info)
|
underTest.displayView(info)
|
||||||
|
|
||||||
verify(logger).logViewAddition(info)
|
verify(logger).logViewAddition(info)
|
||||||
|
assertThat(fakeUiEventLogger.eventId(0))
|
||||||
|
.isEqualTo(TemporaryViewUiEvent.TEMPORARY_VIEW_ADDED.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -1029,6 +1040,9 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() {
|
|||||||
verify(logger).logViewRemoval(DEFAULT_ID, reason)
|
verify(logger).logViewRemoval(DEFAULT_ID, reason)
|
||||||
verify(configurationController).removeCallback(any())
|
verify(configurationController).removeCallback(any())
|
||||||
assertThat(listener.permanentlyRemovedIds).containsExactly(DEFAULT_ID)
|
assertThat(listener.permanentlyRemovedIds).containsExactly(DEFAULT_ID)
|
||||||
|
assertThat(fakeUiEventLogger.logs.size).isEqualTo(1)
|
||||||
|
assertThat(fakeUiEventLogger.eventId(0))
|
||||||
|
.isEqualTo(TemporaryViewUiEvent.TEMPORARY_VIEW_ADDED.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -1133,6 +1147,7 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() {
|
|||||||
powerManager: PowerManager,
|
powerManager: PowerManager,
|
||||||
wakeLockBuilder: WakeLock.Builder,
|
wakeLockBuilder: WakeLock.Builder,
|
||||||
systemClock: SystemClock,
|
systemClock: SystemClock,
|
||||||
|
uiEventLogger: TemporaryViewUiEventLogger,
|
||||||
) : TemporaryViewDisplayController<ViewInfo, TemporaryViewLogger<ViewInfo>>(
|
) : TemporaryViewDisplayController<ViewInfo, TemporaryViewLogger<ViewInfo>>(
|
||||||
context,
|
context,
|
||||||
logger,
|
logger,
|
||||||
@@ -1145,6 +1160,7 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() {
|
|||||||
R.layout.chipbar,
|
R.layout.chipbar,
|
||||||
wakeLockBuilder,
|
wakeLockBuilder,
|
||||||
systemClock,
|
systemClock,
|
||||||
|
uiEventLogger,
|
||||||
) {
|
) {
|
||||||
var mostRecentViewInfo: ViewInfo? = null
|
var mostRecentViewInfo: ViewInfo? = null
|
||||||
|
|
||||||
@@ -1168,6 +1184,7 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() {
|
|||||||
override val timeoutMs: Int = TIMEOUT_MS.toInt(),
|
override val timeoutMs: Int = TIMEOUT_MS.toInt(),
|
||||||
override val id: String = DEFAULT_ID,
|
override val id: String = DEFAULT_ID,
|
||||||
override val priority: ViewPriority = ViewPriority.NORMAL,
|
override val priority: ViewPriority = ViewPriority.NORMAL,
|
||||||
|
override val instanceId: InstanceId = InstanceId.fakeInstanceId(0),
|
||||||
) : TemporaryViewInfo()
|
) : TemporaryViewInfo()
|
||||||
|
|
||||||
inner class Listener : TemporaryViewDisplayController.Listener {
|
inner class Listener : TemporaryViewDisplayController.Listener {
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
package com.android.systemui.temporarydisplay
|
package com.android.systemui.temporarydisplay
|
||||||
|
|
||||||
import androidx.test.filters.SmallTest
|
import androidx.test.filters.SmallTest
|
||||||
|
import com.android.internal.logging.InstanceId
|
||||||
import com.android.systemui.SysuiTestCase
|
import com.android.systemui.SysuiTestCase
|
||||||
import com.android.systemui.dump.DumpManager
|
import com.android.systemui.dump.DumpManager
|
||||||
import com.android.systemui.log.LogBuffer
|
import com.android.systemui.log.LogBuffer
|
||||||
@@ -50,6 +51,7 @@ class TemporaryViewLoggerTest : SysuiTestCase() {
|
|||||||
override val priority: ViewPriority = ViewPriority.CRITICAL
|
override val priority: ViewPriority = ViewPriority.CRITICAL
|
||||||
override val windowTitle: String = "Test Window Title"
|
override val windowTitle: String = "Test Window Title"
|
||||||
override val wakeReason: String = "wake reason"
|
override val wakeReason: String = "wake reason"
|
||||||
|
override val instanceId: InstanceId = InstanceId.fakeInstanceId(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.logViewAddition(info)
|
logger.logViewAddition(info)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -30,6 +30,7 @@ import android.widget.ImageView
|
|||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.core.animation.doOnCancel
|
import androidx.core.animation.doOnCancel
|
||||||
import androidx.test.filters.SmallTest
|
import androidx.test.filters.SmallTest
|
||||||
|
import com.android.internal.logging.InstanceId
|
||||||
import com.android.internal.logging.testing.UiEventLoggerFake
|
import com.android.internal.logging.testing.UiEventLoggerFake
|
||||||
import com.android.systemui.R
|
import com.android.systemui.R
|
||||||
import com.android.systemui.SysuiTestCase
|
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.plugins.FalsingManager
|
||||||
import com.android.systemui.statusbar.VibratorHelper
|
import com.android.systemui.statusbar.VibratorHelper
|
||||||
import com.android.systemui.statusbar.policy.ConfigurationController
|
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.temporarydisplay.ViewPriority
|
||||||
import com.android.systemui.util.concurrency.FakeExecutor
|
import com.android.systemui.util.concurrency.FakeExecutor
|
||||||
import com.android.systemui.util.mockito.any
|
import com.android.systemui.util.mockito.any
|
||||||
@@ -87,6 +90,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() {
|
|||||||
private lateinit var fakeClock: FakeSystemClock
|
private lateinit var fakeClock: FakeSystemClock
|
||||||
private lateinit var fakeExecutor: FakeExecutor
|
private lateinit var fakeExecutor: FakeExecutor
|
||||||
private lateinit var uiEventLoggerFake: UiEventLoggerFake
|
private lateinit var uiEventLoggerFake: UiEventLoggerFake
|
||||||
|
private lateinit var uiEventLogger: TemporaryViewUiEventLogger
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
fun setUp() {
|
fun setUp() {
|
||||||
@@ -101,6 +105,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() {
|
|||||||
fakeWakeLockBuilder.setWakeLock(fakeWakeLock)
|
fakeWakeLockBuilder.setWakeLock(fakeWakeLock)
|
||||||
|
|
||||||
uiEventLoggerFake = UiEventLoggerFake()
|
uiEventLoggerFake = UiEventLoggerFake()
|
||||||
|
uiEventLogger = TemporaryViewUiEventLogger(uiEventLoggerFake)
|
||||||
chipbarAnimator = TestChipbarAnimator()
|
chipbarAnimator = TestChipbarAnimator()
|
||||||
|
|
||||||
underTest =
|
underTest =
|
||||||
@@ -121,6 +126,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() {
|
|||||||
vibratorHelper,
|
vibratorHelper,
|
||||||
fakeWakeLockBuilder,
|
fakeWakeLockBuilder,
|
||||||
fakeClock,
|
fakeClock,
|
||||||
|
uiEventLogger,
|
||||||
)
|
)
|
||||||
underTest.start()
|
underTest.start()
|
||||||
}
|
}
|
||||||
@@ -632,7 +638,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun swipeToDismiss_swipeOccurs_viewDismissed() {
|
fun swipeToDismiss_swipeOccurs_viewDismissed_manuallyDismissedLogged() {
|
||||||
underTest.displayView(
|
underTest.displayView(
|
||||||
createChipbarInfo(
|
createChipbarInfo(
|
||||||
Icon.Resource(R.drawable.ic_cake, contentDescription = null),
|
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))
|
callbackCaptor.value.invoke(MotionEvent.obtain(0L, 0L, 0, 0f, 0f, 0))
|
||||||
|
|
||||||
verify(windowManager).removeView(view)
|
verify(windowManager).removeView(view)
|
||||||
|
assertThat(uiEventLoggerFake.numLogs()).isEqualTo(2)
|
||||||
|
assertThat(uiEventLoggerFake.eventId(1))
|
||||||
|
.isEqualTo(TemporaryViewUiEvent.TEMPORARY_VIEW_MANUALLY_DISMISSED.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -665,6 +674,11 @@ class ChipbarCoordinatorTest : SysuiTestCase() {
|
|||||||
val callbackCaptor = argumentCaptor<(MotionEvent) -> Unit>()
|
val callbackCaptor = argumentCaptor<(MotionEvent) -> Unit>()
|
||||||
verify(swipeGestureHandler).addOnGestureDetectedCallback(any(), capture(callbackCaptor))
|
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
|
// WHEN the view is updated to not allow swipe-to-dismiss
|
||||||
underTest.displayView(
|
underTest.displayView(
|
||||||
createChipbarInfo(
|
createChipbarInfo(
|
||||||
@@ -683,6 +697,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() {
|
|||||||
|
|
||||||
// THEN it is ignored and view isn't removed
|
// THEN it is ignored and view isn't removed
|
||||||
verify(windowManager, never()).removeView(view)
|
verify(windowManager, never()).removeView(view)
|
||||||
|
assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createChipbarInfo(
|
private fun createChipbarInfo(
|
||||||
@@ -703,6 +718,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() {
|
|||||||
timeoutMs = TIMEOUT,
|
timeoutMs = TIMEOUT,
|
||||||
id = DEVICE_ID,
|
id = DEVICE_ID,
|
||||||
priority = ViewPriority.NORMAL,
|
priority = ViewPriority.NORMAL,
|
||||||
|
instanceId = InstanceId.fakeInstanceId(0),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user