#!/usr/bin/env node /** * Inject the custom MainActivity.java into the generated Android project. * * WHY THIS EXISTS * ─────────────── * Capacitor's default MainActivity uses a WebView that silently DROPS * `intent:` / `nostrsigner:` URL navigations, so Amber's approval screen never * opens and every signing action (delete, accept crew invite, zap, profile * edit) hangs forever. Our MainActivity overrides shouldOverrideUrlLoading to * launch those intents natively via startActivity() — the real fix that opens * Amber, matching how login already works. * * The android/ folder is generated per-machine (not committed), so we keep the * source of truth in android-templates/MainActivity.java and copy it in on * every build. Idempotent. Exits quietly if android/ hasn't been generated yet. */ import { readFileSync, writeFileSync, existsSync, copyFileSync } from 'node:fs'; import { fileURLToPath } from 'node:url'; import { dirname, join } from 'node:path'; const root = join(dirname(fileURLToPath(import.meta.url)), '..'); // Package path org.skatespots.app → org/skatespots/app const target = join( root, 'android', 'app', 'src', 'main', 'java', 'org', 'skatespots', 'app', 'MainActivity.java', ); const template = join(root, 'android-templates', 'MainActivity.java'); if (!existsSync(target)) { console.log('[inject-main-activity] android/ not generated yet — skipping.'); process.exit(0); } if (!existsSync(template)) { console.error('[inject-main-activity] template android-templates/MainActivity.java missing — aborting.'); process.exit(1); } const current = readFileSync(target, 'utf8'); const desired = readFileSync(template, 'utf8'); if (current === desired) { console.log('[inject-main-activity] MainActivity.java already up to date.'); process.exit(0); } copyFileSync(template, target); console.log('[inject-main-activity] ✓ Installed custom MainActivity.java (intent hand-off for Amber).');