Loading packages/SystemUI/src/com/android/systemui/broadcast/BroadcastDispatcher.kt +5 −4 Original line number Diff line number Diff line Loading @@ -28,12 +28,12 @@ import android.text.TextUtils import android.util.SparseArray import com.android.internal.annotations.VisibleForTesting import com.android.systemui.Dumpable import com.android.systemui.broadcast.logging.BroadcastDispatcherLogger import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dump.DumpManager import java.io.FileDescriptor import java.io.PrintWriter import java.lang.IllegalStateException import java.util.concurrent.Executor import javax.inject.Inject import javax.inject.Singleton Loading Loading @@ -67,7 +67,8 @@ open class BroadcastDispatcher @Inject constructor ( private val context: Context, @Main private val mainHandler: Handler, @Background private val bgLooper: Looper, dumpManager: DumpManager dumpManager: DumpManager, private val logger: BroadcastDispatcherLogger ) : Dumpable { // Only modify in BG thread Loading Loading @@ -156,7 +157,7 @@ open class BroadcastDispatcher @Inject constructor ( /** * Unregister receiver for a particular user. * * @param receiver The receiver to unregister. It will be unregistered for all users. * @param receiver The receiver to unregister. * @param user The user associated to the registered [receiver]. It can be [UserHandle.ALL]. */ open fun unregisterReceiverForUser(receiver: BroadcastReceiver, user: UserHandle) { Loading @@ -166,7 +167,7 @@ open class BroadcastDispatcher @Inject constructor ( @VisibleForTesting protected open fun createUBRForUser(userId: Int) = UserBroadcastDispatcher(context, userId, bgLooper) UserBroadcastDispatcher(context, userId, bgLooper, logger) override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) { pw.println("Broadcast dispatcher:") Loading packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt +14 −4 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.util.Log import androidx.annotation.VisibleForTesting import com.android.internal.util.Preconditions import com.android.systemui.Dumpable import com.android.systemui.broadcast.logging.BroadcastDispatcherLogger import java.io.FileDescriptor import java.io.PrintWriter import java.lang.IllegalArgumentException Loading @@ -54,7 +55,8 @@ private const val DEBUG = false class UserBroadcastDispatcher( private val context: Context, private val userId: Int, private val bgLooper: Looper private val bgLooper: Looper, private val logger: BroadcastDispatcherLogger ) : BroadcastReceiver(), Dumpable { companion object { Loading Loading @@ -109,10 +111,12 @@ class UserBroadcastDispatcher( } override fun onReceive(context: Context, intent: Intent) { val id = if (DEBUG) index.getAndIncrement() else 0 val id = index.getAndIncrement() if (DEBUG) Log.w(TAG, "[$id] Received $intent") logger.logBroadcastReceived(id, userId, intent) bgHandler.post( HandleBroadcastRunnable(actionsToReceivers, context, intent, pendingResult, id)) HandleBroadcastRunnable( actionsToReceivers, context, intent, pendingResult, id, logger)) } /** Loading Loading @@ -143,6 +147,7 @@ class UserBroadcastDispatcher( ArraySet() }.add(receiverData) } logger.logReceiverRegistered(userId, receiverData.receiver) if (changed) { createFilterAndRegisterReceiverBG() } Loading @@ -163,6 +168,7 @@ class UserBroadcastDispatcher( actionsToReceivers.remove(action) } } logger.logReceiverUnregistered(userId, receiver) if (changed) { createFilterAndRegisterReceiverBG() } Loading @@ -187,7 +193,8 @@ class UserBroadcastDispatcher( val context: Context, val intent: Intent, val pendingResult: PendingResult, val index: Int val index: Int, val logger: BroadcastDispatcherLogger ) : Runnable { override fun run() { if (DEBUG) Log.w(TAG, "[$index] Dispatching $intent") Loading @@ -199,6 +206,7 @@ class UserBroadcastDispatcher( it.executor.execute { if (DEBUG) Log.w(TAG, "[$index] Dispatching ${intent.action} to ${it.receiver}") logger.logBroadcastDispatched(index, intent.action, it.receiver) it.receiver.pendingResult = pendingResult it.receiver.onReceive(context, intent) } Loading @@ -215,6 +223,7 @@ class UserBroadcastDispatcher( if (registered.get()) { try { context.unregisterReceiver(this@UserBroadcastDispatcher) logger.logContextReceiverUnregistered(userId) } catch (e: IllegalArgumentException) { Log.e(TAG, "Trying to unregister unregistered receiver for user $userId", IllegalStateException(e)) Loading @@ -230,6 +239,7 @@ class UserBroadcastDispatcher( null, bgHandler) registered.set(true) logger.logContextReceiverRegistered(userId, intentFilter) } } } Loading packages/SystemUI/src/com/android/systemui/broadcast/logging/BroadcastDispatcherLogger.kt 0 → 100644 +117 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 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.broadcast.logging import android.content.BroadcastReceiver import android.content.Intent import android.content.IntentFilter import com.android.systemui.log.LogBuffer import com.android.systemui.log.LogLevel import com.android.systemui.log.LogLevel.DEBUG import com.android.systemui.log.LogLevel.INFO import com.android.systemui.log.LogMessage import com.android.systemui.log.dagger.BroadcastDispatcherLog import javax.inject.Inject private const val TAG = "BroadcastDispatcherLog" class BroadcastDispatcherLogger @Inject constructor( @BroadcastDispatcherLog private val buffer: LogBuffer ) { fun logBroadcastReceived(broadcastId: Int, user: Int, intent: Intent) { val intentString = intent.toString() log(INFO, { int1 = broadcastId int2 = user str1 = intentString }, { "[$int1] Broadcast received for user $int2: $str1" }) } fun logBroadcastDispatched(broadcastId: Int, action: String?, receiver: BroadcastReceiver) { val receiverString = receiver.toString() log(DEBUG, { int1 = broadcastId str1 = action str2 = receiverString }, { "Broadcast $int1 ($str1) dispatched to $str2" }) } fun logReceiverRegistered(user: Int, receiver: BroadcastReceiver) { val receiverString = receiver.toString() log(INFO, { int1 = user str1 = receiverString }, { "Receiver $str1 registered for user $int1" }) } fun logReceiverUnregistered(user: Int, receiver: BroadcastReceiver) { val receiverString = receiver.toString() log(INFO, { int1 = user str1 = receiverString }, { "Receiver $str1 unregistered for user $int1" }) } fun logContextReceiverRegistered(user: Int, filter: IntentFilter) { val actions = filter.actionsIterator().asSequence() .joinToString(separator = ",", prefix = "Actions(", postfix = ")") val categories = if (filter.countCategories() != 0) { filter.categoriesIterator().asSequence() .joinToString(separator = ",", prefix = "Categories(", postfix = ")") } else { "" } log(INFO, { int1 = user str1 = if (categories != "") { "${actions}\n$categories" } else { actions } }, { """ Receiver registered with Context for user $int1. $str1 """.trimIndent() }) } fun logContextReceiverUnregistered(user: Int) { log(INFO, { int1 = user }, { "Receiver unregistered with Context for user $int1." }) } private inline fun log( logLevel: LogLevel, initializer: LogMessage.() -> Unit, noinline printer: LogMessage.() -> String ) { buffer.log(TAG, logLevel, initializer, printer) } } No newline at end of file packages/SystemUI/src/com/android/systemui/log/dagger/BroadcastDispatcherLog.java 0 → 100644 +33 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 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 static java.lang.annotation.RetentionPolicy.RUNTIME; import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import javax.inject.Qualifier; /** A {@link LogBuffer} for BroadcastDispatcher-related messages. */ @Qualifier @Documented @Retention(RUNTIME) public @interface BroadcastDispatcherLog { } packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java +12 −0 Original line number Diff line number Diff line Loading @@ -97,6 +97,18 @@ public class LogModule { return buffer; } /** Provides a logging buffer for {@link com.android.systemui.broadcast.BroadcastDispatcher} */ @Provides @Singleton @BroadcastDispatcherLog public static LogBuffer provideBroadcastDispatcherLogBuffer( LogcatEchoTracker bufferFilter, DumpManager dumpManager) { LogBuffer buffer = new LogBuffer("BroadcastDispatcherLog", 500, 10, bufferFilter); buffer.attach(dumpManager); return buffer; } /** Allows logging buffers to be tweaked via adb on debug builds but not on prod builds. */ @Provides @Singleton Loading Loading
packages/SystemUI/src/com/android/systemui/broadcast/BroadcastDispatcher.kt +5 −4 Original line number Diff line number Diff line Loading @@ -28,12 +28,12 @@ import android.text.TextUtils import android.util.SparseArray import com.android.internal.annotations.VisibleForTesting import com.android.systemui.Dumpable import com.android.systemui.broadcast.logging.BroadcastDispatcherLogger import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dump.DumpManager import java.io.FileDescriptor import java.io.PrintWriter import java.lang.IllegalStateException import java.util.concurrent.Executor import javax.inject.Inject import javax.inject.Singleton Loading Loading @@ -67,7 +67,8 @@ open class BroadcastDispatcher @Inject constructor ( private val context: Context, @Main private val mainHandler: Handler, @Background private val bgLooper: Looper, dumpManager: DumpManager dumpManager: DumpManager, private val logger: BroadcastDispatcherLogger ) : Dumpable { // Only modify in BG thread Loading Loading @@ -156,7 +157,7 @@ open class BroadcastDispatcher @Inject constructor ( /** * Unregister receiver for a particular user. * * @param receiver The receiver to unregister. It will be unregistered for all users. * @param receiver The receiver to unregister. * @param user The user associated to the registered [receiver]. It can be [UserHandle.ALL]. */ open fun unregisterReceiverForUser(receiver: BroadcastReceiver, user: UserHandle) { Loading @@ -166,7 +167,7 @@ open class BroadcastDispatcher @Inject constructor ( @VisibleForTesting protected open fun createUBRForUser(userId: Int) = UserBroadcastDispatcher(context, userId, bgLooper) UserBroadcastDispatcher(context, userId, bgLooper, logger) override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) { pw.println("Broadcast dispatcher:") Loading
packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt +14 −4 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.util.Log import androidx.annotation.VisibleForTesting import com.android.internal.util.Preconditions import com.android.systemui.Dumpable import com.android.systemui.broadcast.logging.BroadcastDispatcherLogger import java.io.FileDescriptor import java.io.PrintWriter import java.lang.IllegalArgumentException Loading @@ -54,7 +55,8 @@ private const val DEBUG = false class UserBroadcastDispatcher( private val context: Context, private val userId: Int, private val bgLooper: Looper private val bgLooper: Looper, private val logger: BroadcastDispatcherLogger ) : BroadcastReceiver(), Dumpable { companion object { Loading Loading @@ -109,10 +111,12 @@ class UserBroadcastDispatcher( } override fun onReceive(context: Context, intent: Intent) { val id = if (DEBUG) index.getAndIncrement() else 0 val id = index.getAndIncrement() if (DEBUG) Log.w(TAG, "[$id] Received $intent") logger.logBroadcastReceived(id, userId, intent) bgHandler.post( HandleBroadcastRunnable(actionsToReceivers, context, intent, pendingResult, id)) HandleBroadcastRunnable( actionsToReceivers, context, intent, pendingResult, id, logger)) } /** Loading Loading @@ -143,6 +147,7 @@ class UserBroadcastDispatcher( ArraySet() }.add(receiverData) } logger.logReceiverRegistered(userId, receiverData.receiver) if (changed) { createFilterAndRegisterReceiverBG() } Loading @@ -163,6 +168,7 @@ class UserBroadcastDispatcher( actionsToReceivers.remove(action) } } logger.logReceiverUnregistered(userId, receiver) if (changed) { createFilterAndRegisterReceiverBG() } Loading @@ -187,7 +193,8 @@ class UserBroadcastDispatcher( val context: Context, val intent: Intent, val pendingResult: PendingResult, val index: Int val index: Int, val logger: BroadcastDispatcherLogger ) : Runnable { override fun run() { if (DEBUG) Log.w(TAG, "[$index] Dispatching $intent") Loading @@ -199,6 +206,7 @@ class UserBroadcastDispatcher( it.executor.execute { if (DEBUG) Log.w(TAG, "[$index] Dispatching ${intent.action} to ${it.receiver}") logger.logBroadcastDispatched(index, intent.action, it.receiver) it.receiver.pendingResult = pendingResult it.receiver.onReceive(context, intent) } Loading @@ -215,6 +223,7 @@ class UserBroadcastDispatcher( if (registered.get()) { try { context.unregisterReceiver(this@UserBroadcastDispatcher) logger.logContextReceiverUnregistered(userId) } catch (e: IllegalArgumentException) { Log.e(TAG, "Trying to unregister unregistered receiver for user $userId", IllegalStateException(e)) Loading @@ -230,6 +239,7 @@ class UserBroadcastDispatcher( null, bgHandler) registered.set(true) logger.logContextReceiverRegistered(userId, intentFilter) } } } Loading
packages/SystemUI/src/com/android/systemui/broadcast/logging/BroadcastDispatcherLogger.kt 0 → 100644 +117 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 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.broadcast.logging import android.content.BroadcastReceiver import android.content.Intent import android.content.IntentFilter import com.android.systemui.log.LogBuffer import com.android.systemui.log.LogLevel import com.android.systemui.log.LogLevel.DEBUG import com.android.systemui.log.LogLevel.INFO import com.android.systemui.log.LogMessage import com.android.systemui.log.dagger.BroadcastDispatcherLog import javax.inject.Inject private const val TAG = "BroadcastDispatcherLog" class BroadcastDispatcherLogger @Inject constructor( @BroadcastDispatcherLog private val buffer: LogBuffer ) { fun logBroadcastReceived(broadcastId: Int, user: Int, intent: Intent) { val intentString = intent.toString() log(INFO, { int1 = broadcastId int2 = user str1 = intentString }, { "[$int1] Broadcast received for user $int2: $str1" }) } fun logBroadcastDispatched(broadcastId: Int, action: String?, receiver: BroadcastReceiver) { val receiverString = receiver.toString() log(DEBUG, { int1 = broadcastId str1 = action str2 = receiverString }, { "Broadcast $int1 ($str1) dispatched to $str2" }) } fun logReceiverRegistered(user: Int, receiver: BroadcastReceiver) { val receiverString = receiver.toString() log(INFO, { int1 = user str1 = receiverString }, { "Receiver $str1 registered for user $int1" }) } fun logReceiverUnregistered(user: Int, receiver: BroadcastReceiver) { val receiverString = receiver.toString() log(INFO, { int1 = user str1 = receiverString }, { "Receiver $str1 unregistered for user $int1" }) } fun logContextReceiverRegistered(user: Int, filter: IntentFilter) { val actions = filter.actionsIterator().asSequence() .joinToString(separator = ",", prefix = "Actions(", postfix = ")") val categories = if (filter.countCategories() != 0) { filter.categoriesIterator().asSequence() .joinToString(separator = ",", prefix = "Categories(", postfix = ")") } else { "" } log(INFO, { int1 = user str1 = if (categories != "") { "${actions}\n$categories" } else { actions } }, { """ Receiver registered with Context for user $int1. $str1 """.trimIndent() }) } fun logContextReceiverUnregistered(user: Int) { log(INFO, { int1 = user }, { "Receiver unregistered with Context for user $int1." }) } private inline fun log( logLevel: LogLevel, initializer: LogMessage.() -> Unit, noinline printer: LogMessage.() -> String ) { buffer.log(TAG, logLevel, initializer, printer) } } No newline at end of file
packages/SystemUI/src/com/android/systemui/log/dagger/BroadcastDispatcherLog.java 0 → 100644 +33 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 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 static java.lang.annotation.RetentionPolicy.RUNTIME; import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import javax.inject.Qualifier; /** A {@link LogBuffer} for BroadcastDispatcher-related messages. */ @Qualifier @Documented @Retention(RUNTIME) public @interface BroadcastDispatcherLog { }
packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java +12 −0 Original line number Diff line number Diff line Loading @@ -97,6 +97,18 @@ public class LogModule { return buffer; } /** Provides a logging buffer for {@link com.android.systemui.broadcast.BroadcastDispatcher} */ @Provides @Singleton @BroadcastDispatcherLog public static LogBuffer provideBroadcastDispatcherLogBuffer( LogcatEchoTracker bufferFilter, DumpManager dumpManager) { LogBuffer buffer = new LogBuffer("BroadcastDispatcherLog", 500, 10, bufferFilter); buffer.attach(dumpManager); return buffer; } /** Allows logging buffers to be tweaked via adb on debug builds but not on prod builds. */ @Provides @Singleton Loading