mirror of
https://github.com/fankes/termux-app.git
synced 2025-09-07 03:05:18 +08:00
Warn users if Draw over other apps permission is missing
For android version >= 10(Q), a flash will be shown to users requesting them to grant the permission if they attempt to start a foreground terminal session command from background, like with the RUN_COMMAND intent. The flash will only be shown if "Plugin Error Notifications" toggle is enabled in settings.
This commit is contained in:
@@ -28,6 +28,7 @@ import com.termux.app.terminal.TermuxSessionClient;
|
||||
import com.termux.app.terminal.TermuxSessionClientBase;
|
||||
import com.termux.app.utils.Logger;
|
||||
import com.termux.app.utils.NotificationUtils;
|
||||
import com.termux.app.utils.PermissionUtils;
|
||||
import com.termux.app.utils.ShellUtils;
|
||||
import com.termux.app.utils.TextDataUtils;
|
||||
import com.termux.models.ExecutionCommand;
|
||||
@@ -513,7 +514,12 @@ public final class TermuxService extends Service {
|
||||
|
||||
/** Launch the {@link }TermuxActivity} to bring it to foreground. */
|
||||
private void startTermuxActivity() {
|
||||
TermuxActivity.startTermuxActivity(this);
|
||||
// For android >= 10, apps require Display over other apps permission to start foreground activities
|
||||
// from background (services). If it is not granted, then termux sessions that are started will
|
||||
// show in Termux notification but will not run until user manually clicks the notification.
|
||||
if(PermissionUtils.validateDisplayOverOtherAppsPermissionForPostAndroid10(this)) {
|
||||
TermuxActivity.startTermuxActivity(this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
86
app/src/main/java/com/termux/app/utils/PermissionUtils.java
Normal file
86
app/src/main/java/com/termux/app/utils/PermissionUtils.java
Normal file
@@ -0,0 +1,86 @@
|
||||
package com.termux.app.utils;
|
||||
|
||||
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.provider.Settings;
|
||||
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
import com.termux.R;
|
||||
import com.termux.app.TermuxConstants;
|
||||
import com.termux.app.settings.preferences.TermuxAppSharedPreferences;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public class PermissionUtils {
|
||||
|
||||
public static final int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 0;
|
||||
|
||||
private static final String LOG_TAG = "PluginUtils";
|
||||
|
||||
public static boolean checkPermissions(Context context, String[] permissions) {
|
||||
int result;
|
||||
|
||||
for (String p:permissions) {
|
||||
result = ContextCompat.checkSelfPermission(context,p);
|
||||
if (result != PackageManager.PERMISSION_GRANTED) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static void askPermissions(Activity context, String[] permissions) {
|
||||
if(context == null || permissions == null) return;
|
||||
|
||||
int result;
|
||||
Logger.showToast(context, context.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);
|
||||
if (result != PackageManager.PERMISSION_GRANTED) {
|
||||
Logger.logDebug(LOG_TAG, "Requesting Permissions: " + Arrays.toString(permissions));
|
||||
context.requestPermissions(new String[]{permission}, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
public static void askDisplayOverOtherAppsPermission(Activity context) {
|
||||
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + context.getPackageName()));
|
||||
context.startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
|
||||
}
|
||||
|
||||
public static boolean validateDisplayOverOtherAppsPermissionForPostAndroid10(Context context) {
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) return true;
|
||||
|
||||
if(!PermissionUtils.checkDisplayOverOtherAppsPermission(context)) {
|
||||
TermuxAppSharedPreferences preferences = new TermuxAppSharedPreferences(context);
|
||||
if(preferences.getPluginErrorNotificationsEnabled())
|
||||
Logger.showToast(context, context.getString(R.string.error_display_over_other_apps_permission_not_granted), true);
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@@ -128,6 +128,12 @@
|
||||
|
||||
|
||||
|
||||
<!-- Termux PermissionUtils -->
|
||||
<string name="message_sudo_please_grant_permissions">Please grant permissions on next screen</string>
|
||||
<string name="error_display_over_other_apps_permission_not_granted">&TERMUX_APP_NAME; requires \"Display over other apps\" permission to start terminal sessions from background on Android >= 10. Grants it from Settings -> Apps -> &TERMUX_APP_NAME; -> Advanced</string>
|
||||
|
||||
|
||||
|
||||
<!-- Termux File Receiver -->
|
||||
<string name="title_file_received">Save file in ~/downloads/</string>
|
||||
<string name="action_file_received_edit">Edit</string>
|
||||
|
Reference in New Issue
Block a user