summaryrefslogtreecommitdiff
path: root/cmds/bootanimation/BootAnimation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cmds/bootanimation/BootAnimation.cpp')
-rw-r--r--cmds/bootanimation/BootAnimation.cpp74
1 files changed, 49 insertions, 25 deletions
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp
index 2537edaf9e81..a1278f358380 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,28 +413,33 @@ 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;
}
}
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);
}
}