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:
parent
05213345c0
commit
669e754f5b
6 changed files with 314 additions and 1 deletions
|
|
@ -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 ();
|
||||
}
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue