CameraCapabilities.java revision f2b5a976bb1c30f83682a996ce9289a973c88784
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
398097973089420749dcd1ab4974a629c2466b31ccAngus Kong    /* All internal states are declared final and should be thread-safe. */
40c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
41c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected final ArrayList<int[]> mSupportedPreviewFpsRange = new ArrayList<int[]>();
428097973089420749dcd1ab4974a629c2466b31ccAngus Kong    protected final ArrayList<Size> mSupportedPreviewSizes = new ArrayList<Size>();
43c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected final TreeSet<Integer> mSupportedPreviewFormats = new TreeSet<Integer>();
448097973089420749dcd1ab4974a629c2466b31ccAngus Kong    protected final ArrayList<Size> mSupportedVideoSizes = new ArrayList<Size>();
458097973089420749dcd1ab4974a629c2466b31ccAngus Kong    protected final ArrayList<Size> mSupportedPhotoSizes = new ArrayList<Size>();
468097973089420749dcd1ab4974a629c2466b31ccAngus Kong    protected final TreeSet<Integer> mSupportedPhotoFormats = new TreeSet<Integer>();
47c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected final EnumSet<SceneMode> mSupportedSceneModes = EnumSet.noneOf(SceneMode.class);
48c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected final EnumSet<FlashMode> mSupportedFlashModes = EnumSet.noneOf(FlashMode.class);
49c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected final EnumSet<FocusMode> mSupportedFocusModes = EnumSet.noneOf(FocusMode.class);
50c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected final EnumSet<WhiteBalance> mSupportedWhiteBalances =
51c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            EnumSet.noneOf(WhiteBalance.class);
52c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected final EnumSet<Feature> mSupportedFeatures = EnumSet.noneOf(Feature.class);
538097973089420749dcd1ab4974a629c2466b31ccAngus Kong    protected Size mPreferredPreviewSizeForVideo;
54c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected int mMinExposureCompensation;
55c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected int mMaxExposureCompensation;
56c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected float mExposureCompensationStep;
57c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected int mMaxNumOfFacesSupported;
58c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected int mMaxNumOfFocusAreas;
59c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    protected int mMaxNumOfMeteringArea;
608097973089420749dcd1ab4974a629c2466b31ccAngus Kong    protected int mMaxZoomRatio;
6101e7c02174ef268b6d6daaa5a5bb4f752d55964cAngus Kong    protected float mHorizontalViewAngle;
6201e7c02174ef268b6d6daaa5a5bb4f752d55964cAngus Kong    protected float mVerticalViewAngle;
63c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private final Stringifier mStringifier;
648097973089420749dcd1ab4974a629c2466b31ccAngus Kong    protected final ArrayList<Integer> mZoomRatioList = new ArrayList<Integer>();
658097973089420749dcd1ab4974a629c2466b31ccAngus Kong    protected int mMaxZoomIndex;
66c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
678097973089420749dcd1ab4974a629c2466b31ccAngus Kong    /**
688097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * Focus modes.
698097973089420749dcd1ab4974a629c2466b31ccAngus Kong     */
70c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public enum FocusMode {
71c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
72c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Continuous auto focus mode intended for taking pictures.
73c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FOCUS_MODE_AUTO}.
74c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
75c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        AUTO,
76c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
77c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Continuous auto focus mode intended for taking pictures.
78c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FOCUS_MODE_CONTINUOUS_PICTURE}.
79c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
80c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        CONTINUOUS_PICTURE,
81c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
82c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Continuous auto focus mode intended for video recording.
83c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FOCUS_MODE_CONTINUOUS_VIDEO}.
84c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
85c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        CONTINUOUS_VIDEO,
86c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
87c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Extended depth of field (EDOF).
88c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FOCUS_MODE_EDOF}.
89c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
90c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        EXTENDED_DOF,
91c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
92c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Focus is fixed.
93c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FOCUS_MODE_FIXED}.
94c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
95c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        FIXED,
96c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
97c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Focus is set at infinity.
98c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FOCUS_MODE_INFINITY}.
99c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
100de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher        // TODO: Unsupported on API 2
101c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        INFINITY,
102c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
103c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Macro (close-up) focus mode.
104c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FOCUS_MODE_MACRO}.
105c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
106c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        MACRO,
107c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
108c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
1098097973089420749dcd1ab4974a629c2466b31ccAngus Kong    /**
1108097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * Flash modes.
1118097973089420749dcd1ab4974a629c2466b31ccAngus Kong     */
112c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public enum FlashMode {
113c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
1148097973089420749dcd1ab4974a629c2466b31ccAngus Kong         * No flash.
1158097973089420749dcd1ab4974a629c2466b31ccAngus Kong         */
1168097973089420749dcd1ab4974a629c2466b31ccAngus Kong        NO_FLASH,
1178097973089420749dcd1ab4974a629c2466b31ccAngus Kong        /**
118c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Flash will be fired automatically when required.
119c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FLASH_MODE_OFF}.
120c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
121c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        AUTO,
122c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
123c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Flash will not be fired.
124c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FLASH_MODE_OFF}.
125c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
126c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        OFF,
127c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
128c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Flash will always be fired during snapshot.
129c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FLASH_MODE_ON}.
130c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
131c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        ON,
132c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
133c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Constant emission of light during preview, auto-focus and snapshot.
134c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FLASH_MODE_TORCH}.
135c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
136c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        TORCH,
137c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
138c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Flash will be fired in red-eye reduction mode.
139c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#FLASH_MODE_RED_EYE}.
140c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
141c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        RED_EYE,
142c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
143c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
1448097973089420749dcd1ab4974a629c2466b31ccAngus Kong    /**
1458097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * Scene modes.
1468097973089420749dcd1ab4974a629c2466b31ccAngus Kong     */
147c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public enum SceneMode {
148c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
1498097973089420749dcd1ab4974a629c2466b31ccAngus Kong         * No supported scene mode.
1508097973089420749dcd1ab4974a629c2466b31ccAngus Kong         */
1518097973089420749dcd1ab4974a629c2466b31ccAngus Kong        NO_SCENE_MODE,
1528097973089420749dcd1ab4974a629c2466b31ccAngus Kong        /**
153c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Scene mode is off.
154c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_AUTO}.
155c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
156c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        AUTO,
157c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
158c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Take photos of fast moving objects.
159c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_ACTION}.
160c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
161c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        ACTION,
162c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
163c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Applications are looking for a barcode.
164c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_BARCODE}.
165c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
166c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        BARCODE,
167c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
168c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Take pictures on the beach.
169c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_BEACH}.
170c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
171c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        BEACH,
172c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
173c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Capture the naturally warm color of scenes lit by candles.
174c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_CANDLELIGHT}.
175c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
176c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        CANDLELIGHT,
177c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
178c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * For shooting firework displays.
179c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_FIREWORKS}.
180c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
181c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        FIREWORKS,
182c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
183c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Capture a scene using high dynamic range imaging techniques.
184c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_HDR}.
185c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
186de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher        // TODO: Unsupported on API 2
187c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        HDR,
188c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
189c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Take pictures on distant objects.
190c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_LANDSCAPE}.
191c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
192c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        LANDSCAPE,
193c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
194c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Take photos at night.
195c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_NIGHT}.
196c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
197c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        NIGHT,
198c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
199c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Take people pictures at night.
200c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_NIGHT_PORTRAIT}.
201c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
202de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher        // TODO: Unsupported on API 2
203c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        NIGHT_PORTRAIT,
204c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
205c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Take indoor low-light shot.
206c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_PARTY}.
207c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
208c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        PARTY,
209c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
210c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Take people pictures.
211c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_PORTRAIT}.
212c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
213c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        PORTRAIT,
214c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
215c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Take pictures on the snow.
216c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_SNOW}.
217c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
218c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        SNOW,
219c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
220c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Take photos of fast moving objects.
221c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_SPORTS}.
222c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
223c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        SPORTS,
224c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
225c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Avoid blurry pictures (for example, due to hand shake).
226c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_STEADYPHOTO}.
227c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
228c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        STEADYPHOTO,
229c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
230c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Take sunset photos.
231c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_SUNSET}.
232c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
233c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        SUNSET,
234c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
235c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Take photos in a theater.
236c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#SCENE_MODE_THEATRE}.
237c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
238c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        THEATRE,
239c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
240c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
2418097973089420749dcd1ab4974a629c2466b31ccAngus Kong    /**
2428097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * White blances.
2438097973089420749dcd1ab4974a629c2466b31ccAngus Kong     */
244c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public enum WhiteBalance {
245c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
246c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#WHITE_BALANCE_AUTO}.
247c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
248c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        AUTO,
249c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
250c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#WHITE_BALANCE_CLOUDY_DAYLIGHT}.
251c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
252c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        CLOUDY_DAYLIGHT,
253c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
254c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#WHITE_BALANCE_DAYLIGHT}.
255c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
256c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        DAYLIGHT,
257c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
258c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#WHITE_BALANCE_FLUORESCENT}.
259c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
260c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        FLUORESCENT,
261c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
262c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#WHITE_BALANCE_INCANDESCENT}.
263c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
264c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        INCANDESCENT,
265c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
266c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#WHITE_BALANCE_SHADE}.
267c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
268c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        SHADE,
269c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
270c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#WHITE_BALANCE_TWILIGHT}.
271c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
272c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        TWILIGHT,
273c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
274c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @see {@link android.hardware.Camera.Parameters#WHITE_BALANCE_WARM_FLUORESCENT}.
275c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
276c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        WARM_FLUORESCENT,
277c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
278c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
2798097973089420749dcd1ab4974a629c2466b31ccAngus Kong    /**
2808097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * Features.
2818097973089420749dcd1ab4974a629c2466b31ccAngus Kong     */
282c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public enum Feature {
283c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
284c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Support zoom-related methods.
285c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
286c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        ZOOM,
287c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
288c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Support for photo capturing during video recording.
289c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
290c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        VIDEO_SNAPSHOT,
291c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
292c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Support for focus area settings.
293c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
294c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        FOCUS_AREA,
295c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
296c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Support for metering area settings.
297c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
298c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        METERING_AREA,
299c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
300c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Support for automatic exposure lock.
301c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
302c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        AUTO_EXPOSURE_LOCK,
303c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
304c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Support for automatic white balance lock.
305c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
306c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        AUTO_WHITE_BALANCE_LOCK,
3078097973089420749dcd1ab4974a629c2466b31ccAngus Kong        /**
3088097973089420749dcd1ab4974a629c2466b31ccAngus Kong         * Support for video stabilization.
3098097973089420749dcd1ab4974a629c2466b31ccAngus Kong         */
3108097973089420749dcd1ab4974a629c2466b31ccAngus Kong        VIDEO_STABILIZATION,
311c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
312c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
313c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
314c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * A interface stringifier to convert abstract representations to API
315c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * related string representation.
316c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
317a0842b40441db5332a5290f941021636b1182761Sol Boucher    public static class Stringifier {
318a0842b40441db5332a5290f941021636b1182761Sol Boucher        /**
319a0842b40441db5332a5290f941021636b1182761Sol Boucher         * Converts the string to hyphen-delimited lowercase for compatibility with multiple APIs.
320a0842b40441db5332a5290f941021636b1182761Sol Boucher         *
321a0842b40441db5332a5290f941021636b1182761Sol Boucher         * @param enumCase The name of an enum constant.
322a0842b40441db5332a5290f941021636b1182761Sol Boucher         * @return The converted string.
323a0842b40441db5332a5290f941021636b1182761Sol Boucher         */
324a0842b40441db5332a5290f941021636b1182761Sol Boucher        private static String toApiCase(String enumCase) {
325a0842b40441db5332a5290f941021636b1182761Sol Boucher            return enumCase.toLowerCase().replaceAll("_", "-");
326a0842b40441db5332a5290f941021636b1182761Sol Boucher        }
327a0842b40441db5332a5290f941021636b1182761Sol Boucher
328a0842b40441db5332a5290f941021636b1182761Sol Boucher        /**
329a0842b40441db5332a5290f941021636b1182761Sol Boucher         * Conerts the string to underscore-delimited uppercase to match the enum constant names.
330a0842b40441db5332a5290f941021636b1182761Sol Boucher         *
331a0842b40441db5332a5290f941021636b1182761Sol Boucher         * @param apiCase An API-related string representation.
332a0842b40441db5332a5290f941021636b1182761Sol Boucher         * @return The converted string.
333a0842b40441db5332a5290f941021636b1182761Sol Boucher         */
334a0842b40441db5332a5290f941021636b1182761Sol Boucher        private static String toEnumCase(String apiCase) {
335a0842b40441db5332a5290f941021636b1182761Sol Boucher            return apiCase.toUpperCase().replaceAll("-", "_");
336a0842b40441db5332a5290f941021636b1182761Sol Boucher        }
337a0842b40441db5332a5290f941021636b1182761Sol Boucher
338c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
339c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Converts the focus mode to API-related string representation.
340c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         *
341c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @param focus The focus mode to convert.
342c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @return The string used by the camera framework API to represent the
343a0842b40441db5332a5290f941021636b1182761Sol Boucher         *         focus mode.
344c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
345a0842b40441db5332a5290f941021636b1182761Sol Boucher        public String stringify(FocusMode focus) {
346a0842b40441db5332a5290f941021636b1182761Sol Boucher            return toApiCase(focus.name());
347a0842b40441db5332a5290f941021636b1182761Sol Boucher        }
348c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
349c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
350c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Converts the API-related string representation of the focus mode to the
351c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * abstract representation.
352c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         *
353c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @param val The string representation.
354a0842b40441db5332a5290f941021636b1182761Sol Boucher         * @return The focus mode represented by the input string, or the focus
355a0842b40441db5332a5290f941021636b1182761Sol Boucher         *         mode with the lowest ordinal if it cannot be converted.
356a0842b40441db5332a5290f941021636b1182761Sol Boucher         */
357a0842b40441db5332a5290f941021636b1182761Sol Boucher        public FocusMode focusModeFromString(String val) {
358a0842b40441db5332a5290f941021636b1182761Sol Boucher            if (val == null) {
359a0842b40441db5332a5290f941021636b1182761Sol Boucher                return FocusMode.values()[0];
360a0842b40441db5332a5290f941021636b1182761Sol Boucher            }
361a0842b40441db5332a5290f941021636b1182761Sol Boucher            try {
362a0842b40441db5332a5290f941021636b1182761Sol Boucher                return FocusMode.valueOf(toEnumCase(val));
363a0842b40441db5332a5290f941021636b1182761Sol Boucher            } catch (IllegalArgumentException ex) {
364a0842b40441db5332a5290f941021636b1182761Sol Boucher                return FocusMode.values()[0];
365a0842b40441db5332a5290f941021636b1182761Sol Boucher            }
366a0842b40441db5332a5290f941021636b1182761Sol Boucher        }
367c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
368c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
369c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Converts the flash mode to API-related string representation.
370c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         *
371c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @param flash The focus mode to convert.
372c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @return The string used by the camera framework API to represent the
373a0842b40441db5332a5290f941021636b1182761Sol Boucher         *         flash mode.
374c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
375a0842b40441db5332a5290f941021636b1182761Sol Boucher        public String stringify(FlashMode flash) {
376a0842b40441db5332a5290f941021636b1182761Sol Boucher            return toApiCase(flash.name());
377a0842b40441db5332a5290f941021636b1182761Sol Boucher        }
378c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
379c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
380c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Converts the API-related string representation of the flash mode to the
381c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * abstract representation.
382c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         *
383c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @param val The string representation.
384a0842b40441db5332a5290f941021636b1182761Sol Boucher         * @return The flash mode represented by the input string, or the flash
385a0842b40441db5332a5290f941021636b1182761Sol Boucher         *         mode with the lowest ordinal if it cannot be converted.
386a0842b40441db5332a5290f941021636b1182761Sol Boucher         */
387a0842b40441db5332a5290f941021636b1182761Sol Boucher        public FlashMode flashModeFromString(String val) {
388a0842b40441db5332a5290f941021636b1182761Sol Boucher            if (val == null) {
389a0842b40441db5332a5290f941021636b1182761Sol Boucher                return FlashMode.values()[0];
390a0842b40441db5332a5290f941021636b1182761Sol Boucher            }
391a0842b40441db5332a5290f941021636b1182761Sol Boucher            try {
392a0842b40441db5332a5290f941021636b1182761Sol Boucher                return FlashMode.valueOf(toEnumCase(val));
393a0842b40441db5332a5290f941021636b1182761Sol Boucher            } catch (IllegalArgumentException ex) {
394a0842b40441db5332a5290f941021636b1182761Sol Boucher                return FlashMode.values()[0];
395a0842b40441db5332a5290f941021636b1182761Sol Boucher            }
396a0842b40441db5332a5290f941021636b1182761Sol Boucher        }
397c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
398c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
399c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Converts the scene mode to API-related string representation.
400c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         *
401c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @param scene The focus mode to convert.
402c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @return The string used by the camera framework API to represent the
403a0842b40441db5332a5290f941021636b1182761Sol Boucher         *         scene mode.
404c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
405a0842b40441db5332a5290f941021636b1182761Sol Boucher        public String stringify(SceneMode scene) {
406a0842b40441db5332a5290f941021636b1182761Sol Boucher            return toApiCase(scene.name());
407a0842b40441db5332a5290f941021636b1182761Sol Boucher        }
408c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
409c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
410c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Converts the API-related string representation of the scene mode to the
411c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * abstract representation.
412c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         *
413c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @param val The string representation.
414a0842b40441db5332a5290f941021636b1182761Sol Boucher         * @return The scene mode represented by the input string, or the scene
415a0842b40441db5332a5290f941021636b1182761Sol Boucher         *         mode with the lowest ordinal if it cannot be converted.
416a0842b40441db5332a5290f941021636b1182761Sol Boucher         */
417a0842b40441db5332a5290f941021636b1182761Sol Boucher        public SceneMode sceneModeFromString(String val) {
418a0842b40441db5332a5290f941021636b1182761Sol Boucher            if (val == null) {
419a0842b40441db5332a5290f941021636b1182761Sol Boucher                return SceneMode.values()[0];
420a0842b40441db5332a5290f941021636b1182761Sol Boucher            }
421a0842b40441db5332a5290f941021636b1182761Sol Boucher            try {
422a0842b40441db5332a5290f941021636b1182761Sol Boucher                return SceneMode.valueOf(toEnumCase(val));
423a0842b40441db5332a5290f941021636b1182761Sol Boucher            } catch (IllegalArgumentException ex) {
424a0842b40441db5332a5290f941021636b1182761Sol Boucher                return SceneMode.values()[0];
425a0842b40441db5332a5290f941021636b1182761Sol Boucher            }
426a0842b40441db5332a5290f941021636b1182761Sol Boucher        }
427c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
428c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
429c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Converts the white balance to API-related string representation.
430c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         *
431c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @param wb The focus mode to convert.
432c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @return The string used by the camera framework API to represent the
433c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * white balance.
434c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         */
435a0842b40441db5332a5290f941021636b1182761Sol Boucher        public String stringify(WhiteBalance wb) {
436a0842b40441db5332a5290f941021636b1182761Sol Boucher            return toApiCase(wb.name());
437a0842b40441db5332a5290f941021636b1182761Sol Boucher        }
438c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
439c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        /**
440c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * Converts the API-related string representation of the white balance to
441c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * the abstract representation.
442c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         *
443c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong         * @param val The string representation.
444a0842b40441db5332a5290f941021636b1182761Sol Boucher         * @return The white balance represented by the input string, or the
445a0842b40441db5332a5290f941021636b1182761Sol Boucher         *         white balance with the lowest ordinal if it cannot be
446a0842b40441db5332a5290f941021636b1182761Sol Boucher         *         converted.
447a0842b40441db5332a5290f941021636b1182761Sol Boucher         */
448a0842b40441db5332a5290f941021636b1182761Sol Boucher        public WhiteBalance whiteBalanceFromString(String val) {
449a0842b40441db5332a5290f941021636b1182761Sol Boucher            if (val == null) {
450a0842b40441db5332a5290f941021636b1182761Sol Boucher                return WhiteBalance.values()[0];
451a0842b40441db5332a5290f941021636b1182761Sol Boucher            }
452a0842b40441db5332a5290f941021636b1182761Sol Boucher            try {
453a0842b40441db5332a5290f941021636b1182761Sol Boucher                return WhiteBalance.valueOf(toEnumCase(val));
454a0842b40441db5332a5290f941021636b1182761Sol Boucher            } catch (IllegalArgumentException ex) {
455a0842b40441db5332a5290f941021636b1182761Sol Boucher                return WhiteBalance.values()[0];
456a0842b40441db5332a5290f941021636b1182761Sol Boucher            }
457a0842b40441db5332a5290f941021636b1182761Sol Boucher        }
458c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
459c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
460c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
4618097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * Constructor.
4628097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * @param stringifier The API-specific stringifier for this instance.
463c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
4648097973089420749dcd1ab4974a629c2466b31ccAngus Kong    CameraCapabilities(Stringifier stringifier) {
4658097973089420749dcd1ab4974a629c2466b31ccAngus Kong        mStringifier = stringifier;
466c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
467c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
468c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
469c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * Copy constructor.
470c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @param src The source instance.
471c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
472c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public CameraCapabilities(CameraCapabilities src) {
473c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mSupportedPreviewFpsRange.addAll(src.mSupportedPreviewFpsRange);
474c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mSupportedPreviewSizes.addAll(src.mSupportedPreviewSizes);
475c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mSupportedPreviewFormats.addAll(src.mSupportedPreviewFormats);
476c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mSupportedVideoSizes.addAll(src.mSupportedVideoSizes);
4778097973089420749dcd1ab4974a629c2466b31ccAngus Kong        mSupportedPhotoSizes.addAll(src.mSupportedPhotoSizes);
4788097973089420749dcd1ab4974a629c2466b31ccAngus Kong        mSupportedPhotoFormats.addAll(src.mSupportedPhotoFormats);
479c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mSupportedSceneModes.addAll(src.mSupportedSceneModes);
480c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mSupportedFlashModes.addAll(src.mSupportedFlashModes);
481c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mSupportedFocusModes.addAll(src.mSupportedFocusModes);
482c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mSupportedWhiteBalances.addAll(src.mSupportedWhiteBalances);
483c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mSupportedFeatures.addAll(src.mSupportedFeatures);
4848097973089420749dcd1ab4974a629c2466b31ccAngus Kong        mPreferredPreviewSizeForVideo = src.mPreferredPreviewSizeForVideo;
485c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mMaxExposureCompensation = src.mMaxExposureCompensation;
486c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mMinExposureCompensation = src.mMinExposureCompensation;
487c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mExposureCompensationStep = src.mExposureCompensationStep;
488c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mMaxNumOfFacesSupported = src.mMaxNumOfFacesSupported;
489c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mMaxNumOfFocusAreas = src.mMaxNumOfFocusAreas;
4908097973089420749dcd1ab4974a629c2466b31ccAngus Kong        mMaxNumOfMeteringArea = src.mMaxNumOfMeteringArea;
4914ecb0ad6d1d5dc6b12f998bf694877df06a77890Alan Newberger        mMaxZoomIndex = src.mMaxZoomIndex;
4924ecb0ad6d1d5dc6b12f998bf694877df06a77890Alan Newberger        mZoomRatioList.addAll(src.mZoomRatioList);
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    // We'll replace these old style methods with new ones.
6398097973089420749dcd1ab4974a629c2466b31ccAngus Kong    @Deprecated
6408097973089420749dcd1ab4974a629c2466b31ccAngus Kong    public int getMaxZoomIndex() {
6418097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return mMaxZoomIndex;
6428097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
6438097973089420749dcd1ab4974a629c2466b31ccAngus Kong
6448097973089420749dcd1ab4974a629c2466b31ccAngus Kong    @Deprecated
6458097973089420749dcd1ab4974a629c2466b31ccAngus Kong    public List<Integer> getZoomRatioList() {
6468097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return new ArrayList<Integer>(mZoomRatioList);
6478097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
6488097973089420749dcd1ab4974a629c2466b31ccAngus Kong
6498097973089420749dcd1ab4974a629c2466b31ccAngus Kong    /**
650c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @return The min exposure compensation index. The EV is the compensation
651c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * index multiplied by the step value. If unsupported, both this method and
652c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * {@link #getMaxExposureCompensation()} return 0.
653c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
654c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public final int getMinExposureCompensation() {
655c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        return mMinExposureCompensation;
656c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
657c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
658c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
659c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @return The max exposure compensation index. The EV is the compensation
660c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * index multiplied by the step value. If unsupported, both this method and
661c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * {@link #getMinExposureCompensation()} return 0.
662c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
663c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public final int getMaxExposureCompensation() {
664c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        return mMaxExposureCompensation;
665c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
666c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
667c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
668c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @return The exposure compensation step. The EV is the compensation index
669c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * multiplied by the step value.
670c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
671c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public final float getExposureCompensationStep() {
672c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        return mExposureCompensationStep;
673c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
674c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
675c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
676c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @return The max number of faces supported by the face detection. 0 if
677c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * unsupported.
678c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
679c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public final int getMaxNumOfFacesSupported() {
680c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        return mMaxNumOfFacesSupported;
681c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
682c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
683c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    /**
684c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     * @return The stringifier used by this instance.
685c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong     */
686c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    public Stringifier getStringifier() {
687c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        return mStringifier;
688c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
6898097973089420749dcd1ab4974a629c2466b31ccAngus Kong
6908097973089420749dcd1ab4974a629c2466b31ccAngus Kong    private boolean zoomCheck(final CameraSettings settings) {
6918097973089420749dcd1ab4974a629c2466b31ccAngus Kong        final float ratio = settings.getCurrentZoomRatio();
6928097973089420749dcd1ab4974a629c2466b31ccAngus Kong        final int index = settings.getCurrentZoomIndex();
6938097973089420749dcd1ab4974a629c2466b31ccAngus Kong        if (!supports(Feature.ZOOM)) {
6948097973089420749dcd1ab4974a629c2466b31ccAngus Kong            if (ratio != 1.0f || index != 0) {
6958097973089420749dcd1ab4974a629c2466b31ccAngus Kong                Log.v(TAG, "Zoom is not supported");
6968097973089420749dcd1ab4974a629c2466b31ccAngus Kong                return false;
6978097973089420749dcd1ab4974a629c2466b31ccAngus Kong            }
6988097973089420749dcd1ab4974a629c2466b31ccAngus Kong        } else {
6998097973089420749dcd1ab4974a629c2466b31ccAngus Kong            if (settings.getCurrentZoomRatio() > getMaxZoomRatio() ||
7008097973089420749dcd1ab4974a629c2466b31ccAngus Kong                    index > getMaxZoomIndex()) {
7018097973089420749dcd1ab4974a629c2466b31ccAngus Kong                Log.v(TAG, "Zoom ratio is not supported: ratio = " +
7028097973089420749dcd1ab4974a629c2466b31ccAngus Kong                        settings.getCurrentZoomRatio() + ", index = " + index);
7038097973089420749dcd1ab4974a629c2466b31ccAngus Kong                return false;
7048097973089420749dcd1ab4974a629c2466b31ccAngus Kong            }
7058097973089420749dcd1ab4974a629c2466b31ccAngus Kong        }
7068097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return true;
7078097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
7088097973089420749dcd1ab4974a629c2466b31ccAngus Kong
7098097973089420749dcd1ab4974a629c2466b31ccAngus Kong    private boolean exposureCheck(final CameraSettings settings) {
7108097973089420749dcd1ab4974a629c2466b31ccAngus Kong        final int index = settings.getExposureCompensationIndex();
7118097973089420749dcd1ab4974a629c2466b31ccAngus Kong        if (index > getMaxExposureCompensation() || index < getMinExposureCompensation()) {
7128097973089420749dcd1ab4974a629c2466b31ccAngus Kong            Log.v(TAG, "Exposure compensation index is not supported. Min = " +
7138097973089420749dcd1ab4974a629c2466b31ccAngus Kong                    getMinExposureCompensation() + ", max = " + getMaxExposureCompensation() + "," +
7148097973089420749dcd1ab4974a629c2466b31ccAngus Kong                    " setting = " + index);
7158097973089420749dcd1ab4974a629c2466b31ccAngus Kong            return false;
7168097973089420749dcd1ab4974a629c2466b31ccAngus Kong        }
7178097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return true;
7188097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
7198097973089420749dcd1ab4974a629c2466b31ccAngus Kong
7208097973089420749dcd1ab4974a629c2466b31ccAngus Kong    private boolean focusCheck(final CameraSettings settings) {
7218097973089420749dcd1ab4974a629c2466b31ccAngus Kong        FocusMode focusMode = settings.getCurrentFocusMode();
7228097973089420749dcd1ab4974a629c2466b31ccAngus Kong        if (!supports(focusMode)) {
723f2b5a976bb1c30f83682a996ce9289a973c88784Sol Boucher            if (supports(FocusMode.FIXED)) {
724f2b5a976bb1c30f83682a996ce9289a973c88784Sol Boucher                // Workaround for devices whose templates define defaults they don't really support
725f2b5a976bb1c30f83682a996ce9289a973c88784Sol Boucher                // TODO: Remove workaround (b/17177436)
726f2b5a976bb1c30f83682a996ce9289a973c88784Sol Boucher                Log.w(TAG, "Focus mode not supported... trying FIXED");
727f2b5a976bb1c30f83682a996ce9289a973c88784Sol Boucher                settings.setFocusMode(FocusMode.FIXED);
728f2b5a976bb1c30f83682a996ce9289a973c88784Sol Boucher            } else {
729f2b5a976bb1c30f83682a996ce9289a973c88784Sol Boucher                Log.v(TAG, "Focus mode not supported:" +
730f2b5a976bb1c30f83682a996ce9289a973c88784Sol Boucher                        (focusMode != null ? focusMode.name() : "null"));
731f2b5a976bb1c30f83682a996ce9289a973c88784Sol Boucher                return false;
732f2b5a976bb1c30f83682a996ce9289a973c88784Sol Boucher            }
7338097973089420749dcd1ab4974a629c2466b31ccAngus Kong        }
7348097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return true;
7358097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
7368097973089420749dcd1ab4974a629c2466b31ccAngus Kong
7378097973089420749dcd1ab4974a629c2466b31ccAngus Kong    private boolean flashCheck(final CameraSettings settings) {
7388097973089420749dcd1ab4974a629c2466b31ccAngus Kong        FlashMode flashMode = settings.getCurrentFlashMode();
7398097973089420749dcd1ab4974a629c2466b31ccAngus Kong        if (!supports(flashMode)) {
7408097973089420749dcd1ab4974a629c2466b31ccAngus Kong            Log.v(TAG,
7418097973089420749dcd1ab4974a629c2466b31ccAngus Kong                    "Flash mode not supported:" + (flashMode != null ? flashMode.name() : "null"));
7428097973089420749dcd1ab4974a629c2466b31ccAngus Kong            return false;
7438097973089420749dcd1ab4974a629c2466b31ccAngus Kong        }
7448097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return true;
7458097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
7468097973089420749dcd1ab4974a629c2466b31ccAngus Kong
7478097973089420749dcd1ab4974a629c2466b31ccAngus Kong    private boolean photoSizeCheck(final CameraSettings settings) {
7488097973089420749dcd1ab4974a629c2466b31ccAngus Kong        Size photoSize = settings.getCurrentPhotoSize();
7498097973089420749dcd1ab4974a629c2466b31ccAngus Kong        if (mSupportedPhotoSizes.contains(photoSize)) {
7508097973089420749dcd1ab4974a629c2466b31ccAngus Kong            return true;
7518097973089420749dcd1ab4974a629c2466b31ccAngus Kong        }
7528097973089420749dcd1ab4974a629c2466b31ccAngus Kong        Log.v(TAG, "Unsupported photo size:" + photoSize);
7538097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return false;
7548097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
7558097973089420749dcd1ab4974a629c2466b31ccAngus Kong
7568097973089420749dcd1ab4974a629c2466b31ccAngus Kong    private boolean previewSizeCheck(final CameraSettings settings) {
7578097973089420749dcd1ab4974a629c2466b31ccAngus Kong        final Size previewSize = settings.getCurrentPreviewSize();
7588097973089420749dcd1ab4974a629c2466b31ccAngus Kong        if (mSupportedPreviewSizes.contains(previewSize)) {
7598097973089420749dcd1ab4974a629c2466b31ccAngus Kong            return true;
7608097973089420749dcd1ab4974a629c2466b31ccAngus Kong        }
7618097973089420749dcd1ab4974a629c2466b31ccAngus Kong        Log.v(TAG, "Unsupported preview size:" + previewSize);
7628097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return false;
7638097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
7648097973089420749dcd1ab4974a629c2466b31ccAngus Kong
7658097973089420749dcd1ab4974a629c2466b31ccAngus Kong    private boolean videoStabilizationCheck(final CameraSettings settings) {
7668097973089420749dcd1ab4974a629c2466b31ccAngus Kong        if (!settings.isVideoStabilizationEnabled() || supports(Feature.VIDEO_STABILIZATION)) {
7678097973089420749dcd1ab4974a629c2466b31ccAngus Kong            return true;
7688097973089420749dcd1ab4974a629c2466b31ccAngus Kong        }
7698097973089420749dcd1ab4974a629c2466b31ccAngus Kong        Log.v(TAG, "Video stabilization is not supported");
7708097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return false;
7718097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
772c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong}
773