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.