mirror of
https://github.com/fankes/termux-app.git
synced 2025-09-06 02:35:19 +08:00
Move storage permission logic to PermissionUtils and add disable battery optimizations code
Option to disable battery optimizations will be added in termux settings later.
This commit is contained in:
@@ -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.");
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user