Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2006374f authored by Lyn Han's avatar Lyn Han Committed by Android (Google) Code Review
Browse files

Merge changes If61393be,I786b9ffc into main

* changes:
  Dedup logs for queued HUNs
  Move useful debug logcat to logbuffer
parents 41795133 92387775
Loading
Loading
Loading
Loading
+41 −51
Original line number Diff line number Diff line
@@ -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
@@ -174,7 +175,7 @@ constructor(
                headsUpEntryShowing!!.updateEntry(
                    /* updatePostTime= */ false,
                    /* updateEarliestRemovalTime= */ false,
                    /* reason= */ "avalanche duration update",
                    /* reason= */ "shorten duration of previously-last HUN",
                )
            }
        }
@@ -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
@@ -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
        }
    }
@@ -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
        }
@@ -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()
@@ -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 {
+2 −2
Original line number Diff line number Diff line
@@ -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();
+29 −3
Original line number Diff line number Diff line
@@ -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" },
        )
    }

@@ -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" },
        )
    }

@@ -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" })
    }
}