Merge "[Media TTT] Split up the media sender and receiver loggers." into tm-qpr-dev am: 6e355aa7af
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/21059663 Change-Id: I6c68caf899fab4f6f741274e102c42c088192aeb Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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}.
|
||||
|
||||
@@ -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<ChipbarInfo> 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<ChipReceiverInfo> providesMediaTttReceiverLogger(
|
||||
@MediaTttReceiverLogBuffer LogBuffer buffer
|
||||
) {
|
||||
return new MediaTttLogger<>("Receiver", buffer);
|
||||
@MediaTttReceiverLogBuffer
|
||||
static LogBuffer provideMediaTttReceiverLogBuffer(LogBufferFactory factory) {
|
||||
return factory.create("MediaTttReceiver", 20);
|
||||
}
|
||||
|
||||
/** */
|
||||
|
||||
@@ -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<T : TemporaryViewInfo>(
|
||||
deviceTypeTag: String,
|
||||
buffer: LogBuffer
|
||||
) : TemporaryViewLogger<T>(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"
|
||||
@@ -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" }
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -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<out TemporaryViewInfo>
|
||||
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(
|
||||
|
||||
@@ -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<ChipReceiverInfo>,
|
||||
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<ChipReceiverInfo, MediaTttLogger<ChipReceiverInfo>>(
|
||||
) : TemporaryViewDisplayController<ChipReceiverInfo, MediaTttReceiverLogger>(
|
||||
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(
|
||||
|
||||
@@ -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
|
||||
@@ -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<ChipReceiverInfo>(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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<ChipbarInfo>,
|
||||
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<ChipbarInfo>,
|
||||
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) {
|
||||
|
||||
@@ -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
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
@@ -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<TemporaryViewInfo>
|
||||
|
||||
@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")
|
||||
|
||||
@@ -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<ChipReceiverInfo>,
|
||||
logger: MediaTttReceiverLogger,
|
||||
windowManager: WindowManager,
|
||||
mainExecutor: DelayableExecutor,
|
||||
accessibilityManager: AccessibilityManager,
|
||||
|
||||
@@ -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<ChipReceiverInfo>
|
||||
private lateinit var logger: MediaTttReceiverLogger
|
||||
@Mock
|
||||
private lateinit var accessibilityManager: AccessibilityManager
|
||||
@Mock
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
@@ -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<ChipbarInfo>
|
||||
@Mock private lateinit var logger: MediaTttSenderLogger
|
||||
@Mock private lateinit var mediaTttFlags: MediaTttFlags
|
||||
@Mock private lateinit var packageManager: PackageManager
|
||||
@Mock private lateinit var powerManager: PowerManager
|
||||
|
||||
@@ -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<TemporaryViewInfo>
|
||||
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"
|
||||
Reference in New Issue
Block a user