CameraCapabilities.java revision 54c8f898815a233ba6478630940432ddafdb4314
1c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong/*
2c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * Copyright (C) 2014 The Android Open Source Project
3c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong *
4c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * Licensed under the Apache License, Version 2.0 (the "License");
5c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * you may not use this file except in compliance with the License.
6c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * You may obtain a copy of the License at
7c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong *
8c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong *      http://www.apache.org/licenses/LICENSE-2.0
9c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong *
10c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * Unless required by applicable law or agreed to in writing, software
11c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * distributed under the License is distributed on an "AS IS" BASIS,
12c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * See the License for the specific language governing permissions and
14c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * limitations under the License.
15c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong */
16c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
17c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kongpackage com.android.ex.camera2.portability;
18c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
19c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kongimport com.android.ex.camera2.portability.debug.Log;
20c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
21c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kongimport java.util.ArrayList;
22c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kongimport java.util.EnumSet;
23c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kongimport java.util.HashSet;
24c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kongimport java.util.List;
25c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kongimport java.util.Set;
26c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kongimport java.util.TreeSet;
27c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
288097973089420749dcd1ab4974a629c2466b31ccAngus Kong/**
298097973089420749dcd1ab4974a629c2466b31ccAngus Kong * This class holds all the static information of a camera's capabilities.
308097973089420749dcd1ab4974a629c2466b31ccAngus Kong * <p>
318097973089420749dcd1ab4974a629c2466b31ccAngus Kong * The design of this class is thread-safe and can be passed around regardless
328097973089420749dcd1ab4974a629c2466b31ccAngus Kong * of which thread using it.
338097973089420749dcd1ab4974a629c2466b31ccAngus Kong * </p>
348097973089420749dcd1ab4974a629c2466b31ccAngus Kong */
35c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kongpublic class CameraCapabilities {
36c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
37a0842b40441db5332a5290f941021636b1182761Sol Boucher    private static Log.Tag TAG = new Log.Tag("CamCapabs");
388097973089420749dcd1ab4974a629c2466b31ccAngus Kong
399d8668449376fa47bc6528c7a61b04d6a0f691b3Sol Boucher    /** Zoom ratio used for seeing sensor's full field of view. */
409d8668449376fa47bc6528c7a61b04d6a0f691b3Sol Boucher    protected static final float ZOOM_RATIO_UNZOOMED = 1.0f;
419d8668449376fa47bc6528c7a61b04d6a0f691b3Sol Boucher
428097973089420749dcd1ab4974a629c2466b31ccAngus Kong    /* All internal states are declared final and should be thread-safe. */
43c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
44c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected final ArrayList<int[]> mSupportedPreviewFpsRange = new ArrayList<int[]>();
458097973089420749dcd1ab4974a629c2466b31ccAngus Kong    protected final ArrayList<Size> mSupportedPreviewSizes = new ArrayList<Size>();
46c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected final TreeSet<Integer> mSupportedPreviewFormats = new TreeSet<Integer>();
478097973089420749dcd1ab4974a629c2466b31ccAngus Kong    protected final ArrayList<Size> mSupportedVideoSizes = new ArrayList<Size>();
488097973089420749dcd1ab4974a629c2466b31ccAngus Kong    protected final ArrayList<Size> mSupportedPhotoSizes = new ArrayList<Size>();
498097973089420749dcd1ab4974a629c2466b31ccAngus Kong    protected final TreeSet<Integer> mSupportedPhotoFormats = new TreeSet<Integer>();
50c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected final EnumSet<SceneMode> mSupportedSceneModes = EnumSet.noneOf(SceneMode.class);
51c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected final EnumSet<FlashMode> mSupportedFlashModes = EnumSet.noneOf(FlashMode.class);
52c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected final EnumSet<FocusMode> mSupportedFocusModes = EnumSet.noneOf(FocusMode.class);
53c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected final EnumSet<WhiteBalance> mSupportedWhiteBalances =
54c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            EnumSet.noneOf(WhiteBalance.class);
55c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected final EnumSet<Feature> mSupportedFeatures = EnumSet.noneOf(Feature.class);
568097973089420749dcd1ab4974a629c2466b31ccAngus Kong    protected Size mPreferredPreviewSizeForVideo;
57c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected int mMinExposureCompensation;
58c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected int mMaxExposureCompensation;
59c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected float mExposureCompensationStep;
60c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected int mMaxNumOfFacesSupported;
61c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected int mMaxNumOfFocusAreas;
62c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected int mMaxNumOfMeteringArea;
639d8668449376fa47bc6528c7a61b04d6a0f691b3Sol Boucher    protected float mMaxZoomRatio;
6401e7c02174ef268b6d6daaa5a5bb4f752d55964cAngus Kong    protected float mHorizontalViewAngle;
6501e7c02174ef268b6d6daaa5a5bb4f752d55964cAngus Kong    protected float mVerticalViewAngle;
66c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private final Stringifier mStringifier;
67c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
688097973089420749dcd1ab4974a629c2466b31ccAngus Kong    /**
698097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * Focus modes.
708097973089420749dcd1ab4974a629c2466b31ccAngus Kong     */
71c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public enum FocusMode {
72c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
73c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Continuous auto focus mode intended for taking pictures.
74c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FOCUS_MODE_AUTO}.
75c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
76c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        AUTO,
77c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
78c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Continuous auto focus mode intended for taking pictures.
79c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FOCUS_MODE_CONTINUOUS_PICTURE}.
80c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
81c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        CONTINUOUS_PICTURE,
82c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
83c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Continuous auto focus mode intended for video recording.
84c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FOCUS_MODE_CONTINUOUS_VIDEO}.
85c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
86c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        CONTINUOUS_VIDEO,
87c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
88c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Extended depth of field (EDOF).
89c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FOCUS_MODE_EDOF}.
90c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
91c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        EXTENDED_DOF,
92c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
93c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Focus is fixed.
94c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FOCUS_MODE_FIXED}.
95c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
96c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        FIXED,
97c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
98c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Focus is set at infinity.
99c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FOCUS_MODE_INFINITY}.
100c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
101de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher        // TODO: Unsupported on API 2
102c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        INFINITY,
103c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
104c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Macro (close-up) focus mode.
105c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FOCUS_MODE_MACRO}.
106c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
107c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        MACRO,
108c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
109c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
1108097973089420749dcd1ab4974a629c2466b31ccAngus Kong    /**
1118097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * Flash modes.
1128097973089420749dcd1ab4974a629c2466b31ccAngus Kong     */
113c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public enum FlashMode {
114c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
1158097973089420749dcd1ab4974a629c2466b31ccAngus Kong         * No flash.
1168097973089420749dcd1ab4974a629c2466b31ccAngus Kong         */
1178097973089420749dcd1ab4974a629c2466b31ccAngus Kong        NO_FLASH,
1188097973089420749dcd1ab4974a629c2466b31ccAngus Kong        /**
119c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Flash will be fired automatically when required.
120c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FLASH_MODE_OFF}.
121c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
122c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        AUTO,
123c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
124c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Flash will not be fired.
125c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FLASH_MODE_OFF}.
126c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
127c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        OFF,
128c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
129c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Flash will always be fired during snapshot.
130c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FLASH_MODE_ON}.
131c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
132c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        ON,
133c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
134c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Constant emission of light during preview, auto-focus and snapshot.
135c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FLASH_MODE_TORCH}.
136c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
137c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        TORCH,
138c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
139c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Flash will be fired in red-eye reduction mode.
140c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FLASH_MODE_RED_EYE}.
141c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
142c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        RED_EYE,
143c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
144c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
1458097973089420749dcd1ab4974a629c2466b31ccAngus Kong    /**
1468097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * Scene modes.
1478097973089420749dcd1ab4974a629c2466b31ccAngus Kong     */
148c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public enum SceneMode {
149c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
1508097973089420749dcd1ab4974a629c2466b31ccAngus Kong         * No supported scene mode.
1518097973089420749dcd1ab4974a629c2466b31ccAngus Kong         */
1528097973089420749dcd1ab4974a629c2466b31ccAngus Kong        NO_SCENE_MODE,
1538097973089420749dcd1ab4974a629c2466b31ccAngus Kong        /**
154c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Scene mode is off.
155c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_AUTO}.
156c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
157c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        AUTO,
158c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
159c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Take photos of fast moving objects.
160c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_ACTION}.
161c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
162c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        ACTION,
163c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
164c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Applications are looking for a barcode.
165c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_BARCODE}.
166c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
167c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        BARCODE,
168c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
169c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Take pictures on the beach.
170c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_BEACH}.
171c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
172c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        BEACH,
173c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
174c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Capture the naturally warm color of scenes lit by candles.
175c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_CANDLELIGHT}.
176c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
177c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        CANDLELIGHT,
178c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
179c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * For shooting firework displays.
180c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_FIREWORKS}.
181c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
182c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        FIREWORKS,
183c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
184c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Capture a scene using high dynamic range imaging techniques.
185c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_HDR}.
186c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
18754c8f898815a233ba6478630940432ddafdb4314Ruben Brunk        // Note: Supported as a vendor tag on the Camera2 API for some LEGACY devices.
188c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        HDR,
189c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
190c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Take pictures on distant objects.
191c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_LANDSCAPE}.
192c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
193c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        LANDSCAPE,
194c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
195c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Take photos at night.
196c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_NIGHT}.
197c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
198c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        NIGHT,
199c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
200c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Take people pictures at night.
201c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_NIGHT_PORTRAIT}.
202c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
203de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher        // TODO: Unsupported on API 2
204c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        NIGHT_PORTRAIT,
205c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
206c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Take indoor low-light shot.
207c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_PARTY}.
208c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
209c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        PARTY,
210c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
211c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Take people pictures.
212c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_PORTRAIT}.
213c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
214c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        PORTRAIT,
215c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
216c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Take pictures on the snow.
217c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_SNOW}.
218c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
219c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        SNOW,
220c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
221c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Take photos of fast moving objects.
222c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_SPORTS}.
223c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
224c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        SPORTS,
225c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
226c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Avoid blurry pictures (for example, due to hand shake).
227c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_STEADYPHOTO}.
228c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
229c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        STEADYPHOTO,
230c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
231c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Take sunset photos.
232c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_SUNSET}.
233c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
234c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        SUNSET,
235c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
236c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Take photos in a theater.
237c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_THEATRE}.
238c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
239c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        THEATRE,
240c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
241c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
2428097973089420749dcd1ab4974a629c2466b31ccAngus Kong    /**
2438097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * White blances.
2448097973089420749dcd1ab4974a629c2466b31ccAngus Kong     */
245c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public enum WhiteBalance {
246c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
247c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#WHITE_BALANCE_AUTO}.
248c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
249c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        AUTO,
250c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
251c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#WHITE_BALANCE_CLOUDY_DAYLIGHT}.
252c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
253c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        CLOUDY_DAYLIGHT,
254c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
255c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#WHITE_BALANCE_DAYLIGHT}.
256c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
257c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        DAYLIGHT,
258c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
259c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#WHITE_BALANCE_FLUORESCENT}.
260c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
261c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        FLUORESCENT,
262c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
263c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#WHITE_BALANCE_INCANDESCENT}.
264c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
265c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        INCANDESCENT,
266c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
267c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#WHITE_BALANCE_SHADE}.
268c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
269c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        SHADE,
270c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
271c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#WHITE_BALANCE_TWILIGHT}.
272c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
273c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        TWILIGHT,
274c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
275c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#WHITE_BALANCE_WARM_FLUORESCENT}.
276c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
277c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        WARM_FLUORESCENT,
278c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
279c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
2808097973089420749dcd1ab4974a629c2466b31ccAngus Kong    /**
2818097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * Features.
2828097973089420749dcd1ab4974a629c2466b31ccAngus Kong     */
283c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public enum Feature {
284c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
285c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Support zoom-related methods.
286c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
287c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        ZOOM,
288c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
289c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Support for photo capturing during video recording.
290c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
291c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        VIDEO_SNAPSHOT,
292c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
293c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Support for focus area settings.
294c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
295c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        FOCUS_AREA,
296c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
297c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Support for metering area settings.
298c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
299c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        METERING_AREA,
300c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
301c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Support for automatic exposure lock.
302c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
303c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        AUTO_EXPOSURE_LOCK,
304c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
305c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Support for automatic white balance lock.
306c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
307c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        AUTO_WHITE_BALANCE_LOCK,
3088097973089420749dcd1ab4974a629c2466b31ccAngus Kong        /**
3098097973089420749dcd1ab4974a629c2466b31ccAngus Kong         * Support for video stabilization.
3108097973089420749dcd1ab4974a629c2466b31ccAngus Kong         */
3118097973089420749dcd1ab4974a629c2466b31ccAngus Kong        VIDEO_STABILIZATION,
312c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
313c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
314c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
315c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * A interface stringifier to convert abstract representations to API
316c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * related string representation.
317c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
318a0842b40441db5332a5290f941021636b1182761Sol Boucher    public static class Stringifier {
319a0842b40441db5332a5290f941021636b1182761Sol Boucher        /**
320a0842b40441db5332a5290f941021636b1182761Sol Boucher         * Converts the string to hyphen-delimited lowercase for compatibility with multiple APIs.
321a0842b40441db5332a5290f941021636b1182761Sol Boucher         *
322a0842b40441db5332a5290f941021636b1182761Sol Boucher         * @param enumCase The name of an enum constant.
323a0842b40441db5332a5290f941021636b1182761Sol Boucher         * @return The converted string.
324a0842b40441db5332a5290f941021636b1182761Sol Boucher         */
325a0842b40441db5332a5290f941021636b1182761Sol Boucher        private static String toApiCase(String enumCase) {
326a0842b40441db5332a5290f941021636b1182761Sol Boucher            return enumCase.toLowerCase().replaceAll("_", "-");
327a0842b40441db5332a5290f941021636b1182761Sol Boucher        }
328a0842b40441db5332a5290f941021636b1182761Sol Boucher
329a0842b40441db5332a5290f941021636b1182761Sol Boucher        /**
330a0842b40441db5332a5290f941021636b1182761Sol Boucher         * Conerts the string to underscore-delimited uppercase to match the enum constant names.
331a0842b40441db5332a5290f941021636b1182761Sol Boucher         *
332a0842b40441db5332a5290f941021636b1182761Sol Boucher         * @param apiCase An API-related string representation.
333a0842b40441db5332a5290f941021636b1182761Sol Boucher         * @return The converted string.
334a0842b40441db5332a5290f941021636b1182761Sol Boucher         */
335a0842b40441db5332a5290f941021636b1182761Sol Boucher        private static String toEnumCase(String apiCase) {
336a0842b40441db5332a5290f941021636b1182761Sol Boucher            return apiCase.toUpperCase().replaceAll("-", "_");
337a0842b40441db5332a5290f941021636b1182761Sol Boucher        }
338a0842b40441db5332a5290f941021636b1182761Sol Boucher
339c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
340c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Converts the focus mode to API-related string representation.
341c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         *
342c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @param focus The focus mode to convert.
343c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @return The string used by the camera framework API to represent the
344a0842b40441db5332a5290f941021636b1182761Sol Boucher         *         focus mode.
345c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
346a0842b40441db5332a5290f941021636b1182761Sol Boucher        public String stringify(FocusMode focus) {
347a0842b40441db5332a5290f941021636b1182761Sol Boucher            return toApiCase(focus.name());
348a0842b40441db5332a5290f941021636b1182761Sol Boucher        }
349c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
350c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
351c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Converts the API-related string representation of the focus mode to the
352c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * abstract representation.
353c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         *
354c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @param val The string representation.
355a0842b40441db5332a5290f941021636b1182761Sol Boucher         * @return The focus mode represented by the input string, or the focus
356a0842b40441db5332a5290f941021636b1182761Sol Boucher         *         mode with the lowest ordinal if it cannot be converted.
357a0842b40441db5332a5290f941021636b1182761Sol Boucher         */
358a0842b40441db5332a5290f941021636b1182761Sol Boucher        public FocusMode focusModeFromString(String val) {
359a0842b40441db5332a5290f941021636b1182761Sol Boucher            if (val == null) {
360a0842b40441db5332a5290f941021636b1182761Sol Boucher                return FocusMode.values()[0];
361a0842b40441db5332a5290f941021636b1182761Sol Boucher            }
362a0842b40441db5332a5290f941021636b1182761Sol Boucher            try {
363a0842b40441db5332a5290f941021636b1182761Sol Boucher                return FocusMode.valueOf(toEnumCase(val));
364a0842b40441db5332a5290f941021636b1182761Sol Boucher            } catch (IllegalArgumentException ex) {
365a0842b40441db5332a5290f941021636b1182761Sol Boucher                return FocusMode.values()[0];
366a0842b40441db5332a5290f941021636b1182761Sol Boucher            }
367a0842b40441db5332a5290f941021636b1182761Sol Boucher        }
368c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
369c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
370c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Converts the flash mode to API-related string representation.
371c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         *
372c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @param flash The focus mode to convert.
373c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @return The string used by the camera framework API to represent the
374a0842b40441db5332a5290f941021636b1182761Sol Boucher         *         flash mode.
375c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
376a0842b40441db5332a5290f941021636b1182761Sol Boucher        public String stringify(FlashMode flash) {
377a0842b40441db5332a5290f941021636b1182761Sol Boucher            return toApiCase(flash.name());
378a0842b40441db5332a5290f941021636b1182761Sol Boucher        }
379c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
380c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
381c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Converts the API-related string representation of the flash mode to the
382c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * abstract representation.
383c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         *
384c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @param val The string representation.
385a0842b40441db5332a5290f941021636b1182761Sol Boucher         * @return The flash mode represented by the input string, or the flash
386a0842b40441db5332a5290f941021636b1182761Sol Boucher         *         mode with the lowest ordinal if it cannot be converted.
387a0842b40441db5332a5290f941021636b1182761Sol Boucher         */
388a0842b40441db5332a5290f941021636b1182761Sol Boucher        public FlashMode flashModeFromString(String val) {
389a0842b40441db5332a5290f941021636b1182761Sol Boucher            if (val == null) {
390a0842b40441db5332a5290f941021636b1182761Sol Boucher                return FlashMode.values()[0];
391a0842b40441db5332a5290f941021636b1182761Sol Boucher            }
392a0842b40441db5332a5290f941021636b1182761Sol Boucher            try {
393a0842b40441db5332a5290f941021636b1182761Sol Boucher                return FlashMode.valueOf(toEnumCase(val));
394a0842b40441db5332a5290f941021636b1182761Sol Boucher            } catch (IllegalArgumentException ex) {
395a0842b40441db5332a5290f941021636b1182761Sol Boucher                return FlashMode.values()[0];
396a0842b40441db5332a5290f941021636b1182761Sol Boucher            }
397a0842b40441db5332a5290f941021636b1182761Sol Boucher        }
398c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
399c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
400c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Converts the scene mode to API-related string representation.
401c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         *
402c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @param scene The focus mode to convert.
403c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @return The string used by the camera framework API to represent the
404a0842b40441db5332a5290f941021636b1182761Sol Boucher         *         scene mode.
405c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
406a0842b40441db5332a5290f941021636b1182761Sol Boucher        public String stringify(SceneMode scene) {
407a0842b40441db5332a5290f941021636b1182761Sol Boucher            return toApiCase(scene.name());
408a0842b40441db5332a5290f941021636b1182761Sol Boucher        }
409c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
410c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
411c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Converts the API-related string representation of the scene mode to the
412c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * abstract representation.
413c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         *
414c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @param val The string representation.
415a0842b40441db5332a5290f941021636b1182761Sol Boucher         * @return The scene mode represented by the input string, or the scene
416a0842b40441db5332a5290f941021636b1182761Sol Boucher         *         mode with the lowest ordinal if it cannot be converted.
417a0842b40441db5332a5290f941021636b1182761Sol Boucher         */
418a0842b40441db5332a5290f941021636b1182761Sol Boucher        public SceneMode sceneModeFromString(String val) {
419a0842b40441db5332a5290f941021636b1182761Sol Boucher            if (val == null) {
420a0842b40441db5332a5290f941021636b1182761Sol Boucher                return SceneMode.values()[0];
421a0842b40441db5332a5290f941021636b1182761Sol Boucher            }
422a0842b40441db5332a5290f941021636b1182761Sol Boucher            try {
423a0842b40441db5332a5290f941021636b1182761Sol Boucher                return SceneMode.valueOf(toEnumCase(val));
424a0842b40441db5332a5290f941021636b1182761Sol Boucher            } catch (IllegalArgumentException ex) {
425a0842b40441db5332a5290f941021636b1182761Sol Boucher                return SceneMode.values()[0];
426a0842b40441db5332a5290f941021636b1182761Sol Boucher            }
427a0842b40441db5332a5290f941021636b1182761Sol Boucher        }
428c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
429c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
430c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Converts the white balance to API-related string representation.
431c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         *
432c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @param wb The focus mode to convert.
433c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @return The string used by the camera framework API to represent the
434c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * white balance.
435c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
436a0842b40441db5332a5290f941021636b1182761Sol Boucher        public String stringify(WhiteBalance wb) {
437a0842b40441db5332a5290f941021636b1182761Sol Boucher            return toApiCase(wb.name());
438a0842b40441db5332a5290f941021636b1182761Sol Boucher        }
439c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
440c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
441c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Converts the API-related string representation of the white balance to
442c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * the abstract representation.
443c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         *
444c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @param val The string representation.
445a0842b40441db5332a5290f941021636b1182761Sol Boucher         * @return The white balance represented by the input string, or the
446a0842b40441db5332a5290f941021636b1182761Sol Boucher         *         white balance with the lowest ordinal if it cannot be
447a0842b40441db5332a5290f941021636b1182761Sol Boucher         *         converted.
448a0842b40441db5332a5290f941021636b1182761Sol Boucher         */
449a0842b40441db5332a5290f941021636b1182761Sol Boucher        public WhiteBalance whiteBalanceFromString(String val) {
450a0842b40441db5332a5290f941021636b1182761Sol Boucher            if (val == null) {
451a0842b40441db5332a5290f941021636b1182761Sol Boucher                return WhiteBalance.values()[0];
452a0842b40441db5332a5290f941021636b1182761Sol Boucher            }
453a0842b40441db5332a5290f941021636b1182761Sol Boucher            try {
454a0842b40441db5332a5290f941021636b1182761Sol Boucher                return WhiteBalance.valueOf(toEnumCase(val));
455a0842b40441db5332a5290f941021636b1182761Sol Boucher            } catch (IllegalArgumentException ex) {
456a0842b40441db5332a5290f941021636b1182761Sol Boucher                return WhiteBalance.values()[0];
457a0842b40441db5332a5290f941021636b1182761Sol Boucher            }
458a0842b40441db5332a5290f941021636b1182761Sol Boucher        }
459c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
460c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
461c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
4628097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * Constructor.
4638097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * @param stringifier The API-specific stringifier for this instance.
464c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
4658097973089420749dcd1ab4974a629c2466b31ccAngus Kong    CameraCapabilities(Stringifier stringifier) {
4668097973089420749dcd1ab4974a629c2466b31ccAngus Kong        mStringifier = stringifier;
467c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
468c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
469c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
470c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * Copy constructor.
471c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @param src The source instance.
472c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
473c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public CameraCapabilities(CameraCapabilities src) {
474c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mSupportedPreviewFpsRange.addAll(src.mSupportedPreviewFpsRange);
475c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mSupportedPreviewSizes.addAll(src.mSupportedPreviewSizes);
476c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mSupportedPreviewFormats.addAll(src.mSupportedPreviewFormats);
477c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mSupportedVideoSizes.addAll(src.mSupportedVideoSizes);
4788097973089420749dcd1ab4974a629c2466b31ccAngus Kong        mSupportedPhotoSizes.addAll(src.mSupportedPhotoSizes);
4798097973089420749dcd1ab4974a629c2466b31ccAngus Kong        mSupportedPhotoFormats.addAll(src.mSupportedPhotoFormats);
480c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mSupportedSceneModes.addAll(src.mSupportedSceneModes);
481c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mSupportedFlashModes.addAll(src.mSupportedFlashModes);
482c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mSupportedFocusModes.addAll(src.mSupportedFocusModes);
483c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mSupportedWhiteBalances.addAll(src.mSupportedWhiteBalances);
484c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mSupportedFeatures.addAll(src.mSupportedFeatures);
4858097973089420749dcd1ab4974a629c2466b31ccAngus Kong        mPreferredPreviewSizeForVideo = src.mPreferredPreviewSizeForVideo;
486c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mMaxExposureCompensation = src.mMaxExposureCompensation;
487c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mMinExposureCompensation = src.mMinExposureCompensation;
488c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mExposureCompensationStep = src.mExposureCompensationStep;
489c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mMaxNumOfFacesSupported = src.mMaxNumOfFacesSupported;
490c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mMaxNumOfFocusAreas = src.mMaxNumOfFocusAreas;
4918097973089420749dcd1ab4974a629c2466b31ccAngus Kong        mMaxNumOfMeteringArea = src.mMaxNumOfMeteringArea;
4928097973089420749dcd1ab4974a629c2466b31ccAngus Kong        mMaxZoomRatio = src.mMaxZoomRatio;
49301e7c02174ef268b6d6daaa5a5bb4f752d55964cAngus Kong        mHorizontalViewAngle = src.mHorizontalViewAngle;
49401e7c02174ef268b6d6daaa5a5bb4f752d55964cAngus Kong        mVerticalViewAngle = src.mVerticalViewAngle;
495c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mStringifier = src.mStringifier;
496c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
497c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
49801e7c02174ef268b6d6daaa5a5bb4f752d55964cAngus Kong    public float getHorizontalViewAngle() {
49901e7c02174ef268b6d6daaa5a5bb4f752d55964cAngus Kong        return mHorizontalViewAngle;
50001e7c02174ef268b6d6daaa5a5bb4f752d55964cAngus Kong    }
50101e7c02174ef268b6d6daaa5a5bb4f752d55964cAngus Kong
50201e7c02174ef268b6d6daaa5a5bb4f752d55964cAngus Kong    public float getVerticalViewAngle() {
50301e7c02174ef268b6d6daaa5a5bb4f752d55964cAngus Kong        return mVerticalViewAngle;
50401e7c02174ef268b6d6daaa5a5bb4f752d55964cAngus Kong    }
50501e7c02174ef268b6d6daaa5a5bb4f752d55964cAngus Kong
506c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
507c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @return the supported picture formats. See {@link android.graphics.ImageFormat}.
508c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
5098097973089420749dcd1ab4974a629c2466b31ccAngus Kong    public Set<Integer> getSupportedPhotoFormats() {
5108097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return new TreeSet<Integer>(mSupportedPhotoFormats);
511c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
512c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
513c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
514c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * Gets the supported preview formats.
515c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @return The supported preview {@link android.graphics.ImageFormat}s.
516c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
517c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public Set<Integer> getSupportedPreviewFormats() {
518c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        return new TreeSet<Integer>(mSupportedPreviewFormats);
519c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
520c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
521c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
522c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * Gets the supported picture sizes.
523c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
5248097973089420749dcd1ab4974a629c2466b31ccAngus Kong    public List<Size> getSupportedPhotoSizes() {
5258097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return new ArrayList<Size>(mSupportedPhotoSizes);
526c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
527c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
528c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
529c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @return The supported preview fps (frame-per-second) ranges. The returned
530c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * list is sorted by maximum fps then minimum fps in a descending order.
531c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * The values are multiplied by 1000.
532c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
533c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public final List<int[]> getSupportedPreviewFpsRange() {
534c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        return new ArrayList<int[]>(mSupportedPreviewFpsRange);
535c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
536c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
537c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
5388097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * @return The supported preview sizes. The list is sorted by width then
539c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * height in a descending order.
540c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
5418097973089420749dcd1ab4974a629c2466b31ccAngus Kong    public final List<Size> getSupportedPreviewSizes() {
5428097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return new ArrayList<Size>(mSupportedPreviewSizes);
5438097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
5448097973089420749dcd1ab4974a629c2466b31ccAngus Kong
5458097973089420749dcd1ab4974a629c2466b31ccAngus Kong    public final Size getPreferredPreviewSizeForVideo() {
5468097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return new Size(mPreferredPreviewSizeForVideo);
547c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
548c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
549c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
550c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @return The supported video frame sizes that can be used by MediaRecorder.
5518097973089420749dcd1ab4974a629c2466b31ccAngus Kong     *         The list is sorted by width then height in a descending order.
552c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
5538097973089420749dcd1ab4974a629c2466b31ccAngus Kong    public final List<Size> getSupportedVideoSizes() {
5548097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return new ArrayList<Size>(mSupportedVideoSizes);
555c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
556c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
557c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
558c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @return The supported scene modes.
559c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
560c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public final Set<SceneMode> getSupportedSceneModes() {
561c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        return new HashSet<SceneMode>(mSupportedSceneModes);
562c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
563c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
564c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
565c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @return Whether the scene mode is supported.
566c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
567c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public final boolean supports(SceneMode scene) {
568c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        return (scene != null && mSupportedSceneModes.contains(scene));
569c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
570c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
5718097973089420749dcd1ab4974a629c2466b31ccAngus Kong    public boolean supports(final CameraSettings settings) {
5728097973089420749dcd1ab4974a629c2466b31ccAngus Kong        if (zoomCheck(settings) && exposureCheck(settings) && focusCheck(settings) &&
5738097973089420749dcd1ab4974a629c2466b31ccAngus Kong                flashCheck(settings) && photoSizeCheck(settings) && previewSizeCheck(settings) &&
5748097973089420749dcd1ab4974a629c2466b31ccAngus Kong                videoStabilizationCheck(settings)) {
5758097973089420749dcd1ab4974a629c2466b31ccAngus Kong            return true;
5768097973089420749dcd1ab4974a629c2466b31ccAngus Kong        }
5778097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return false;
5788097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
5798097973089420749dcd1ab4974a629c2466b31ccAngus Kong
580c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
581c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @return The supported flash modes.
582c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
583c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public final Set<FlashMode> getSupportedFlashModes() {
584c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        return new HashSet<FlashMode>(mSupportedFlashModes);
585c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
586c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
587c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
588c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @return Whether the flash mode is supported.
589c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
590c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public final boolean supports(FlashMode flash) {
591c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        return (flash != null && mSupportedFlashModes.contains(flash));
592c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
593c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
594c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
595c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @return The supported focus modes.
596c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
597c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public final Set<FocusMode> getSupportedFocusModes() {
598c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        return new HashSet<FocusMode>(mSupportedFocusModes);
599c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
600c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
601c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
602c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @return Whether the focus mode is supported.
603c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
604c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public final boolean supports(FocusMode focus) {
605c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        return (focus != null && mSupportedFocusModes.contains(focus));
606c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
607c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
608c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
609c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @return The supported white balanceas.
610c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
611c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public final Set<WhiteBalance> getSupportedWhiteBalance() {
612c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        return new HashSet<WhiteBalance>(mSupportedWhiteBalances);
613c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
614c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
615c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
616c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @return Whether the white balance is supported.
617c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
618c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public boolean supports(WhiteBalance wb) {
619c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        return (wb != null && mSupportedWhiteBalances.contains(wb));
620c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
621c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
622c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public final Set<Feature> getSupportedFeature() {
623c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        return new HashSet<Feature>(mSupportedFeatures);
624c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
625c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
626c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public boolean supports(Feature ft) {
627c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        return (ft != null && mSupportedFeatures.contains(ft));
628c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
629c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
630c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
6318097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * @return The maximal supported zoom ratio.
6328097973089420749dcd1ab4974a629c2466b31ccAngus Kong     */
6338097973089420749dcd1ab4974a629c2466b31ccAngus Kong    public float getMaxZoomRatio() {
6348097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return mMaxZoomRatio;
6358097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
6368097973089420749dcd1ab4974a629c2466b31ccAngus Kong
6378097973089420749dcd1ab4974a629c2466b31ccAngus Kong    /**
638c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @return The min exposure compensation index. The EV is the compensation
639c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * index multiplied by the step value. If unsupported, both this method and
640c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * {@link #getMaxExposureCompensation()} return 0.
641c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
642c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public final int getMinExposureCompensation() {
643c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        return mMinExposureCompensation;
644c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
645c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
646c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
647c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @return The max exposure compensation index. The EV is the compensation
648c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * index multiplied by the step value. If unsupported, both this method and
649c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * {@link #getMinExposureCompensation()} return 0.
650c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
651c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public final int getMaxExposureCompensation() {
652c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        return mMaxExposureCompensation;
653c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
654c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
655c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
656c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @return The exposure compensation step. The EV is the compensation index
657c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * multiplied by the step value.
658c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
659c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public final float getExposureCompensationStep() {
660c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        return mExposureCompensationStep;
661c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
662c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
663c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
664c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @return The max number of faces supported by the face detection. 0 if
665c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * unsupported.
666c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
667c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public final int getMaxNumOfFacesSupported() {
668c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        return mMaxNumOfFacesSupported;
669c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
670c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
671c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
672c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @return The stringifier used by this instance.
673c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
674c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public Stringifier getStringifier() {
675c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        return mStringifier;
676c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
6778097973089420749dcd1ab4974a629c2466b31ccAngus Kong
6788097973089420749dcd1ab4974a629c2466b31ccAngus Kong    private boolean zoomCheck(final CameraSettings settings) {
6798097973089420749dcd1ab4974a629c2466b31ccAngus Kong        final float ratio = settings.getCurrentZoomRatio();
6808097973089420749dcd1ab4974a629c2466b31ccAngus Kong        if (!supports(Feature.ZOOM)) {
6819d8668449376fa47bc6528c7a61b04d6a0f691b3Sol Boucher            if (ratio != ZOOM_RATIO_UNZOOMED) {
6828097973089420749dcd1ab4974a629c2466b31ccAngus Kong                Log.v(TAG, "Zoom is not supported");
6838097973089420749dcd1ab4974a629c2466b31ccAngus Kong                return false;
6848097973089420749dcd1ab4974a629c2466b31ccAngus Kong            }
6858097973089420749dcd1ab4974a629c2466b31ccAngus Kong        } else {
6869d8668449376fa47bc6528c7a61b04d6a0f691b3Sol Boucher            if (settings.getCurrentZoomRatio() > getMaxZoomRatio()) {
6878097973089420749dcd1ab4974a629c2466b31ccAngus Kong                Log.v(TAG, "Zoom ratio is not supported: ratio = " +
6889d8668449376fa47bc6528c7a61b04d6a0f691b3Sol Boucher                        settings.getCurrentZoomRatio());
6898097973089420749dcd1ab4974a629c2466b31ccAngus Kong                return false;
6908097973089420749dcd1ab4974a629c2466b31ccAngus Kong            }
6918097973089420749dcd1ab4974a629c2466b31ccAngus Kong        }
6928097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return true;
6938097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
6948097973089420749dcd1ab4974a629c2466b31ccAngus Kong
6958097973089420749dcd1ab4974a629c2466b31ccAngus Kong    private boolean exposureCheck(final CameraSettings settings) {
6968097973089420749dcd1ab4974a629c2466b31ccAngus Kong        final int index = settings.getExposureCompensationIndex();
6978097973089420749dcd1ab4974a629c2466b31ccAngus Kong        if (index > getMaxExposureCompensation() || index < getMinExposureCompensation()) {
6988097973089420749dcd1ab4974a629c2466b31ccAngus Kong            Log.v(TAG, "Exposure compensation index is not supported. Min = " +
6998097973089420749dcd1ab4974a629c2466b31ccAngus Kong                    getMinExposureCompensation() + ", max = " + getMaxExposureCompensation() + "," +
7008097973089420749dcd1ab4974a629c2466b31ccAngus Kong                    " setting = " + index);
7018097973089420749dcd1ab4974a629c2466b31ccAngus Kong            return false;
7028097973089420749dcd1ab4974a629c2466b31ccAngus Kong        }
7038097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return true;
7048097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
7058097973089420749dcd1ab4974a629c2466b31ccAngus Kong
7068097973089420749dcd1ab4974a629c2466b31ccAngus Kong    private boolean focusCheck(final CameraSettings settings) {
7078097973089420749dcd1ab4974a629c2466b31ccAngus Kong        FocusMode focusMode = settings.getCurrentFocusMode();
7088097973089420749dcd1ab4974a629c2466b31ccAngus Kong        if (!supports(focusMode)) {
709f2b5a976bb1c30f83682a996ce9289a973c88784Sol Boucher            if (supports(FocusMode.FIXED)) {
710f2b5a976bb1c30f83682a996ce9289a973c88784Sol Boucher                // Workaround for devices whose templates define defaults they don't really support
711f2b5a976bb1c30f83682a996ce9289a973c88784Sol Boucher                // TODO: Remove workaround (b/17177436)
712f2b5a976bb1c30f83682a996ce9289a973c88784Sol Boucher                Log.w(TAG, "Focus mode not supported... trying FIXED");
713f2b5a976bb1c30f83682a996ce9289a973c88784Sol Boucher                settings.setFocusMode(FocusMode.FIXED);
714f2b5a976bb1c30f83682a996ce9289a973c88784Sol Boucher            } else {
715f2b5a976bb1c30f83682a996ce9289a973c88784Sol Boucher                Log.v(TAG, "Focus mode not supported:" +
716f2b5a976bb1c30f83682a996ce9289a973c88784Sol Boucher                        (focusMode != null ? focusMode.name() : "null"));
717f2b5a976bb1c30f83682a996ce9289a973c88784Sol Boucher                return false;
718f2b5a976bb1c30f83682a996ce9289a973c88784Sol Boucher            }
7198097973089420749dcd1ab4974a629c2466b31ccAngus Kong        }
7208097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return true;
7218097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
7228097973089420749dcd1ab4974a629c2466b31ccAngus Kong
7238097973089420749dcd1ab4974a629c2466b31ccAngus Kong    private boolean flashCheck(final CameraSettings settings) {
7248097973089420749dcd1ab4974a629c2466b31ccAngus Kong        FlashMode flashMode = settings.getCurrentFlashMode();
7258097973089420749dcd1ab4974a629c2466b31ccAngus Kong        if (!supports(flashMode)) {
7268097973089420749dcd1ab4974a629c2466b31ccAngus Kong            Log.v(TAG,
7278097973089420749dcd1ab4974a629c2466b31ccAngus Kong                    "Flash mode not supported:" + (flashMode != null ? flashMode.name() : "null"));
7288097973089420749dcd1ab4974a629c2466b31ccAngus Kong            return false;
7298097973089420749dcd1ab4974a629c2466b31ccAngus Kong        }
7308097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return true;
7318097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
7328097973089420749dcd1ab4974a629c2466b31ccAngus Kong
7338097973089420749dcd1ab4974a629c2466b31ccAngus Kong    private boolean photoSizeCheck(final CameraSettings settings) {
7348097973089420749dcd1ab4974a629c2466b31ccAngus Kong        Size photoSize = settings.getCurrentPhotoSize();
7358097973089420749dcd1ab4974a629c2466b31ccAngus Kong        if (mSupportedPhotoSizes.contains(photoSize)) {
7368097973089420749dcd1ab4974a629c2466b31ccAngus Kong            return true;
7378097973089420749dcd1ab4974a629c2466b31ccAngus Kong        }
7388097973089420749dcd1ab4974a629c2466b31ccAngus Kong        Log.v(TAG, "Unsupported photo size:" + photoSize);
7398097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return false;
7408097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
7418097973089420749dcd1ab4974a629c2466b31ccAngus Kong
7428097973089420749dcd1ab4974a629c2466b31ccAngus Kong    private boolean previewSizeCheck(final CameraSettings settings) {
7438097973089420749dcd1ab4974a629c2466b31ccAngus Kong        final Size previewSize = settings.getCurrentPreviewSize();
7448097973089420749dcd1ab4974a629c2466b31ccAngus Kong        if (mSupportedPreviewSizes.contains(previewSize)) {
7458097973089420749dcd1ab4974a629c2466b31ccAngus Kong            return true;
7468097973089420749dcd1ab4974a629c2466b31ccAngus Kong        }
7478097973089420749dcd1ab4974a629c2466b31ccAngus Kong        Log.v(TAG, "Unsupported preview size:" + previewSize);
7488097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return false;
7498097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
7508097973089420749dcd1ab4974a629c2466b31ccAngus Kong
7518097973089420749dcd1ab4974a629c2466b31ccAngus Kong    private boolean videoStabilizationCheck(final CameraSettings settings) {
7528097973089420749dcd1ab4974a629c2466b31ccAngus Kong        if (!settings.isVideoStabilizationEnabled() || supports(Feature.VIDEO_STABILIZATION)) {
7538097973089420749dcd1ab4974a629c2466b31ccAngus Kong            return true;
7548097973089420749dcd1ab4974a629c2466b31ccAngus Kong        }
7558097973089420749dcd1ab4974a629c2466b31ccAngus Kong        Log.v(TAG, "Video stabilization is not supported");
7568097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return false;
7578097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
758c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong}
759