diff --git a/cmds/bootanimation/iot/BootAction.cpp b/cmds/bootanimation/iot/BootAction.cpp index 7b4ef72bd8ec2..8b55147110bcd 100644 --- a/cmds/bootanimation/iot/BootAction.cpp +++ b/cmds/bootanimation/iot/BootAction.cpp @@ -32,7 +32,7 @@ BootAction::~BootAction() { } bool BootAction::init(const std::string& libraryPath, - const std::vector& parameters) { + const std::unique_ptr& bootParameters) { APeripheralManagerClient* client = nullptr; ALOGD("Connecting to peripheralmanager"); // Wait for peripheral manager to come up. @@ -77,9 +77,32 @@ bool BootAction::init(const std::string& libraryPath, mLibStartPart = reinterpret_cast(loaded); } - ALOGD("Entering boot_action_init"); - bool result = mLibInit(parameters.data(), parameters.size()); - ALOGD("Returned from boot_action_init"); + // SilentBoot is considered optional, if it isn't exported by the library + // and the boot is silent, no method is called. + loaded = nullptr; + if (!loadSymbol("boot_action_silent_boot", &loaded) || loaded == nullptr) { + ALOGW("No boot_action_silent_boot found, boot action will not be " + "executed during a silent boot."); + } else { + mLibSilentBoot = reinterpret_cast(loaded); + } + + bool result = true; + const auto& parameters = bootParameters->getParameters(); + if (bootParameters->isSilentBoot()) { + if (mLibSilentBoot != nullptr) { + ALOGD("Entering boot_action_silent_boot"); + result = mLibSilentBoot(parameters.data(), parameters.size()); + ALOGD("Returned from boot_action_silent_boot"); + } else { + ALOGW("Skipping missing boot_action_silent_boot"); + } + } else { + ALOGD("Entering boot_action_init"); + result = mLibInit(parameters.data(), parameters.size()); + ALOGD("Returned from boot_action_init"); + } + return result; } diff --git a/cmds/bootanimation/iot/BootAction.h b/cmds/bootanimation/iot/BootAction.h index 5e2495fe6c518..7119c35db0f9c 100644 --- a/cmds/bootanimation/iot/BootAction.h +++ b/cmds/bootanimation/iot/BootAction.h @@ -20,6 +20,8 @@ #include #include +#include "BootParameters.h" + #include // libandroidthings native API. #include @@ -31,7 +33,7 @@ public: // libraryPath is a fully qualified path to the target .so library. bool init(const std::string& libraryPath, - const std::vector& parameters); + const std::unique_ptr& bootParameters); // The animation is going to start playing partNumber for the playCount'th // time, update the action as needed. @@ -45,7 +47,7 @@ public: private: typedef bool (*libInit)(const ABootActionParameter* parameters, - size_t num_parameters); + size_t numParameters); typedef void (*libStartPart)(int partNumber, int playNumber); typedef void (*libShutdown)(); @@ -55,6 +57,9 @@ private: libInit mLibInit = nullptr; libStartPart mLibStartPart = nullptr; libShutdown mLibShutdown = nullptr; + + // Called only if the boot is silent. + libInit mLibSilentBoot = nullptr; }; } // namespace android diff --git a/cmds/bootanimation/iot/iotbootanimation_main.cpp b/cmds/bootanimation/iot/iotbootanimation_main.cpp index 00cef430135e9..2a3d3766ab38a 100644 --- a/cmds/bootanimation/iot/iotbootanimation_main.cpp +++ b/cmds/bootanimation/iot/iotbootanimation_main.cpp @@ -59,7 +59,7 @@ public: } mBootAction = new BootAction(); - if (!mBootAction->init(library_path, mBootParameters->getParameters())) { + if (!mBootAction->init(library_path, mBootParameters)) { mBootAction = NULL; } }; @@ -116,8 +116,16 @@ int main() { sp proc(ProcessState::self()); ProcessState::self()->startThreadPool(); - sp boot = new BootAnimation( - new BootActionAnimationCallbacks(std::move(bootParameters))); + bool isSilentBoot = bootParameters->isSilentBoot(); + sp callbacks = + new BootActionAnimationCallbacks(std::move(bootParameters)); + + // On silent boot, animations aren't displayed. + if (isSilentBoot) { + callbacks->init({}); + } else { + sp boot = new BootAnimation(callbacks); + } IPCThreadState::self()->joinThreadPool(); return 0;