Skip to content

Commit

Permalink
Move storage permission logic to PermissionUtils and add disable batt…
Browse files Browse the repository at this point in the history
…ery optimizations code

Option to disable battery optimizations will be added in termux settings later.
  • Loading branch information
agnostic-apollo committed Jun 24, 2021
1 parent 69e5dee commit 80b495e
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 27 deletions.
15 changes: 7 additions & 8 deletions app/src/main/java/com/termux/app/TermuxActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@

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;
Expand Down Expand Up @@ -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";
Expand Down Expand Up @@ -683,22 +682,22 @@ private void requestAutoFill() {
* 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.");
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -19,13 +21,23 @@

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 checkPermission(Context context, String permission) {
if (permission == null) return false;
return checkPermissions(context, new String[]{permission});
}

public static boolean checkPermissions(Context context, String[] permissions) {
int result;
if (permissions == null) return false;

int result;
for (String p:permissions) {
result = ContextCompat.checkSelfPermission(context,p);
if (result != PackageManager.PERMISSION_GRANTED) {
Expand All @@ -35,55 +47,70 @@ public static boolean checkPermissions(Context context, String[] permissions) {
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);
}
}
}



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;

if (preferences.arePluginErrorNotificationsEnabled())
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);
}

}

0 comments on commit 80b495e

Please sign in to comment.