diff --git a/app/src/apkFlavor/AndroidManifest.xml b/app/src/apkFlavor/AndroidManifest.xml
index 0188eca..6f843ef 100644
--- a/app/src/apkFlavor/AndroidManifest.xml
+++ b/app/src/apkFlavor/AndroidManifest.xml
@@ -261,6 +261,13 @@
android:exported="true"
/>
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/fdroidFlavor/AndroidManifest.xml b/app/src/fdroidFlavor/AndroidManifest.xml
index 1a7d25e..af39e62 100644
--- a/app/src/fdroidFlavor/AndroidManifest.xml
+++ b/app/src/fdroidFlavor/AndroidManifest.xml
@@ -246,6 +246,13 @@
android:exported="true"
/>
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/googlePlayFlavor/AndroidManifest.xml b/app/src/googlePlayFlavor/AndroidManifest.xml
index b4426bc..1c67849 100644
--- a/app/src/googlePlayFlavor/AndroidManifest.xml
+++ b/app/src/googlePlayFlavor/AndroidManifest.xml
@@ -245,6 +245,13 @@
android:exported="true"
/>
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/jens/automation2/Action.java b/app/src/main/java/com/jens/automation2/Action.java
index d2694ae..2c3c359 100644
--- a/app/src/main/java/com/jens/automation2/Action.java
+++ b/app/src/main/java/com/jens/automation2/Action.java
@@ -56,6 +56,7 @@ public class Action
startPhoneCall,
stopPhoneCall,
copyToClipboard,
+ takeScreenshot,
sendTextMessage;
public String getFullName(Context context)
@@ -140,6 +141,9 @@ public class Action
return context.getResources().getString(R.string.endPhoneCall);
case copyToClipboard:
return context.getResources().getString(R.string.copyTextToClipboard);
+ case takeScreenshot:
+ return context.getResources().getString(R.string.takeScreenshot);
+
default:
return "Unknown";
}
@@ -307,6 +311,10 @@ public class Action
break;
case copyToClipboard:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.copyTextToClipboard));
+ break;
+ case takeScreenshot:
+ returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.takeScreenshot));
+ break;
default:
returnString.append(action.toString());
}
diff --git a/app/src/main/java/com/jens/automation2/Actions.java b/app/src/main/java/com/jens/automation2/Actions.java
index 1603725..3021ce0 100644
--- a/app/src/main/java/com/jens/automation2/Actions.java
+++ b/app/src/main/java/com/jens/automation2/Actions.java
@@ -1,6 +1,7 @@
package com.jens.automation2;
import android.Manifest;
+import android.accessibilityservice.AccessibilityService;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.NotificationManager;
@@ -2339,4 +2340,12 @@ public class Actions
clipboard.setPrimaryClip(clip);
}
}
+
+ public static void takeScreenshot()
+ {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
+ {
+ MyAccessibilityService.getInstance().performGlobalAction(AccessibilityService.GLOBAL_ACTION_TAKE_SCREENSHOT);
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/jens/automation2/ActivityManageRule.java b/app/src/main/java/com/jens/automation2/ActivityManageRule.java
index 32fda94..b012e1a 100644
--- a/app/src/main/java/com/jens/automation2/ActivityManageRule.java
+++ b/app/src/main/java/com/jens/automation2/ActivityManageRule.java
@@ -2126,6 +2126,8 @@ public class ActivityManageRule extends Activity
}
else if(types[i].toString().equals(Action_Enum.copyToClipboard.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.clipboard));
+ else if(types[i].toString().equals(Action_Enum.takeScreenshot.toString()))
+ items.add(new Item(typesLong[i].toString(), R.drawable.clipboard));
else
items.add(new Item(typesLong[i].toString(), R.drawable.placeholder));
}
@@ -2352,6 +2354,12 @@ public class ActivityManageRule extends Activity
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionCopyToClipboard.class);
startActivityForResult(intent, requestCodeActionCopyTextToClipboardAdd);
}
+ else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.takeScreenshot.toString()))
+ {
+ newAction.setAction(Action_Enum.takeScreenshot);
+ ruleToEdit.getActionSet().add(newAction);
+ refreshActionList();
+ }
}
});
diff --git a/app/src/main/java/com/jens/automation2/ActivityPermissions.java b/app/src/main/java/com/jens/automation2/ActivityPermissions.java
index f18c223..43a9c2d 100644
--- a/app/src/main/java/com/jens/automation2/ActivityPermissions.java
+++ b/app/src/main/java/com/jens/automation2/ActivityPermissions.java
@@ -18,6 +18,7 @@ import android.os.Bundle;
import android.os.PowerManager;
import android.provider.Settings;
import android.text.Html;
+import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
@@ -51,6 +52,7 @@ public class ActivityPermissions extends Activity
private static final int requestCodeForPermissionsBatteryOptimization = 12048;
private static final int requestCodeForPermissionNotificationAccessAndroid13 = 12049;
private static final int requestCodeForPermissionsManageOverlay = 12050;
+ private static final int requestCodeForPermissionsAccessibility = 12051;
protected String[] specificPermissionsToRequest = null;
public static String intentExtraName = "permissionsToBeRequested";
@@ -305,6 +307,10 @@ public class ActivityPermissions extends Activity
{
return android.provider.Settings.canDrawOverlays(Miscellaneous.getAnyContext());
}
+ else if(s.equals(Manifest.permission.BIND_ACCESSIBILITY_SERVICE))
+ {
+ return haveAccessibilityAccess(Miscellaneous.getAnyContext());
+ }
else
{
int res = context.checkCallingOrSelfPermission(s);
@@ -323,11 +329,57 @@ public class ActivityPermissions extends Activity
return active;
}
+ public static boolean haveAccessibilityAccess(Context mContext)
+ {
+ int accessibilityEnabled = 0;
+
+ final String service = mContext.getPackageName() + "/com.mytest.accessibility.MyAccessibilityService";
+
+ boolean accessibilityFound = false;
+ try
+ {
+ accessibilityEnabled = Settings.Secure.getInt(mContext.getApplicationContext().getContentResolver(), Settings.Secure.ACCESSIBILITY_ENABLED);
+ Log.v(TAG, "accessibilityEnabled = " + accessibilityEnabled);
+ }
+ catch (Settings.SettingNotFoundException e)
+ {
+ Log.e(TAG, "Error finding setting, default accessibility to not found: " + e.getMessage());
+ }
+ TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(':');
+
+ if (accessibilityEnabled == 1) {
+ String settingValue = Settings.Secure.getString(mContext
+ .getApplicationContext().getContentResolver(),
+ Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
+ if (settingValue != null) {
+ TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
+ splitter.setString(settingValue);
+ while (splitter.hasNext()) {
+ String accessabilityService = splitter.next();
+
+ if (accessabilityService.equalsIgnoreCase(service)) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return accessibilityFound;
+ }
+
public static void requestOverlay()
{
Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
ActivityPermissions.getInstance().startActivityForResult(intent, requestCodeForPermissionsManageOverlay);
}
+
+ public static void requestBindAccessibilityService()
+ {
+ Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ ActivityPermissions.getInstance().startActivityForResult(intent, requestCodeForPermissionsAccessibility);
+ }
+
public static void requestDeviceAdmin()
{
if(!haveDeviceAdmin())
@@ -722,6 +774,8 @@ public class ActivityPermissions extends Activity
case stopPhoneCall:
addToArrayListUnique(Manifest.permission.ANSWER_PHONE_CALLS, requiredPermissions);
break;
+ case takeScreenshot:
+ addToArrayListUnique(Manifest.permission.BIND_ACCESSIBILITY_SERVICE, requiredPermissions);
default:
break;
}
@@ -971,6 +1025,8 @@ public class ActivityPermissions extends Activity
case Manifest.permission.QUERY_ALL_PACKAGES:
usingElements.add(getResources().getString(R.string.queryAllPackages));
break;
+ case Manifest.permission.BIND_ACCESSIBILITY_SERVICE:
+ usingElements.add(getResources().getString(R.string.bindAccessibilityService));
}
return usingElements;
@@ -1026,6 +1082,10 @@ public class ActivityPermissions extends Activity
if (requestCode == requestCodeForPermissionsManageOverlay)
if(havePermission(Manifest.permission.SYSTEM_ALERT_WINDOW, ActivityPermissions.this))
requestPermissions(cachedPermissionsToRequest, true);
+
+ if (requestCode == requestCodeForPermissionsAccessibility)
+ if(havePermission(Manifest.permission.BIND_ACCESSIBILITY_SERVICE, ActivityPermissions.this))
+ requestPermissions(cachedPermissionsToRequest, true);
}
}
@@ -1107,6 +1167,22 @@ public class ActivityPermissions extends Activity
diag.show();
return;
}
+ else if (s.equalsIgnoreCase(Manifest.permission.BIND_ACCESSIBILITY_SERVICE))
+ {
+ AlertDialog diag = Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.accessibilityApiPermissionHint), ActivityPermissions.this);
+ diag.setOnDismissListener(new DialogInterface.OnDismissListener()
+ {
+ @Override
+ public void onDismiss(DialogInterface dialogInterface)
+ {
+ requiredPermissions.remove(s);
+ cachedPermissionsToRequest = requiredPermissions;
+ requestBindAccessibilityService();
+ }
+ });
+ diag.show();
+ return;
+ }
else if (s.equalsIgnoreCase(Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE))
{
if(Build.VERSION.SDK_INT >= 33)
diff --git a/app/src/main/java/com/jens/automation2/MyAccessibilityService.java b/app/src/main/java/com/jens/automation2/MyAccessibilityService.java
new file mode 100644
index 0000000..922c91f
--- /dev/null
+++ b/app/src/main/java/com/jens/automation2/MyAccessibilityService.java
@@ -0,0 +1,29 @@
+package com.jens.automation2;
+
+import android.accessibilityservice.AccessibilityService;
+import android.view.accessibility.AccessibilityEvent;
+
+public class MyAccessibilityService extends AccessibilityService
+{
+ static MyAccessibilityService instance;
+
+ public static MyAccessibilityService getInstance()
+ {
+ if(instance == null)
+ instance = new MyAccessibilityService();
+
+ return instance;
+ }
+
+ @Override
+ public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent)
+ {
+
+ }
+
+ @Override
+ public void onInterrupt()
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c71f261..bfaa942 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -892,4 +892,7 @@
Method
GET
POST
+ Take screenshot
+ Bind to accessibility service
+ After clicking OK you\'ll be sent to a system dialog. Please select Automation there and allow "Allow accessibility API".
\ No newline at end of file