diff options
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; | |||
| 63 | 63 | ||
| 64 | import android.os.BatteryManager; | 64 | import android.os.BatteryManager; |
| 65 | import android.os.Build; | 65 | import android.os.Build; |
| 66 | import android.os.Environment; | ||
| 66 | import android.os.Looper; | 67 | import android.os.Looper; |
| 67 | import android.os.IBinder; | 68 | import android.os.IBinder; |
| 68 | import android.os.Handler; | 69 | import android.os.Handler; |
| @@ -73,6 +74,7 @@ import android.os.VibrationEffect; | |||
| 73 | 74 | ||
| 74 | import android.provider.DocumentsContract; | 75 | import android.provider.DocumentsContract; |
| 75 | import android.provider.DocumentsContract.Document; | 76 | import android.provider.DocumentsContract.Document; |
| 77 | import android.provider.Settings; | ||
| 76 | 78 | ||
| 77 | import android.util.Log; | 79 | import android.util.Log; |
| 78 | import android.util.DisplayMetrics; | 80 | import 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 | }; |