Move boot color sysprop parsing to after loading zips.

Otherwise the sysprops would not be loaded yet and accessing them would
return empty strings.

Though unlikely, this is not 100% safe because boot color sysprops
are not guaranteed to be loaded by the time zips are loaded. A TODO
here is to understand boot steps and their timing implications so
that we can fully avoid the race condition.

Bug: 190093578
Test: adb shell setprop persist.bootanim.color(1-4), then reboot phone.
Change-Id: I603da080b1732a436a10dbaca6f2be9f158124dc
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp
index fa94e6a..98e447c 100644
--- a/cmds/bootanimation/BootAnimation.cpp
+++ b/cmds/bootanimation/BootAnimation.cpp
@@ -729,22 +729,6 @@
     glVertexAttribPointer(uvLocation, 2, GL_FLOAT, GL_FALSE, 0, quadUVs);
     glEnableVertexAttribArray(uvLocation);
 
-    if (dynamicColoringEnabled) {
-        glUseProgram(mImageShader);
-        SLOGI("[BootAnimation] Dynamically coloring boot animation.");
-        for (int i = 0; i < DYNAMIC_COLOR_COUNT; i++) {
-            float *startColor = mAnimation->startColors[i];
-            float *endColor = mAnimation->endColors[i];
-            glUniform4f(glGetUniformLocation(mImageShader,
-                (U_START_COLOR_PREFIX + std::to_string(i)).c_str()),
-                startColor[0], startColor[1], startColor[2], 1 /* alpha */);
-            glUniform4f(glGetUniformLocation(mImageShader,
-                (U_END_COLOR_PREFIX + std::to_string(i)).c_str()),
-                endColor[0], endColor[1], endColor[2], 1 /* alpha */);
-        }
-        mImageColorProgressLocation = glGetUniformLocation(mImageShader, U_COLOR_PROGRESS);
-    }
-
     // Initialize text shader.
     mTextShader = linkShader(vertexShader, textFragmentShader);
     positionLocation = glGetAttribLocation(mTextShader, A_POSITION);
@@ -1180,12 +1164,6 @@
         s = ++endl;
     }
 
-    for (int i = 0; i < DYNAMIC_COLOR_COUNT; i++) {
-        parseColorDecimalString(
-            android::base::GetProperty("persist.bootanim.color" + std::to_string(i + 1), ""),
-            animation.endColors[i], animation.startColors[i]);
-    }
-
     return true;
 }
 
@@ -1362,6 +1340,10 @@
         mTimeCheckThread->run("BootAnimation::TimeCheckThread", PRIORITY_NORMAL);
     }
 
+    if (mAnimation != nullptr && mAnimation->dynamicColoringEnabled) {
+        initDynamicColors();
+    }
+
     playAnimation(*mAnimation);
 
     if (mTimeCheckThread != nullptr) {
@@ -1415,6 +1397,27 @@
         sizeof(quadPositions) / sizeof(quadPositions[0]) / 2);
 }
 
+void BootAnimation::initDynamicColors() {
+    for (int i = 0; i < DYNAMIC_COLOR_COUNT; i++) {
+        parseColorDecimalString(
+            android::base::GetProperty("persist.bootanim.color" + std::to_string(i + 1), ""),
+            mAnimation->endColors[i], mAnimation->startColors[i]);
+    }
+    glUseProgram(mImageShader);
+    SLOGI("[BootAnimation] Dynamically coloring boot animation.");
+    for (int i = 0; i < DYNAMIC_COLOR_COUNT; i++) {
+        float *startColor = mAnimation->startColors[i];
+        float *endColor = mAnimation->endColors[i];
+        glUniform4f(glGetUniformLocation(mImageShader,
+            (U_START_COLOR_PREFIX + std::to_string(i)).c_str()),
+            startColor[0], startColor[1], startColor[2], 1 /* alpha */);
+        glUniform4f(glGetUniformLocation(mImageShader,
+            (U_END_COLOR_PREFIX + std::to_string(i)).c_str()),
+            endColor[0], endColor[1], endColor[2], 1 /* alpha */);
+    }
+    mImageColorProgressLocation = glGetUniformLocation(mImageShader, U_COLOR_PROGRESS);
+}
+
 bool BootAnimation::playAnimation(const Animation& animation) {
     const size_t pcount = animation.parts.size();
     nsecs_t frameDuration = s2ns(1) / animation.fps;
diff --git a/cmds/bootanimation/BootAnimation.h b/cmds/bootanimation/BootAnimation.h
index 8bb3256..0e29621 100644
--- a/cmds/bootanimation/BootAnimation.h
+++ b/cmds/bootanimation/BootAnimation.h
@@ -204,6 +204,7 @@
     void checkExit();
 
     void handleViewport(nsecs_t timestep);
+    void initDynamicColors();
 
     sp<SurfaceComposerClient>       mSession;
     AssetManager mAssets;