The v1 action (org.openintents.openpgp.IOpenPgpService) resolves in
Keychain 6.0.4 but its binder does not implement the IOpenPgpService2
AIDL descriptor that OpenPgpApi calls through, so every call died with
SecurityException: Binder invocation to an incorrect interface. Bind
the IOpenPgpService2 service first (v1 and the very old
api.OpenPgpService actions remain as fallbacks).
Android 11+ package visibility also hid Keychain's services entirely:
resolveService/bindService found nothing from the app even with
MANAGE_EXTERNAL_STORAGE granted, so the build now injects a <queries>
element (package + intent) into the decoded manifest.
scripts/build.sh (documented in README) builds, manifest-patches
( MANAGE_EXTERNAL_STORAGE ), signs and installs the APK in one go.
Without the permission the system 'All files access' toggle is grayed
out on Android 11+.
GUI fix: the event loop only checks the 'updated' channel when it is
not blocked in w.Event(), and gioui only emits frames on invalidation
or user input, so the initial list load was never drawn until a tap.
The updater now signals non-blocking and invalidates the window itself;
the animation ticker gets the same wake-up treatment.