diff --git a/modules/camera/3_4/V4L2Camera.cpp b/modules/camera/3_4/V4L2Camera.cpp
index cb310a7..b3ae4fc 100644
--- a/modules/camera/3_4/V4L2Camera.cpp
+++ b/modules/camera/3_4/V4L2Camera.cpp
@@ -33,6 +33,19 @@
 
 namespace v4l2_camera_hal {
 
+// Helper function for managing metadata.
+static std::vector<int32_t> getMetadataKeys(
+    const camera_metadata_t* metadata) {
+  std::vector<int32_t> keys;
+  size_t num_entries = get_camera_metadata_entry_count(metadata);
+  for (size_t i = 0; i < num_entries; ++i) {
+    camera_metadata_ro_entry_t entry;
+    get_camera_metadata_ro_entry(metadata, i, &entry);
+    keys.push_back(entry.tag);
+  }
+  return keys;
+}
+
 V4L2Camera::V4L2Camera(int id, std::string path)
     : default_camera_hal::Camera(id),
       mDevicePath(std::move(path)),
@@ -95,13 +108,6 @@
 
   android::CameraMetadata info;
 
-  std::vector<int32_t> avail_characteristics_keys;
-
-#define ADD_STATIC_ENTRY(name, varptr, count) \
-  avail_characteristics_keys.push_back(name); \
-  res = info.update(name, varptr, count); \
-  if (res != android::OK) return res
-
   // Static metadata characteristics from /system/media/camera/docs/docs.html.
 
   /* android.colorCorrection. */
@@ -111,70 +117,118 @@
   uint8_t avail_aberration_modes[] = {
     ANDROID_COLOR_CORRECTION_ABERRATION_MODE_FAST,
     ANDROID_COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY};
-  ADD_STATIC_ENTRY(ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES,
-                   avail_aberration_modes, ARRAY_SIZE(avail_aberration_modes));
+  res = info.update(ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES,
+                    avail_aberration_modes, ARRAY_SIZE(avail_aberration_modes));
+  if (res != android::OK) {
+    return res;
+  }
 
   /* android.control. */
 
   /*   3As */
 
-  ADD_STATIC_ENTRY(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
-                   mAeAntibandingModes.data(), mAeAntibandingModes.size());
+  res = info.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
+                    mAeAntibandingModes.data(), mAeAntibandingModes.size());
+  if (res != android::OK) {
+    return res;
+  }
 
-  ADD_STATIC_ENTRY(ANDROID_CONTROL_AE_AVAILABLE_MODES,
-                   mAeModes.data(), mAeModes.size());
+  res = info.update(ANDROID_CONTROL_AE_AVAILABLE_MODES,
+                    mAeModes.data(), mAeModes.size());
+  if (res != android::OK) {
+    return res;
+  }
 
   // Flatten mFpsRanges.
-  ADD_STATIC_ENTRY(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
-                   mFpsRanges.data(), mFpsRanges.total_num_elements());
+  res = info.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
+                    mFpsRanges.data(), mFpsRanges.total_num_elements());
+  if (res != android::OK) {
+    return res;
+  }
 
-  ADD_STATIC_ENTRY(ANDROID_CONTROL_AE_COMPENSATION_RANGE,
-                   mAeCompensationRange.data(), mAeCompensationRange.size());
+  res = info.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE,
+                    mAeCompensationRange.data(), mAeCompensationRange.size());
+  if (res != android::OK) {
+    return res;
+  }
 
-  ADD_STATIC_ENTRY(ANDROID_CONTROL_AE_COMPENSATION_STEP,
-                   &mAeCompensationStep, 1);
+  res = info.update(ANDROID_CONTROL_AE_COMPENSATION_STEP,
+                    &mAeCompensationStep, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
-  ADD_STATIC_ENTRY(ANDROID_CONTROL_AF_AVAILABLE_MODES,
-                   mAfModes.data(), mAfModes.size());
+  res = info.update(ANDROID_CONTROL_AF_AVAILABLE_MODES,
+                    mAfModes.data(), mAfModes.size());
+  if (res != android::OK) {
+    return res;
+  }
 
-  ADD_STATIC_ENTRY(ANDROID_CONTROL_AWB_AVAILABLE_MODES,
-                   mAwbModes.data(), mAwbModes.size());
+  res = info.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES,
+                    mAwbModes.data(), mAwbModes.size());
+  if (res != android::OK) {
+    return res;
+  }
 
   // Couldn't find any V4L2 support for regions, though maybe it's out there.
   int32_t max_regions[] = {/*AE*/ 0,/*AWB*/ 0,/*AF*/ 0};
-  ADD_STATIC_ENTRY(ANDROID_CONTROL_MAX_REGIONS,
-                   max_regions, ARRAY_SIZE(max_regions));
+  res = info.update(ANDROID_CONTROL_MAX_REGIONS,
+                    max_regions, ARRAY_SIZE(max_regions));
+  if (res != android::OK) {
+    return res;
+  }
 
-  ADD_STATIC_ENTRY(ANDROID_CONTROL_AE_LOCK_AVAILABLE,
-                   &mAeLockAvailable, 1);
-  ADD_STATIC_ENTRY(ANDROID_CONTROL_AWB_LOCK_AVAILABLE,
-                   &mAwbLockAvailable, 1);
+  res = info.update(ANDROID_CONTROL_AE_LOCK_AVAILABLE,
+                    &mAeLockAvailable, 1);
+  if (res != android::OK) {
+    return res;
+  }
+  res = info.update(ANDROID_CONTROL_AWB_LOCK_AVAILABLE,
+                    &mAwbLockAvailable, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   /*   Scene modes. */
 
-  ADD_STATIC_ENTRY(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
-                   mSceneModes.data(), mSceneModes.size());
+  res = info.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
+                    mSceneModes.data(), mSceneModes.size());
+  if (res != android::OK) {
+    return res;
+  }
 
   // A 3-tuple of AE, AWB, AF overrides for each scene mode.
   // Ignored for DISABLED, FACE_PRIORITY and FACE_PRIORITY_LOW_LIGHT.
   uint8_t scene_mode_overrides[] = {
     /*SCENE_MODE_DISABLED*/ /*AE*/0, /*AW*/0, /*AF*/0};
-  ADD_STATIC_ENTRY(ANDROID_CONTROL_SCENE_MODE_OVERRIDES,
-                   scene_mode_overrides, ARRAY_SIZE(scene_mode_overrides));
+  res = info.update(ANDROID_CONTROL_SCENE_MODE_OVERRIDES,
+                    scene_mode_overrides, ARRAY_SIZE(scene_mode_overrides));
+  if (res != android::OK) {
+    return res;
+  }
 
   /*   Top level 3A/Scenes switch. */
 
-  ADD_STATIC_ENTRY(ANDROID_CONTROL_AVAILABLE_MODES,
-                   mControlModes.data(), mControlModes.size());
+  res = info.update(ANDROID_CONTROL_AVAILABLE_MODES,
+                    mControlModes.data(), mControlModes.size());
+  if (res != android::OK) {
+    return res;
+  }
 
   /*   Other android.control configuration. */
 
-  ADD_STATIC_ENTRY(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
-                   mVideoStabilizationModes.data(),
-                   mVideoStabilizationModes.size());
+  res = info.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
+                    mVideoStabilizationModes.data(),
+                    mVideoStabilizationModes.size());
+  if (res != android::OK) {
+    return res;
+  }
 
-  ADD_STATIC_ENTRY(ANDROID_CONTROL_AVAILABLE_EFFECTS,
-                   mEffects.data(), mEffects.size());
+  res = info.update(ANDROID_CONTROL_AVAILABLE_EFFECTS,
+                    mEffects.data(), mEffects.size());
+  if (res != android::OK) {
+    return res;
+  }
 
   // AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS only necessary
   // for devices supporting CONSTRAINED_HIGH_SPEED_VIDEO,
@@ -190,13 +244,19 @@
   // either way it's fine to list.
   uint8_t avail_edge_modes[] = {
     ANDROID_EDGE_MODE_FAST};
-  ADD_STATIC_ENTRY(ANDROID_EDGE_AVAILABLE_EDGE_MODES,
-                   avail_edge_modes, ARRAY_SIZE(avail_edge_modes));
+  res = info.update(ANDROID_EDGE_AVAILABLE_EDGE_MODES,
+                    avail_edge_modes, ARRAY_SIZE(avail_edge_modes));
+  if (res != android::OK) {
+    return res;
+  }
 
   /* android.flash. */
 
-  ADD_STATIC_ENTRY(ANDROID_FLASH_INFO_AVAILABLE,
-                   &mFlashAvailable, 1);
+  res = info.update(ANDROID_FLASH_INFO_AVAILABLE,
+                    &mFlashAvailable, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   // info.chargeDuration, color.Temperature, maxEnergy marked FUTURE.
 
@@ -207,8 +267,11 @@
   uint8_t avail_hot_pixel_modes[] = {
     ANDROID_HOT_PIXEL_MODE_FAST,
     ANDROID_HOT_PIXEL_MODE_HIGH_QUALITY};
-  ADD_STATIC_ENTRY(ANDROID_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES,
-                   avail_hot_pixel_modes, ARRAY_SIZE(avail_hot_pixel_modes));
+  res = info.update(ANDROID_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES,
+                    avail_hot_pixel_modes, ARRAY_SIZE(avail_hot_pixel_modes));
+  if (res != android::OK) {
+    return res;
+  }
 
   /* android.jpeg. */
 
@@ -217,54 +280,84 @@
   // since V4L2 doesn't actually allow for thumbnail size control.
   int32_t thumbnail_sizes[] = {
     0, 0};
-  ADD_STATIC_ENTRY(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
-                   thumbnail_sizes, ARRAY_SIZE(thumbnail_sizes));
+  res = info.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
+                    thumbnail_sizes, ARRAY_SIZE(thumbnail_sizes));
+  if (res != android::OK) {
+    return res;
+  }
 
   // V4L2 doesn't support querying this, so we generously assume up to 3 MB.
   int32_t max_jpeg_size = 3000000;
-  ADD_STATIC_ENTRY(ANDROID_JPEG_MAX_SIZE,
-                   &max_jpeg_size, 1);
+  res = info.update(ANDROID_JPEG_MAX_SIZE,
+                    &max_jpeg_size, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   /* android.lens. */
 
   /*   Misc. lens control. */
 
-  ADD_STATIC_ENTRY(ANDROID_LENS_INFO_AVAILABLE_APERTURES,
-                   &mAperture, 1);
+  res = info.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES,
+                    &mAperture, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
-  ADD_STATIC_ENTRY(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,
-                   &mFilterDensity, 1);
+  res = info.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,
+                    &mFilterDensity, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
-  ADD_STATIC_ENTRY(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
-                   mOpticalStabilizationModes.data(),
-                   mOpticalStabilizationModes.size());
+  res = info.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
+                    mOpticalStabilizationModes.data(),
+                    mOpticalStabilizationModes.size());
+  if (res != android::OK) {
+    return res;
+  }
 
   // No known V4L2 shading map info.
   int32_t shading_map_size[] = {1, 1};
-  ADD_STATIC_ENTRY(ANDROID_LENS_INFO_SHADING_MAP_SIZE,
-                   shading_map_size, ARRAY_SIZE(shading_map_size));
+  res = info.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE,
+                    shading_map_size, ARRAY_SIZE(shading_map_size));
+  if (res != android::OK) {
+    return res;
+  }
 
   // All V4L2 devices are considered to be external facing.
   uint8_t facing = ANDROID_LENS_FACING_EXTERNAL;
-  ADD_STATIC_ENTRY(ANDROID_LENS_FACING, &facing, 1);
+  res = info.update(ANDROID_LENS_FACING, &facing, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   /*   Zoom/Focus. */
 
   // No way to actually get the focal length in V4L2, but it's a required key,
   // so we just fake it.
-  ADD_STATIC_ENTRY(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
-                   &mFocalLength, 1);
+  res = info.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
+                    &mFocalLength, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   // V4L2 focal units do not correspond to a particular physical unit.
   uint8_t focus_calibration =
       ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED;
-  ADD_STATIC_ENTRY(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION,
-                   &focus_calibration, 1);
+  res = info.update(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION,
+                    &focus_calibration, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   // info.hyperfocalDistance not required for UNCALIBRATED.
 
-  ADD_STATIC_ENTRY(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
-                   &mFocusDistance, 1);
+  res = info.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
+                    &mFocusDistance, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   /*   Depth. */
 
@@ -279,9 +372,12 @@
   // Unable to control noise reduction in V4L2 devices,
   // but FAST is allowed to be the same as OFF.
   uint8_t avail_noise_reduction_modes[] = {ANDROID_NOISE_REDUCTION_MODE_FAST};
-  ADD_STATIC_ENTRY(ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES,
-                   avail_noise_reduction_modes,
-                   ARRAY_SIZE(avail_noise_reduction_modes));
+  res = info.update(ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES,
+                    avail_noise_reduction_modes,
+                    ARRAY_SIZE(avail_noise_reduction_modes));
+  if (res != android::OK) {
+    return res;
+  }
 
   /* android.request. */
 
@@ -289,16 +385,22 @@
   // for LIMITED devices.
   int32_t max_num_output_streams[] = {
     /*Raw*/0, /*YUV*/2, /*JPEG*/1};
-  ADD_STATIC_ENTRY(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS,
-                   max_num_output_streams, ARRAY_SIZE(max_num_output_streams));
+  res = info.update(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS,
+                    max_num_output_streams, ARRAY_SIZE(max_num_output_streams));
+  if (res != android::OK) {
+    return res;
+  }
 
   // Reprocessing not supported, so no maxNumInputStreams.
 
   // No way to know for V4L2, so fake with max allowable latency.
   // Doesn't mean much without per-frame controls.
   uint8_t pipeline_max_depth = 4;
-  ADD_STATIC_ENTRY(ANDROID_REQUEST_PIPELINE_MAX_DEPTH,
-                   &pipeline_max_depth, 1);
+  res = info.update(ANDROID_REQUEST_PIPELINE_MAX_DEPTH,
+                    &pipeline_max_depth, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   // Partial results not supported; partialResultCount defaults to 1.
 
@@ -308,56 +410,89 @@
 
   /*   Cropping. */
 
-  ADD_STATIC_ENTRY(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
-                   &mMaxZoom, 1);
+  res = info.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
+                    &mMaxZoom, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
-  ADD_STATIC_ENTRY(ANDROID_SCALER_CROPPING_TYPE, &mCropType, 1);
+  res = info.update(ANDROID_SCALER_CROPPING_TYPE, &mCropType, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   /*   Streams. */
 
   // availableInputOutputFormatsMap only required for reprocessing capability.
 
   // Flatten mStreamConfigs.
-  ADD_STATIC_ENTRY(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
-                   mStreamConfigs.data(),
-                   mStreamConfigs.total_num_elements());
+  res = info.update(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
+                    mStreamConfigs.data(),
+                    mStreamConfigs.total_num_elements());
+  if (res != android::OK) {
+    return res;
+  }
 
   // Flatten mMinFrameDurations.
-  ADD_STATIC_ENTRY(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,
-                   mMinFrameDurations.data(),
-                   mMinFrameDurations.total_num_elements());
+  res = info.update(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,
+                    mMinFrameDurations.data(),
+                    mMinFrameDurations.total_num_elements());
+  if (res != android::OK) {
+    return res;
+  }
 
   // Flatten mStallDurations.
-  ADD_STATIC_ENTRY(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS,
-                   mStallDurations.data(),
-                   mStallDurations.total_num_elements());
+  res = info.update(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS,
+                    mStallDurations.data(),
+                    mStallDurations.total_num_elements());
+  if (res != android::OK) {
+    return res;
+  }
 
   /* android.sensor. */
 
   /*   Sizes. */
 
-  ADD_STATIC_ENTRY(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
-                   mPixelArraySize.data(), mPixelArraySize.size());
+  res = info.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
+                    mPixelArraySize.data(), mPixelArraySize.size());
+  if (res != android::OK) {
+    return res;
+  }
   // No V4L2 way to differentiate active vs. inactive parts of the rectangle.
-  ADD_STATIC_ENTRY(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
-                   mPixelArraySize.data(), mPixelArraySize.size());
+  res = info.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
+                    mPixelArraySize.data(), mPixelArraySize.size());
+  if (res != android::OK) {
+    return res;
+  }
 
-  ADD_STATIC_ENTRY(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
-                   mPhysicalSize.data(), mPhysicalSize.size());
+  res = info.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
+                    mPhysicalSize.data(), mPhysicalSize.size());
+  if (res != android::OK) {
+    return res;
+  }
 
   /*   Misc sensor information. */
 
-  ADD_STATIC_ENTRY(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
-                   &mMaxFrameDuration, 1);
+  res = info.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
+                    &mMaxFrameDuration, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   // HAL uses BOOTTIME timestamps.
   // TODO(b/29457051): make sure timestamps are consistent throughout the HAL.
   uint8_t timestamp_source = ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN;
-  ADD_STATIC_ENTRY(ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE,
-                   &timestamp_source, 1);
+  res = info.update(ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE,
+                    &timestamp_source, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   // As in initDeviceInfo, no way to actually get orientation.
-  ADD_STATIC_ENTRY(ANDROID_SENSOR_ORIENTATION, &mOrientation, 1);
+  res = info.update(ANDROID_SENSOR_ORIENTATION, &mOrientation, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   // availableTestPatternModes just defaults to OFF, which is fine.
 
@@ -386,21 +521,30 @@
   uint8_t avail_shading_modes[] = {
     ANDROID_SHADING_MODE_FAST,
     ANDROID_SHADING_MODE_HIGH_QUALITY};
-  ADD_STATIC_ENTRY(ANDROID_SHADING_AVAILABLE_MODES,
-                   avail_shading_modes, ARRAY_SIZE(avail_shading_modes));
+  res = info.update(ANDROID_SHADING_AVAILABLE_MODES,
+                    avail_shading_modes, ARRAY_SIZE(avail_shading_modes));
+  if (res != android::OK) {
+    return res;
+  }
 
   /* android.statistics */
 
   // Face detection not supported.
   uint8_t avail_face_detect_modes[] = {
     ANDROID_STATISTICS_FACE_DETECT_MODE_OFF};
-  ADD_STATIC_ENTRY(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,
-                   avail_face_detect_modes,
-                   ARRAY_SIZE(avail_face_detect_modes));
+  res = info.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,
+                    avail_face_detect_modes,
+                    ARRAY_SIZE(avail_face_detect_modes));
+  if (res != android::OK) {
+    return res;
+  }
 
   int32_t max_face_count = 0;
-  ADD_STATIC_ENTRY(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
-                   &max_face_count, 1);
+  res = info.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
+                    &max_face_count, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   // info.histogramBucketCount, info.maxHistogramCount,
   // info.maxSharpnessMapValue, info.sharpnessMapSizemarked FUTURE.
@@ -408,16 +552,22 @@
   // ON only needs to be supported for RAW capable devices.
   uint8_t avail_hot_pixel_map_modes[] = {
     ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE_OFF};
-  ADD_STATIC_ENTRY(ANDROID_STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES,
-                   avail_hot_pixel_map_modes,
-                   ARRAY_SIZE(avail_hot_pixel_map_modes));
+  res = info.update(ANDROID_STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES,
+                    avail_hot_pixel_map_modes,
+                    ARRAY_SIZE(avail_hot_pixel_map_modes));
+  if (res != android::OK) {
+    return res;
+  }
 
   // ON only needs to be supported for RAW capable devices.
   uint8_t avail_lens_shading_map_modes[] = {
     ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF};
-  ADD_STATIC_ENTRY(ANDROID_STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES,
-                   avail_lens_shading_map_modes,
-                   ARRAY_SIZE(avail_lens_shading_map_modes));
+  res = info.update(ANDROID_STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES,
+                    avail_lens_shading_map_modes,
+                    ARRAY_SIZE(avail_lens_shading_map_modes));
+  if (res != android::OK) {
+    return res;
+  }
 
   /* android.tonemap. */
 
@@ -427,7 +577,10 @@
 
   // May or may not have LEDs available.
   if (!mLeds.empty()) {
-    ADD_STATIC_ENTRY(ANDROID_LED_AVAILABLE_LEDS, mLeds.data(), mLeds.size());
+    res = info.update(ANDROID_LED_AVAILABLE_LEDS, mLeds.data(), mLeds.size());
+    if (res != android::OK) {
+      return res;
+    }
   }
 
   /* android.sync. */
@@ -438,8 +591,11 @@
   // really help here either. Could even be that adjusting settings mid-stream
   // blocks in V4L2, and should be avoided.
   int32_t max_latency = ANDROID_SYNC_MAX_LATENCY_UNKNOWN;
-  ADD_STATIC_ENTRY(ANDROID_SYNC_MAX_LATENCY,
-                   &max_latency, 1);
+  res = info.update(ANDROID_SYNC_MAX_LATENCY,
+                    &max_latency, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   /* android.reprocess. */
 
@@ -452,13 +608,19 @@
   /* Capabilities and android.info. */
 
   uint8_t hw_level = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED;
-  ADD_STATIC_ENTRY(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,
-                   &hw_level, 1);
+  res = info.update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,
+                    &hw_level, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   uint8_t capabilities[] = {
     ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE};
-  ADD_STATIC_ENTRY(ANDROID_REQUEST_AVAILABLE_CAPABILITIES,
-                   capabilities, ARRAY_SIZE(capabilities));
+  res = info.update(ANDROID_REQUEST_AVAILABLE_CAPABILITIES,
+                    capabilities, ARRAY_SIZE(capabilities));
+  if (res != android::OK) {
+    return res;
+  }
 
   // Scan a default request template for included request keys.
   if (!mTemplatesInitialized) {
@@ -467,8 +629,7 @@
       return res;
     }
   }
-  std::vector<int32_t> avail_request_keys;
-  const camera_metadata_t *preview_request = nullptr;
+  const camera_metadata_t* preview_request = nullptr;
   // Search templates from the beginning for a supported one.
   for (uint8_t template_id = 1; template_id < CAMERA3_TEMPLATE_COUNT;
        ++template_id) {
@@ -481,25 +642,38 @@
     HAL_LOGE("No valid templates, can't get request keys.");
     return -ENODEV;
   }
-  size_t num_entries = get_camera_metadata_entry_count(preview_request);
-  for (size_t i = 0; i < num_entries; ++i) {
-    camera_metadata_ro_entry_t entry;
-    get_camera_metadata_ro_entry(preview_request, i, &entry);
-    avail_request_keys.push_back(entry.tag);
+  std::vector<int32_t> avail_request_keys = getMetadataKeys(preview_request);
+  res = info.update(ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS,
+                    avail_request_keys.data(), avail_request_keys.size());
+  if (res != android::OK) {
+    return res;
   }
-  ADD_STATIC_ENTRY(ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS,
-                   avail_request_keys.data(), avail_request_keys.size());
 
   // Result keys will be duplicated from the request, plus a few extras.
   // TODO(b/29335262): additonal available result keys.
   std::vector<int32_t> avail_result_keys(avail_request_keys);
-  ADD_STATIC_ENTRY(ANDROID_REQUEST_AVAILABLE_RESULT_KEYS,
-                   avail_result_keys.data(), avail_result_keys.size());
+  res = info.update(ANDROID_REQUEST_AVAILABLE_RESULT_KEYS,
+                    avail_result_keys.data(), avail_result_keys.size());
+  if (res != android::OK) {
+    return res;
+  }
 
   // Last thing, once all the available characteristics have been added.
-  info.update(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS,
-              avail_characteristics_keys.data(),
-              avail_characteristics_keys.size());
+  const camera_metadata_t* static_characteristics = info.getAndLock();
+  std::vector<int32_t> avail_characteristics_keys =
+      getMetadataKeys(static_characteristics);
+  res = info.unlock(static_characteristics);
+  if (res != android::OK) {
+    return res;
+  }
+  avail_characteristics_keys.push_back(
+      ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS);
+  res = info.update(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS,
+                    avail_characteristics_keys.data(),
+                    avail_characteristics_keys.size());
+  if (res != android::OK) {
+    return res;
+  }
 
   *out = info.release();
   return 0;
@@ -547,22 +721,25 @@
   // Note: static metadata expects all templates/requests
   // to provide values for all supported keys.
 
-  android::CameraMetadata template_metadata;
-#define ADD_REQUEST_ENTRY(name, varptr, count) \
-  res = template_metadata.update(name, varptr, count); \
-  if (res != android::OK) return res
+  android::CameraMetadata base_metadata;
 
   // Start with defaults for all templates.
 
   /* android.colorCorrection. */
 
   uint8_t aberration_mode = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_FAST;
-  ADD_REQUEST_ENTRY(ANDROID_COLOR_CORRECTION_ABERRATION_MODE,
-                    &aberration_mode, 1);
+  res = base_metadata.update(ANDROID_COLOR_CORRECTION_ABERRATION_MODE,
+                             &aberration_mode, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   uint8_t color_correction_mode = ANDROID_COLOR_CORRECTION_MODE_FAST;
-  ADD_REQUEST_ENTRY(ANDROID_COLOR_CORRECTION_MODE,
-                    &color_correction_mode, 1);
+  res = base_metadata.update(ANDROID_COLOR_CORRECTION_MODE,
+                             &color_correction_mode, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   // transform and gains are for the unsupported MANUAL_POST_PROCESSING only.
 
@@ -570,27 +747,42 @@
 
   /*   AE. */
   uint8_t ae_antibanding_mode = ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO;
-  ADD_REQUEST_ENTRY(ANDROID_CONTROL_AE_ANTIBANDING_MODE,
-                    &ae_antibanding_mode, 1);
+  res = base_metadata.update(ANDROID_CONTROL_AE_ANTIBANDING_MODE,
+                             &ae_antibanding_mode, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   // Only matters if AE_MODE = OFF
   int32_t ae_exposure_compensation = 0;
-  ADD_REQUEST_ENTRY(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
-                    &ae_exposure_compensation, 1);
+  res = base_metadata.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
+                             &ae_exposure_compensation, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   uint8_t ae_lock = ANDROID_CONTROL_AE_LOCK_OFF;
-  ADD_REQUEST_ENTRY(ANDROID_CONTROL_AE_LOCK, &ae_lock, 1);
+  res = base_metadata.update(ANDROID_CONTROL_AE_LOCK, &ae_lock, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   uint8_t ae_mode = ANDROID_CONTROL_AE_MODE_ON;
-  ADD_REQUEST_ENTRY(ANDROID_CONTROL_AE_MODE, &ae_mode, 1);
+  res = base_metadata.update(ANDROID_CONTROL_AE_MODE, &ae_mode, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   // AE regions not supported.
 
   // FPS set per-template.
 
   uint8_t ae_precapture_trigger = ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE;
-  ADD_REQUEST_ENTRY(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER,
-                    &ae_precapture_trigger, 1);
+  res = base_metadata.update(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER,
+                             &ae_precapture_trigger, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   /*   AF. */
 
@@ -599,7 +791,10 @@
   // AF regions not supported.
 
   uint8_t af_trigger = ANDROID_CONTROL_AF_TRIGGER_IDLE;
-  ADD_REQUEST_ENTRY(ANDROID_CONTROL_AF_TRIGGER, &af_trigger, 1);
+  res = base_metadata.update(ANDROID_CONTROL_AF_TRIGGER, &af_trigger, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   /*   AWB. */
 
@@ -612,25 +807,40 @@
                        ANDROID_CONTROL_AWB_MODE_OFF)) {
     default_awb_mode = ANDROID_CONTROL_AWB_MODE_OFF;
   }
-  ADD_REQUEST_ENTRY(ANDROID_CONTROL_AWB_MODE, &default_awb_mode, 1);
+  res = base_metadata.update(ANDROID_CONTROL_AWB_MODE, &default_awb_mode, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   // AWB regions not supported.
 
   /*   Other controls. */
 
   uint8_t effect_mode = ANDROID_CONTROL_EFFECT_MODE_OFF;
-  ADD_REQUEST_ENTRY(ANDROID_CONTROL_EFFECT_MODE, &effect_mode, 1);
+  res = base_metadata.update(ANDROID_CONTROL_EFFECT_MODE, &effect_mode, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   uint8_t control_mode = ANDROID_CONTROL_MODE_AUTO;
-  ADD_REQUEST_ENTRY(ANDROID_CONTROL_MODE, &control_mode, 1);
+  res = base_metadata.update(ANDROID_CONTROL_MODE, &control_mode, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   uint8_t scene_mode = ANDROID_CONTROL_SCENE_MODE_DISABLED;
-  ADD_REQUEST_ENTRY(ANDROID_CONTROL_SCENE_MODE,
-                    &scene_mode, 1);
+  res = base_metadata.update(ANDROID_CONTROL_SCENE_MODE,
+                             &scene_mode, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   uint8_t video_stabilization = ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF;
-  ADD_REQUEST_ENTRY(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
-                    &video_stabilization, 1);
+  res = base_metadata.update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
+                             &video_stabilization, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   // postRawSensitivityBoost: RAW not supported, leave null.
 
@@ -641,7 +851,10 @@
   /* android.edge. */
 
   uint8_t edge_mode = ANDROID_EDGE_MODE_FAST;
-  ADD_REQUEST_ENTRY(ANDROID_EDGE_MODE, &edge_mode, 1);
+  res = base_metadata.update(ANDROID_EDGE_MODE, &edge_mode, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   // strength marked FUTURE.
 
@@ -650,58 +863,106 @@
   // firingPower, firingTime marked FUTURE.
 
   uint8_t flash_mode = ANDROID_FLASH_MODE_OFF;
-  ADD_REQUEST_ENTRY(ANDROID_FLASH_MODE, &flash_mode, 1);
+  res = base_metadata.update(ANDROID_FLASH_MODE, &flash_mode, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   /* android.hotPixel. */
 
   uint8_t hp_mode = ANDROID_HOT_PIXEL_MODE_FAST;
-  ADD_REQUEST_ENTRY(ANDROID_HOT_PIXEL_MODE, &hp_mode, 1);
+  res = base_metadata.update(ANDROID_HOT_PIXEL_MODE, &hp_mode, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   /* android.jpeg. */
 
   double gps_coords[] = {/*latitude*/0, /*longitude*/0, /*altitude*/0};
-  ADD_REQUEST_ENTRY(ANDROID_JPEG_GPS_COORDINATES, gps_coords, 3);
+  res = base_metadata.update(ANDROID_JPEG_GPS_COORDINATES, gps_coords, 3);
+  if (res != android::OK) {
+    return res;
+  }
 
   uint8_t gps_processing_method[] = "none";
-  ADD_REQUEST_ENTRY(ANDROID_JPEG_GPS_PROCESSING_METHOD,
-                    gps_processing_method, ARRAY_SIZE(gps_processing_method));
+  res = base_metadata.update(ANDROID_JPEG_GPS_PROCESSING_METHOD,
+                             gps_processing_method,
+                             ARRAY_SIZE(gps_processing_method));
+  if (res != android::OK) {
+    return res;
+  }
 
   int64_t gps_timestamp = 0;
-  ADD_REQUEST_ENTRY(ANDROID_JPEG_GPS_TIMESTAMP, &gps_timestamp, 1);
+  res = base_metadata.update(ANDROID_JPEG_GPS_TIMESTAMP, &gps_timestamp, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   // JPEG orientation is relative to sensor orientation (mOrientation).
   int32_t jpeg_orientation = 0;
-  ADD_REQUEST_ENTRY(ANDROID_JPEG_ORIENTATION, &jpeg_orientation, 1);
+  res = base_metadata.update(ANDROID_JPEG_ORIENTATION, &jpeg_orientation, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   // 1-100, larger is higher quality.
   uint8_t jpeg_quality = 80;
-  ADD_REQUEST_ENTRY(ANDROID_JPEG_QUALITY, &jpeg_quality, 1);
+  res = base_metadata.update(ANDROID_JPEG_QUALITY, &jpeg_quality, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   // TODO(b/29580107): If thumbnail quality actually matters/can be adjusted,
   // adjust this.
   uint8_t thumbnail_quality = 80;
-  ADD_REQUEST_ENTRY(ANDROID_JPEG_THUMBNAIL_QUALITY, &thumbnail_quality, 1);
+  res = base_metadata.update(ANDROID_JPEG_THUMBNAIL_QUALITY,
+                             &thumbnail_quality, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   // TODO(b/29580107): Choose a size matching the resolution.
   int32_t thumbnail_size[] = {0, 0};
-  ADD_REQUEST_ENTRY(ANDROID_JPEG_THUMBNAIL_SIZE, thumbnail_size, 2);
+  res = base_metadata.update(ANDROID_JPEG_THUMBNAIL_SIZE, thumbnail_size, 2);
+  if (res != android::OK) {
+    return res;
+  }
 
   /* android.lens. */
 
   // Fixed values.
-  ADD_REQUEST_ENTRY(ANDROID_LENS_APERTURE, &mAperture, 1);
-  ADD_REQUEST_ENTRY(ANDROID_LENS_FILTER_DENSITY, &mFilterDensity, 1);
-  ADD_REQUEST_ENTRY(ANDROID_LENS_FOCAL_LENGTH, &mFocalLength, 1);
-  ADD_REQUEST_ENTRY(ANDROID_LENS_FOCUS_DISTANCE, &mFocusDistance, 1);
+  res = base_metadata.update(ANDROID_LENS_APERTURE, &mAperture, 1);
+  if (res != android::OK) {
+    return res;
+  }
+  res = base_metadata.update(ANDROID_LENS_FILTER_DENSITY, &mFilterDensity, 1);
+  if (res != android::OK) {
+    return res;
+  }
+  res = base_metadata.update(ANDROID_LENS_FOCAL_LENGTH, &mFocalLength, 1);
+  if (res != android::OK) {
+    return res;
+  }
+  res = base_metadata.update(ANDROID_LENS_FOCUS_DISTANCE, &mFocusDistance, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   uint8_t optical_stabilization = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF;
-  ADD_REQUEST_ENTRY(ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
+  res = base_metadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
                     &optical_stabilization, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   /* android.noiseReduction. */
 
   uint8_t noise_reduction_mode = ANDROID_NOISE_REDUCTION_MODE_FAST;
-  ADD_REQUEST_ENTRY(ANDROID_NOISE_REDUCTION_MODE, &noise_reduction_mode, 1);
+  res = base_metadata.update(ANDROID_NOISE_REDUCTION_MODE,
+                             &noise_reduction_mode, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   // strength marked FUTURE.
 
@@ -710,15 +971,21 @@
   // Request Id unused by the HAL for now, and these are just
   // templates, so just fill it in with a dummy.
   int32_t id = 0;
-  ADD_REQUEST_ENTRY(ANDROID_REQUEST_ID, &id, 1);
+  res = base_metadata.update(ANDROID_REQUEST_ID, &id, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   // metadataMode marked FUTURE.
 
   /* android.scaler. */
 
   // No cropping by default; use the full active array.
-  ADD_REQUEST_ENTRY(ANDROID_SCALER_CROP_REGION, mPixelArraySize.data(),
-                    mPixelArraySize.size());
+  res = base_metadata.update(ANDROID_SCALER_CROP_REGION, mPixelArraySize.data(),
+                             mPixelArraySize.size());
+  if (res != android::OK) {
+    return res;
+  }
 
   /* android.sensor. */
 
@@ -726,26 +993,43 @@
 
   // Ignored when AE is OFF.
   int64_t frame_duration = 33333333L; // 1/30 s.
-  ADD_REQUEST_ENTRY(ANDROID_SENSOR_FRAME_DURATION, &frame_duration, 1);
+  res = base_metadata.update(ANDROID_SENSOR_FRAME_DURATION, &frame_duration, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   /* android.shading. */
 
   uint8_t shading_mode = ANDROID_SHADING_MODE_FAST;
-  ADD_REQUEST_ENTRY(ANDROID_SHADING_MODE, &shading_mode, 1);
+  res = base_metadata.update(ANDROID_SHADING_MODE, &shading_mode, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   /* android.statistics. */
 
   uint8_t face_detect_mode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
-  ADD_REQUEST_ENTRY(ANDROID_STATISTICS_FACE_DETECT_MODE, &face_detect_mode, 1);
+  res = base_metadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE,
+                             &face_detect_mode, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   // histogramMode, sharpnessMapMode marked FUTURE.
 
   uint8_t hp_map_mode = ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE_OFF;
-  ADD_REQUEST_ENTRY(ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE, &hp_map_mode, 1);
+  res = base_metadata.update(ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE,
+                             &hp_map_mode, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   uint8_t lens_shading_map_mode = ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF;
-  ADD_REQUEST_ENTRY(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE,
-                    &lens_shading_map_mode, 1);
+  res = base_metadata.update(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE,
+                             &lens_shading_map_mode, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   /* android.tonemap. */
 
@@ -754,7 +1038,10 @@
   /* android.led. */
 
   uint8_t transmit = ANDROID_LED_TRANSMIT_ON;
-  ADD_REQUEST_ENTRY(ANDROID_LED_TRANSMIT, &transmit, 1);
+  res = base_metadata.update(ANDROID_LED_TRANSMIT, &transmit, 1);
+  if (res != android::OK) {
+    return res;
+  }
 
   /* android.reprocess */
 
@@ -817,11 +1104,8 @@
   uint8_t video_af_mode =  continuous_video_avail ?
       ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO : non_continuous_af_mode;
 
-  // Copy our base metadata (note: we do it in this direction so we don't have
-  // to redefine our ADD_REQUEST_ENTRY macro).
-  android::CameraMetadata base_metadata(template_metadata);
-
-  for (uint8_t template_id = 1; template_id < CAMERA3_TEMPLATE_COUNT; ++template_id) {
+  for (uint8_t template_id = 1; template_id < CAMERA3_TEMPLATE_COUNT;
+       ++template_id) {
     // General differences/support.
     uint8_t intent;
     uint8_t af_mode;
@@ -854,10 +1138,21 @@
         continue;
     }
 
-    ADD_REQUEST_ENTRY(ANDROID_CONTROL_CAPTURE_INTENT, &intent, 1);
-    ADD_REQUEST_ENTRY(ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
-                      fps_range.data(), fps_range.size());
-    ADD_REQUEST_ENTRY(ANDROID_CONTROL_AF_MODE, &af_mode, 1);
+    // Copy our base metadata and add the new items.
+    android::CameraMetadata template_metadata(base_metadata);
+    res = template_metadata.update(ANDROID_CONTROL_CAPTURE_INTENT, &intent, 1);
+    if (res != android::OK) {
+      return res;
+    }
+    res = template_metadata.update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
+                                   fps_range.data(), fps_range.size());
+    if (res != android::OK) {
+      return res;
+    }
+    res = template_metadata.update(ANDROID_CONTROL_AF_MODE, &af_mode, 1);
+    if (res != android::OK) {
+      return res;
+    }
 
     const camera_metadata_t* template_raw_metadata =
         template_metadata.getAndLock();
@@ -869,9 +1164,6 @@
     if (res != android::OK) {
       return res;
     }
-
-    // Reset the template metadata to the base.
-    template_metadata = base_metadata;
   }
 
   mTemplatesInitialized = true;
