Skip to content

Commit 80b495e

Browse files
Move storage permission logic to PermissionUtils and add disable battery optimizations code
Option to disable battery optimizations will be added in termux settings later.
1 parent 69e5dee commit 80b495e

File tree

2 files changed

+53
-27
lines changed

2 files changed

+53
-27
lines changed

app/src/main/java/com/termux/app/TermuxActivity.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131

3232
import com.termux.R;
3333
import com.termux.app.terminal.TermuxActivityRootView;
34+
import com.termux.shared.packages.PermissionUtils;
3435
import com.termux.shared.termux.TermuxConstants;
3536
import com.termux.shared.termux.TermuxConstants.TERMUX_APP.TERMUX_ACTIVITY;
3637
import com.termux.app.activities.HelpActivity;
@@ -165,8 +166,6 @@ public final class TermuxActivity extends Activity implements ServiceConnection
165166
private static final int CONTEXT_MENU_SETTINGS_ID = 8;
166167
private static final int CONTEXT_MENU_REPORT_ID = 9;
167168

168-
private static final int REQUESTCODE_PERMISSION_STORAGE = 1234;
169-
170169
private static final String ARG_TERMINAL_TOOLBAR_TEXT_INPUT = "terminal_toolbar_text_input";
171170

172171
private static final String LOG_TAG = "TermuxActivity";
@@ -683,22 +682,22 @@ private void requestAutoFill() {
683682
* For processes to access shared internal storage (/sdcard) we need this permission.
684683
*/
685684
public boolean ensureStoragePermissionGranted() {
686-
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
685+
if (PermissionUtils.checkPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
687686
return true;
688687
} else {
689-
Logger.logDebug(LOG_TAG, "Storage permission not granted, requesting permission.");
690-
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUESTCODE_PERMISSION_STORAGE);
688+
Logger.logInfo(LOG_TAG, "Storage permission not granted, requesting permission.");
689+
PermissionUtils.requestPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE, PermissionUtils.REQUEST_GRANT_STORAGE_PERMISSION);
691690
return false;
692691
}
693692
}
694693

695694
@Override
696695
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
697-
if (requestCode == REQUESTCODE_PERMISSION_STORAGE && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
698-
Logger.logDebug(LOG_TAG, "Storage permission granted by user on request.");
696+
if (requestCode == PermissionUtils.REQUEST_GRANT_STORAGE_PERMISSION && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
697+
Logger.logInfo(LOG_TAG, "Storage permission granted by user on request.");
699698
TermuxInstaller.setupStorageSymlinks(this);
700699
} else {
701-
Logger.logDebug(LOG_TAG, "Storage permission denied by user on request.");
700+
Logger.logInfo(LOG_TAG, "Storage permission denied by user on request.");
702701
}
703702
}
704703

Lines changed: 46 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package com.termux.shared.packages;
22

3+
import android.annotation.SuppressLint;
34
import android.app.Activity;
45
import android.content.Context;
56
import android.content.Intent;
67
import android.content.pm.PackageManager;
78
import android.net.Uri;
89
import android.os.Build;
10+
import android.os.PowerManager;
911
import android.provider.Settings;
1012

1113
import androidx.core.content.ContextCompat;
@@ -19,13 +21,23 @@
1921

2022
public 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

Comments
 (0)