From cc4fb60b7bb6fb62e993609e0089fdeeb02369b5 Mon Sep 17 00:00:00 2001 From: jiqiu2021 Date: Fri, 27 Jun 2025 15:29:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=85=A8=E5=B1=80=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BB=B6=E8=BF=9F=E6=B3=A8=E5=85=A5=E7=A7=92?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/jiqiu/configapp/ConfigManager.java | 10 +++ .../com/jiqiu/configapp/SettingsFragment.java | 38 ++++++++++ .../src/main/res/layout/fragment_settings.xml | 71 +++++++++++++++++++ module/src/main/cpp/config.cpp | 22 +++++- module/src/main/cpp/config.h | 4 ++ module/src/main/cpp/hack_new.cpp | 8 ++- 6 files changed, 150 insertions(+), 3 deletions(-) diff --git a/configapp/src/main/java/com/jiqiu/configapp/ConfigManager.java b/configapp/src/main/java/com/jiqiu/configapp/ConfigManager.java index 3d0dc8e..272816d 100644 --- a/configapp/src/main/java/com/jiqiu/configapp/ConfigManager.java +++ b/configapp/src/main/java/com/jiqiu/configapp/ConfigManager.java @@ -253,6 +253,15 @@ public class ConfigManager { saveConfig(); } + public int getInjectionDelay() { + return config.injectionDelay; + } + + public void setInjectionDelay(int delay) { + config.injectionDelay = delay; + saveConfig(); + } + // Copy SO files directly to app's data directory private void deploySoFilesToApp(String packageName) { AppConfig appConfig = config.perAppConfig.get(packageName); @@ -402,6 +411,7 @@ public class ConfigManager { public static class ModuleConfig { public boolean enabled = true; public boolean hideInjection = false; + public int injectionDelay = 2; // Default 2 seconds public List globalSoFiles = new ArrayList<>(); public Map perAppConfig = new HashMap<>(); } diff --git a/configapp/src/main/java/com/jiqiu/configapp/SettingsFragment.java b/configapp/src/main/java/com/jiqiu/configapp/SettingsFragment.java index c8bedf5..310fb29 100644 --- a/configapp/src/main/java/com/jiqiu/configapp/SettingsFragment.java +++ b/configapp/src/main/java/com/jiqiu/configapp/SettingsFragment.java @@ -8,6 +8,9 @@ import android.view.View; import android.view.ViewGroup; import android.widget.RadioButton; import android.widget.RadioGroup; +import android.widget.EditText; +import android.text.TextWatcher; +import android.text.Editable; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -24,6 +27,8 @@ public class SettingsFragment extends Fragment { private RadioGroup radioGroupFilter; private RadioButton radioShowAll; private RadioButton radioHideSystem; + private EditText editInjectionDelay; + private ConfigManager configManager; private SharedPreferences sharedPreferences; private OnSettingsChangeListener settingsChangeListener; @@ -53,6 +58,9 @@ public class SettingsFragment extends Fragment { radioGroupFilter = view.findViewById(R.id.radio_group_filter); radioShowAll = view.findViewById(R.id.radio_show_all); radioHideSystem = view.findViewById(R.id.radio_hide_system); + editInjectionDelay = view.findViewById(R.id.editInjectionDelay); + + configManager = new ConfigManager(getContext()); } private void initSharedPreferences() { @@ -67,6 +75,10 @@ public class SettingsFragment extends Fragment { } else { radioShowAll.setChecked(true); } + + // Load injection delay + int injectionDelay = configManager.getInjectionDelay(); + editInjectionDelay.setText(String.valueOf(injectionDelay)); } private void setupListeners() { @@ -86,6 +98,32 @@ public class SettingsFragment extends Fragment { } } }); + + // Injection delay listener + editInjectionDelay.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) {} + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) {} + + @Override + public void afterTextChanged(Editable s) { + String text = s.toString().trim(); + if (!text.isEmpty()) { + try { + int delay = Integer.parseInt(text); + // Limit delay between 0 and 60 seconds + if (delay < 0) delay = 0; + if (delay > 60) delay = 60; + + configManager.setInjectionDelay(delay); + } catch (NumberFormatException e) { + // Ignore invalid input + } + } + } + }); } public void setOnSettingsChangeListener(OnSettingsChangeListener listener) { diff --git a/configapp/src/main/res/layout/fragment_settings.xml b/configapp/src/main/res/layout/fragment_settings.xml index 3270a17..953b6cc 100644 --- a/configapp/src/main/res/layout/fragment_settings.xml +++ b/configapp/src/main/res/layout/fragment_settings.xml @@ -72,6 +72,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + perAppConfig; }; @@ -45,6 +46,9 @@ namespace Config { // Get injection method for specific app InjectionMethod getAppInjectionMethod(const std::string& packageName); + + // Get injection delay in seconds + int getInjectionDelay(); } #endif // CONFIG_H \ No newline at end of file diff --git a/module/src/main/cpp/hack_new.cpp b/module/src/main/cpp/hack_new.cpp index 1860eab..1bd3d68 100644 --- a/module/src/main/cpp/hack_new.cpp +++ b/module/src/main/cpp/hack_new.cpp @@ -88,8 +88,12 @@ void load_so_file_custom_linker(const char *game_data_dir, const Config::SoFile void hack_thread_func(const char *game_data_dir, const char *package_name, JavaVM *vm) { LOGI("Hack thread started for package: %s", package_name); - // Wait a bit for app to initialize and files to be copied - sleep(2); + // Get injection delay from config + int delay = Config::getInjectionDelay(); + LOGI("Waiting %d seconds before injection", delay); + + // Wait for app to initialize and files to be copied + sleep(delay); // Get injection method for this app Config::InjectionMethod method = Config::getAppInjectionMethod(package_name);