@Override
 public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   boolean useFrontCamera = getArguments().getBoolean(FRONT_CAMERA, false);
   camera = getCameraInstance(useFrontCamera);
   if (camera == null) {
     return;
   }
   initScreenParams();
   parameters = camera.getParameters();
   zoomRatios = parameters.getZoomRatios();
   zoomIndex = minZoomIndex = 0;
   maxZoomIndex = parameters.getMaxZoom();
   previewSizes = buildPreviewSizesRatioMap(parameters.getSupportedPreviewSizes());
   pictureSizes = buildPictureSizesRatioMap(parameters.getSupportedPictureSizes());
   List<String> sceneModes = parameters.getSupportedSceneModes();
   if (sceneModes != null) {
     for (String mode : sceneModes) {
       if (mode.equals(Camera.Parameters.SCENE_MODE_HDR)) {
         supportedHDR = true;
         break;
       }
     }
   }
   // it returns false positive
   /*getActivity().getApplicationContext().getPackageManager()
   .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);*/
   List<String> flashModes = parameters.getSupportedFlashModes();
   if (flashModes == null || flashModes.size() <= 1) {
     /* Device has no flash */
     supportedFlash = false;
   } else {
     supportedFlash = true;
   }
   if (CameraConst.DEBUG) {
     Timber.d("PictureSizesRatioMap:");
     for (Ratio r : pictureSizes.keySet()) {
       Timber.d(r.toString() + ":");
       for (Quality q : pictureSizes.get(r).keySet()) {
         Camera.Size size = pictureSizes.get(r).get(q);
         if (size != null) {
           Timber.d(q.toString() + ": " + size.width + "x" + size.height);
         }
       }
     }
   }
   expandParams(getArguments());
   initParams();
 }
  private Map<Ratio, Map<Quality, Camera.Size>> buildPictureSizesRatioMap(List<Camera.Size> sizes) {
    Map<Ratio, Map<Quality, Camera.Size>> map = new HashMap<>();

    Map<Ratio, List<Camera.Size>> ratioListMap = new HashMap<>();
    for (Camera.Size size : sizes) {
      Ratio ratio = Ratio.pickRatio(size.width, size.height);
      if (ratio != null) {
        List<Camera.Size> sizeList = ratioListMap.get(ratio);
        if (sizeList == null) {
          sizeList = new ArrayList<>();
          ratioListMap.put(ratio, sizeList);
        }
        sizeList.add(size);
      }
    }
    for (Ratio r : ratioListMap.keySet()) {
      List<Camera.Size> list = ratioListMap.get(r);
      ratioListMap.put(r, sortSizes(list));
      Map<Quality, Camera.Size> sizeMap = new HashMap<>();
      int i = 0;
      for (Quality q : Quality.values()) {
        Camera.Size size = null;
        if (i < list.size()) {
          size = list.get(i++);
        }
        sizeMap.put(q, size);
      }
      map.put(r, sizeMap);
    }

    return map;
  }
 private void expandParams(Bundle params) {
   if (params == null) {
     params = new Bundle();
   }
   int id = 0;
   if (params.containsKey(RATIO)) {
     id = params.getInt(RATIO, 1);
   }
   ratio = Ratio.getRatioById(id);
   id = 0;
   if (params.containsKey(QUALITY)) {
     id = params.getInt(QUALITY, 0);
   }
   quality = Quality.getQualityById(id);
   id = 0;
   if (params.containsKey(FOCUS_MODE)) {
     id = params.getInt(FOCUS_MODE);
   }
   focusMode = FocusMode.getFocusModeById(id);
   id = 0;
   if (params.containsKey(FLASH_MODE)) {
     id = params.getInt(FLASH_MODE);
   }
   flashMode = FlashMode.getFlashModeById(id);
   id = 0;
   if (params.containsKey(HDR_MODE)) {
     id = params.getInt(HDR_MODE);
   }
   hdrMode = HDRMode.getHDRModeById(id);
 }
  private Bundle packSettings() {
    Bundle params = new Bundle();

    params.putInt(QUALITY, quality.getId());
    params.putInt(RATIO, ratio.getId());
    params.putInt(FOCUS_MODE, focusMode.getId());
    params.putInt(HDR_MODE, hdrMode.getId());
    return params;
  }
 @Override
 public void onRatioChanged(int id) {
   ratio = Ratio.getRatioById(id);
   setPreviewSize(parameters, ratio);
   setPictureSize(parameters, quality, ratio);
   camera.setParameters(parameters);
   setPreviewContainerSize(mScreenWidth, mScreenHeight, ratio);
   if (paramsChangedListener != null) {
     paramsChangedListener.onRatioChanged(id);
   }
 }
  private Map<Ratio, Camera.Size> buildPreviewSizesRatioMap(List<Camera.Size> sizes) {
    Map<Ratio, Camera.Size> map = new HashMap<>();

    for (Camera.Size size : sizes) {
      Ratio ratio = Ratio.pickRatio(size.width, size.height);
      if (ratio != null) {
        Camera.Size oldSize = map.get(ratio);
        if (oldSize == null || (oldSize.width < size.width || oldSize.height < size.height)) {
          map.put(ratio, size);
        }
      }
    }

    return map;
  }