aboutsummaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
Diffstat (limited to 'java')
-rw-r--r--java/org/gnu/emacs/EmacsService.java122
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;
63 63
64import android.os.BatteryManager; 64import android.os.BatteryManager;
65import android.os.Build; 65import android.os.Build;
66import android.os.Environment;
66import android.os.Looper; 67import android.os.Looper;
67import android.os.IBinder; 68import android.os.IBinder;
68import android.os.Handler; 69import android.os.Handler;
@@ -73,6 +74,7 @@ import android.os.VibrationEffect;
73 74
74import android.provider.DocumentsContract; 75import android.provider.DocumentsContract;
75import android.provider.DocumentsContract.Document; 76import android.provider.DocumentsContract.Document;
77import android.provider.Settings;
76 78
77import android.util.Log; 79import android.util.Log;
78import android.util.DisplayMetrics; 80import android.util.DisplayMetrics;
@@ -1909,4 +1911,124 @@ public final class EmacsService extends Service
1909 1911
1910 return false; 1912 return false;
1911 } 1913 }
1914
1915
1916
1917 /* Functions for detecting and requesting storage permissions. */
1918
1919 public boolean
1920 externalStorageAvailable ()
1921 {
1922 final String readPermission;
1923
1924 readPermission = "android.permission.READ_EXTERNAL_STORAGE";
1925
1926 return (Build.VERSION.SDK_INT < Build.VERSION_CODES.R
1927 ? (checkSelfPermission (readPermission)
1928 == PackageManager.PERMISSION_GRANTED)
1929 : Environment.isExternalStorageManager ());
1930 }
1931
1932 private void
1933 requestStorageAccess23 ()
1934 {
1935 Runnable runnable;
1936
1937 runnable = new Runnable () {
1938 @Override
1939 public void
1940 run ()
1941 {
1942 EmacsActivity activity;
1943 String permission, permission1;
1944
1945 permission = "android.permission.READ_EXTERNAL_STORAGE";
1946 permission1 = "android.permission.WRITE_EXTERNAL_STORAGE";
1947
1948 /* Find an activity that is entitled to display a permission
1949 request dialog. */
1950
1951 if (EmacsActivity.focusedActivities.isEmpty ())
1952 {
1953 /* If focusedActivities is empty then this dialog may
1954 have been displayed immediately after another popup
1955 dialog was dismissed. Try the EmacsActivity to be
1956 focused. */
1957
1958 activity = EmacsActivity.lastFocusedActivity;
1959
1960 if (activity == null)
1961 {
1962 /* Still no luck. Return failure. */
1963 return;
1964 }
1965 }
1966 else
1967 activity = EmacsActivity.focusedActivities.get (0);
1968
1969 /* Now request these permissions. */
1970 activity.requestPermissions (new String[] { permission,
1971 permission1, },
1972 0);
1973 }
1974 };
1975
1976 runOnUiThread (runnable);
1977 }
1978
1979 private void
1980 requestStorageAccess30 ()
1981 {
1982 Runnable runnable;
1983 final Intent intent;
1984
1985 intent
1986 = new Intent (Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION,
1987 Uri.parse ("package:org.gnu.emacs"));
1988
1989 runnable = new Runnable () {
1990 @Override
1991 public void
1992 run ()
1993 {
1994 EmacsActivity activity;
1995
1996 /* Find an activity that is entitled to display a permission
1997 request dialog. */
1998
1999 if (EmacsActivity.focusedActivities.isEmpty ())
2000 {
2001 /* If focusedActivities is empty then this dialog may
2002 have been displayed immediately after another popup
2003 dialog was dismissed. Try the EmacsActivity to be
2004 focused. */
2005
2006 activity = EmacsActivity.lastFocusedActivity;
2007
2008 if (activity == null)
2009 {
2010 /* Still no luck. Return failure. */
2011 return;
2012 }
2013 }
2014 else
2015 activity = EmacsActivity.focusedActivities.get (0);
2016
2017 /* Now request these permissions. */
2018
2019 activity.startActivity (intent);
2020 }
2021 };
2022
2023 runOnUiThread (runnable);
2024 }
2025
2026 public void
2027 requestStorageAccess ()
2028 {
2029 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R)
2030 requestStorageAccess23 ();
2031 else
2032 requestStorageAccess30 ();
2033 }
1912}; 2034};