Try to load colors more frequently
During OTA, sysprops aren't available as early in the boot process.
This causes the boot animation to not have dynamic colors.
This CL tries to load the colors more frequently, at every part loop.
Before we'd only try on the first frame of each animation part.
Test: adb shell bootanimation
Fixes: 229029861
Change-Id: I1bbebf93b4fbc31d945c4181472576cf29f13bc7
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp
index fb68c6d..50c8e93 100644
--- a/cmds/bootanimation/BootAnimation.cpp
+++ b/cmds/bootanimation/BootAnimation.cpp
@@ -1459,6 +1459,8 @@
int fadedFramesCount = 0;
int lastDisplayedProgress = 0;
+ int colorTransitionStart = animation.colorTransitionStart;
+ int colorTransitionEnd = animation.colorTransitionEnd;
for (size_t i=0 ; i<pcount ; i++) {
const Animation::Part& part(animation.parts[i]);
const size_t fcount = part.frames.size();
@@ -1471,15 +1473,27 @@
continue; //to next part
}
- if (animation.dynamicColoringEnabled && part.useDynamicColoring && !mDynamicColorsApplied) {
- SLOGD("Trying to load dynamic color sysprops.");
- initDynamicColors();
- }
-
// process the part not only while the count allows but also if already fading
for (int r=0 ; !part.count || r<part.count || fadedFramesCount > 0 ; r++) {
if (shouldStopPlayingPart(part, fadedFramesCount, lastDisplayedProgress)) break;
+ // It's possible that the sysprops were not loaded yet at this boot phase.
+ // If that's the case, then we should keep trying until they are available.
+ if (animation.dynamicColoringEnabled && !mDynamicColorsApplied
+ && (part.useDynamicColoring || part.postDynamicColoring)) {
+ SLOGD("Trying to load dynamic color sysprops.");
+ initDynamicColors();
+ if (mDynamicColorsApplied) {
+ // Sysprops were loaded. Next step is to adjust the animation if we loaded
+ // the colors after the animation should have started.
+ const int transitionLength = colorTransitionEnd - colorTransitionStart;
+ if (part.postDynamicColoring) {
+ colorTransitionStart = 0;
+ colorTransitionEnd = fmin(transitionLength, fcount - 1);
+ }
+ }
+ }
+
mCallbacks->playPart(i, part, r);
glClearColor(
@@ -1509,9 +1523,8 @@
// - 1 for parts that come after.
float colorProgress = part.useDynamicColoring
? fmin(fmax(
- ((float)j - animation.colorTransitionStart) /
- fmax(animation.colorTransitionEnd -
- animation.colorTransitionStart, 1.0f), 0.0f), 1.0f)
+ ((float)j - colorTransitionStart) /
+ fmax(colorTransitionEnd - colorTransitionStart, 1.0f), 0.0f), 1.0f)
: (part.postDynamicColoring ? 1 : 0);
processDisplayEvents();