diff --git a/packages/SystemUI/ktfmt_includes.txt b/packages/SystemUI/ktfmt_includes.txt index 1f00812780929..1a67691e30bf8 100644 --- a/packages/SystemUI/ktfmt_includes.txt +++ b/packages/SystemUI/ktfmt_includes.txt @@ -197,13 +197,10 @@ -packages/SystemUI/src/com/android/systemui/media/nearby/NearbyMediaDevicesManager.kt -packages/SystemUI/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelper.kt -packages/SystemUI/src/com/android/systemui/media/taptotransfer/MediaTttFlags.kt --packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttLogger.kt -packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/ChipStateReceiver.kt -packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt --packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLogger.kt -packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/ReceiverChipRippleView.kt -packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/ChipStateSender.kt --packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLogger.kt -packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderUiEventLogger.kt -packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanel.kt -packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt @@ -611,7 +608,6 @@ -packages/SystemUI/tests/src/com/android/systemui/media/muteawait/MediaMuteAwaitConnectionManagerTest.kt -packages/SystemUI/tests/src/com/android/systemui/media/nearby/NearbyMediaDevicesManagerTest.kt -packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelperTest.kt --packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttLoggerTest.kt -packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt -packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderUiEventLoggerTest.kt -packages/SystemUI/tests/src/com/android/systemui/navigationbar/gestural/FloatingRotationButtonPositionCalculatorTest.kt diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java index 15306f9cc23e4..6c6f7e9744fe7 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java @@ -199,28 +199,6 @@ public class LogModule { return factory.create("SwipeUpLog", 30); } - /** - * Provides a logging buffer for logs related to the media tap-to-transfer chip on the sender - * device. See {@link com.android.systemui.media.taptotransfer.sender.MediaTttSenderLogger}. - */ - @Provides - @SysUISingleton - @MediaTttSenderLogBuffer - public static LogBuffer provideMediaTttSenderLogBuffer(LogBufferFactory factory) { - return factory.create("MediaTttSender", 20); - } - - /** - * Provides a logging buffer for logs related to the media tap-to-transfer chip on the receiver - * device. See {@link com.android.systemui.media.taptotransfer.receiver.MediaTttReceiverLogger}. - */ - @Provides - @SysUISingleton - @MediaTttReceiverLogBuffer - public static LogBuffer provideMediaTttReceiverLogBuffer(LogBufferFactory factory) { - return factory.create("MediaTttReceiver", 20); - } - /** * Provides a logging buffer for logs related to the media mute-await connections. See * {@link com.android.systemui.media.muteawait.MediaMuteAwaitConnectionManager}. diff --git a/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java b/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java index bb833df1ff694..9ae4577b0394e 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java +++ b/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java @@ -17,8 +17,7 @@ package com.android.systemui.media.dagger; import com.android.systemui.dagger.SysUISingleton; -import com.android.systemui.log.dagger.MediaTttReceiverLogBuffer; -import com.android.systemui.log.dagger.MediaTttSenderLogBuffer; +import com.android.systemui.log.LogBufferFactory; import com.android.systemui.media.controls.pipeline.MediaDataManager; import com.android.systemui.media.controls.ui.MediaHierarchyManager; import com.android.systemui.media.controls.ui.MediaHost; @@ -29,12 +28,9 @@ import com.android.systemui.media.muteawait.MediaMuteAwaitConnectionCli; import com.android.systemui.media.nearby.NearbyMediaDevicesManager; import com.android.systemui.media.taptotransfer.MediaTttCommandLineHelper; import com.android.systemui.media.taptotransfer.MediaTttFlags; -import com.android.systemui.media.taptotransfer.common.MediaTttLogger; -import com.android.systemui.media.taptotransfer.receiver.ChipReceiverInfo; -import com.android.systemui.media.taptotransfer.receiver.MediaTttReceiverLogger; -import com.android.systemui.media.taptotransfer.sender.MediaTttSenderLogger; +import com.android.systemui.media.taptotransfer.receiver.MediaTttReceiverLogBuffer; +import com.android.systemui.media.taptotransfer.sender.MediaTttSenderLogBuffer; import com.android.systemui.plugins.log.LogBuffer; -import com.android.systemui.temporarydisplay.chipbar.ChipbarInfo; import java.util.Optional; @@ -94,22 +90,22 @@ public interface MediaModule { return new MediaHost(stateHolder, hierarchyManager, dataManager, statesManager); } + /** Provides a logging buffer related to the media tap-to-transfer chip on the sender device. */ @Provides @SysUISingleton - @MediaTttSenderLogger - static MediaTttLogger providesMediaTttSenderLogger( - @MediaTttSenderLogBuffer LogBuffer buffer - ) { - return new MediaTttLogger<>("Sender", buffer); + @MediaTttSenderLogBuffer + static LogBuffer provideMediaTttSenderLogBuffer(LogBufferFactory factory) { + return factory.create("MediaTttSender", 30); } + /** + * Provides a logging buffer related to the media tap-to-transfer chip on the receiver device. + */ @Provides @SysUISingleton - @MediaTttReceiverLogger - static MediaTttLogger providesMediaTttReceiverLogger( - @MediaTttReceiverLogBuffer LogBuffer buffer - ) { - return new MediaTttLogger<>("Receiver", buffer); + @MediaTttReceiverLogBuffer + static LogBuffer provideMediaTttReceiverLogBuffer(LogBufferFactory factory) { + return factory.create("MediaTttReceiver", 20); } /** */ diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttLogger.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttLogger.kt deleted file mode 100644 index 8aef9385fe3ea..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttLogger.kt +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) 2022 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.media.taptotransfer.common - -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel -import com.android.systemui.temporarydisplay.TemporaryViewInfo -import com.android.systemui.temporarydisplay.TemporaryViewLogger - -/** - * A logger for media tap-to-transfer events. - * - * @param deviceTypeTag the type of device triggering the logs -- "Sender" or "Receiver". - * - * TODO(b/245610654): We should de-couple the sender and receiver loggers, since they're vastly - * different experiences. - */ -class MediaTttLogger( - deviceTypeTag: String, - buffer: LogBuffer -) : TemporaryViewLogger(buffer, BASE_TAG + deviceTypeTag) { - /** Logs a change in the chip state for the given [mediaRouteId]. */ - fun logStateChange(stateName: String, mediaRouteId: String, packageName: String?) { - buffer.log( - tag, - LogLevel.DEBUG, - { - str1 = stateName - str2 = mediaRouteId - str3 = packageName - }, - { "State changed to $str1 for ID=$str2 package=$str3" } - ) - } - - /** - * Logs an error in trying to update to [displayState]. - * - * [displayState] is either a [android.app.StatusBarManager.MediaTransferSenderState] or - * a [android.app.StatusBarManager.MediaTransferReceiverState]. - */ - fun logStateChangeError(displayState: Int) { - buffer.log( - tag, - LogLevel.ERROR, - { int1 = displayState }, - { "Cannot display state=$int1; aborting" } - ) - } - - /** - * Logs an invalid sender state transition error in trying to update to [desiredState]. - * - * @param currentState the previous state of the chip. - * @param desiredState the new state of the chip. - */ - fun logInvalidStateTransitionError( - currentState: String, - desiredState: String - ) { - buffer.log( - tag, - LogLevel.ERROR, - { - str1 = currentState - str2 = desiredState - }, - { "Cannot display state=$str2 after state=$str1; invalid transition" } - ) - } - - /** Logs that we couldn't find information for [packageName]. */ - fun logPackageNotFound(packageName: String) { - buffer.log( - tag, - LogLevel.DEBUG, - { str1 = packageName }, - { "Package $str1 could not be found" } - ) - } - - /** - * Logs that a removal request has been bypassed (ignored). - * - * @param removalReason the reason that the chip removal was requested. - * @param bypassReason the reason that the request was bypassed. - */ - fun logRemovalBypass(removalReason: String, bypassReason: String) { - buffer.log( - tag, - LogLevel.DEBUG, - { - str1 = removalReason - str2 = bypassReason - }, - { "Chip removal requested due to $str1; however, removal was ignored because $str2" }) - } -} - -private const val BASE_TAG = "MediaTtt" diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttLoggerUtils.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttLoggerUtils.kt new file mode 100644 index 0000000000000..0e839c6dbc7a2 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttLoggerUtils.kt @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2022 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.media.taptotransfer.common + +import com.android.systemui.plugins.log.LogBuffer +import com.android.systemui.plugins.log.LogLevel + +/** A helper for logging media tap-to-transfer events. */ +object MediaTttLoggerUtils { + fun logStateChange( + buffer: LogBuffer, + tag: String, + stateName: String, + mediaRouteId: String, + packageName: String?, + ) { + buffer.log( + tag, + LogLevel.DEBUG, + { + str1 = stateName + str2 = mediaRouteId + str3 = packageName + }, + { "State changed to $str1 for ID=$str2 package=$str3" } + ) + } + + fun logStateChangeError(buffer: LogBuffer, tag: String, displayState: Int) { + buffer.log( + tag, + LogLevel.ERROR, + { int1 = displayState }, + { "Cannot display state=$int1; aborting" } + ) + } + + fun logPackageNotFound(buffer: LogBuffer, tag: String, packageName: String) { + buffer.log( + tag, + LogLevel.DEBUG, + { str1 = packageName }, + { "Package $str1 could not be found" } + ) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt index 066c1853818fc..a3ae943c97047 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt @@ -25,7 +25,6 @@ import com.android.systemui.R import com.android.systemui.common.shared.model.ContentDescription import com.android.systemui.common.shared.model.Icon import com.android.systemui.common.shared.model.TintedIcon -import com.android.systemui.temporarydisplay.TemporaryViewInfo /** Utility methods for media tap-to-transfer. */ class MediaTttUtils { @@ -43,12 +42,13 @@ class MediaTttUtils { * default name and icon if we can't find the app name/icon. * * @param appPackageName the package name of the app playing the media. - * @param logger the logger to use for any errors. + * @param onPackageNotFoundException a function run if a + * [PackageManager.NameNotFoundException] occurs. */ fun getIconInfoFromPackageName( context: Context, appPackageName: String?, - logger: MediaTttLogger + onPackageNotFoundException: () -> Unit, ): IconInfo { if (appPackageName != null) { val packageManager = context.packageManager @@ -70,7 +70,7 @@ class MediaTttUtils { isAppIcon = true ) } catch (e: PackageManager.NameNotFoundException) { - logger.logPackageNotFound(appPackageName) + onPackageNotFoundException.invoke() } } return IconInfo( 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 60dd5dab75380..34bf74faa11ab 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 @@ -40,7 +40,6 @@ import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dump.DumpManager import com.android.systemui.media.taptotransfer.MediaTttFlags import com.android.systemui.media.taptotransfer.common.MediaTttIcon -import com.android.systemui.media.taptotransfer.common.MediaTttLogger import com.android.systemui.media.taptotransfer.common.MediaTttUtils import com.android.systemui.statusbar.CommandQueue import com.android.systemui.statusbar.policy.ConfigurationController @@ -65,7 +64,7 @@ import javax.inject.Inject open class MediaTttChipControllerReceiver @Inject constructor( private val commandQueue: CommandQueue, context: Context, - @MediaTttReceiverLogger logger: MediaTttLogger, + logger: MediaTttReceiverLogger, windowManager: WindowManager, mainExecutor: DelayableExecutor, accessibilityManager: AccessibilityManager, @@ -79,7 +78,7 @@ open class MediaTttChipControllerReceiver @Inject constructor( wakeLockBuilder: WakeLock.Builder, systemClock: SystemClock, private val rippleController: MediaTttReceiverRippleController, -) : TemporaryViewDisplayController>( +) : TemporaryViewDisplayController( context, logger, windowManager, @@ -173,9 +172,10 @@ open class MediaTttChipControllerReceiver @Inject constructor( } override fun updateView(newInfo: ChipReceiverInfo, currentView: ViewGroup) { - var iconInfo = MediaTttUtils.getIconInfoFromPackageName( - context, newInfo.routeInfo.clientPackageName, logger - ) + val packageName = newInfo.routeInfo.clientPackageName + var iconInfo = MediaTttUtils.getIconInfoFromPackageName(context, packageName) { + logger.logPackageNotFound(packageName) + } if (newInfo.appNameOverride != null) { iconInfo = iconInfo.copy( diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/MediaTttReceiverLogBuffer.java b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLogBuffer.java similarity index 86% rename from packages/SystemUI/src/com/android/systemui/log/dagger/MediaTttReceiverLogBuffer.java rename to packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLogBuffer.java index 1570d434bc625..67e464c344c5a 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/MediaTttReceiverLogBuffer.java +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLogBuffer.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.log.dagger; +package com.android.systemui.media.taptotransfer.receiver; import static java.lang.annotation.RetentionPolicy.RUNTIME; @@ -26,8 +26,7 @@ import java.lang.annotation.Retention; import javax.inject.Qualifier; /** - * A {@link LogBuffer} for - * {@link com.android.systemui.media.taptotransfer.receiver.MediaTttReceiverLogger}. + * A {@link LogBuffer} for receiver logs. */ @Qualifier @Documented diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLogger.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLogger.kt index 54fc48ddba910..b0c6257df96c3 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLogger.kt @@ -13,14 +13,44 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.android.systemui.media.taptotransfer.receiver -import java.lang.annotation.Documented -import java.lang.annotation.Retention -import java.lang.annotation.RetentionPolicy -import javax.inject.Qualifier +import android.app.StatusBarManager +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.media.taptotransfer.common.MediaTttLoggerUtils +import com.android.systemui.plugins.log.LogBuffer +import com.android.systemui.temporarydisplay.TemporaryViewLogger +import javax.inject.Inject -@Qualifier -@Documented -@Retention(RetentionPolicy.RUNTIME) -annotation class MediaTttReceiverLogger +/** A logger for all events related to the media tap-to-transfer receiver experience. */ +@SysUISingleton +class MediaTttReceiverLogger +@Inject +constructor( + @MediaTttReceiverLogBuffer buffer: LogBuffer, +) : TemporaryViewLogger(buffer, TAG) { + + /** Logs a change in the chip state for the given [mediaRouteId]. */ + fun logStateChange( + stateName: String, + mediaRouteId: String, + packageName: String?, + ) { + MediaTttLoggerUtils.logStateChange(buffer, TAG, stateName, mediaRouteId, packageName) + } + + /** Logs an error in trying to update to [displayState]. */ + fun logStateChangeError(@StatusBarManager.MediaTransferReceiverState displayState: Int) { + MediaTttLoggerUtils.logStateChangeError(buffer, TAG, displayState) + } + + /** Logs that we couldn't find information for [packageName]. */ + fun logPackageNotFound(packageName: String) { + MediaTttLoggerUtils.logPackageNotFound(buffer, TAG, packageName) + } + + companion object { + private const val TAG = "MediaTttReceiver" + } +} 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 902a10a0cea92..b2a5e356b9360 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 @@ -27,7 +27,6 @@ import com.android.systemui.R import com.android.systemui.common.shared.model.Text import com.android.systemui.dagger.SysUISingleton import com.android.systemui.media.taptotransfer.MediaTttFlags -import com.android.systemui.media.taptotransfer.common.MediaTttLogger import com.android.systemui.media.taptotransfer.common.MediaTttUtils import com.android.systemui.statusbar.CommandQueue import com.android.systemui.temporarydisplay.TemporaryViewDisplayController @@ -48,7 +47,7 @@ constructor( private val chipbarCoordinator: ChipbarCoordinator, private val commandQueue: CommandQueue, private val context: Context, - @MediaTttSenderLogger private val logger: MediaTttLogger, + private val logger: MediaTttSenderLogger, private val mediaTttFlags: MediaTttFlags, private val uiEventLogger: MediaTttSenderUiEventLogger, ) : CoreStartable { @@ -150,7 +149,7 @@ constructor( routeInfo: MediaRoute2Info, undoCallback: IUndoMediaTransferCallback?, context: Context, - logger: MediaTttLogger, + logger: MediaTttSenderLogger, ): ChipbarInfo { val packageName = routeInfo.clientPackageName val otherDeviceName = @@ -159,12 +158,14 @@ constructor( } else { routeInfo.name.toString() } + val icon = + MediaTttUtils.getIconInfoFromPackageName(context, packageName) { + logger.logPackageNotFound(packageName) + } return ChipbarInfo( // Display the app's icon as the start icon - startIcon = - MediaTttUtils.getIconInfoFromPackageName(context, packageName, logger) - .toTintedIcon(), + startIcon = icon.toTintedIcon(), text = chipStateSender.getChipTextString(context, otherDeviceName), endItem = when (chipStateSender.endItem) { diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/MediaTttSenderLogBuffer.java b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLogBuffer.java similarity index 86% rename from packages/SystemUI/src/com/android/systemui/log/dagger/MediaTttSenderLogBuffer.java rename to packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLogBuffer.java index bf216c6991d27..a262e97864f32 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/MediaTttSenderLogBuffer.java +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLogBuffer.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.log.dagger; +package com.android.systemui.media.taptotransfer.sender; import static java.lang.annotation.RetentionPolicy.RUNTIME; @@ -26,8 +26,7 @@ import java.lang.annotation.Retention; import javax.inject.Qualifier; /** - * A {@link LogBuffer} for - * {@link com.android.systemui.media.taptotransfer.sender.MediaTttSenderLogger}. + * A {@link LogBuffer} for sender logs. */ @Qualifier @Documented 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 4393af9a99ecf..6363425d6db98 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 @@ -13,14 +13,79 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.android.systemui.media.taptotransfer.sender -import java.lang.annotation.Documented -import java.lang.annotation.Retention -import java.lang.annotation.RetentionPolicy -import javax.inject.Qualifier +import android.app.StatusBarManager +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.media.taptotransfer.common.MediaTttLoggerUtils +import com.android.systemui.plugins.log.LogBuffer +import com.android.systemui.plugins.log.LogLevel +import javax.inject.Inject -@Qualifier -@Documented -@Retention(RetentionPolicy.RUNTIME) -annotation class MediaTttSenderLogger +/** A logger for all events related to the media tap-to-transfer sender experience. */ +@SysUISingleton +class MediaTttSenderLogger +@Inject +constructor( + @MediaTttSenderLogBuffer private val buffer: LogBuffer, +) { + /** Logs a change in the chip state for the given [mediaRouteId]. */ + fun logStateChange( + stateName: String, + mediaRouteId: String, + packageName: String?, + ) { + MediaTttLoggerUtils.logStateChange(buffer, TAG, stateName, mediaRouteId, packageName) + } + + /** Logs an error in trying to update to [displayState]. */ + fun logStateChangeError(@StatusBarManager.MediaTransferSenderState displayState: Int) { + MediaTttLoggerUtils.logStateChangeError(buffer, TAG, displayState) + } + + /** Logs that we couldn't find information for [packageName]. */ + fun logPackageNotFound(packageName: String) { + MediaTttLoggerUtils.logPackageNotFound(buffer, TAG, packageName) + } + + /** + * Logs an invalid sender state transition error in trying to update to [desiredState]. + * + * @param currentState the previous state of the chip. + * @param desiredState the new state of the chip. + */ + fun logInvalidStateTransitionError(currentState: String, desiredState: String) { + buffer.log( + TAG, + LogLevel.ERROR, + { + str1 = currentState + str2 = desiredState + }, + { "Cannot display state=$str2 after state=$str1; invalid transition" } + ) + } + + /** + * Logs that a removal request has been bypassed (ignored). + * + * @param removalReason the reason that the chip removal was requested. + * @param bypassReason the reason that the request was bypassed. + */ + fun logRemovalBypass(removalReason: String, bypassReason: String) { + buffer.log( + TAG, + LogLevel.DEBUG, + { + str1 = removalReason + str2 = bypassReason + }, + { "Chip removal requested due to $str1; however, removal was ignored because $str2" } + ) + } + + companion object { + private const val TAG = "MediaTttSender" + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttLoggerUtilsTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttLoggerUtilsTest.kt new file mode 100644 index 0000000000000..8da1c646109d3 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttLoggerUtilsTest.kt @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2022 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.media.taptotransfer.common + +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.dump.DumpManager +import com.android.systemui.log.LogBufferFactory +import com.android.systemui.plugins.log.LogBuffer +import com.android.systemui.plugins.log.LogcatEchoTracker +import com.google.common.truth.Truth.assertThat +import java.io.PrintWriter +import java.io.StringWriter +import org.junit.Before +import org.junit.Test +import org.mockito.Mockito.mock + +@SmallTest +class MediaTttLoggerUtilsTest : SysuiTestCase() { + + private lateinit var buffer: LogBuffer + + @Before + fun setUp() { + buffer = + LogBufferFactory(DumpManager(), mock(LogcatEchoTracker::class.java)) + .create("buffer", 10) + } + + @Test + fun logStateChange_bufferHasDeviceTypeTagAndParamInfo() { + val stateName = "test state name" + val id = "test id" + val packageName = "this.is.a.package" + + MediaTttLoggerUtils.logStateChange(buffer, TAG, stateName, id, packageName) + + val actualString = getStringFromBuffer() + assertThat(actualString).contains(TAG) + assertThat(actualString).contains(stateName) + assertThat(actualString).contains(id) + assertThat(actualString).contains(packageName) + } + + @Test + fun logStateChangeError_hasState() { + MediaTttLoggerUtils.logStateChangeError(buffer, TAG, 3456) + + val actualString = getStringFromBuffer() + assertThat(actualString).contains(TAG) + assertThat(actualString).contains("3456") + } + + @Test + fun logPackageNotFound_bufferHasPackageName() { + val packageName = "this.is.a.package" + + MediaTttLoggerUtils.logPackageNotFound(buffer, TAG, packageName) + + val actualString = getStringFromBuffer() + assertThat(actualString).contains(TAG) + assertThat(actualString).contains(packageName) + } + + private fun getStringFromBuffer(): String { + val stringWriter = StringWriter() + buffer.dump(PrintWriter(stringWriter), tailLength = 0) + return stringWriter.toString() + } +} + +private const val TAG = "TEST TAG" diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttUtilsTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttUtilsTest.kt index 561867f78e603..8055b987973be 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttUtilsTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttUtilsTest.kt @@ -25,7 +25,6 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.common.shared.model.ContentDescription import com.android.systemui.common.shared.model.ContentDescription.Companion.loadContentDescription import com.android.systemui.common.shared.model.Icon -import com.android.systemui.temporarydisplay.TemporaryViewInfo import com.android.systemui.util.mockito.any import com.google.common.truth.Truth.assertThat import org.junit.Before @@ -41,7 +40,6 @@ class MediaTttUtilsTest : SysuiTestCase() { private lateinit var appIconFromPackageName: Drawable @Mock private lateinit var packageManager: PackageManager @Mock private lateinit var applicationInfo: ApplicationInfo - @Mock private lateinit var logger: MediaTttLogger @Before fun setUp() { @@ -67,8 +65,7 @@ class MediaTttUtilsTest : SysuiTestCase() { @Test fun getIconInfoFromPackageName_nullPackageName_returnsDefault() { - val iconInfo = - MediaTttUtils.getIconInfoFromPackageName(context, appPackageName = null, logger) + val iconInfo = MediaTttUtils.getIconInfoFromPackageName(context, appPackageName = null) {} assertThat(iconInfo.isAppIcon).isFalse() assertThat(iconInfo.contentDescription.loadContentDescription(context)) @@ -76,9 +73,20 @@ class MediaTttUtilsTest : SysuiTestCase() { assertThat(iconInfo.icon).isEqualTo(MediaTttIcon.Resource(R.drawable.ic_cast)) } + @Test + fun getIconInfoFromPackageName_nullPackageName_exceptionFnNotTriggered() { + var exceptionTriggered = false + + MediaTttUtils.getIconInfoFromPackageName(context, appPackageName = null) { + exceptionTriggered = true + } + + assertThat(exceptionTriggered).isFalse() + } + @Test fun getIconInfoFromPackageName_invalidPackageName_returnsDefault() { - val iconInfo = MediaTttUtils.getIconInfoFromPackageName(context, "fakePackageName", logger) + val iconInfo = MediaTttUtils.getIconInfoFromPackageName(context, "fakePackageName") {} assertThat(iconInfo.isAppIcon).isFalse() assertThat(iconInfo.contentDescription.loadContentDescription(context)) @@ -86,15 +94,37 @@ class MediaTttUtilsTest : SysuiTestCase() { assertThat(iconInfo.icon).isEqualTo(MediaTttIcon.Resource(R.drawable.ic_cast)) } + @Test + fun getIconInfoFromPackageName_invalidPackageName_exceptionFnTriggered() { + var exceptionTriggered = false + + MediaTttUtils.getIconInfoFromPackageName(context, appPackageName = "fakePackageName") { + exceptionTriggered = true + } + + assertThat(exceptionTriggered).isTrue() + } + @Test fun getIconInfoFromPackageName_validPackageName_returnsAppInfo() { - val iconInfo = MediaTttUtils.getIconInfoFromPackageName(context, PACKAGE_NAME, logger) + val iconInfo = MediaTttUtils.getIconInfoFromPackageName(context, PACKAGE_NAME) {} assertThat(iconInfo.isAppIcon).isTrue() assertThat(iconInfo.icon).isEqualTo(MediaTttIcon.Loaded(appIconFromPackageName)) assertThat(iconInfo.contentDescription.loadContentDescription(context)).isEqualTo(APP_NAME) } + @Test + fun getIconInfoFromPackageName_validPackageName_exceptionFnNotTriggered() { + var exceptionTriggered = false + + MediaTttUtils.getIconInfoFromPackageName(context, PACKAGE_NAME) { + exceptionTriggered = true + } + + assertThat(exceptionTriggered).isFalse() + } + @Test fun iconInfo_toTintedIcon_loaded() { val contentDescription = ContentDescription.Loaded("test") 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 b3e621e32d088..bd042c23856d9 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 @@ -24,7 +24,6 @@ import android.view.WindowManager import android.view.accessibility.AccessibilityManager import com.android.systemui.dump.DumpManager import com.android.systemui.media.taptotransfer.MediaTttFlags -import com.android.systemui.media.taptotransfer.common.MediaTttLogger import com.android.systemui.statusbar.CommandQueue import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.util.concurrency.DelayableExecutor @@ -35,7 +34,7 @@ import com.android.systemui.util.wakelock.WakeLock class FakeMediaTttChipControllerReceiver( commandQueue: CommandQueue, context: Context, - logger: MediaTttLogger, + logger: MediaTttReceiverLogger, windowManager: WindowManager, mainExecutor: DelayableExecutor, accessibilityManager: AccessibilityManager, 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 5e40898030cfa..dba2da7d74b24 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 @@ -36,7 +36,6 @@ import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager import com.android.systemui.media.taptotransfer.MediaTttFlags -import com.android.systemui.media.taptotransfer.common.MediaTttLogger import com.android.systemui.statusbar.CommandQueue import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.util.concurrency.FakeExecutor @@ -68,7 +67,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() { @Mock private lateinit var applicationInfo: ApplicationInfo @Mock - private lateinit var logger: MediaTttLogger + private lateinit var logger: MediaTttReceiverLogger @Mock private lateinit var accessibilityManager: AccessibilityManager @Mock diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLoggerTest.kt new file mode 100644 index 0000000000000..95df484cddc2d --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLoggerTest.kt @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2022 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.media.taptotransfer.receiver + +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.dump.DumpManager +import com.android.systemui.log.LogBufferFactory +import com.android.systemui.plugins.log.LogBuffer +import com.android.systemui.plugins.log.LogcatEchoTracker +import com.google.common.truth.Truth.assertThat +import java.io.PrintWriter +import java.io.StringWriter +import org.junit.Before +import org.junit.Test +import org.mockito.Mockito.mock + +@SmallTest +class MediaTttReceiverLoggerTest : SysuiTestCase() { + + private lateinit var buffer: LogBuffer + private lateinit var logger: MediaTttReceiverLogger + + @Before + fun setUp() { + buffer = + LogBufferFactory(DumpManager(), mock(LogcatEchoTracker::class.java)) + .create("buffer", 10) + logger = MediaTttReceiverLogger(buffer) + } + + @Test + fun logStateChange_bufferHasDeviceTypeTagAndParamInfo() { + val stateName = "test state name" + val id = "test id" + val packageName = "this.is.a.package" + + logger.logStateChange(stateName, id, packageName) + + val actualString = getStringFromBuffer() + assertThat(actualString).contains(stateName) + assertThat(actualString).contains(id) + assertThat(actualString).contains(packageName) + } + + @Test + fun logStateChangeError_hasState() { + logger.logStateChangeError(3456) + + val actualString = getStringFromBuffer() + assertThat(actualString).contains("3456") + } + + @Test + fun logPackageNotFound_bufferHasPackageName() { + val packageName = "this.is.a.package" + + logger.logPackageNotFound(packageName) + + val actualString = getStringFromBuffer() + assertThat(actualString).contains(packageName) + } + + private fun getStringFromBuffer(): String { + val stringWriter = StringWriter() + buffer.dump(PrintWriter(stringWriter), tailLength = 0) + return stringWriter.toString() + } +} 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 54d4460af6e4d..87a1f1294bfe6 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 @@ -40,14 +40,12 @@ import com.android.systemui.classifier.FalsingCollector import com.android.systemui.common.shared.model.Text.Companion.loadText import com.android.systemui.dump.DumpManager import com.android.systemui.media.taptotransfer.MediaTttFlags -import com.android.systemui.media.taptotransfer.common.MediaTttLogger import com.android.systemui.plugins.FalsingManager 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.chipbar.ChipbarCoordinator -import com.android.systemui.temporarydisplay.chipbar.ChipbarInfo import com.android.systemui.temporarydisplay.chipbar.ChipbarLogger import com.android.systemui.temporarydisplay.chipbar.FakeChipbarCoordinator import com.android.systemui.temporarydisplay.chipbar.SwipeChipbarAwayGestureHandler @@ -92,7 +90,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() { @Mock private lateinit var falsingManager: FalsingManager @Mock private lateinit var falsingCollector: FalsingCollector @Mock private lateinit var chipbarLogger: ChipbarLogger - @Mock private lateinit var logger: MediaTttLogger + @Mock private lateinit var logger: MediaTttSenderLogger @Mock private lateinit var mediaTttFlags: MediaTttFlags @Mock private lateinit var packageManager: PackageManager @Mock private lateinit var powerManager: PowerManager diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLoggerTest.kt similarity index 81% rename from packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttLoggerTest.kt rename to packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLoggerTest.kt index 0e7bf8d9d465b..59cc43f59bfc0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttLoggerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLoggerTest.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.media.taptotransfer.common +package com.android.systemui.media.taptotransfer.sender import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase @@ -22,7 +22,6 @@ import com.android.systemui.dump.DumpManager import com.android.systemui.log.LogBufferFactory import com.android.systemui.plugins.log.LogBuffer import com.android.systemui.plugins.log.LogcatEchoTracker -import com.android.systemui.temporarydisplay.TemporaryViewInfo import com.google.common.truth.Truth.assertThat import java.io.PrintWriter import java.io.StringWriter @@ -31,16 +30,17 @@ import org.junit.Test import org.mockito.Mockito.mock @SmallTest -class MediaTttLoggerTest : SysuiTestCase() { +class MediaTttSenderLoggerTest : SysuiTestCase() { private lateinit var buffer: LogBuffer - private lateinit var logger: MediaTttLogger + private lateinit var logger: MediaTttSenderLogger @Before - fun setUp () { - buffer = LogBufferFactory(DumpManager(), mock(LogcatEchoTracker::class.java)) - .create("buffer", 10) - logger = MediaTttLogger(DEVICE_TYPE_TAG, buffer) + fun setUp() { + buffer = + LogBufferFactory(DumpManager(), mock(LogcatEchoTracker::class.java)) + .create("buffer", 10) + logger = MediaTttSenderLogger(buffer) } @Test @@ -52,12 +52,19 @@ class MediaTttLoggerTest : SysuiTestCase() { logger.logStateChange(stateName, id, packageName) val actualString = getStringFromBuffer() - assertThat(actualString).contains(DEVICE_TYPE_TAG) assertThat(actualString).contains(stateName) assertThat(actualString).contains(id) assertThat(actualString).contains(packageName) } + @Test + fun logStateChangeError_hasState() { + logger.logStateChangeError(3456) + + val actualString = getStringFromBuffer() + assertThat(actualString).contains("3456") + } + @Test fun logPackageNotFound_bufferHasPackageName() { val packageName = "this.is.a.package" @@ -86,5 +93,3 @@ class MediaTttLoggerTest : SysuiTestCase() { return stringWriter.toString() } } - -private const val DEVICE_TYPE_TAG = "TEST TYPE"