repositories / pi-ext
pi-ext
bugabingas pi extensions
owned by admin
extensions/os-notifier/termux-focus.ts
Rawimport { execFile } from "node:child_process";
import { chmod, stat } from "node:fs/promises";
import { delimiter } from "node:path";
import { fileURLToPath } from "node:url";
const jar = fileURLToPath(new URL("./android/focus.jar", import.meta.url));
let prepared: Promise<void> | undefined;
/** 0 = unfocused, 3 = focused; anything else is unknown and must stay quiet. */
export async function termuxFocused(
timeoutMs = 5000,
): Promise<boolean | undefined> {
try {
prepared ??= stat(jar).then(async ({ mode }) => {
// Git restores mode 0644; Android rejects writable DEX/JAR files.
if (mode & 0o222) await chmod(jar, mode & ~0o222);
});
await prepared;
return await new Promise((resolve) => {
execFile(
"app_process",
["/", "F"],
{
env: {
...process.env,
PATH: `${process.env["PATH"] ?? ""}${delimiter}/system/bin`,
CLASSPATH: jar,
LD_PRELOAD: undefined,
LD_LIBRARY_PATH: undefined,
},
timeout: timeoutMs,
killSignal: "SIGKILL",
maxBuffer: 16 * 1024,
},
(error) => {
if (!error) resolve(false);
else
resolve(
error.code === 3 && !error.killed && !error.signal
? true
: undefined,
);
},
);
});
} catch {
return undefined;
}
}