diff options
author | Po Lu <luangruo@yahoo.com> | 2023-11-18 14:15:55 +0800 |
---|---|---|
committer | Po Lu <luangruo@yahoo.com> | 2023-11-18 14:15:55 +0800 |
commit | 669e754f5bdc9f9130a68eec6966babe9a85ecae (patch) | |
tree | 718d7fe3517a79ae69ed3380cd86e0f8c4716621 /java | |
parent | 05213345c04d4572afec46b99a58d206a111c846 (diff) | |
download | emacs-669e754f5bdc9f9130a68eec6966babe9a85ecae.tar.gz |
Offer to grant storage permissions if absent
* java/org/gnu/emacs/EmacsService.java (externalStorageAvailable)
(requestStorageAccess23, requestStorageAccess30)
(requestStorageAccess): New functions.
* lisp/startup.el (fancy-startup-tail, normal-splash-screen):
Call android-win functions for inserting the new storage
permission notice.
* lisp/term/android-win.el
(android-display-storage-permission-popup)
(android-after-splash-screen): New functions.
* src/android.c (android_init_emacs_service): Link to new Java
functions.
(android_external_storage_available_p)
(android_request_storage_access): New functions.
* src/android.h: Update prototypes.
* src/androidfns.c (Fandroid_external_storage_available_p)
(Fandroid_request_storage_access): New functions.
(syms_of_androidfns): Register new subrs.
Diffstat (limited to 'java')
-rw-r--r-- | java/org/gnu/emacs/EmacsService.java | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/java/org/gnu/emacs/EmacsService.java b/java/org/gnu/emacs/EmacsService.java index 5bd1dcc5a88..3cc37dd992d 100644 --- a/java/org/gnu/emacs/EmacsService.java +++ b/java/org/gnu/emacs/EmacsService.java @@ -63,6 +63,7 @@ import android.net.Uri; import android.os.BatteryManager; import android.os.Build; +import android.os.Environment; import android.os.Looper; import android.os.IBinder; import android.os.Handler; @@ -73,6 +74,7 @@ import android.os.VibrationEffect; import android.provider.DocumentsContract; import android.provider.DocumentsContract.Document; +import android.provider.Settings; import android.util.Log; import android.util.DisplayMetrics; @@ -1909,4 +1911,124 @@ public final class EmacsService extends Service return false; } + + + + /* Functions for detecting and requesting storage permissions. */ + + public boolean + externalStorageAvailable () + { + final String readPermission; + + readPermission = "android.permission.READ_EXTERNAL_STORAGE"; + + return (Build.VERSION.SDK_INT < Build.VERSION_CODES.R + ? (checkSelfPermission (readPermission) + == PackageManager.PERMISSION_GRANTED) + : Environment.isExternalStorageManager ()); + } + + private void + requestStorageAccess23 () + { + Runnable runnable; + + runnable = new Runnable () { + @Override + public void + run () + { + EmacsActivity activity; + String permission, permission1; + + permission = "android.permission.READ_EXTERNAL_STORAGE"; + permission1 = "android.permission.WRITE_EXTERNAL_STORAGE"; + + /* Find an activity that is entitled to display a permission + request dialog. */ + + if (EmacsActivity.focusedActivities.isEmpty ()) + { + /* If focusedActivities is empty then this dialog may + have been displayed immediately after another popup + dialog was dismissed. Try the EmacsActivity to be + focused. */ + + activity = EmacsActivity.lastFocusedActivity; + + if (activity == null) + { + /* Still no luck. Return failure. */ + return; + } + } + else + activity = EmacsActivity.focusedActivities.get (0); + + /* Now request these permissions. */ + activity.requestPermissions (new String[] { permission, + permission1, }, + 0); + } + }; + + runOnUiThread (runnable); + } + + private void + requestStorageAccess30 () + { + Runnable runnable; + final Intent intent; + + intent + = new Intent (Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, + Uri.parse ("package:org.gnu.emacs")); + + runnable = new Runnable () { + @Override + public void + run () + { + EmacsActivity activity; + + /* Find an activity that is entitled to display a permission + request dialog. */ + + if (EmacsActivity.focusedActivities.isEmpty ()) + { + /* If focusedActivities is empty then this dialog may + have been displayed immediately after another popup + dialog was dismissed. Try the EmacsActivity to be + focused. */ + + activity = EmacsActivity.lastFocusedActivity; + + if (activity == null) + { + /* Still no luck. Return failure. */ + return; + } + } + else + activity = EmacsActivity.focusedActivities.get (0); + + /* Now request these permissions. */ + + activity.startActivity (intent); + } + }; + + runOnUiThread (runnable); + } + + public void + requestStorageAccess () + { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) + requestStorageAccess23 (); + else + requestStorageAccess30 (); + } }; |