diff --git a/cmds/bootanimation/Android.bp b/cmds/bootanimation/Android.bp index e17f735b93a42..3e5877b05708b 100644 --- a/cmds/bootanimation/Android.bp +++ b/cmds/bootanimation/Android.bp @@ -40,24 +40,6 @@ cc_binary { "audioplay.cpp", ], - product_variables: { - product_is_iot: { - shared_libs: [ - "libandroidthings", - "libchrome", - ], - srcs: [ - "iot/iotbootanimation_main.cpp", - "iot/BootAction.cpp", - "iot/BootParameters.cpp", - ], - exclude_srcs: [ - "bootanimation_main.cpp", - "audioplay.cpp", - ], - }, - }, - init_rc: ["bootanim.rc"], } @@ -77,10 +59,4 @@ cc_library_shared { "libGLESv1_CM", "libgui", ], - - product_variables: { - product_is_iot: { - init_rc: ["iot/bootanim_iot.rc"], - }, - }, } diff --git a/cmds/bootanimation/iot/BootAction.cpp b/cmds/bootanimation/iot/BootAction.cpp deleted file mode 100644 index fa797444d569b..0000000000000 --- a/cmds/bootanimation/iot/BootAction.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "BootAction.h" - -#define LOG_TAG "BootAction" - -#include - -#include -#include - -namespace android { - -BootAction::~BootAction() { - if (mLibHandle != nullptr) { - dlclose(mLibHandle); - } -} - -bool BootAction::init(const std::string& libraryPath, - const std::vector& parameters) { - APeripheralManagerClient* client = nullptr; - ALOGD("Connecting to peripheralmanager"); - // Wait for peripheral manager to come up. - while (client == nullptr) { - client = APeripheralManagerClient_new(); - if (client == nullptr) { - ALOGV("peripheralmanager is not up, sleeping before we check again."); - usleep(250000); - } - } - ALOGD("Peripheralmanager is up."); - APeripheralManagerClient_delete(client); - - - ALOGI("Loading boot action %s", libraryPath.c_str()); - mLibHandle = dlopen(libraryPath.c_str(), RTLD_NOW); - if (mLibHandle == nullptr) { - ALOGE("Unable to load library at %s :: %s", - libraryPath.c_str(), dlerror()); - return false; - } - - void* loaded = nullptr; - if (!loadSymbol("boot_action_init", &loaded) || loaded == nullptr) { - return false; - } - mLibInit = reinterpret_cast(loaded); - - loaded = nullptr; - if (!loadSymbol("boot_action_shutdown", &loaded) || loaded == nullptr) { - return false; - } - mLibShutdown = reinterpret_cast(loaded); - - // StartPart is considered optional, if it isn't exported by the library - // we will still call init and shutdown. - loaded = nullptr; - if (!loadSymbol("boot_action_start_part", &loaded) || loaded == nullptr) { - ALOGI("No boot_action_start_part found, action will not be told when " - "Animation parts change."); - } else { - mLibStartPart = reinterpret_cast(loaded); - } - - ALOGD("Entering boot_action_init"); - bool result = mLibInit(parameters.data(), parameters.size()); - ALOGD("Returned from boot_action_init"); - return result; -} - -void BootAction::startPart(int partNumber, int playNumber) { - if (mLibStartPart == nullptr) return; - - ALOGD("Entering boot_action_start_part"); - mLibStartPart(partNumber, playNumber); - ALOGD("Returned from boot_action_start_part"); -} - -void BootAction::shutdown() { - ALOGD("Entering boot_action_shutdown"); - mLibShutdown(); - ALOGD("Returned from boot_action_shutdown"); -} - -bool BootAction::loadSymbol(const char* symbol, void** loaded) { - *loaded = dlsym(mLibHandle, symbol); - if (loaded == nullptr) { - ALOGE("Unable to load symbol : %s :: %s", symbol, dlerror()); - return false; - } - return true; -} - -} // namespace android diff --git a/cmds/bootanimation/iot/BootAction.h b/cmds/bootanimation/iot/BootAction.h deleted file mode 100644 index 5e2495fe6c518..0000000000000 --- a/cmds/bootanimation/iot/BootAction.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _BOOTANIMATION_BOOTACTION_H -#define _BOOTANIMATION_BOOTACTION_H - -#include -#include - -#include // libandroidthings native API. -#include - -namespace android { - -class BootAction : public RefBase { -public: - ~BootAction(); - - // libraryPath is a fully qualified path to the target .so library. - bool init(const std::string& libraryPath, - const std::vector& parameters); - - // The animation is going to start playing partNumber for the playCount'th - // time, update the action as needed. - // This is run in the same thread as the boot animation, - // you must not block here. - void startPart(int partNumber, int playCount); - - // Shutdown the boot action, this will be called shortly before the - // process is shut down to allow time for cleanup. - void shutdown(); - -private: - typedef bool (*libInit)(const ABootActionParameter* parameters, - size_t num_parameters); - typedef void (*libStartPart)(int partNumber, int playNumber); - typedef void (*libShutdown)(); - - bool loadSymbol(const char* symbol, void** loaded); - - void* mLibHandle = nullptr; - libInit mLibInit = nullptr; - libStartPart mLibStartPart = nullptr; - libShutdown mLibShutdown = nullptr; -}; - -} // namespace android - - -#endif // _BOOTANIMATION_BOOTACTION_H diff --git a/cmds/bootanimation/iot/BootParameters.cpp b/cmds/bootanimation/iot/BootParameters.cpp deleted file mode 100644 index da6ad0d1f08f9..0000000000000 --- a/cmds/bootanimation/iot/BootParameters.cpp +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "BootParameters.h" - -#define LOG_TAG "BootParameters" - -#include - -#include - -#include -#include -#include -#include -#include - -using android::base::RemoveFileIfExists; -using android::base::ReadFileToString; -using base::JSONReader; -using base::JSONValueConverter; -using base::Value; - -namespace android { - -namespace { - -// Brightness and volume are stored as integer strings in next_boot.json. -// They are divided by this constant to produce the actual float values in -// range [0.0, 1.0]. This constant must match its counterpart in -// DeviceManager. -constexpr const float kFloatScaleFactor = 1000.0f; - -constexpr const char* kNextBootFile = "/data/misc/bootanimation/next_boot.json"; -constexpr const char* kLastBootFile = "/data/misc/bootanimation/last_boot.json"; - -void swapBootConfigs() { - // rename() will fail if next_boot.json doesn't exist, so delete - // last_boot.json manually first. - std::string err; - if (!RemoveFileIfExists(kLastBootFile, &err)) - ALOGE("Unable to delete last boot file: %s", err.c_str()); - - if (rename(kNextBootFile, kLastBootFile) && errno != ENOENT) - ALOGE("Unable to swap boot files: %s", strerror(errno)); - - int fd = open(kNextBootFile, O_CREAT, DEFFILEMODE); - if (fd == -1) { - ALOGE("Unable to create next boot file: %s", strerror(errno)); - } else { - // Make next_boot.json writable to everyone so DeviceManagementService - // can save saved_parameters there. - if (fchmod(fd, DEFFILEMODE)) - ALOGE("Unable to set next boot file permissions: %s", strerror(errno)); - close(fd); - } -} - -} // namespace - -BootParameters::SavedBootParameters::SavedBootParameters() - : brightness(-kFloatScaleFactor), volume(-kFloatScaleFactor) {} - -void BootParameters::SavedBootParameters::RegisterJSONConverter( - JSONValueConverter* converter) { - converter->RegisterIntField("brightness", &SavedBootParameters::brightness); - converter->RegisterIntField("volume", &SavedBootParameters::volume); - converter->RegisterRepeatedString("param_names", - &SavedBootParameters::param_names); - converter->RegisterRepeatedString("param_values", - &SavedBootParameters::param_values); -} - -BootParameters::BootParameters() { - swapBootConfigs(); - loadParameters(); -} - -void BootParameters::loadParameters() { - std::string contents; - if (!ReadFileToString(kLastBootFile, &contents)) { - if (errno != ENOENT) - ALOGE("Unable to read from %s: %s", kLastBootFile, strerror(errno)); - - return; - } - - std::unique_ptr json = JSONReader::Read(contents); - if (json.get() == nullptr) { - return; - } - - JSONValueConverter converter; - if (converter.Convert(*(json.get()), &mRawParameters)) { - mBrightness = mRawParameters.brightness / kFloatScaleFactor; - mVolume = mRawParameters.volume / kFloatScaleFactor; - - if (mRawParameters.param_names.size() == mRawParameters.param_values.size()) { - for (size_t i = 0; i < mRawParameters.param_names.size(); i++) { - mParameters.push_back({ - .key = mRawParameters.param_names[i]->c_str(), - .value = mRawParameters.param_values[i]->c_str() - }); - } - } else { - ALOGW("Parameter names and values size mismatch"); - } - } -} - -} // namespace android diff --git a/cmds/bootanimation/iot/BootParameters.h b/cmds/bootanimation/iot/BootParameters.h deleted file mode 100644 index c10bd44bc2ca6..0000000000000 --- a/cmds/bootanimation/iot/BootParameters.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _BOOTANIMATION_BOOT_PARAMETERS_H_ -#define _BOOTANIMATION_BOOT_PARAMETERS_H_ - -#include -#include - -#include -#include // libandroidthings native API. - -namespace android { - -// Provides access to the parameters set by DeviceManager.reboot(). -class BootParameters { -public: - // Constructor loads the parameters for this boot and swaps the param files - // to clear the parameters for next boot. - BootParameters(); - - // Returns true if volume/brightness were explicitly set on reboot. - bool hasVolume() const { return mVolume >= 0; } - bool hasBrightness() const { return mBrightness >= 0; } - - // Returns volume/brightness in [0,1], or -1 if unset. - float getVolume() const { return mVolume; } - float getBrightness() const { return mBrightness; } - - // Returns the additional boot parameters that were set on reboot. - const std::vector& getParameters() const { return mParameters; } - -private: - // Raw boot saved_parameters loaded from .json. - struct SavedBootParameters { - int brightness; - int volume; - std::vector> param_names; - std::vector> param_values; - - SavedBootParameters(); - static void RegisterJSONConverter( - ::base::JSONValueConverter* converter); - }; - - void loadParameters(); - - float mVolume = -1.f; - float mBrightness = -1.f; - std::vector mParameters; - - // ABootActionParameter is just a raw pointer so we need to keep the - // original strings around to avoid losing them. - SavedBootParameters mRawParameters; -}; - -} // namespace android - - -#endif // _BOOTANIMATION_BOOT_PARAMETERS_H_ diff --git a/cmds/bootanimation/iot/bootanim_iot.rc b/cmds/bootanimation/iot/bootanim_iot.rc deleted file mode 100644 index 2fc13364b53dc..0000000000000 --- a/cmds/bootanimation/iot/bootanim_iot.rc +++ /dev/null @@ -1,2 +0,0 @@ -on post-fs-data - mkdir /data/misc/bootanimation 0777 root root diff --git a/cmds/bootanimation/iot/iotbootanimation_main.cpp b/cmds/bootanimation/iot/iotbootanimation_main.cpp deleted file mode 100644 index 00cef430135e9..0000000000000 --- a/cmds/bootanimation/iot/iotbootanimation_main.cpp +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define LOG_TAG "IotBootAnimation" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "BootAction.h" -#include "BootAnimationUtil.h" -#include "BootParameters.h" - -using namespace android; - -// Create a typedef for readability. -typedef android::BootAnimation::Animation Animation; - -namespace { - -constexpr const char* kDefaultLibName = "libbootaction.so"; - -class BootActionAnimationCallbacks : public android::BootAnimation::Callbacks { -public: - BootActionAnimationCallbacks(std::unique_ptr bootParameters) - : mBootParameters(std::move(bootParameters)) {} - - void init(const Vector&) override { - 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 { - if (mBootAction != nullptr) { - mBootAction->startPart(partNumber, playNumber); - } - }; - - 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); - mBootAction = nullptr; - } - }; - -private: - std::unique_ptr mBootParameters; - sp mBootAction = nullptr; -}; - -} // namespace - -int main() { - setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY); - - // Clear our params for next boot no matter what. - std::unique_ptr bootParameters(new BootParameters()); - - if (bootAnimationDisabled()) { - ALOGI("boot animation disabled"); - return 0; - } - - waitForSurfaceFlinger(); - - sp proc(ProcessState::self()); - ProcessState::self()->startThreadPool(); - - sp boot = new BootAnimation( - new BootActionAnimationCallbacks(std::move(bootParameters))); - - IPCThreadState::self()->joinThreadPool(); - return 0; -}