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