11package com .termux .shared .packages ;
22
3+ import android .annotation .SuppressLint ;
34import android .app .Activity ;
45import android .content .Context ;
56import android .content .Intent ;
67import android .content .pm .PackageManager ;
78import android .net .Uri ;
89import android .os .Build ;
10+ import android .os .PowerManager ;
911import android .provider .Settings ;
1012
1113import androidx .core .content .ContextCompat ;
1921
2022public class PermissionUtils {
2123
22- public static final int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 0 ;
24+ public static final int REQUEST_GRANT_STORAGE_PERMISSION = 1000 ;
25+
26+ public static final int REQUEST_DISABLE_BATTERY_OPTIMIZATIONS = 2000 ;
27+ public static final int REQUEST_GRANT_DISPLAY_OVER_OTHER_APPS_PERMISSION = 2001 ;
2328
2429 private static final String LOG_TAG = "PermissionUtils" ;
2530
31+
32+ public static boolean checkPermission (Context context , String permission ) {
33+ if (permission == null ) return false ;
34+ return checkPermissions (context , new String []{permission });
35+ }
36+
2637 public static boolean checkPermissions (Context context , String [] permissions ) {
27- int result ;
38+ if ( permissions == null ) return false ;
2839
40+ int result ;
2941 for (String p :permissions ) {
3042 result = ContextCompat .checkSelfPermission (context ,p );
3143 if (result != PackageManager .PERMISSION_GRANTED ) {
@@ -35,55 +47,70 @@ public static boolean checkPermissions(Context context, String[] permissions) {
3547 return true ;
3648 }
3749
38- public static void askPermissions (Activity context , String [] permissions ) {
39- if (context == null || permissions == null ) return ;
50+
51+
52+ public static void requestPermission (Activity activity , String permission , int requestCode ) {
53+ if (permission == null ) return ;
54+ requestPermissions (activity , new String []{permission }, requestCode );
55+ }
56+
57+ public static void requestPermissions (Activity activity , String [] permissions , int requestCode ) {
58+ if (activity == null || permissions == null ) return ;
4059
4160 int result ;
42- Logger .showToast (context , context .getString (R .string .message_sudo_please_grant_permissions ), true );
61+ Logger .showToast (activity , activity .getString (R .string .message_sudo_please_grant_permissions ), true );
4362 try {Thread .sleep (1000 );} catch (InterruptedException e ) {e .printStackTrace ();}
4463
4564 for (String permission :permissions ) {
46- result = ContextCompat .checkSelfPermission (context , permission );
65+ result = ContextCompat .checkSelfPermission (activity , permission );
4766 if (result != PackageManager .PERMISSION_GRANTED ) {
4867 Logger .logDebug (LOG_TAG , "Requesting Permissions: " + Arrays .toString (permissions ));
49- context .requestPermissions (new String []{permission }, 0 );
68+ activity .requestPermissions (new String []{permission }, requestCode );
5069 }
5170 }
5271 }
5372
5473
5574
5675 public static boolean checkDisplayOverOtherAppsPermission (Context context ) {
57- boolean permissionGranted ;
58-
59- permissionGranted = Settings .canDrawOverlays (context );
60- if (!permissionGranted ) {
61- Logger .logWarn (LOG_TAG , TermuxConstants .TERMUX_APP_NAME + " App does not have Display over other apps (SYSTEM_ALERT_WINDOW) permission" );
62- return false ;
63- } else {
64- Logger .logDebug (LOG_TAG , TermuxConstants .TERMUX_APP_NAME + " App already has Display over other apps (SYSTEM_ALERT_WINDOW) permission" );
65- return true ;
66- }
76+ return Settings .canDrawOverlays (context );
6777 }
6878
69- public static void askDisplayOverOtherAppsPermission (Activity context ) {
79+ public static void requestDisplayOverOtherAppsPermission (Activity context , int requestCode ) {
7080 Intent intent = new Intent (Settings .ACTION_MANAGE_OVERLAY_PERMISSION , Uri .parse ("package:" + context .getPackageName ()));
71- context .startActivityForResult (intent , ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE );
81+ context .startActivityForResult (intent , requestCode );
7282 }
7383
7484 public static boolean validateDisplayOverOtherAppsPermissionForPostAndroid10 (Context context ) {
7585 if (Build .VERSION .SDK_INT < Build .VERSION_CODES .Q ) return true ;
7686
7787 if (!PermissionUtils .checkDisplayOverOtherAppsPermission (context )) {
88+ Logger .logWarn (LOG_TAG , TermuxConstants .TERMUX_APP_NAME + " App does not have Display over other apps (SYSTEM_ALERT_WINDOW) permission" );
89+
7890 TermuxAppSharedPreferences preferences = TermuxAppSharedPreferences .build (context );
7991 if (preferences == null ) return false ;
8092
8193 if (preferences .arePluginErrorNotificationsEnabled ())
8294 Logger .showToast (context , context .getString (R .string .error_display_over_other_apps_permission_not_granted ), true );
8395 return false ;
8496 } else {
97+ Logger .logDebug (LOG_TAG , TermuxConstants .TERMUX_APP_NAME + " App already has Display over other apps (SYSTEM_ALERT_WINDOW) permission" );
8598 return true ;
8699 }
87100 }
88101
102+
103+
104+ public static boolean checkIfBatteryOptimizationsDisabled (Context context ) {
105+ PowerManager powerManager = (PowerManager ) context .getSystemService (Context .POWER_SERVICE );
106+ return powerManager .isIgnoringBatteryOptimizations (context .getPackageName ());
107+ }
108+
109+ @ SuppressLint ("BatteryLife" )
110+ public static void requestDisableBatteryOptimizations (Activity activity , int requestCode ) {
111+ Intent intent = new Intent (Settings .ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS );
112+ intent .setData (Uri .parse ("package:" + activity .getPackageName ()));
113+ activity .startActivityForResult (intent , requestCode );
114+ }
115+
89116}
0 commit comments