Utils.java 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package com.example.modifier;
  2. import android.accessibilityservice.AccessibilityServiceInfo;
  3. import android.content.Context;
  4. import android.content.SharedPreferences;
  5. import android.content.pm.ServiceInfo;
  6. import android.provider.Settings;
  7. import android.text.TextUtils;
  8. import android.util.Log;
  9. import android.view.accessibility.AccessibilityManager;
  10. import androidx.appcompat.app.AlertDialog;
  11. import org.apache.commons.io.FileUtils;
  12. import org.apache.commons.lang3.StringUtils;
  13. import java.io.DataOutputStream;
  14. import java.io.File;
  15. import java.io.IOException;
  16. import java.lang.reflect.Method;
  17. import java.util.ArrayList;
  18. import java.util.List;
  19. import java.util.Objects;
  20. public class Utils {
  21. private static final String TAG = "Modifier";
  22. public static Context getContext() {
  23. try {
  24. Class<?> activityThreadClass = Class.forName("android.app.ActivityThread");
  25. Method currentActivityThreadMethod = activityThreadClass.getMethod("currentActivityThread");
  26. currentActivityThreadMethod.setAccessible(true);
  27. Object currentActivityThread = currentActivityThreadMethod.invoke(null);
  28. Method getApplicationMethod = activityThreadClass.getMethod("getApplication");
  29. getApplicationMethod.setAccessible(true);
  30. return (Context) getApplicationMethod.invoke(currentActivityThread);
  31. } catch (Exception e) {
  32. e.printStackTrace();
  33. }
  34. return null;
  35. }
  36. public static String runAsRoot(String... cmds) throws IOException, InterruptedException {
  37. Log.i(TAG, "Trying to run as root");
  38. Context context = getContext();
  39. File outputDir = context.getCacheDir(); // context being the Activity pointer
  40. File outputFile = File.createTempFile("su0000000", ".log", outputDir);
  41. Process p = new ProcessBuilder("su")
  42. .redirectErrorStream(true)
  43. .redirectOutput(outputFile)
  44. .start();
  45. DataOutputStream outputStream = new DataOutputStream(p.getOutputStream());
  46. for (String cmd : cmds) {
  47. outputStream.writeBytes(cmd + "\n");
  48. outputStream.flush();
  49. Log.i(TAG, "Running command: " + cmd);
  50. }
  51. outputStream.writeBytes("exit\n");
  52. outputStream.flush();
  53. p.waitFor();
  54. String res = FileUtils.readFileToString(outputFile, "UTF-8");
  55. Log.i(TAG, "Command output: \n" + res);
  56. outputFile.delete();
  57. return res;
  58. }
  59. public static boolean isAccessibilityEnabled() {
  60. Context context = getContext();
  61. AccessibilityManager am = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
  62. List<AccessibilityServiceInfo> enabledServices = am.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
  63. for (AccessibilityServiceInfo enabledService : enabledServices) {
  64. Log.i(TAG, "Enabled service: " + enabledService.getResolveInfo().serviceInfo.packageName + "/" + enabledService.getResolveInfo().serviceInfo.name);
  65. ServiceInfo enabledServiceInfo = enabledService.getResolveInfo().serviceInfo;
  66. if (enabledServiceInfo.packageName.equals(context.getPackageName()) && enabledServiceInfo.name.equals(ModifierService.NAME))
  67. return true;
  68. }
  69. return false;
  70. }
  71. public static boolean hasRootAccess() {
  72. boolean rootAccess = false;
  73. try {
  74. String res = runAsRoot("echo 'imrooted'");
  75. if (res.contains("imrooted")) {
  76. rootAccess = true;
  77. }
  78. } catch (Exception e) {
  79. e.printStackTrace();
  80. }
  81. return rootAccess;
  82. }
  83. public static boolean enableAccessibility() {
  84. Context context = getContext();
  85. AccessibilityManager am = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
  86. List<AccessibilityServiceInfo> enabledServices = am.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
  87. List<String> names = new ArrayList<>();
  88. for (AccessibilityServiceInfo enabledService : enabledServices) {
  89. names.add(enabledService.getResolveInfo().serviceInfo.packageName + "/" + enabledService.getResolveInfo().serviceInfo.name);
  90. }
  91. names.add(context.getPackageName() + "/" + ModifierService.NAME);
  92. try {
  93. runAsRoot("settings put secure enabled_accessibility_services " + TextUtils.join(":", names),
  94. "settings put secure accessibility_enabled 1");
  95. return true;
  96. } catch (Exception e) {
  97. e.printStackTrace();
  98. }
  99. return false;
  100. }
  101. public static String getUniqueID() {
  102. Context context = getContext();
  103. Objects.requireNonNull(context);
  104. SharedPreferences sharedPrefs = context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE);
  105. String uniqueID = sharedPrefs.getString("unique_id", null);
  106. if (StringUtils.isBlank(uniqueID)) {
  107. try {
  108. uniqueID = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
  109. } catch (Exception e) {
  110. e.printStackTrace();
  111. }
  112. }
  113. if (StringUtils.isBlank(uniqueID)) {
  114. uniqueID = java.util.UUID.randomUUID().toString();
  115. }
  116. sharedPrefs.edit().putString("unique_id", uniqueID).apply();
  117. return uniqueID;
  118. }
  119. }