Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/AvalancheController.kt +41 −51 Original line number Diff line number Diff line Loading @@ -163,6 +163,7 @@ constructor( if (entry in nextMap) nextMap.remove(entry) if (entry in nextList) nextList.remove(entry) outcome = "add next" addToNext(entry, runnable) // Shorten headsUpEntryShowing display time Loading @@ -174,7 +175,7 @@ constructor( headsUpEntryShowing!!.updateEntry( /* updatePostTime= */ false, /* updateEarliestRemovalTime= */ false, /* reason= */ "avalanche duration update", /* reason= */ "shorten duration of previously-last HUN", ) } } Loading Loading @@ -269,8 +270,10 @@ constructor( } nextList.sort() val entryList = showingList + nextList val thisKey = getKey(entry) if (entryList.isEmpty()) { log { "No avalanche HUNs, use default ms: $autoDismissMs" } headsUpManagerLogger.logAvalancheDuration( thisKey, autoDismissMs, "No avalanche HUNs, use default", nextKey = "") return autoDismissMs } // entryList.indexOf(entry) returns -1 even when the entry is in entryList Loading @@ -281,27 +284,29 @@ constructor( } } if (thisEntryIndex == -1) { log { "Untracked entry, use default ms: $autoDismissMs" } headsUpManagerLogger.logAvalancheDuration( thisKey, autoDismissMs, "Untracked entry, use default", nextKey = "") return autoDismissMs } val nextEntryIndex = thisEntryIndex + 1 // If last entry, use default duration if (nextEntryIndex >= entryList.size) { log { "Last entry, use default ms: $autoDismissMs" } headsUpManagerLogger.logAvalancheDuration( thisKey, autoDismissMs, "Last entry, use default", nextKey = "") return autoDismissMs } val nextEntry = entryList[nextEntryIndex] val nextKey = getKey(nextEntry) if (nextEntry.compareNonTimeFields(entry) == -1) { // Next entry is higher priority log { "Next entry is higher priority: 500ms" } headsUpManagerLogger.logAvalancheDuration( thisKey, 500, "LOWER priority than next: ", nextKey) return 500 } else if (nextEntry.compareNonTimeFields(entry) == 0) { // Next entry is same priority log { "Next entry is same priority: 1000ms" } headsUpManagerLogger.logAvalancheDuration( thisKey, 1000, "SAME priority as next: ", nextKey) return 1000 } else { log { "Next entry is lower priority, use default ms: $autoDismissMs" } headsUpManagerLogger.logAvalancheDuration( thisKey, autoDismissMs, "HIGHER priority than next: ", nextKey) return autoDismissMs } } Loading Loading @@ -355,25 +360,28 @@ constructor( } private fun showNow(entry: HeadsUpEntry, runnableList: MutableList<Runnable>) { log { "SHOW: " + getKey(entry) } headsUpManagerLogger.logAvalancheStage("show", getKey(entry)) uiEventLogger.log(ThrottleEvent.AVALANCHE_THROTTLING_HUN_SHOWN) headsUpEntryShowing = entry runnableList.forEach { if (it in debugRunnableLabelMap) { log { "RUNNABLE: ${debugRunnableLabelMap[it]}" } runnableList.forEach { runnable -> if (debug) { debugRunnableLabelMap[runnable]?.let { label -> headsUpManagerLogger.logAvalancheStage("run", label) // Remove label after logging to avoid memory leak debugRunnableLabelMap.remove(runnable) } } it.run() runnable.run() } } private fun showNext() { log { "SHOW NEXT" } headsUpManagerLogger.logAvalancheStage("show next", key = "") headsUpEntryShowing = null if (nextList.isEmpty()) { log { "NO MORE TO SHOW" } headsUpManagerLogger.logAvalancheStage("no more", key = "") previousHunKey = "" return } Loading @@ -395,11 +403,7 @@ constructor( debugRunnableLabelMap.remove(r) } } val queue = ArrayList<String>() for (entry in listToDrop) { queue.add("[${getKey(entry)}]") } val dropList = java.lang.String.join("\n", queue) val dropList = listToDrop.joinToString("\n ") { getKey(it) } headsUpManagerLogger.logDroppedHuns(dropList) } clearNext() Loading @@ -424,38 +428,24 @@ constructor( // Methods below are for logging only ========================================================== private inline fun log(s: () -> String) { if (debug) { Log.d(tag, s()) } } private fun getStateStr(): String { return "\navalanche state:" + "\n\tshowing: [${getKey(headsUpEntryShowing)}]" + "\n\tprevious: [$previousHunKey]" + "\n\tnext list: $nextListStr" + "\n\tnext map: $nextMapStr" + "\nBHUM.mHeadsUpEntryMap: " + baseEntryMapStr() } private val nextListStr: String get() { val queue = ArrayList<String>() for (entry in nextList) { queue.add("[${getKey(entry)}]") } return java.lang.String.join("\n", queue) return "\n[AC state]" + "\nshow: ${getKey(headsUpEntryShowing)}" + "\nprevious: $previousHunKey" + "\n$nextStr" + "\n[HeadsUpManagerImpl.mHeadsUpEntryMap] " + baseEntryMapStr() + "\n" } private val nextMapStr: String private val nextStr: String get() { val queue = ArrayList<String>() for (entry in nextMap.keys) { queue.add("[${getKey(entry)}]") val nextListStr = nextList.joinToString("\n ") { getKey(it) } if (nextList.toSet() == nextMap.keys.toSet()) { return "next (${nextList.size}):\n $nextListStr" } return java.lang.String.join("\n", queue) // This should never happen val nextMapStr = nextMap.keys.joinToString("\n ") { getKey(it) } return "next list (${nextList.size}):\n $nextListStr" + "\nnext map (${nextMap.size}):\n $nextMapStr" } fun getKey(entry: HeadsUpEntry?): String { Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerImpl.java +2 −2 Original line number Diff line number Diff line Loading @@ -856,11 +856,11 @@ public class HeadsUpManagerImpl private String getEntryMapStr() { if (mHeadsUpEntryMap.isEmpty()) { return "EMPTY"; return ""; } StringBuilder entryMapStr = new StringBuilder(); for (HeadsUpEntry entry: mHeadsUpEntryMap.values()) { entryMapStr.append("\n\t").append( entryMapStr.append("\n ").append( entry.mEntry == null ? "null" : entry.mEntry.getKey()); } return entryMapStr.toString(); Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerLogger.kt +29 −3 Original line number Diff line number Diff line Loading @@ -71,7 +71,7 @@ constructor(@NotificationHeadsUpLog private val buffer: LogBuffer) { str3 = outcome bool1 = isEnabled }, { "$str1\n\t=> AC[isEnabled:$bool1] update: $str2\n\t=> $str3" }, { "$str1\n=> AC[enabled:$bool1] update: $str2\n=> $str3" }, ) } Loading @@ -90,7 +90,33 @@ constructor(@NotificationHeadsUpLog private val buffer: LogBuffer) { str3 = outcome bool1 = isEnabled }, { "$str1\n\t=> AC[isEnabled:$bool1] delete: $str2\n\t=> $str3" }, { "$str1\n=> AC[enabled:$bool1] delete: $str2\n=> $str3" }, ) } fun logAvalancheStage(stage: String, key: String) { buffer.log( TAG, INFO, { str1 = stage str2 = key }, { "[AC] $str1 $str2" }, ) } fun logAvalancheDuration(thisKey: String, duration: Int, reason: String, nextKey: String) { buffer.log( TAG, INFO, { str1 = thisKey int1 = duration str2 = reason str3 = nextKey }, { "[AC] $str1 | $int1 ms | $str2 $str3" }, ) } Loading Loading @@ -325,7 +351,7 @@ constructor(@NotificationHeadsUpLog private val buffer: LogBuffer) { } fun logDroppedHuns(entryList: String) { buffer.log(TAG, VERBOSE, { str1 = entryList }, { "[AC] Drop HUNs: $str1" }) buffer.log(TAG, VERBOSE, { str1 = entryList }, { "[AC] dropped:\n $str1" }) } } Loading Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/AvalancheController.kt +41 −51 Original line number Diff line number Diff line Loading @@ -163,6 +163,7 @@ constructor( if (entry in nextMap) nextMap.remove(entry) if (entry in nextList) nextList.remove(entry) outcome = "add next" addToNext(entry, runnable) // Shorten headsUpEntryShowing display time Loading @@ -174,7 +175,7 @@ constructor( headsUpEntryShowing!!.updateEntry( /* updatePostTime= */ false, /* updateEarliestRemovalTime= */ false, /* reason= */ "avalanche duration update", /* reason= */ "shorten duration of previously-last HUN", ) } } Loading Loading @@ -269,8 +270,10 @@ constructor( } nextList.sort() val entryList = showingList + nextList val thisKey = getKey(entry) if (entryList.isEmpty()) { log { "No avalanche HUNs, use default ms: $autoDismissMs" } headsUpManagerLogger.logAvalancheDuration( thisKey, autoDismissMs, "No avalanche HUNs, use default", nextKey = "") return autoDismissMs } // entryList.indexOf(entry) returns -1 even when the entry is in entryList Loading @@ -281,27 +284,29 @@ constructor( } } if (thisEntryIndex == -1) { log { "Untracked entry, use default ms: $autoDismissMs" } headsUpManagerLogger.logAvalancheDuration( thisKey, autoDismissMs, "Untracked entry, use default", nextKey = "") return autoDismissMs } val nextEntryIndex = thisEntryIndex + 1 // If last entry, use default duration if (nextEntryIndex >= entryList.size) { log { "Last entry, use default ms: $autoDismissMs" } headsUpManagerLogger.logAvalancheDuration( thisKey, autoDismissMs, "Last entry, use default", nextKey = "") return autoDismissMs } val nextEntry = entryList[nextEntryIndex] val nextKey = getKey(nextEntry) if (nextEntry.compareNonTimeFields(entry) == -1) { // Next entry is higher priority log { "Next entry is higher priority: 500ms" } headsUpManagerLogger.logAvalancheDuration( thisKey, 500, "LOWER priority than next: ", nextKey) return 500 } else if (nextEntry.compareNonTimeFields(entry) == 0) { // Next entry is same priority log { "Next entry is same priority: 1000ms" } headsUpManagerLogger.logAvalancheDuration( thisKey, 1000, "SAME priority as next: ", nextKey) return 1000 } else { log { "Next entry is lower priority, use default ms: $autoDismissMs" } headsUpManagerLogger.logAvalancheDuration( thisKey, autoDismissMs, "HIGHER priority than next: ", nextKey) return autoDismissMs } } Loading Loading @@ -355,25 +360,28 @@ constructor( } private fun showNow(entry: HeadsUpEntry, runnableList: MutableList<Runnable>) { log { "SHOW: " + getKey(entry) } headsUpManagerLogger.logAvalancheStage("show", getKey(entry)) uiEventLogger.log(ThrottleEvent.AVALANCHE_THROTTLING_HUN_SHOWN) headsUpEntryShowing = entry runnableList.forEach { if (it in debugRunnableLabelMap) { log { "RUNNABLE: ${debugRunnableLabelMap[it]}" } runnableList.forEach { runnable -> if (debug) { debugRunnableLabelMap[runnable]?.let { label -> headsUpManagerLogger.logAvalancheStage("run", label) // Remove label after logging to avoid memory leak debugRunnableLabelMap.remove(runnable) } } it.run() runnable.run() } } private fun showNext() { log { "SHOW NEXT" } headsUpManagerLogger.logAvalancheStage("show next", key = "") headsUpEntryShowing = null if (nextList.isEmpty()) { log { "NO MORE TO SHOW" } headsUpManagerLogger.logAvalancheStage("no more", key = "") previousHunKey = "" return } Loading @@ -395,11 +403,7 @@ constructor( debugRunnableLabelMap.remove(r) } } val queue = ArrayList<String>() for (entry in listToDrop) { queue.add("[${getKey(entry)}]") } val dropList = java.lang.String.join("\n", queue) val dropList = listToDrop.joinToString("\n ") { getKey(it) } headsUpManagerLogger.logDroppedHuns(dropList) } clearNext() Loading @@ -424,38 +428,24 @@ constructor( // Methods below are for logging only ========================================================== private inline fun log(s: () -> String) { if (debug) { Log.d(tag, s()) } } private fun getStateStr(): String { return "\navalanche state:" + "\n\tshowing: [${getKey(headsUpEntryShowing)}]" + "\n\tprevious: [$previousHunKey]" + "\n\tnext list: $nextListStr" + "\n\tnext map: $nextMapStr" + "\nBHUM.mHeadsUpEntryMap: " + baseEntryMapStr() } private val nextListStr: String get() { val queue = ArrayList<String>() for (entry in nextList) { queue.add("[${getKey(entry)}]") } return java.lang.String.join("\n", queue) return "\n[AC state]" + "\nshow: ${getKey(headsUpEntryShowing)}" + "\nprevious: $previousHunKey" + "\n$nextStr" + "\n[HeadsUpManagerImpl.mHeadsUpEntryMap] " + baseEntryMapStr() + "\n" } private val nextMapStr: String private val nextStr: String get() { val queue = ArrayList<String>() for (entry in nextMap.keys) { queue.add("[${getKey(entry)}]") val nextListStr = nextList.joinToString("\n ") { getKey(it) } if (nextList.toSet() == nextMap.keys.toSet()) { return "next (${nextList.size}):\n $nextListStr" } return java.lang.String.join("\n", queue) // This should never happen val nextMapStr = nextMap.keys.joinToString("\n ") { getKey(it) } return "next list (${nextList.size}):\n $nextListStr" + "\nnext map (${nextMap.size}):\n $nextMapStr" } fun getKey(entry: HeadsUpEntry?): String { Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerImpl.java +2 −2 Original line number Diff line number Diff line Loading @@ -856,11 +856,11 @@ public class HeadsUpManagerImpl private String getEntryMapStr() { if (mHeadsUpEntryMap.isEmpty()) { return "EMPTY"; return ""; } StringBuilder entryMapStr = new StringBuilder(); for (HeadsUpEntry entry: mHeadsUpEntryMap.values()) { entryMapStr.append("\n\t").append( entryMapStr.append("\n ").append( entry.mEntry == null ? "null" : entry.mEntry.getKey()); } return entryMapStr.toString(); Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerLogger.kt +29 −3 Original line number Diff line number Diff line Loading @@ -71,7 +71,7 @@ constructor(@NotificationHeadsUpLog private val buffer: LogBuffer) { str3 = outcome bool1 = isEnabled }, { "$str1\n\t=> AC[isEnabled:$bool1] update: $str2\n\t=> $str3" }, { "$str1\n=> AC[enabled:$bool1] update: $str2\n=> $str3" }, ) } Loading @@ -90,7 +90,33 @@ constructor(@NotificationHeadsUpLog private val buffer: LogBuffer) { str3 = outcome bool1 = isEnabled }, { "$str1\n\t=> AC[isEnabled:$bool1] delete: $str2\n\t=> $str3" }, { "$str1\n=> AC[enabled:$bool1] delete: $str2\n=> $str3" }, ) } fun logAvalancheStage(stage: String, key: String) { buffer.log( TAG, INFO, { str1 = stage str2 = key }, { "[AC] $str1 $str2" }, ) } fun logAvalancheDuration(thisKey: String, duration: Int, reason: String, nextKey: String) { buffer.log( TAG, INFO, { str1 = thisKey int1 = duration str2 = reason str3 = nextKey }, { "[AC] $str1 | $int1 ms | $str2 $str3" }, ) } Loading Loading @@ -325,7 +351,7 @@ constructor(@NotificationHeadsUpLog private val buffer: LogBuffer) { } fun logDroppedHuns(entryList: String) { buffer.log(TAG, VERBOSE, { str1 = entryList }, { "[AC] Drop HUNs: $str1" }) buffer.log(TAG, VERBOSE, { str1 = entryList }, { "[AC] dropped:\n $str1" }) } } Loading