From c1cdbfeffc9cea51dff58b38f394882202200849 Mon Sep 17 00:00:00 2001 From: yjj38 Date: Wed, 9 Jul 2025 20:27:48 +0800 Subject: [PATCH] =?UTF-8?q?refactor(device):=20=E9=87=8D=E6=9E=84=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E4=BF=A1=E6=81=AF=E4=BF=AE=E6=94=B9=E5=92=8CARM?= =?UTF-8?q?=E4=BA=91API=E5=AE=A2=E6=88=B7=E7=AB=AF=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `ArmCloudApiClient`:移除构造函数中的 `baseUrl`、`accessKey` 和 `secretKey` 参数,将这些值硬编码到类中。 - `ChangeDeviceInfoUtil`: - `changeDeviceInfo` 方法:移除 `padCodes` 参数,改为在方法内部通过 `armClient.getDeviceCodes` 获取。 - `LoadDeviceWorker`: - `executeSingleLogic` 方法:在调用 `ChangeDeviceInfoUtil.changeDeviceInfo` 时传递 `MainActivity.armClient`。 - `MainActivity`: - 新增 `armClient` 静态成员变量,并在 `onCreate` 中初始化 `ArmCloudApiClient` 实例。 - 修改 `modifyDeviceInfoButton` 的点击事件,在调用 `ChangeDeviceInfoUtil.changeDeviceInfo` 时传递 `armClient`。 - `executeSingleLogic` 方法:在调用 `ChangeDeviceInfoUtil.changeDeviceInfo` 时传递 `armClient`。 - 移除了 `getAndroidId(Context context)` 方法中未使用的代码。 - 简化了 `onCreate` 方法中的按钮初始化逻辑,引入了 `setupButton` 辅助方法。 - 引入了 `logInfo`, `logError`, `logWarn`, `showToast` 等辅助方法以简化日志记录和UI提示。 - 移除了未使用的 `instance` 静态成员变量和 `getInstance()` 方法。 - 移除了 `executeLogic` 方法和相关的 `isRunning`、`taskLock` 成员变量,相关逻辑已移至 `LoadDeviceWorker`。 - 调整了 `onDestroy` 方法的逻辑。 --- .../com/example/retention/MainActivity.java | 557 ++++++++---------- .../retention/device/ArmCloudApiClient.java | 8 +- .../device/ChangeDeviceInfoUtil.java | 3 +- .../retention/worker/LoadDeviceWorker.java | 3 +- 4 files changed, 246 insertions(+), 325 deletions(-) diff --git a/app/src/main/java/com/example/retention/MainActivity.java b/app/src/main/java/com/example/retention/MainActivity.java index a9fd35d..abe0a57 100644 --- a/app/src/main/java/com/example/retention/MainActivity.java +++ b/app/src/main/java/com/example/retention/MainActivity.java @@ -13,6 +13,7 @@ import android.os.Bundle; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; +import android.view.View; import android.widget.Button; import android.widget.Toast; import android.Manifest; @@ -29,6 +30,7 @@ import androidx.work.WorkManager; import com.example.retention.R; import com.example.retention.autoJS.AutoJsUtil; +import com.example.retention.device.ArmCloudApiClient; import com.example.retention.device.ChangeDeviceInfoUtil; import com.example.retention.proxy.ClashUtil; @@ -47,361 +49,280 @@ import java.util.concurrent.TimeUnit; public class MainActivity extends AppCompatActivity { - private static WeakReference instance; + private static final int REQUEST_CODE_STORAGE_PERMISSION = 1; - private static final int REQUEST_CODE_STORAGE_PERMISSION = 1; + private static final int ALLOW_ALL_FILES_ACCESS_PERMISSION_CODE = 1001; - private static final int ALLOW_ALL_FILES_ACCESS_PERMISSION_CODE = 1001; + public static ExecutorService executorService; - public static ExecutorService executorService; + public static ArmCloudApiClient armClient; - // 假设我们从配置文件中提取出了以下 name 项数据(仅为部分示例数据) - private final String[] proxyNames = { - "mr", "sr", "bq", "ml", "ht", "ga", "mk", "by", "pr", "hr", "hu", - "in", "gt", "at", "kh", "bn", "mg", "kr", "ca", "gh", "ma", "md", - "je", "pa", "ba", "mm", "ir", "gy", "mt", "ae", "es", "ng", "ls", - "ag", "pk", "bd", "kn", "mw", "ve", "hk", "cv", "hn", "tm", "us", - "cz", "ly", "gb", "kz", "it", "bh", "sn", "fi", "co", "sx", "bm", - "fj", "cw", "st", "bw", "fr", "bb", "tg", "ci", "gd", "ne", "bj", - "nz", "rs", "do", "cl", "lb", "nl", "re", "aw", "ug", "sv", "ar", - "jo", "bg", "jp", "rw", "py", "mn", "ec", "uz", "ro", "cu", "gu", - "xk", "sy", "so", "zm", "tz", "ni", "sc", "my", "gf", "na", "zw", - "la", "et", "ao", "ua", "om", "np", "mx", "mz", "dm", "ye", "gi", - "cr", "cm", "ph", "am", "th", "ch", "br", "sd", "ie", "bo", "bs", - "tc", "vg", "pe", "sa", "dk", "tn", "ee", "jm", "lc", "pt", "qa", - "ge", "ps" - }; + // 假设我们从配置文件中提取出了以下 name 项数据(仅为部分示例数据) + private final String[] proxyNames = { + "mr", "sr", "bq", "ml", "ht", "ga", "mk", "by", "pr", "hr", "hu", + "in", "gt", "at", "kh", "bn", "mg", "kr", "ca", "gh", "ma", "md", + "je", "pa", "ba", "mm", "ir", "gy", "mt", "ae", "es", "ng", "ls", + "ag", "pk", "bd", "kn", "mw", "ve", "hk", "cv", "hn", "tm", "us", + "cz", "ly", "gb", "kz", "it", "bh", "sn", "fi", "co", "sx", "bm", + "fj", "cw", "st", "bw", "fr", "bb", "tg", "ci", "gd", "ne", "bj", + "nz", "rs", "do", "cl", "lb", "nl", "re", "aw", "ug", "sv", "ar", + "jo", "bg", "jp", "rw", "py", "mn", "ec", "uz", "ro", "cu", "gu", + "xk", "sy", "so", "zm", "tz", "ni", "sc", "my", "gf", "na", "zw", + "la", "et", "ao", "ua", "om", "np", "mx", "mz", "dm", "ye", "gi", + "cr", "cm", "ph", "am", "th", "ch", "br", "sd", "ie", "bo", "bs", + "tc", "vg", "pe", "sa", "dk", "tn", "ee", "jm", "lc", "pt", "qa", + "ge", "ps" + }; - public static volatile String scriptResult; + // 初始化 ExecutorService + private void initializeExecutorService() { + if (executorService == null || executorService.isShutdown()) { + executorService = new ThreadPoolExecutor( + 1, // 核心线程数 + 1, // 最大线程数 + 0L, TimeUnit.MILLISECONDS, + new LinkedBlockingQueue<>(50), // 阻塞队列 + new ThreadPoolExecutor.AbortPolicy() // 拒绝策略 + ); + } + } - // 初始化 ExecutorService - private void initializeExecutorService() { - if (executorService == null || executorService.isShutdown()) { - executorService = new ThreadPoolExecutor( - 1, // 核心线程数 - 1, // 最大线程数 - 0L, TimeUnit.MILLISECONDS, - new LinkedBlockingQueue<>(50), // 阻塞队列 - new ThreadPoolExecutor.AbortPolicy() // 拒绝策略 - ); - } + private String getAndroidId() { + return "FyZqWrStUvOpKlMn"; + } + + + private static final int REQUEST_CODE_PERMISSIONS = 100; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + LogFileUtil.initialize(this); + setContentView(R.layout.activity_main); + + logInfo("onCreate: Initializing application"); + + initializeExecutorService(); + + System.setProperty("java.library.path", getApplicationInfo().nativeLibraryDir); + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions( + this, + new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, + REQUEST_CODE_STORAGE_PERMISSION + ); + } + } else { + if (!Environment.isExternalStorageManager()) { + Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); + intent.setData(Uri.parse("package:" + getPackageName())); + startActivityForResult(intent, ALLOW_ALL_FILES_ACCESS_PERMISSION_CODE); + } } - /** - * 获取 Android 设备的 ANDROID_ID - * - * @param context 应用上下文 - * @return 设备的 ANDROID_ID,若无法获取,则返回 null - */ - private String getAndroidId(Context context) { -// if (context == null) { -// LogFileUtil.logAndWrite(Log.ERROR, "MainActivity", "getAndroidId: Context cannot be null",null); -// throw new IllegalArgumentException("Context cannot be null"); -// } -// try { -// return Settings.Secure.getString( -// context.getContentResolver(), -// Settings.Secure.ANDROID_ID -// ); -// } catch (Exception e) { -// LogFileUtil.logAndWrite(Log.ERROR, "MainActivity", "getAndroidId: Failed to get ANDROID_ID",e); -// return null; -// } - return "FyZqWrStUvOpKlMn"; + if (!isNetworkAvailable(this)) { + showToast("网络不可用"); + logError("Network not available, closing app."); + finish(); + return; } + logInfo("onCreate: Setting up work manager"); + PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(CheckAccessibilityWorker.class, 15, TimeUnit.MINUTES) + .build(); + WorkManager.getInstance(this).enqueue(workRequest); - private static final int REQUEST_CODE_PERMISSIONS = 100; + logInfo("onCreate: Setting up UI components"); - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - LogFileUtil.initialize(this); - setContentView(R.layout.activity_main); - instance = new WeakReference<>(this); + setupButton(R.id.run_script_button, v -> AutoJsUtil.runAutojsScript(this)); + setupButton(R.id.connectVpnButton, v -> startProxyVpn(this)); + setupButton(R.id.disconnectVpnButton, v -> ClashUtil.stopProxy(this)); + setupButton(R.id.switchVpnButton, v -> ClashUtil.switchProxyGroup("GLOBAL", "us", "http://127.0.0.1:6170")); - LogFileUtil.logAndWrite(Log.INFO, "MainActivity", "onCreate: Initializing application", null); - initializeExecutorService(); - System.setProperty("java.library.path", this.getApplicationInfo().nativeLibraryDir); - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { - if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) - != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions( - this, - new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, - REQUEST_CODE_STORAGE_PERMISSION - ); - } - } else { - if (!Environment.isExternalStorageManager()) { - Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); - intent.setData(Uri.parse("package:" + getPackageName())); - startActivityForResult(intent, ALLOW_ALL_FILES_ACCESS_PERMISSION_CODE); - } - } - if (!isNetworkAvailable(this)) { - Toast.makeText(this, "Network is not available", Toast.LENGTH_SHORT).show(); - LogFileUtil.logAndWrite(Log.ERROR, "MainActivity", "Network not available, closing app.", null); - finish(); - } + armClient = new ArmCloudApiClient(); - LogFileUtil.logAndWrite(Log.INFO, "MainActivity", "onCreate: Setting up work manager", null); - PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(CheckAccessibilityWorker.class, 15, TimeUnit.MINUTES) - .build(); - WorkManager.getInstance(this).enqueue(workRequest); + setupButton(R.id.modifyDeviceInfoButton, v -> ChangeDeviceInfoUtil.changeDeviceInfo(getPackageName(), this, armClient)); + setupButton(R.id.resetDeviceInfoButton, v -> ChangeDeviceInfoUtil.resetChangedDeviceInfo(getPackageName(), this)); - LogFileUtil.logAndWrite(Log.INFO, "MainActivity", "onCreate: Setting up UI components", null); - Button runScriptButton = findViewById(R.id.run_script_button); - if (runScriptButton != null) { - runScriptButton.setOnClickListener(v -> AutoJsUtil.runAutojsScript(this)); - } else { - LogFileUtil.logAndWrite(Log.WARN, "MainActivity", "Run Script Button not found", null); - Toast.makeText(this, "Button not found", Toast.LENGTH_SHORT).show(); - } + Button executeButton = findViewById(R.id.execute_button); + Button stopExecuteButton = findViewById(R.id.stop_execute_button); - Button connectButton = findViewById(R.id.connectVpnButton); - if (connectButton != null) { - connectButton.setOnClickListener(v -> startProxyVpn(this)); - } else { - Toast.makeText(this, "Connect button not found", Toast.LENGTH_SHORT).show(); - } - - Button disconnectButton = findViewById(R.id.disconnectVpnButton); - if (disconnectButton != null) { - disconnectButton.setOnClickListener(v -> ClashUtil.stopProxy(this)); - } else { - Toast.makeText(this, "Disconnect button not found", Toast.LENGTH_SHORT).show(); - } - - Button switchVpnButton = findViewById(R.id.switchVpnButton); - if (switchVpnButton != null) { - switchVpnButton.setOnClickListener(v -> ClashUtil.switchProxyGroup("GLOBAL", "us", "http://127.0.0.1:6170")); - } else { - Toast.makeText(this, "Disconnect button not found", Toast.LENGTH_SHORT).show(); - } - - Button modifyDeviceInfoButton = findViewById(R.id.modifyDeviceInfoButton); - if (modifyDeviceInfoButton != null) { - modifyDeviceInfoButton.setOnClickListener(v -> ChangeDeviceInfoUtil.changeDeviceInfo(getPackageName(), this)); - } else { - Toast.makeText(this, "modifyDeviceInfo button not found", Toast.LENGTH_SHORT).show(); - } - - Button resetDeviceInfoButton = findViewById(R.id.resetDeviceInfoButton); - if (resetDeviceInfoButton != null) { - resetDeviceInfoButton.setOnClickListener(v -> ChangeDeviceInfoUtil.resetChangedDeviceInfo(getPackageName(), this)); - } else { - Toast.makeText(this, "resetDeviceInfo button not found", Toast.LENGTH_SHORT).show(); - } - - // 初始化 ChangeDeviceInfoUtil - String androidId = getAndroidId(this); - String taskId = UUID.randomUUID().toString(); -// ChangeDeviceInfoUtil.initialize("US", 2, this, androidId); - // 获取输入框和按钮 - Button executeButton = findViewById(R.id.execute_button); - Button stopExecuteButton = findViewById(R.id.stop_execute_button); - - // 设置按钮的点击事件 - if (executeButton != null) { - executeButton.setOnClickListener(v -> { - executeButton.setEnabled(false); -// Toast.makeText(this, "任务正在执行", Toast.LENGTH_SHORT).show(); -// executeLogic(androidId,taskId); - startLoadWork(); - }); - } - if (stopExecuteButton != null) { - stopExecuteButton.setOnClickListener(v -> { -// if (executorService != null && !executorService.isShutdown()) { -// executorService.shutdownNow(); -// ClashUtil.stopProxy(this); -// AutoJsUtil.stopAutojsScript(this); -// executeButton.setEnabled(true); -// } - WorkManager.getInstance(this).cancelAllWorkByTag(WORK_TAG); - executeButton.setEnabled(true); - }); - } else { - Toast.makeText(this, "Stop button not found", Toast.LENGTH_SHORT).show(); - } + if (executeButton != null) { + executeButton.setOnClickListener(v -> { + executeButton.setEnabled(false); + startLoadWork(); + }); } - private static String WORK_TAG = "LOAD_WORK"; + if (stopExecuteButton != null) { + stopExecuteButton.setOnClickListener(v -> { + WorkManager.getInstance(this).cancelAllWorkByTag(WORK_TAG); + executeButton.setEnabled(true); + }); + } else { + showToast("Stop button not found"); + } + } - private void startLoadWork() { - PeriodicWorkRequest workRequest = new PeriodicWorkRequest. - Builder(LoadDeviceWorker.class, 30, TimeUnit.MINUTES) - .setInitialDelay(0, TimeUnit.SECONDS) - .addTag(WORK_TAG) - .build(); - WorkManager.getInstance(this).enqueue(workRequest); + + private void setupButton(int resId, View.OnClickListener listener) { + Button button = findViewById(resId); + if (button != null) { + button.setOnClickListener(listener); + } else { + String msg = getResources().getResourceEntryName(resId) + " not found"; + logWarn(msg); + showToast(msg); + } + } + + private static String WORK_TAG = "LOAD_WORK"; + + private void startLoadWork() { + PeriodicWorkRequest workRequest = new PeriodicWorkRequest. + Builder(LoadDeviceWorker.class, 30, TimeUnit.MINUTES) + .setInitialDelay(0, TimeUnit.SECONDS) + .addTag(WORK_TAG) + .build(); + WorkManager.getInstance(this).enqueue(workRequest); + } + + public static final LinkedBlockingQueue scriptResultQueue = new LinkedBlockingQueue<>(); + + + public void executeSingleLogic() { + LogFileUtil.logAndWrite(Log.INFO, "MainActivity", "executeSingleLogic: Proxy not active, starting VPN", null); + startProxyVpn(this); + LogFileUtil.logAndWrite(Log.INFO, "MainActivity", "executeSingleLogic: Changing device info", null); + ChangeDeviceInfoUtil.changeDeviceInfo(getPackageName(), this,armClient); + LogFileUtil.logAndWrite(Log.INFO, "MainActivity", "executeSingleLogic: Running AutoJs script", null); + AutoJsUtil.runAutojsScript(this); + } + + + private void startProxyVpn(Context context) { + if (!isNetworkAvailable(context)) { + Toast.makeText(context, "Network is not available", Toast.LENGTH_SHORT).show(); + LogFileUtil.logAndWrite(Log.ERROR, "MainActivity", "startProxyVpn: Network is not available.", null); + return; } - private void executeLogic(String androidId, String taskId) { - LogFileUtil.logAndWrite(Log.INFO, "MainActivity", "executeLogic: Start execution", null); + if (!(context instanceof Activity)) { + Toast.makeText(context, "Context must be an Activity", Toast.LENGTH_SHORT).show(); + LogFileUtil.logAndWrite(Log.ERROR, "MainActivity", "startProxyVpn: Context is not an Activity.", null); + return; + } - if (!isNetworkAvailable(this)) { - LogFileUtil.logAndWrite(Log.ERROR, "MainActivity", "executeLogic: Network is not available!", null); - Toast.makeText(this, "网络不可用,请检查网络连接", Toast.LENGTH_SHORT).show(); - return; + try { + ClashUtil.startProxy(context); // 在主线程中调用 + ClashUtil.switchProxyGroup("GLOBAL", "us", "http://127.0.0.1:6170"); + } catch (Exception e) { + LogFileUtil.logAndWrite(Log.ERROR, "MainActivity", "startProxyVpn: Failed to start VPN", e); + Toast.makeText(context, "Failed to start VPN: " + (e.getMessage() != null ? e.getMessage() : "Unknown error"), Toast.LENGTH_SHORT).show(); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (requestCode == REQUEST_CODE_STORAGE_PERMISSION) { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + Toast.makeText(this, "Storage Permissions granted", Toast.LENGTH_SHORT).show(); + } else { + // 提示权限被拒绝,同时允许用户重新授予权限 + showPermissionExplanationDialog(); + } + } + if (requestCode == REQUEST_CODE_PERMISSIONS) { + boolean allGranted = true; + for (int result : grantResults) { + if (result != PackageManager.PERMISSION_GRANTED) { + allGranted = false; + break; } + } - LogFileUtil.logAndWrite(Log.INFO, "MainActivity", "executeLogic: Submitting job to executor", null); - initializeExecutorService(); - executorService.submit(() -> { - try { - AutoJsUtil.registerScriptResultReceiver(this); - AutoJsUtil.flag = true; - ChangeDeviceInfoUtil.getDeviceInfo(taskId, androidId); - executeSingleLogic(); - while (isRunning) { - if (!isRunning) break; - - // 从队列中获取最新的 scriptResult - LogFileUtil.logAndWrite(Log.INFO, "MainActivity", "executeSingleLogic: Running AutoJs script", null); - String currentScriptResult = scriptResultQueue.take(); - ChangeDeviceInfoUtil.getDeviceInfo(taskId, androidId); - ChangeDeviceInfoUtil.processPackageInfo(TaskUtil.getPackageInfo(androidId), this); - executeSingleLogic(); - TaskUtil.execSaveTask(this, androidId, taskId, currentScriptResult); - LogFileUtil.logAndWrite(android.util.Log.DEBUG, "MainActivity", "----发送result------;" + currentScriptResult, null); - if (currentScriptResult != null && !TextUtils.isEmpty(currentScriptResult)) { - infoUpload(this, androidId, currentScriptResult); - } - } - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - LogFileUtil.logAndWrite(Log.ERROR, "MainActivity", "executeLogic: Thread interrupted while waiting", e); - } catch (Exception e) { - LogFileUtil.logAndWrite(Log.ERROR, "MainActivity", "executeLogic: Unexpected task error.", e); - } - }); + if (allGranted) { + // 所有权限已授予 + startMyForegroundService(); + } else { + Toast.makeText(this, "未授予必要权限,请检查设置", Toast.LENGTH_SHORT).show(); + } } + } - public static final LinkedBlockingQueue scriptResultQueue = new LinkedBlockingQueue<>(); - private volatile boolean isRunning = true; // 主线程运行状态 - public static final Object taskLock = new Object(); // 任务逻辑锁 + private void startMyForegroundService() { + Intent serviceIntent = new Intent(this, MyAccessibilityService.class); + ContextCompat.startForegroundService(this, serviceIntent); + } - public void executeSingleLogic() { - LogFileUtil.logAndWrite(Log.INFO, "MainActivity", "executeSingleLogic: Proxy not active, starting VPN", null); - startProxyVpn(this); - LogFileUtil.logAndWrite(Log.INFO, "MainActivity", "executeSingleLogic: Changing device info", null); - ChangeDeviceInfoUtil.changeDeviceInfo(getPackageName(), this); - LogFileUtil.logAndWrite(Log.INFO, "MainActivity", "executeSingleLogic: Running AutoJs script", null); - AutoJsUtil.runAutojsScript(this); + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + switch (requestCode) { + case ALLOW_ALL_FILES_ACCESS_PERMISSION_CODE: + handleStoragePermissionResult(resultCode); + break; + default: + break; } + } - - private void startProxyVpn(Context context) { - if (!isNetworkAvailable(context)) { - Toast.makeText(context, "Network is not available", Toast.LENGTH_SHORT).show(); - LogFileUtil.logAndWrite(Log.ERROR, "MainActivity", "startProxyVpn: Network is not available.", null); - return; - } - - if (!(context instanceof Activity)) { - Toast.makeText(context, "Context must be an Activity", Toast.LENGTH_SHORT).show(); - LogFileUtil.logAndWrite(Log.ERROR, "MainActivity", "startProxyVpn: Context is not an Activity.", null); - return; - } - - try { - ClashUtil.startProxy(context); // 在主线程中调用 - ClashUtil.switchProxyGroup("GLOBAL", "us", "http://127.0.0.1:6170"); - } catch (Exception e) { - LogFileUtil.logAndWrite(Log.ERROR, "MainActivity", "startProxyVpn: Failed to start VPN", e); - Toast.makeText(context, "Failed to start VPN: " + (e.getMessage() != null ? e.getMessage() : "Unknown error"), Toast.LENGTH_SHORT).show(); - } + private void handleStoragePermissionResult(int resultCode) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && Environment.isExternalStorageManager()) { + Toast.makeText(this, "Storage Permissions granted", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(this, "请授予所有文件管理权限", Toast.LENGTH_SHORT).show(); + finish(); } + } - @Override - public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (requestCode == REQUEST_CODE_STORAGE_PERMISSION) { - if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - Toast.makeText(this, "Storage Permissions granted", Toast.LENGTH_SHORT).show(); - } else { - // 提示权限被拒绝,同时允许用户重新授予权限 - showPermissionExplanationDialog(); - } - } - if (requestCode == REQUEST_CODE_PERMISSIONS) { - boolean allGranted = true; - for (int result : grantResults) { - if (result != PackageManager.PERMISSION_GRANTED) { - allGranted = false; - break; - } - } + private void showPermissionExplanationDialog() { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle("Permission Required") + .setMessage("Storage Permission is required for the app to function. Please enable it in Settings.") + .setPositiveButton("Go to Settings", (dialog, which) -> { + Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + Uri uri = Uri.fromParts("package", getPackageName(), null); + intent.setData(uri); + startActivity(intent); + }) + .setNegativeButton("Cancel", (dialog, which) -> finish()) + .show(); + } - if (allGranted) { - // 所有权限已授予 - startMyForegroundService(); - } else { - Toast.makeText(this, "未授予必要权限,请检查设置", Toast.LENGTH_SHORT).show(); - } - } + @Override + protected void onDestroy() { + LogFileUtil.logAndWrite(Log.INFO, "MainActivity", "onDestroy: Cleaning up resources", null); + super.onDestroy(); + if (AutoJsUtil.scriptResultReceiver != null) { + unregisterReceiver(AutoJsUtil.scriptResultReceiver); + AutoJsUtil.scriptResultReceiver = null; } - - private void startMyForegroundService() { - Intent serviceIntent = new Intent(this, MyAccessibilityService.class); - ContextCompat.startForegroundService(this, serviceIntent); + if (executorService != null) { + executorService.shutdown(); } + } - @Override - protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { - super.onActivityResult(requestCode, resultCode, data); + private void logInfo(String message) { + LogFileUtil.logAndWrite(Log.INFO, "MainActivity", message, null); + } - switch (requestCode) { - case ALLOW_ALL_FILES_ACCESS_PERMISSION_CODE: - handleStoragePermissionResult(resultCode); - break; - default: - break; - } - } + private void logError(String message) { + LogFileUtil.logAndWrite(Log.ERROR, "MainActivity", message, null); + } - private void handleStoragePermissionResult(int resultCode) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && Environment.isExternalStorageManager()) { - Toast.makeText(this, "Storage Permissions granted", Toast.LENGTH_SHORT).show(); - } else { - Toast.makeText(this, "请授予所有文件管理权限", Toast.LENGTH_SHORT).show(); - finish(); - } - } + private void logWarn(String message) { + LogFileUtil.logAndWrite(Log.WARN, "MainActivity", message, null); + } - private void showPermissionExplanationDialog() { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle("Permission Required") - .setMessage("Storage Permission is required for the app to function. Please enable it in Settings.") - .setPositiveButton("Go to Settings", (dialog, which) -> { - Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); - Uri uri = Uri.fromParts("package", getPackageName(), null); - intent.setData(uri); - startActivity(intent); - }) - .setNegativeButton("Cancel", (dialog, which) -> finish()) - .show(); - } - - @Override - protected void onDestroy() { - LogFileUtil.logAndWrite(Log.INFO, "MainActivity", "onDestroy: Cleaning up resources", null); - super.onDestroy(); - instance.clear(); - if (AutoJsUtil.scriptResultReceiver != null) { - unregisterReceiver(AutoJsUtil.scriptResultReceiver); - AutoJsUtil.scriptResultReceiver = null; - } - if (executorService != null) { - executorService.shutdown(); - } - isRunning = false; - } - - public static MainActivity getInstance() { - return instance.get(); // 返回实例 - } + private void showToast(String message) { + Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); + } } diff --git a/app/src/main/java/com/example/retention/device/ArmCloudApiClient.java b/app/src/main/java/com/example/retention/device/ArmCloudApiClient.java index f1901cb..862a7ed 100644 --- a/app/src/main/java/com/example/retention/device/ArmCloudApiClient.java +++ b/app/src/main/java/com/example/retention/device/ArmCloudApiClient.java @@ -34,16 +34,14 @@ public class ArmCloudApiClient { private final OkHttpClient client; private final String baseUrl = "https://openapi-hk.armcloud.net"; - private final String accessKey; - private final String secretKey; + private final String accessKey = "gz8f1u0t63byzdu6ozbx8r5qs3e5lipt"; + private final String secretKey = "3yc8c8bg1dym0zaiwjh867al"; - public ArmCloudApiClient(String baseUrl, String accessKey, String secretKey) { + public ArmCloudApiClient() { this.client = new Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .build(); - this.accessKey = accessKey; - this.secretKey = secretKey; } private static final String ALGORITHM = "HmacSHA256"; diff --git a/app/src/main/java/com/example/retention/device/ChangeDeviceInfoUtil.java b/app/src/main/java/com/example/retention/device/ChangeDeviceInfoUtil.java index 244f2f0..587dbbf 100644 --- a/app/src/main/java/com/example/retention/device/ChangeDeviceInfoUtil.java +++ b/app/src/main/java/com/example/retention/device/ChangeDeviceInfoUtil.java @@ -285,7 +285,7 @@ public class ChangeDeviceInfoUtil { } - public static void changeDeviceInfo(String current_pkg_name, Context context, ArmCloudApiClient client, String[] padCodes) { + public static void changeDeviceInfo(String current_pkg_name, Context context, ArmCloudApiClient client) { final String B_PREFIX = current_pkg_name + "."; final String U_PREFIX = current_pkg_name + "_"; @@ -438,6 +438,7 @@ public class ChangeDeviceInfoUtil { // 调用接口更新实例属性 try { + String[] padCodes = client.getDeviceCodes(1, 1, null, null, null, null, null, null, null, null); String response = client.updateInstanceProperties( padCodes, null, // modemPersistProps diff --git a/app/src/main/java/com/example/retention/worker/LoadDeviceWorker.java b/app/src/main/java/com/example/retention/worker/LoadDeviceWorker.java index 34c854d..e653b40 100644 --- a/app/src/main/java/com/example/retention/worker/LoadDeviceWorker.java +++ b/app/src/main/java/com/example/retention/worker/LoadDeviceWorker.java @@ -11,6 +11,7 @@ import androidx.annotation.NonNull; import androidx.work.CoroutineWorker; import androidx.work.WorkerParameters; +import com.example.retention.MainActivity; import com.example.retention.autoJS.AutoJsUtil; import com.example.retention.device.ChangeDeviceInfoUtil; import com.example.retention.proxy.ClashUtil; @@ -54,7 +55,7 @@ public class LoadDeviceWorker extends CoroutineWorker { LogFileUtil.logAndWrite(Log.INFO, "MainActivity", "executeSingleLogic: Proxy not active, starting VPN",null); startProxyVpn(context); LogFileUtil.logAndWrite(Log.INFO, "MainActivity", "executeSingleLogic: Changing device info",null); - ChangeDeviceInfoUtil.changeDeviceInfo(context.getPackageName(), context); + ChangeDeviceInfoUtil.changeDeviceInfo(context.getPackageName(), context, MainActivity.armClient); LogFileUtil.logAndWrite(Log.INFO, "MainActivity", "executeSingleLogic: Running AutoJs script",null); Utils.writePackageName(ChangeDeviceInfoUtil.packageName); AutoJsUtil.runAutojsScript(context);