/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.camera.one;

import android.graphics.ImageFormat;
import android.graphics.Rect;
import android.hardware.camera2.CameraCharacteristics;

import com.android.camera.ui.motion.LinearScale;
import com.android.camera.util.Size;

import java.util.List;

/**
 * The properties describing a OneCamera device. These properties are fixed for
 * a given OneCamera device.
 */
public interface OneCameraCharacteristics {
    public enum SupportedHardwareLevel {
        FULL, LIMITED, LEGACY
    }

    public enum FaceDetectMode {
        FULL, SIMPLE, NONE
    }

    /**
     * Gets the supported picture sizes for the given image format.
     *
     * @param imageFormat The specific image format listed on
     *            {@link ImageFormat}.
     */
    public List<Size> getSupportedPictureSizes(int imageFormat);

    /**
     * Gets the supported preview sizes.
     */
    public List<Size> getSupportedPreviewSizes();

    /**
     * @See {@link CameraCharacteristics#SENSOR_ORIENTATION}
     */
    public int getSensorOrientation();

    /**
     * @Return The direction of the camera
     */
    public OneCamera.Facing getCameraDirection();

    /**
     * @See {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE}
     */
    public Rect getSensorInfoActiveArraySize();

    /**
     * @See {@link CameraCharacteristics#SCALER_AVAILABLE_MAX_DIGITAL_ZOOM}
     */
    public float getAvailableMaxDigitalZoom();

    /**
     * @return If flash is supported for this camera.
     */
    public boolean isFlashSupported();

    /**
     * @return If Scene-mode HDR is supported.
     */
    public boolean isHdrSceneSupported();

    /**
     * @return The supported hardware level.
     */
    public SupportedHardwareLevel getSupportedHardwareLevel();

    /**
     * @return The supported face detection modes.
     */
    public List<FaceDetectMode> getSupportedFaceDetectModes();

    /**
     * A converter from the physical focus range of the camera to a ratio.
     */
    public LinearScale getLensFocusRange();

    /**
     * @return A List of available focal lengths for this camera.
     */
    public List<Float> getAvailableFocalLengths();

    /**
     * Whether exposure compensation is supported for this camera.
     *
     * @return true if exposure compensation is supported for this camera.
     */
    public boolean isExposureCompensationSupported();

    /**
     * @return The min exposure compensation index. The EV is the compensation
     * index multiplied by the step value. If {@link
     * #isExposureCompensationSupported()} is false, return -1.
     */
    public int getMinExposureCompensation();

    /**
     * @return The max exposure compensation index. The EV is the compensation
     * index multiplied by the step value. If {@link
     * #isExposureCompensationSupported()} is false, return -1.
     */
    public int getMaxExposureCompensation();

    /**
     * @return The exposure compensation step. The EV is the compensation index
     * multiplied by the step value. If {@link
     * #isExposureCompensationSupported()} is false, return -1.
     */
    public float getExposureCompensationStep();

    /**
     * @return true if this camera supports custom AutoFocus regions.
     */
    public boolean isAutoFocusSupported();

    /**
     * @return true if this camera supports continuous picture autofocus.
     */
    public boolean isContinuousPictureAutoFocusSupported();

    /**
     * @return true if this camera supports custom AutoExposure regions.
     */
    public boolean isAutoExposureSupported();
}
