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);