diff options
| author | 2024-07-11 21:16:22 +0000 | |
|---|---|---|
| committer | 2024-07-12 17:09:40 +0000 | |
| commit | 63100949a56aa830002de9450d6eefe76a746b6a (patch) | |
| tree | b11f0c8b0e83fa89a2f75b67ebbdd0efd3bb7a71 | |
| parent | 76a101672501773833b22ddae9cdf2fc156be879 (diff) | |
[SB][Screen Chips] Finish adding logs to repo, interactor, and VM flows.
Bug: 351785188
Bug: 332662551
Flag: com.android.systemui.status_bar_screen_sharing_chips
Test: Dump `MediaRouter` log buffer, make sure it's readable
Test: Dump `StatusBarChips` log buffer, make sure it's readable and has
all the info
Test: atest MediaRouterRepositoryTest
Change-Id: I2b192ee8a01be5133b5da63677693fce6fb6c185
9 files changed, 92 insertions, 8 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/mediarouter/MediaRouterLog.kt b/packages/SystemUI/src/com/android/systemui/mediarouter/MediaRouterLog.kt new file mode 100644 index 000000000000..16bf0ffbf9e9 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/mediarouter/MediaRouterLog.kt @@ -0,0 +1,25 @@ +/* + * 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.mediarouter + +import javax.inject.Qualifier + +/** Logs for events related to MediaRouter APIs. */ +@Qualifier +@MustBeDocumented +@Retention(AnnotationRetention.RUNTIME) +annotation class MediaRouterLog diff --git a/packages/SystemUI/src/com/android/systemui/mediarouter/MediaRouterModule.kt b/packages/SystemUI/src/com/android/systemui/mediarouter/MediaRouterModule.kt index c07e3a0e7cec..df5dae4dd33a 100644 --- a/packages/SystemUI/src/com/android/systemui/mediarouter/MediaRouterModule.kt +++ b/packages/SystemUI/src/com/android/systemui/mediarouter/MediaRouterModule.kt @@ -16,12 +16,25 @@ package com.android.systemui.mediarouter +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogBufferFactory import com.android.systemui.mediarouter.data.repository.MediaRouterRepository import com.android.systemui.mediarouter.data.repository.MediaRouterRepositoryImpl import dagger.Binds import dagger.Module +import dagger.Provides @Module interface MediaRouterModule { @Binds fun mediaRouterRepository(impl: MediaRouterRepositoryImpl): MediaRouterRepository + + companion object { + @Provides + @SysUISingleton + @MediaRouterLog + fun provideMediaRouterLogBuffer(factory: LogBufferFactory): LogBuffer { + return factory.create("MediaRouter", 50) + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/mediarouter/data/repository/MediaRouterRepository.kt b/packages/SystemUI/src/com/android/systemui/mediarouter/data/repository/MediaRouterRepository.kt index 998d76ced9f7..debb667bbb15 100644 --- a/packages/SystemUI/src/com/android/systemui/mediarouter/data/repository/MediaRouterRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/mediarouter/data/repository/MediaRouterRepository.kt @@ -18,6 +18,9 @@ package com.android.systemui.mediarouter.data.repository import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.core.LogLevel +import com.android.systemui.mediarouter.MediaRouterLog import com.android.systemui.statusbar.policy.CastController import com.android.systemui.statusbar.policy.CastDevice import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow @@ -26,6 +29,9 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn /** A repository for data coming from MediaRouter APIs. */ @@ -43,23 +49,29 @@ class MediaRouterRepositoryImpl constructor( @Application private val scope: CoroutineScope, private val castController: CastController, + @MediaRouterLog private val logger: LogBuffer, ) : MediaRouterRepository { override val castDevices: StateFlow<List<CastDevice>> = conflatedCallbackFlow { - val callback = - CastController.Callback { - val mediaRouterCastDevices = - castController.castDevices.filter { - it.origin == CastDevice.CastOrigin.MediaRouter - } - trySend(mediaRouterCastDevices) - } + val callback = CastController.Callback { trySend(castController.castDevices) } castController.addCallback(callback) awaitClose { castController.removeCallback(callback) } } + // The CastController.Callback is pretty noisy and sends the same values multiple times + // in a row, so use a distinctUntilChanged before logging. + .distinctUntilChanged() + .onEach { allDevices -> + val logString = allDevices.map { it.shortLogString }.toString() + logger.log(TAG, LogLevel.INFO, { str1 = logString }, { "All cast devices: $str1" }) + } + .map { it.filter { device -> device.origin == CastDevice.CastOrigin.MediaRouter } } .stateIn(scope, SharingStarted.WhileSubscribed(), emptyList()) override fun stopCasting(device: CastDevice) { castController.stopCasting(device) } + + companion object { + private const val TAG = "MediaRouterRepo" + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/casttootherdevice/domain/interactor/MediaRouterChipInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/casttootherdevice/domain/interactor/MediaRouterChipInteractor.kt index 6917f468ce14..7c95f1e42080 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/casttootherdevice/domain/interactor/MediaRouterChipInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/casttootherdevice/domain/interactor/MediaRouterChipInteractor.kt @@ -18,7 +18,10 @@ package com.android.systemui.statusbar.chips.casttootherdevice.domain.interactor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.core.LogLevel import com.android.systemui.mediarouter.data.repository.MediaRouterRepository +import com.android.systemui.statusbar.chips.StatusBarChipsLog import com.android.systemui.statusbar.chips.casttootherdevice.domain.model.MediaRouterCastModel import com.android.systemui.statusbar.policy.CastDevice import javax.inject.Inject @@ -38,6 +41,7 @@ class MediaRouterChipInteractor constructor( @Application private val scope: CoroutineScope, private val mediaRouterRepository: MediaRouterRepository, + @StatusBarChipsLog private val logger: LogBuffer, ) { private val activeCastDevice: StateFlow<CastDevice?> = mediaRouterRepository.castDevices @@ -49,8 +53,10 @@ constructor( activeCastDevice .map { if (it != null) { + logger.log(TAG, LogLevel.INFO, { str1 = it.name }, { "State: Casting($str1)" }) MediaRouterCastModel.Casting(deviceName = it.name) } else { + logger.log(TAG, LogLevel.INFO, {}, { "State: DoingNothing" }) MediaRouterCastModel.DoingNothing } } @@ -60,4 +66,8 @@ constructor( fun stopCasting() { activeCastDevice.value?.let { mediaRouterRepository.stopCasting(it) } } + + companion object { + private const val TAG = "MediaRouter" + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/casttootherdevice/ui/viewmodel/CastToOtherDeviceChipViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/casttootherdevice/ui/viewmodel/CastToOtherDeviceChipViewModel.kt index f5e17df71ff9..80fd8619607e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/casttootherdevice/ui/viewmodel/CastToOtherDeviceChipViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/casttootherdevice/ui/viewmodel/CastToOtherDeviceChipViewModel.kt @@ -22,7 +22,10 @@ import com.android.systemui.common.shared.model.ContentDescription import com.android.systemui.common.shared.model.Icon import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.core.LogLevel import com.android.systemui.res.R +import com.android.systemui.statusbar.chips.StatusBarChipsLog import com.android.systemui.statusbar.chips.casttootherdevice.domain.interactor.MediaRouterChipInteractor import com.android.systemui.statusbar.chips.casttootherdevice.domain.model.MediaRouterCastModel import com.android.systemui.statusbar.chips.casttootherdevice.ui.view.EndCastScreenToOtherDeviceDialogDelegate @@ -58,6 +61,7 @@ constructor( private val mediaRouterChipInteractor: MediaRouterChipInteractor, private val systemClock: SystemClock, private val endMediaProjectionDialogHelper: EndMediaProjectionDialogHelper, + @StatusBarChipsLog private val logger: LogBuffer, ) : OngoingActivityChipViewModel { /** * The cast chip to show, based only on MediaProjection API events. @@ -123,6 +127,16 @@ constructor( override val chip: StateFlow<OngoingActivityChipModel> = combine(projectionChip, routerChip) { projection, router -> + logger.log( + TAG, + LogLevel.INFO, + { + str1 = projection.logName + str2 = router.logName + }, + { "projectionChip=$str1 > routerChip=$str2" } + ) + // A consequence of b/269975671 is that MediaRouter and MediaProjection APIs fire at // different times when *screen* casting: // @@ -212,5 +226,6 @@ constructor( companion object { @DrawableRes val CAST_TO_OTHER_DEVICE_ICON = R.drawable.ic_cast_connected + private const val TAG = "CastToOtherVM" } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastDevice.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastDevice.kt index 5fc160bd5da3..68edd758808c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastDevice.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastDevice.kt @@ -38,6 +38,9 @@ data class CastDevice( ) { val isCasting = state == CastState.Connecting || state == CastState.Connected + val shortLogString: String = + "CastDevice(id=$id name=$name description=$description state=$state origin=$origin)" + companion object { /** Creates a [CastDevice] based on the provided information from MediaRouter. */ fun MediaRouter.RouteInfo.toCastDevice(context: Context): CastDevice { diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/mediarouter/data/repository/MediaRouterRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/mediarouter/data/repository/MediaRouterRepositoryKosmos.kt index eec99207446a..e1ecc517ec9f 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/mediarouter/data/repository/MediaRouterRepositoryKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/mediarouter/data/repository/MediaRouterRepositoryKosmos.kt @@ -18,6 +18,7 @@ package com.android.systemui.mediarouter.data.repository import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope +import com.android.systemui.log.logcatLogBuffer import com.android.systemui.statusbar.policy.fakeCastController val Kosmos.realMediaRouterRepository by @@ -25,6 +26,7 @@ val Kosmos.realMediaRouterRepository by MediaRouterRepositoryImpl( scope = applicationCoroutineScope, castController = fakeCastController, + logger = logcatLogBuffer("MediaRouter"), ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/chips/casttootherdevice/domain/interactor/MediaRouterChipInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/chips/casttootherdevice/domain/interactor/MediaRouterChipInteractorKosmos.kt index cb18b687d5ed..1737bc4c7dfb 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/chips/casttootherdevice/domain/interactor/MediaRouterChipInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/chips/casttootherdevice/domain/interactor/MediaRouterChipInteractorKosmos.kt @@ -19,11 +19,13 @@ package com.android.systemui.statusbar.chips.casttootherdevice.domain.interactor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.mediarouter.data.repository.fakeMediaRouterRepository +import com.android.systemui.statusbar.chips.statusBarChipsLogger val Kosmos.mediaRouterChipInteractor by Kosmos.Fixture { MediaRouterChipInteractor( scope = applicationCoroutineScope, mediaRouterRepository = fakeMediaRouterRepository, + logger = statusBarChipsLogger, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/chips/casttootherdevice/ui/viewmodel/CastToOtherDeviceChipViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/chips/casttootherdevice/ui/viewmodel/CastToOtherDeviceChipViewModelKosmos.kt index 2335f21b2094..3d85a4abbd68 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/chips/casttootherdevice/ui/viewmodel/CastToOtherDeviceChipViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/chips/casttootherdevice/ui/viewmodel/CastToOtherDeviceChipViewModelKosmos.kt @@ -22,6 +22,7 @@ import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.statusbar.chips.casttootherdevice.domain.interactor.mediaRouterChipInteractor import com.android.systemui.statusbar.chips.mediaprojection.domain.interactor.mediaProjectionChipInteractor import com.android.systemui.statusbar.chips.mediaprojection.ui.view.endMediaProjectionDialogHelper +import com.android.systemui.statusbar.chips.statusBarChipsLogger import com.android.systemui.util.time.fakeSystemClock val Kosmos.castToOtherDeviceChipViewModel: CastToOtherDeviceChipViewModel by @@ -33,5 +34,6 @@ val Kosmos.castToOtherDeviceChipViewModel: CastToOtherDeviceChipViewModel by mediaRouterChipInteractor = mediaRouterChipInteractor, systemClock = fakeSystemClock, endMediaProjectionDialogHelper = endMediaProjectionDialogHelper, + logger = statusBarChipsLogger, ) } |