diff options
Diffstat (limited to 'cmds/bootanimation/BootAnimation.cpp')
-rw-r--r-- | cmds/bootanimation/BootAnimation.cpp | 74 |
1 files changed, 49 insertions, 25 deletions
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp index 9af2a96cbe13..f31435834458 100644 --- a/cmds/bootanimation/BootAnimation.cpp +++ b/cmds/bootanimation/BootAnimation.cpp @@ -17,6 +17,8 @@ #define LOG_NDEBUG 0 #define LOG_TAG "BootAnimation" +#include <vector> + #include <stdint.h> #include <inttypes.h> #include <sys/inotify.h> @@ -40,10 +42,10 @@ #include <android-base/properties.h> +#include <ui/DisplayConfig.h> #include <ui/PixelFormat.h> #include <ui/Rect.h> #include <ui/Region.h> -#include <ui/DisplayInfo.h> #include <gui/ISurfaceComposer.h> #include <gui/Surface.h> @@ -80,6 +82,10 @@ static const char OEM_SHUTDOWNANIMATION_FILE[] = "/oem/media/shutdownanimation.z static const char PRODUCT_SHUTDOWNANIMATION_FILE[] = "/product/media/shutdownanimation.zip"; static const char SYSTEM_SHUTDOWNANIMATION_FILE[] = "/system/media/shutdownanimation.zip"; +static constexpr const char* PRODUCT_USERSPACE_REBOOT_ANIMATION_FILE = "/product/media/userspace-reboot.zip"; +static constexpr const char* OEM_USERSPACE_REBOOT_ANIMATION_FILE = "/oem/media/userspace-reboot.zip"; +static constexpr const char* SYSTEM_USERSPACE_REBOOT_ANIMATION_FILE = "/system/media/userspace-reboot.zip"; + static const char SYSTEM_DATA_DIR_PATH[] = "/data/system"; static const char SYSTEM_TIME_DIR_NAME[] = "time"; static const char SYSTEM_TIME_DIR_PATH[] = "/data/system/time"; @@ -277,16 +283,19 @@ status_t BootAnimation::readyToRun() { mDisplayToken = SurfaceComposerClient::getInternalDisplayToken(); if (mDisplayToken == nullptr) - return -1; + return NAME_NOT_FOUND; + + DisplayConfig displayConfig; + const status_t error = + SurfaceComposerClient::getActiveDisplayConfig(mDisplayToken, &displayConfig); + if (error != NO_ERROR) + return error; - DisplayInfo dinfo; - status_t status = SurfaceComposerClient::getDisplayInfo(mDisplayToken, &dinfo); - if (status) - return -1; + const ui::Size& resolution = displayConfig.resolution; // create the native surface sp<SurfaceControl> control = session()->createSurface(String8("BootAnimation"), - dinfo.w, dinfo.h, PIXEL_FORMAT_RGB_565); + resolution.getWidth(), resolution.getHeight(), PIXEL_FORMAT_RGB_565); SurfaceComposerClient::Transaction t; @@ -384,6 +393,16 @@ bool BootAnimation::preloadAnimation() { return false; } +bool BootAnimation::findBootAnimationFileInternal(const std::vector<std::string> &files) { + for (const std::string& f : files) { + if (access(f.c_str(), R_OK) == 0) { + mZipFileName = f.c_str(); + return true; + } + } + return false; +} + void BootAnimation::findBootAnimationFile() { // If the device has encryption turned on or is in process // of being encrypted we show the encrypted boot animation. @@ -394,13 +413,11 @@ void BootAnimation::findBootAnimationFile() { !strcmp("trigger_restart_min_framework", decrypt); if (!mShuttingDown && encryptedAnimation) { - static const char* encryptedBootFiles[] = - {PRODUCT_ENCRYPTED_BOOTANIMATION_FILE, SYSTEM_ENCRYPTED_BOOTANIMATION_FILE}; - for (const char* f : encryptedBootFiles) { - if (access(f, R_OK) == 0) { - mZipFileName = f; - return; - } + static const std::vector<std::string> encryptedBootFiles = { + PRODUCT_ENCRYPTED_BOOTANIMATION_FILE, SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, + }; + if (findBootAnimationFileInternal(encryptedBootFiles)) { + return; } } @@ -416,17 +433,24 @@ void BootAnimation::findBootAnimationFile() { } const bool playDarkAnim = android::base::GetIntProperty("ro.boot.theme", 0) == 1; - static const char* bootFiles[] = - {APEX_BOOTANIMATION_FILE, playDarkAnim ? PRODUCT_BOOTANIMATION_DARK_FILE : PRODUCT_BOOTANIMATION_FILE, - OEM_BOOTANIMATION_FILE, SYSTEM_BOOTANIMATION_FILE}; - static const char* shutdownFiles[] = - {PRODUCT_SHUTDOWNANIMATION_FILE, OEM_SHUTDOWNANIMATION_FILE, SYSTEM_SHUTDOWNANIMATION_FILE, ""}; - - for (const char* f : (!mShuttingDown ? bootFiles : shutdownFiles)) { - if (access(f, R_OK) == 0) { - mZipFileName = f; - return; - } + static const std::vector<std::string> bootFiles = { + APEX_BOOTANIMATION_FILE, playDarkAnim ? PRODUCT_BOOTANIMATION_DARK_FILE : PRODUCT_BOOTANIMATION_FILE, + OEM_BOOTANIMATION_FILE, SYSTEM_BOOTANIMATION_FILE + }; + static const std::vector<std::string> shutdownFiles = { + PRODUCT_SHUTDOWNANIMATION_FILE, OEM_SHUTDOWNANIMATION_FILE, SYSTEM_SHUTDOWNANIMATION_FILE, "" + }; + static const std::vector<std::string> userspaceRebootFiles = { + PRODUCT_USERSPACE_REBOOT_ANIMATION_FILE, OEM_USERSPACE_REBOOT_ANIMATION_FILE, + SYSTEM_USERSPACE_REBOOT_ANIMATION_FILE, + }; + + if (android::base::GetBoolProperty("sys.init.userspace_reboot.in_progress", false)) { + findBootAnimationFileInternal(userspaceRebootFiles); + } else if (mShuttingDown) { + findBootAnimationFileInternal(shutdownFiles); + } else { + findBootAnimationFileInternal(bootFiles); } } |