1 /* 2 * Copyright (C) 2024 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.systemui.statusbar.policy 18 19 import android.media.MediaRouter.RouteInfo 20 import android.media.projection.MediaProjectionInfo 21 import com.android.systemui.dagger.SysUISingleton 22 import com.android.systemui.log.LogBuffer 23 import com.android.systemui.log.core.LogLevel 24 import com.android.systemui.log.core.MessageInitializer 25 import com.android.systemui.log.core.MessagePrinter 26 import com.android.systemui.statusbar.policy.dagger.CastControllerLog 27 import javax.inject.Inject 28 29 /** Helper class for logging events to [CastControllerLog] from Java. */ 30 @SysUISingleton 31 class CastControllerLogger 32 @Inject 33 constructor( 34 @CastControllerLog val logger: LogBuffer, 35 ) { 36 /** Passthrough to [logger]. */ lognull37 inline fun log( 38 tag: String, 39 level: LogLevel, 40 messageInitializer: MessageInitializer, 41 noinline messagePrinter: MessagePrinter, 42 exception: Throwable? = null, 43 ) { 44 logger.log(tag, level, messageInitializer, messagePrinter, exception) 45 } 46 logDiscoveringnull47 fun logDiscovering(isDiscovering: Boolean) = 48 logger.log(TAG, LogLevel.DEBUG, { bool1 = isDiscovering }, { "setDiscovering: $bool1" }) 49 logStartCastingnull50 fun logStartCasting(route: RouteInfo) = 51 logger.log(TAG, LogLevel.DEBUG, { str1 = route.toLogString() }, { "startCasting: $str1" }) 52 logStopCastingnull53 fun logStopCasting(isProjection: Boolean) = 54 logger.log( 55 TAG, 56 LogLevel.DEBUG, 57 { bool1 = isProjection }, <lambda>null58 { "stopCasting. isProjection=$bool1" }, 59 ) 60 logStopCastingNoProjectionnull61 fun logStopCastingNoProjection(projection: MediaProjectionInfo) = 62 logger.log( 63 TAG, 64 LogLevel.WARNING, 65 { str1 = projection.toString() }, <lambda>null66 { "stopCasting failed because projection is no longer active: $str1" }, 67 ) 68 logStopCastingMediaRouternull69 fun logStopCastingMediaRouter() = 70 logger.log( 71 TAG, 72 LogLevel.DEBUG, 73 {}, <lambda>null74 { "stopCasting is selecting fallback route in MediaRouter" }, 75 ) 76 logSetProjectionnull77 fun logSetProjection(oldInfo: MediaProjectionInfo?, newInfo: MediaProjectionInfo?) = 78 logger.log( 79 TAG, 80 LogLevel.DEBUG, 81 { 82 str1 = oldInfo.toString() 83 str2 = newInfo.toString() 84 }, <lambda>null85 { "setProjection: $str1 -> $str2" }, 86 ) 87 logRouteAddednull88 fun logRouteAdded(route: RouteInfo) = 89 logger.log(TAG, LogLevel.DEBUG, { str1 = route.toLogString() }, { "onRouteAdded: $str1" }) 90 logRouteChangednull91 fun logRouteChanged(route: RouteInfo) = 92 logger.log(TAG, LogLevel.DEBUG, { str1 = route.toLogString() }, { "onRouteChanged: $str1" }) 93 logRouteRemovednull94 fun logRouteRemoved(route: RouteInfo) = 95 logger.log(TAG, LogLevel.DEBUG, { str1 = route.toLogString() }, { "onRouteRemoved: $str1" }) 96 logRouteSelectednull97 fun logRouteSelected(route: RouteInfo, type: Int) = 98 logger.log( 99 TAG, 100 LogLevel.DEBUG, 101 { 102 str1 = route.toLogString() 103 int1 = type 104 }, <lambda>null105 { "onRouteSelected($int1): $str1" }, 106 ) 107 logRouteUnselectednull108 fun logRouteUnselected(route: RouteInfo, type: Int) = 109 logger.log( 110 TAG, 111 LogLevel.DEBUG, 112 { 113 str1 = route.toLogString() 114 int1 = type 115 }, <lambda>null116 { "onRouteUnselected($int1): $str1" }, 117 ) 118 119 companion object { 120 @JvmStatic toLogStringnull121 fun RouteInfo?.toLogString(): String? { 122 if (this == null) return null 123 val sb = 124 StringBuilder() 125 .append(name) 126 .append('/') 127 .append(description) 128 .append('@') 129 .append(deviceAddress) 130 .append(",status=") 131 .append(status) 132 if (isDefault) sb.append(",default") 133 if (isEnabled) sb.append(",enabled") 134 if (isConnecting) sb.append(",connecting") 135 if (isSelected) sb.append(",selected") 136 return sb.append(",id=").append(this.tag).toString() 137 } 138 139 private const val TAG = "CastController" 140 } 141 } 142