diff options
7 files changed, 200 insertions, 40 deletions
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 ba3c1d216099..ed766469094e 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java @@ -382,6 +382,16 @@ public class LogModule { return factory.create("MediaLog", 20); } + /** + * Provides a buffer for media device changes + */ + @Provides + @SysUISingleton + @MediaDeviceLog + public static LogBuffer providesMediaDeviceLogBuffer(LogBufferFactory factory) { + return factory.create("MediaDeviceLog", 50); + } + /** Allows logging buffers to be tweaked via adb on debug builds but not on prod builds. */ @Provides @SysUISingleton diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/MediaDeviceLog.kt b/packages/SystemUI/src/com/android/systemui/log/dagger/MediaDeviceLog.kt new file mode 100644 index 000000000000..06bd26971232 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/MediaDeviceLog.kt @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2024 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.log.dagger + +import com.android.systemui.log.LogBuffer +import javax.inject.Qualifier + +/** A [LogBuffer] for [com.android.systemui.media.controls.domain.pipeline.MediaDeviceLogger] */ +@Qualifier +@MustBeDocumented +@Retention(AnnotationRetention.RUNTIME) +annotation class MediaDeviceLog diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDeviceLogger.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDeviceLogger.kt new file mode 100644 index 000000000000..f886166b986b --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDeviceLogger.kt @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2024 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.controls.domain.pipeline + +import android.media.session.MediaController +import com.android.settingslib.media.MediaDevice +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.core.LogLevel +import com.android.systemui.log.dagger.MediaDeviceLog +import com.android.systemui.media.controls.shared.model.MediaDeviceData +import javax.inject.Inject + +/** A [LogBuffer] for media device changes */ +class MediaDeviceLogger @Inject constructor(@MediaDeviceLog private val buffer: LogBuffer) { + + fun logBroadcastEvent(event: String, reason: Int, broadcastId: Int) { + buffer.log( + TAG, + LogLevel.DEBUG, + { + str1 = event + int1 = reason + int2 = broadcastId + }, + { "$str1, reason = $int1, broadcastId = $int2" } + ) + } + + fun logBroadcastEvent(event: String, reason: Int) { + buffer.log( + TAG, + LogLevel.DEBUG, + { + str1 = event + int1 = reason + }, + { "$str1, reason = $int1" } + ) + } + + fun logBroadcastMetadataChanged(broadcastId: Int, metadata: String) { + buffer.log( + TAG, + LogLevel.DEBUG, + { + int1 = broadcastId + str1 = metadata + }, + { "onBroadcastMetadataChanged, broadcastId = $int1, metadata = $str1" } + ) + } + + fun logNewDeviceName(name: String?) { + buffer.log(TAG, LogLevel.DEBUG, { str1 = name }, { "New device name $str1" }) + } + + fun logLocalDevice(sassDevice: MediaDeviceData?, connectedDevice: MediaDeviceData?) { + buffer.log( + TAG, + LogLevel.DEBUG, + { + str1 = sassDevice?.name?.toString() + str2 = connectedDevice?.name?.toString() + }, + { "Local device: $str1 or $str2" } + ) + } + + fun logRemoteDevice(routingSessionName: CharSequence?, connectedDevice: MediaDeviceData?) { + buffer.log( + TAG, + LogLevel.DEBUG, + { + str1 = routingSessionName?.toString() + str2 = connectedDevice?.name?.toString() + }, + { "Remote device: $str1 or $str2 or unknown" } + ) + } + + fun logDeviceName( + device: MediaDevice?, + controller: MediaController?, + routingSessionName: CharSequence?, + selectedRouteName: CharSequence? + ) { + buffer.log( + TAG, + LogLevel.DEBUG, + { + str1 = "device $device, controller: $controller" + str2 = routingSessionName?.toString() + str3 = selectedRouteName?.toString() + }, + { "$str1, routingSession $str2 or selected route $str3" } + ) + } + + companion object { + private const val TAG = "MediaDeviceLog" + } +} diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDeviceManager.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDeviceManager.kt index a193f7f8f498..49b53c2d78ae 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDeviceManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDeviceManager.kt @@ -71,6 +71,7 @@ constructor( private val localBluetoothManager: Lazy<LocalBluetoothManager?>, @Main private val fgExecutor: Executor, @Background private val bgExecutor: Executor, + private val logger: MediaDeviceLogger, ) : MediaDataManager.Listener { private val listeners: MutableSet<Listener> = mutableSetOf() @@ -281,59 +282,38 @@ constructor( } override fun onBroadcastStarted(reason: Int, broadcastId: Int) { - if (DEBUG) { - Log.d(TAG, "onBroadcastStarted(), reason = $reason , broadcastId = $broadcastId") - } + logger.logBroadcastEvent("onBroadcastStarted", reason, broadcastId) updateCurrent() } override fun onBroadcastStartFailed(reason: Int) { - if (DEBUG) { - Log.d(TAG, "onBroadcastStartFailed(), reason = $reason") - } + logger.logBroadcastEvent("onBroadcastStartFailed", reason) } override fun onBroadcastMetadataChanged( broadcastId: Int, metadata: BluetoothLeBroadcastMetadata ) { - if (DEBUG) { - Log.d( - TAG, - "onBroadcastMetadataChanged(), broadcastId = $broadcastId , " + - "metadata = $metadata" - ) - } + logger.logBroadcastMetadataChanged(broadcastId, metadata.toString()) updateCurrent() } override fun onBroadcastStopped(reason: Int, broadcastId: Int) { - if (DEBUG) { - Log.d(TAG, "onBroadcastStopped(), reason = $reason , broadcastId = $broadcastId") - } + logger.logBroadcastEvent("onBroadcastStopped", reason, broadcastId) updateCurrent() } override fun onBroadcastStopFailed(reason: Int) { - if (DEBUG) { - Log.d(TAG, "onBroadcastStopFailed(), reason = $reason") - } + logger.logBroadcastEvent("onBroadcastStopFailed", reason) } override fun onBroadcastUpdated(reason: Int, broadcastId: Int) { - if (DEBUG) { - Log.d(TAG, "onBroadcastUpdated(), reason = $reason , broadcastId = $broadcastId") - } + logger.logBroadcastEvent("onBroadcastUpdated", reason, broadcastId) updateCurrent() } override fun onBroadcastUpdateFailed(reason: Int, broadcastId: Int) { - if (DEBUG) { - Log.d( - TAG, - "onBroadcastUpdateFailed(), reason = $reason , " + "broadcastId = $broadcastId" - ) - } + logger.logBroadcastEvent("onBroadcastUpdateFailed", reason, broadcastId) } override fun onPlaybackStarted(reason: Int, broadcastId: Int) {} @@ -381,12 +361,16 @@ constructor( name = context.getString(R.string.media_seamless_other_device), showBroadcastButton = false ) + logger.logRemoteDevice(routingSession?.name, connectedDevice) } else { // Prefer SASS if available when playback is local. - activeDevice = getSassDevice() ?: connectedDevice + val sassDevice = getSassDevice() + activeDevice = sassDevice ?: connectedDevice + logger.logLocalDevice(sassDevice, connectedDevice) } current = activeDevice ?: EMPTY_AND_DISABLED_MEDIA_DEVICE_DATA + logger.logNewDeviceName(current?.name?.toString()) } else { val aboutToConnect = aboutToConnectDeviceOverride if ( @@ -407,9 +391,7 @@ constructor( val enabled = device != null && (controller == null || routingSession != null) val name = getDeviceName(device, routingSession) - if (DEBUG) { - Log.d(TAG, "new device name $name") - } + logger.logNewDeviceName(name) current = MediaDeviceData( enabled, @@ -463,14 +445,12 @@ constructor( ): String? { val selectedRoutes = routingSession?.let { mr2manager.get().getSelectedRoutes(it) } - if (DEBUG) { - Log.d( - TAG, - "device is $device, controller $controller," + - " routingSession ${routingSession?.name}" + - " or ${selectedRoutes?.firstOrNull()?.name}" - ) - } + logger.logDeviceName( + device, + controller, + routingSession?.name, + selectedRoutes?.firstOrNull()?.name + ) if (controller == null) { // In resume state, we don't have a controller - just use the device name diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDeviceManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDeviceManagerTest.kt index 6a66c4087615..0c8d88065a73 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDeviceManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDeviceManagerTest.kt @@ -54,6 +54,7 @@ import com.android.systemui.media.muteawait.MediaMuteAwaitConnectionManager import com.android.systemui.media.muteawait.MediaMuteAwaitConnectionManagerFactory import com.android.systemui.res.R import com.android.systemui.statusbar.policy.ConfigurationController +import com.android.systemui.testKosmos import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat @@ -125,6 +126,8 @@ public class MediaDeviceManagerTest : SysuiTestCase() { private lateinit var mediaData: MediaData @JvmField @Rule val mockito = MockitoJUnit.rule() + private val kosmos = testKosmos() + @Before fun setUp() { fakeFgExecutor = FakeExecutor(FakeSystemClock()) @@ -141,6 +144,7 @@ public class MediaDeviceManagerTest : SysuiTestCase() { { localBluetoothManager }, fakeFgExecutor, fakeBgExecutor, + kosmos.mediaDeviceLogger, ) manager.addListener(listener) diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/MediaDeviceLoggerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/MediaDeviceLoggerKosmos.kt new file mode 100644 index 000000000000..76d71dd05edd --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/MediaDeviceLoggerKosmos.kt @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2024 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.controls.domain.pipeline + +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.log.logcatLogBuffer + +var Kosmos.mediaDeviceLogger by + Kosmos.Fixture { MediaDeviceLogger(logcatLogBuffer("MediaDeviceLoggerKosmos")) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/MediaDeviceManagerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/MediaDeviceManagerKosmos.kt index c479ce676761..11408d8a4b90 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/MediaDeviceManagerKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/MediaDeviceManagerKosmos.kt @@ -41,5 +41,6 @@ val Kosmos.mediaDeviceManager by }, fgExecutor = fakeExecutor, bgExecutor = fakeExecutor, + logger = mediaDeviceLogger, ) } |