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; }