diff options
Diffstat (limited to 'cmds/bootanimation/iot/iotbootanimation_main.cpp')
-rw-r--r-- | cmds/bootanimation/iot/iotbootanimation_main.cpp | 57 |
1 files changed, 44 insertions, 13 deletions
diff --git a/cmds/bootanimation/iot/iotbootanimation_main.cpp b/cmds/bootanimation/iot/iotbootanimation_main.cpp index d1ae786e83af..00cef430135e 100644 --- a/cmds/bootanimation/iot/iotbootanimation_main.cpp +++ b/cmds/bootanimation/iot/iotbootanimation_main.cpp @@ -16,7 +16,7 @@ #define LOG_TAG "IotBootAnimation" -#include <android-base/file.h> +#include <base/files/file_util.h> #include <binder/IPCThreadState.h> #include <binder/IServiceManager.h> #include <binder/ProcessState.h> @@ -28,28 +28,40 @@ #include "BootAction.h" #include "BootAnimationUtil.h" +#include "BootParameters.h" using namespace android; -using android::base::ReadFileToString; // Create a typedef for readability. typedef android::BootAnimation::Animation Animation; namespace { -class BootActionAnimationCallbacks : public android::BootAnimation::Callbacks {public: +constexpr const char* kDefaultLibName = "libbootaction.so"; + +class BootActionAnimationCallbacks : public android::BootAnimation::Callbacks { +public: + BootActionAnimationCallbacks(std::unique_ptr<BootParameters> bootParameters) + : mBootParameters(std::move(bootParameters)) {} + void init(const Vector<Animation::Part>&) override { - // Create and initialize BootActions if we have a boot_action.conf. - std::string bootActionConf; - if (ReadFileToString("/oem/app/etc/boot_action.conf", &bootActionConf)) { - mBootAction = new BootAction(); - if (!mBootAction->init("/oem/app/lib", bootActionConf)) { - mBootAction = NULL; - } - } else { - ALOGI("No boot actions specified"); + std::string library_path("/oem/lib/"); + + // This value is optionally provided by the user and will be written to + // /oem/oem.prop. + char property[PROP_VALUE_MAX] = {0}; + property_get("ro.oem.bootactions.lib", property, kDefaultLibName); + library_path += property; + + if (!::base::PathExists(::base::FilePath(library_path))) { + ALOGI("Skipping boot actions: %s does not exist", library_path.c_str()); + return; } + mBootAction = new BootAction(); + if (!mBootAction->init(library_path, mBootParameters->getParameters())) { + mBootAction = NULL; + } }; void playPart(int partNumber, const Animation::Part&, int playNumber) override { @@ -60,6 +72,20 @@ class BootActionAnimationCallbacks : public android::BootAnimation::Callbacks {p void shutdown() override { if (mBootAction != nullptr) { + // If we have a bootaction we want to wait until we are actually + // told to shut down. If the animation exits early keep the action + // running. + char value[PROPERTY_VALUE_MAX] = {0}; + for (int exitRequested = 0; exitRequested == 0; ) { + property_get("service.bootanim.exit", value, "0"); + exitRequested = atoi(value); + + // Poll value at 10hz. + if (exitRequested == 0) { + usleep(100000); + } + } + mBootAction->shutdown(); // Give it two seconds to shut down. sleep(2); @@ -68,6 +94,7 @@ class BootActionAnimationCallbacks : public android::BootAnimation::Callbacks {p }; private: + std::unique_ptr<BootParameters> mBootParameters; sp<BootAction> mBootAction = nullptr; }; @@ -76,6 +103,9 @@ private: int main() { setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY); + // Clear our params for next boot no matter what. + std::unique_ptr<BootParameters> bootParameters(new BootParameters()); + if (bootAnimationDisabled()) { ALOGI("boot animation disabled"); return 0; @@ -86,7 +116,8 @@ int main() { sp<ProcessState> proc(ProcessState::self()); ProcessState::self()->startThreadPool(); - sp<BootAnimation> boot = new BootAnimation(new BootActionAnimationCallbacks()); + sp<BootAnimation> boot = new BootAnimation( + new BootActionAnimationCallbacks(std::move(bootParameters))); IPCThreadState::self()->joinThreadPool(); return 0; |