android: the handoff — the pending rounds, the pipeline, and what is unverified
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.
This commit is contained in:
1 parent
867fd42972
commit
9f0601027c
400 files changed
+26401
-3
No files matched your search
@@ -0,0 +1,38 @@
|
||||
/* 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: "" };
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user