Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b1bcb416 authored by Michael Mikhail's avatar Michael Mikhail
Browse files

Add UiEventLogger to TemporaryView

Adds three UiEvents for temporary view and introduce instance id in the
logs to match with the events comming from Media TTT.
Adds instance id in the temporary view info for logging purposes.

Bug: 280338222.
Test: manually tested with adb commands with some logs added to make
sure the same instance id is being logged in both tap-to-transfer and
temporary view UI events.
Test: atest MediaTttChipControllerReceiverTest
Test: atest MediaTttReceiverUiEventLoggerTest
Test: atest MediaTttSenderCoordinatorTest
Test: atest MediaTttSenderLoggerTest
Test: atest MediaTttSenderUiEventLoggerTest
Test: atest TemporaryViewDisplayControllerTest
Test: atest TemporaryViewLoggerTest
Test: atest TemporaryViewUiEventLoggerTest
Test: atest TemporaryViewUiEventLoggerTest

Change-Id: I0e8c8ddb5b366305f51881169361a11b855ef580
parent 453c9a15
Loading
Loading
Loading
Loading
+20 −1
Original line number Diff line number Diff line
@@ -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()
+3 −2
Original line number Diff line number Diff line
@@ -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)
    }
}

+15 −6
Original line number Diff line number Diff line
@@ -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
+2 −1
Original line number Diff line number Diff line
@@ -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,
+8 −6
Original line number Diff line number Diff line
@@ -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)
    }
}

Loading