From 80b495e50b130d26dd2d7b8483b0019875c9a0c3 Mon Sep 17 00:00:00 2001 From: agnostic-apollo Date: Thu, 24 Jun 2021 23:59:56 +0500 Subject: [PATCH] Move storage permission logic to PermissionUtils and add disable battery optimizations code Option to disable battery optimizations will be added in termux settings later. --- .../java/com/termux/app/TermuxActivity.java | 15 ++--- .../shared/packages/PermissionUtils.java | 67 +++++++++++++------ 2 files changed, 54 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/com/termux/app/TermuxActivity.java b/app/src/main/java/com/termux/app/TermuxActivity.java index 35aaa4fc..a3885fe5 100644 --- a/app/src/main/java/com/termux/app/TermuxActivity.java +++ b/app/src/main/java/com/termux/app/TermuxActivity.java @@ -31,6 +31,7 @@ import android.widget.Toast; import com.termux.R; import com.termux.app.terminal.TermuxActivityRootView; +import com.termux.shared.packages.PermissionUtils; import com.termux.shared.termux.TermuxConstants; import com.termux.shared.termux.TermuxConstants.TERMUX_APP.TERMUX_ACTIVITY; import com.termux.app.activities.HelpActivity; @@ -165,8 +166,6 @@ public final class TermuxActivity extends Activity implements ServiceConnection private static final int CONTEXT_MENU_SETTINGS_ID = 8; private static final int CONTEXT_MENU_REPORT_ID = 9; - private static final int REQUESTCODE_PERMISSION_STORAGE = 1234; - private static final String ARG_TERMINAL_TOOLBAR_TEXT_INPUT = "terminal_toolbar_text_input"; private static final String LOG_TAG = "TermuxActivity"; @@ -683,22 +682,22 @@ public final class TermuxActivity extends Activity implements ServiceConnection * For processes to access shared internal storage (/sdcard) we need this permission. */ public boolean ensureStoragePermissionGranted() { - if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { + if (PermissionUtils.checkPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { return true; } else { - Logger.logDebug(LOG_TAG, "Storage permission not granted, requesting permission."); - requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUESTCODE_PERMISSION_STORAGE); + Logger.logInfo(LOG_TAG, "Storage permission not granted, requesting permission."); + PermissionUtils.requestPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE, PermissionUtils.REQUEST_GRANT_STORAGE_PERMISSION); return false; } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - if (requestCode == REQUESTCODE_PERMISSION_STORAGE && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - Logger.logDebug(LOG_TAG, "Storage permission granted by user on request."); + if (requestCode == PermissionUtils.REQUEST_GRANT_STORAGE_PERMISSION && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + Logger.logInfo(LOG_TAG, "Storage permission granted by user on request."); TermuxInstaller.setupStorageSymlinks(this); } else { - Logger.logDebug(LOG_TAG, "Storage permission denied by user on request."); + Logger.logInfo(LOG_TAG, "Storage permission denied by user on request."); } } diff --git a/termux-shared/src/main/java/com/termux/shared/packages/PermissionUtils.java b/termux-shared/src/main/java/com/termux/shared/packages/PermissionUtils.java index e6a8569c..ddd36b7a 100644 --- a/termux-shared/src/main/java/com/termux/shared/packages/PermissionUtils.java +++ b/termux-shared/src/main/java/com/termux/shared/packages/PermissionUtils.java @@ -1,11 +1,13 @@ package com.termux.shared.packages; +import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; +import android.os.PowerManager; import android.provider.Settings; import androidx.core.content.ContextCompat; @@ -19,13 +21,23 @@ import java.util.Arrays; public class PermissionUtils { - public static final int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 0; + public static final int REQUEST_GRANT_STORAGE_PERMISSION = 1000; + + public static final int REQUEST_DISABLE_BATTERY_OPTIMIZATIONS = 2000; + public static final int REQUEST_GRANT_DISPLAY_OVER_OTHER_APPS_PERMISSION = 2001; private static final String LOG_TAG = "PermissionUtils"; - public static boolean checkPermissions(Context context, String[] permissions) { - int result; + public static boolean checkPermission(Context context, String permission) { + if (permission == null) return false; + return checkPermissions(context, new String[]{permission}); + } + + public static boolean checkPermissions(Context context, String[] permissions) { + if (permissions == null) return false; + + int result; for (String p:permissions) { result = ContextCompat.checkSelfPermission(context,p); if (result != PackageManager.PERMISSION_GRANTED) { @@ -35,18 +47,25 @@ public class PermissionUtils { return true; } - public static void askPermissions(Activity context, String[] permissions) { - if (context == null || permissions == null) return; + + + public static void requestPermission(Activity activity, String permission, int requestCode) { + if (permission == null) return; + requestPermissions(activity, new String[]{permission}, requestCode); + } + + public static void requestPermissions(Activity activity, String[] permissions, int requestCode) { + if (activity == null || permissions == null) return; int result; - Logger.showToast(context, context.getString(R.string.message_sudo_please_grant_permissions), true); + Logger.showToast(activity, activity.getString(R.string.message_sudo_please_grant_permissions), true); try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();} for (String permission:permissions) { - result = ContextCompat.checkSelfPermission(context, permission); + result = ContextCompat.checkSelfPermission(activity, permission); if (result != PackageManager.PERMISSION_GRANTED) { Logger.logDebug(LOG_TAG, "Requesting Permissions: " + Arrays.toString(permissions)); - context.requestPermissions(new String[]{permission}, 0); + activity.requestPermissions(new String[]{permission}, requestCode); } } } @@ -54,27 +73,20 @@ public class PermissionUtils { public static boolean checkDisplayOverOtherAppsPermission(Context context) { - boolean permissionGranted; - - permissionGranted = Settings.canDrawOverlays(context); - if (!permissionGranted) { - Logger.logWarn(LOG_TAG, TermuxConstants.TERMUX_APP_NAME + " App does not have Display over other apps (SYSTEM_ALERT_WINDOW) permission"); - return false; - } else { - Logger.logDebug(LOG_TAG, TermuxConstants.TERMUX_APP_NAME + " App already has Display over other apps (SYSTEM_ALERT_WINDOW) permission"); - return true; - } + return Settings.canDrawOverlays(context); } - public static void askDisplayOverOtherAppsPermission(Activity context) { + public static void requestDisplayOverOtherAppsPermission(Activity context, int requestCode) { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + context.getPackageName())); - context.startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE); + context.startActivityForResult(intent, requestCode); } public static boolean validateDisplayOverOtherAppsPermissionForPostAndroid10(Context context) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) return true; if (!PermissionUtils.checkDisplayOverOtherAppsPermission(context)) { + Logger.logWarn(LOG_TAG, TermuxConstants.TERMUX_APP_NAME + " App does not have Display over other apps (SYSTEM_ALERT_WINDOW) permission"); + TermuxAppSharedPreferences preferences = TermuxAppSharedPreferences.build(context); if (preferences == null) return false; @@ -82,8 +94,23 @@ public class PermissionUtils { Logger.showToast(context, context.getString(R.string.error_display_over_other_apps_permission_not_granted), true); return false; } else { + Logger.logDebug(LOG_TAG, TermuxConstants.TERMUX_APP_NAME + " App already has Display over other apps (SYSTEM_ALERT_WINDOW) permission"); return true; } } + + + public static boolean checkIfBatteryOptimizationsDisabled(Context context) { + PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); + return powerManager.isIgnoringBatteryOptimizations(context.getPackageName()); + } + + @SuppressLint("BatteryLife") + public static void requestDisableBatteryOptimizations(Activity activity, int requestCode) { + Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); + intent.setData(Uri.parse("package:" + activity.getPackageName())); + activity.startActivityForResult(intent, requestCode); + } + }