BootParameters: Use new JSON reader

* Update JSON blob that BootParameters reads from.
* Change JSON reader to allow custom keys.

Bug: 78524407
Test: Builds. Unit tests pass. End to end flow with RebootActivity
passes values as expected.

Change-Id: I2966f560de4aaf045125946c7fbe1becd47354be
diff --git a/cmds/bootanimation/iot/BootParameters.cpp b/cmds/bootanimation/iot/BootParameters.cpp
index 06cdbf8..995a3aa 100644
--- a/cmds/bootanimation/iot/BootParameters.cpp
+++ b/cmds/bootanimation/iot/BootParameters.cpp
@@ -18,29 +18,25 @@
 
 #define LOG_TAG "BootParameters"
 
+#include <errno.h>
 #include <fcntl.h>
 
 #include <android-base/file.h>
-#include <base/json/json_parser.h>
-#include <base/json/json_reader.h>
-#include <base/json/json_value_converter.h>
 #include <utils/Log.h>
 
 using android::base::RemoveFileIfExists;
 using android::base::ReadFileToString;
-using base::JSONReader;
-using base::JSONValueConverter;
-using base::Value;
+using Json::Reader;
+using Json::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;
+// Keys for volume, brightness, and user-defined parameters.
+constexpr const char* kKeyVolume = "volume";
+constexpr const char* kKeyBrightness = "brightness";
+constexpr const char* kKeyParams = "params";
 
 constexpr const char* kNextBootFile = "/data/misc/bootanimation/next_boot.json";
 constexpr const char* kLastBootFile = "/data/misc/bootanimation/last_boot.json";
@@ -69,19 +65,6 @@
 
 }  // namespace
 
-BootParameters::SavedBootParameters::SavedBootParameters()
-    : brightness(-kFloatScaleFactor), volume(-kFloatScaleFactor) {}
-
-void BootParameters::SavedBootParameters::RegisterJSONConverter(
-        JSONValueConverter<SavedBootParameters>* 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();
@@ -100,27 +83,34 @@
 }
 
 void BootParameters::loadParameters(const std::string& raw_json) {
-    std::unique_ptr<Value> json = JSONReader::Read(raw_json);
-    if (json.get() == nullptr) {
-        return;
-    }
+  if (!Reader().parse(raw_json, mJson)) {
+    return;
+  }
 
-    JSONValueConverter<SavedBootParameters> converter;
-    if (converter.Convert(*(json.get()), &mRawParameters)) {
-        mBrightness = mRawParameters.brightness / kFloatScaleFactor;
-        mVolume = mRawParameters.volume / kFloatScaleFactor;
+  // A missing key returns a safe, missing value.
+  // Ignore invalid or missing JSON parameters.
+  Value& jsonValue = mJson[kKeyVolume];
+  if (jsonValue.isDouble()) {
+    mVolume = jsonValue.asFloat();
+  }
 
-        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");
-        }
+  jsonValue = mJson[kKeyBrightness];
+  if (jsonValue.isDouble()) {
+    mBrightness = jsonValue.asFloat();
+  }
+
+  jsonValue = mJson[kKeyParams];
+  if (jsonValue.isObject()) {
+    for (auto &key : jsonValue.getMemberNames()) {
+      Value& value = jsonValue[key];
+      if (value.isString()) {
+        mParameters.push_back({
+          .key = key.c_str(),
+          .value = value.asCString()
+        });
+      }
     }
+  }
 }
 
 }  // namespace android