Keychain 6.0.4 no longer exports the legacy
org.openintents.openpgp.api.OpenPgpService action, so the OpenPgpServiceConnection
from openpgp-api.jar bound nothing and every encrypt/decrypt died with a
NullPointerException in OpenPgpApi.executeApi.
Bind our own ServiceConnection against org.openintents.openpgp.IOpenPgpService
(falling back to the legacy action for older Keychain releases), and queue
API calls until the service is actually connected instead of racing the
async bind.
Also fix the //go:generate recipe: it built one jar containing both
PgpConnect and Permissions, which collides with Permissions.jar when gogio
dexes every *.jar in the repo root.
Gio's GioView.onDestroyView signals detach with ViewEvent{View: 0};
handleEvent already filters these, but add defense in depth so any
caller forwarding the event unfiltered cannot drive the JNI path
(GetObjectClass on a null ref aborts the process, the recents-wipe
SIGABRT). Completes the intent of PR #1, whose handleEvent guard is
already in master from the migration commit.
Fixes: recents-wipe crash defense (PR #1 superseded).
MANAGE_EXTERNAL_STORAGE (needed to read the store at
/storage/emulated/0/...) cannot be requested with a runtime
permission dialog; the user must toggle it in system settings.
Port the mechanism from the pad app:
- Permissions.java: a Fragment registered at window attach that
launches Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION
(per-app settings screen) when Environment.isExternalStorageManager()
is false on API 30+ (runtime READ_EXTERNAL_STORAGE request on
older APIs). The guard means the screen appears only until the
user grants it.
- The compiled classes ship in PgpConnect.jar's directory jar
(Permissions.jar); gogio picks *.jar up from the package dir and
dexes them. go:generate now rebuilds it.
- jni_android.c/h: registerPermissionsFragment(), mirroring
registerFragment() for PgpConnect.
- Impl wiring: call it from the AndroidViewEvent handler right
after InitPgp.
Verified on the x86_64 emulator: with the appop denied the system
settings screen opens automatically on launch; after granting it,
launch is clean and list + OpenKeychain decryption from
/sdcard/Pass work end to end.
- Update to //go:build tags, gofmt, and the android-35 javac template
in //go:generate.
- GetStore: reset store.Empty when the store directory exists (it was
only set true when the dir was missing, so a reconfigured store kept
the stale 'Empty' state and showed the configure button).
- Rebuild PgpConnect.jar (android-35).