diff --git a/kernel_module_loader.cpp b/kernel_module_loader.cpp index 1f30d0df..db7fcc9a 100644 --- a/kernel_module_loader.cpp +++ b/kernel_module_loader.cpp @@ -1,4 +1,5 @@ #include "kernel_module_loader.hpp" +#include "common.h" const std::vector kernel_modules_requested = TWFunc::split_string(EXPAND(TW_LOAD_VENDOR_MODULES), ' ', true); @@ -58,6 +59,10 @@ exit: if (ven) ven->UnMount(false); + android::base::SetProperty("twrp.modules.loaded", "true"); + + TWFunc::Wait_For_Battery(3s); + return true; } diff --git a/twrp-functions.cpp b/twrp-functions.cpp index 350d840f..15d4bdd4 100755 --- a/twrp-functions.cpp +++ b/twrp-functions.cpp @@ -38,8 +38,10 @@ #include #include #include +#include #include +#include #include "twrp-functions.hpp" #include "twcommon.h" @@ -407,6 +409,30 @@ int32_t TWFunc::timespec_diff_ms(timespec& start, timespec& end) ((start.tv_sec * 1000) + start.tv_nsec/1000000); } +bool TWFunc::Wait_For_File(const string& path, std::chrono::nanoseconds timeout) { + android::base::Timer t; + while (t.duration() < timeout) { + struct stat sb; + if (stat(path.c_str(), &sb) != -1) { + return true; + } + std::this_thread::sleep_for(10ms); + } + return false; +} + +bool TWFunc::Wait_For_Battery(std::chrono::nanoseconds timeout) { + std::string battery_path; +#ifdef TW_CUSTOM_BATTERY_PATH + battery_path = EXPAND(TW_CUSTOM_BATTERY_PATH); +#else + battery_path = "/sys/class/power_supply/battery"; +#endif + if (!battery_path.empty()) return TWFunc::Wait_For_File(battery_path, timeout); + + return false; +} + #ifndef BUILD_TWRPTAR_MAIN // Returns "/path" from a full /path/to/file.name diff --git a/twrp-functions.hpp b/twrp-functions.hpp index 01afb7aa..7bec5a6a 100755 --- a/twrp-functions.hpp +++ b/twrp-functions.hpp @@ -74,6 +74,8 @@ public: static vector split_string(const string &in, char del, bool skip_empty); static timespec timespec_diff(timespec& start, timespec& end); // Return a diff for 2 times static int32_t timespec_diff_ms(timespec& start, timespec& end); // Returns diff in ms + static bool Wait_For_File(const string& path, std::chrono::nanoseconds timeout); // Wait For File, True is success, False is timeout; + static bool Wait_For_Battery(std::chrono::nanoseconds timeout); // Wait For /sys/class/power_supply/battery or TW_CUSTOM_BATTERY_PATH, True is success, False is timeout; #ifndef BUILD_TWRPTAR_MAIN static void install_htc_dumlock(void); // Installs HTC Dumlock