1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-27 07:41:28 -08:00

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.
This commit is contained in:
Po Lu 2023-11-18 14:15:55 +08:00
parent 05213345c0
commit 669e754f5b
6 changed files with 314 additions and 1 deletions

View file

@ -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 ();
}
};