summaryrefslogtreecommitdiff
path: root/cmds/bootanimation/iot/iotbootanimation_main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cmds/bootanimation/iot/iotbootanimation_main.cpp')
-rw-r--r--cmds/bootanimation/iot/iotbootanimation_main.cpp57
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;