private static List<Camera.Area> convertMeteringRegionsToLegacy(
      Rect activeArray,
      ParameterUtils.ZoomData zoomData,
      MeteringRectangle[] meteringRegions,
      int maxNumMeteringAreas,
      String regionName) {
    if (meteringRegions == null || maxNumMeteringAreas <= 0) {
      if (maxNumMeteringAreas > 0) {
        return Arrays.asList(ParameterUtils.CAMERA_AREA_DEFAULT);
      } else {
        return null;
      }
    }

    // Add all non-zero weight regions to the list
    List<MeteringRectangle> meteringRectangleList = new ArrayList<>();
    for (MeteringRectangle rect : meteringRegions) {
      if (rect.getMeteringWeight() != MeteringRectangle.METERING_WEIGHT_DONT_CARE) {
        meteringRectangleList.add(rect);
      }
    }

    if (meteringRectangleList.size() == 0) {
      Log.w(TAG, "Only received metering rectangles with weight 0.");
      return Arrays.asList(ParameterUtils.CAMERA_AREA_DEFAULT);
    }

    // Ignore any regions beyond our maximum supported count
    int countMeteringAreas = Math.min(maxNumMeteringAreas, meteringRectangleList.size());
    List<Camera.Area> meteringAreaList = new ArrayList<>(countMeteringAreas);

    for (int i = 0; i < countMeteringAreas; ++i) {
      MeteringRectangle rect = meteringRectangleList.get(i);

      ParameterUtils.MeteringData meteringData =
          ParameterUtils.convertMeteringRectangleToLegacy(activeArray, rect, zoomData);
      meteringAreaList.add(meteringData.meteringArea);
    }

    if (maxNumMeteringAreas < meteringRectangleList.size()) {
      Log.w(
          TAG,
          "convertMeteringRegionsToLegacy - Too many requested "
              + regionName
              + " regions, ignoring all beyond the first "
              + maxNumMeteringAreas);
    }

    if (VERBOSE) {
      Log.v(
          TAG,
          "convertMeteringRegionsToLegacy - "
              + regionName
              + " areas = "
              + ParameterUtils.stringFromAreaList(meteringAreaList));
    }

    return meteringAreaList;
  }