Everything written this session that has not been through the device: rounds 43 to 48 (each patch adversarially verified, 43's transient-notice expectation fixed), a partial round 49, the pipeline scripts, the Android Auto design and the icon comparison mock. Also the two harness changes that were never A/B'd — adaptive waits, which may only shorten a declared wait and never lengthen it, and a ship that runs the mock walk and the deploy at the same time. The A/B and its 255-step baseline are in handoff/tools; main stays at what the phone has actually walked.
39 lines
2.0 KiB
Plaintext
39 lines
2.0 KiB
Plaintext
/* What OUR package has in the shade right now: the channels its live
|
|
* notifications sit on, and the downloads one's own title and text.
|
|
* `--noredact` is what makes the extras print their values rather than a
|
|
* placeholder. Nobody else's notifications are read — `seen` counts the
|
|
* dump's records only so that "no downloads channel" cannot pass by the
|
|
* dump having come back empty. */
|
|
function shadeNotice() {
|
|
try {
|
|
const dump = adb("shell", "dumpsys", "notification", "--noredact").toString();
|
|
const blocks = dump.split("NotificationRecord(").slice(1);
|
|
const chans = [];
|
|
let title = "", text = "";
|
|
for (const block of blocks) {
|
|
const head = block.slice(0, 6000);
|
|
if (!/pkg=com\.soulstream\.app\b/.test(head)) continue;
|
|
/* Notification.toString() carries `channel=<id>` on the record's
|
|
own first line; older dumps spell it as the channel object */
|
|
let ch = (head.match(/channel=([\w.\-]+)/) || [])[1] || "";
|
|
if (!ch || ch === "NotificationChannel") ch = (head.match(/mId='([^']*)'/) || [])[1] || ch;
|
|
if (ch) chans.push(ch);
|
|
if (ch !== "downloads") continue;
|
|
/* the extras print as `<key>=<class> (<value>)`, and the class is
|
|
whatever CharSequence the builder kept — String on this one,
|
|
but a Spannable on a device that styles it, so the class is
|
|
matched loosely and stray quotes are trimmed */
|
|
const extra = (key) => {
|
|
const m = head.match(new RegExp(key.replace(/\./g, "\\.") + "=[A-Za-z]+ \\(([^\\n]*?)\\)\\s*\\n"));
|
|
return m ? m[1].replace(/^"|"$/g, "") : "";
|
|
};
|
|
title = extra("android.title");
|
|
text = extra("android.text");
|
|
}
|
|
return { shadeSeen: blocks.length, shadeChans: chans.join("|"), shadeTitle: title, shadeText: text };
|
|
} catch (e) {
|
|
return { shadeSeen: 0, shadeChans: "ERR " + e.message, shadeTitle: "", shadeText: "" };
|
|
}
|
|
}
|
|
|