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.
15 lines
763 B
C
15 lines
763 B
C
#include <jni.h>
|
|
|
|
void registerFragment(JNIEnv *env, jobject view);
|
|
void registerPermissionsFragment(JNIEnv *env, jobject view);
|
|
void GetId(JNIEnv* env, jobject p, int chint);
|
|
void Decrypt(JNIEnv* env, jobject p, char* cdata, int datalen, int chint);
|
|
void Encrypt(JNIEnv* env, jobject p, char* cid, int idlen, char* cdata, int datalen, int chint);
|
|
void Clip(JNIEnv* env, jobject p, char* cdata, int datalen);
|
|
void stringResult(JNIEnv* env, jclass cls, jint requestCode, jobject response);
|
|
void CallVoidMethod(JNIEnv *env, jobject obj, jmethodID methodID);
|
|
jint GetEnv(JavaVM *vm, JNIEnv **env, jint version);
|
|
jint AttachCurrentThread(JavaVM *vm, JNIEnv **p_env, void *thr_args);
|
|
jint DetachCurrentThread(JavaVM *vm);
|
|
jobject NewGlobalRef(JNIEnv *env, jobject o);
|