AndroidCameraCapabilities.java revision 8097973089420749dcd1ab4974a629c2466b31cc
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 android.hardware.Camera;
20c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
21c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kongimport com.android.ex.camera2.portability.debug.Log;
22c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
23c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kongimport java.util.Collections;
24c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kongimport java.util.Comparator;
25c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kongimport java.util.List;
26c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
27c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong/**
28c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * The subclass of {@link CameraCapabilities} for Android Camera 1 API.
29c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong */
308097973089420749dcd1ab4974a629c2466b31ccAngus Kongclass AndroidCameraCapabilities extends CameraCapabilities {
31c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
32c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private static Log.Tag TAG = new Log.Tag("AndroidCameraCapabilities");
33c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
34c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private FpsComparator mFpsComparator = new FpsComparator();
35c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private SizeComparator mSizeComparator = new SizeComparator();
36c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
37c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    AndroidCameraCapabilities(Camera.Parameters p) {
38c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        super(new AndroidCameraCapabilityStringifier());
39c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mMaxExposureCompensation = p.getMaxExposureCompensation();
40c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mMinExposureCompensation = p.getMinExposureCompensation();
41c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mExposureCompensationStep = p.getExposureCompensationStep();
42c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mMaxNumOfFacesSupported = p.getMaxNumDetectedFaces();
43c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mMaxNumOfMeteringArea = p.getMaxNumMeteringAreas();
448097973089420749dcd1ab4974a629c2466b31ccAngus Kong        mPreferredPreviewSizeForVideo = new Size(p.getPreferredPreviewSizeForVideo());
45c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mSupportedPreviewFormats.addAll(p.getSupportedPreviewFormats());
468097973089420749dcd1ab4974a629c2466b31ccAngus Kong        mSupportedPhotoFormats.addAll(p.getSupportedPictureFormats());
478097973089420749dcd1ab4974a629c2466b31ccAngus Kong        mMaxZoomIndex = p.getMaxZoom();
488097973089420749dcd1ab4974a629c2466b31ccAngus Kong        mZoomRatioList.addAll(p.getZoomRatios());
498097973089420749dcd1ab4974a629c2466b31ccAngus Kong        mMaxZoomRatio = mZoomRatioList.get(mMaxZoomIndex);
50c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        buildPreviewFpsRange(p);
51c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        buildPreviewSizes(p);
52c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        buildVideoSizes(p);
53c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        buildPictureSizes(p);
54c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        buildSceneModes(p);
55c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        buildFlashModes(p);
56c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        buildFocusModes(p);
57c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        buildWhiteBalances(p);
58c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
59c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (p.isZoomSupported()) {
60c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            mSupportedFeatures.add(Feature.ZOOM);
61c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
62c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (p.isVideoSnapshotSupported()) {
63c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            mSupportedFeatures.add(Feature.VIDEO_SNAPSHOT);
64c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
65c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (p.isAutoExposureLockSupported()) {
66c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            mSupportedFeatures.add(Feature.AUTO_EXPOSURE_LOCK);
67c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
68c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (p.isAutoWhiteBalanceLockSupported()) {
69c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            mSupportedFeatures.add(Feature.AUTO_WHITE_BALANCE_LOCK);
70c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
71c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supports(FocusMode.AUTO)) {
72c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            mMaxNumOfFocusAreas = p.getMaxNumFocusAreas();
73c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            if (mMaxNumOfFocusAreas > 0) {
74c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                mSupportedFeatures.add(Feature.FOCUS_AREA);
75c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
76c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
77c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (mMaxNumOfMeteringArea > 0) {
78c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            mSupportedFeatures.add(Feature.METERING_AREA);
79c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
80c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
81c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
82c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    AndroidCameraCapabilities(AndroidCameraCapabilities src) {
83c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        super(src);
84c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
85c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
86c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildPreviewFpsRange(Camera.Parameters p) {
87c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<int[]> supportedPreviewFpsRange = p.getSupportedPreviewFpsRange();
88c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supportedPreviewFpsRange != null) {
89c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            mSupportedPreviewFpsRange.addAll(supportedPreviewFpsRange);
90c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
91c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        Collections.sort(mSupportedPreviewFpsRange, mFpsComparator);
92c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
93c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
94c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildPreviewSizes(Camera.Parameters p) {
95c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<Camera.Size> supportedPreviewSizes = p.getSupportedPreviewSizes();
96c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supportedPreviewSizes != null) {
97c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            for (Camera.Size s : supportedPreviewSizes) {
988097973089420749dcd1ab4974a629c2466b31ccAngus Kong                mSupportedPreviewSizes.add(new Size(s.width, s.height));
99c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
100c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
101c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        Collections.sort(mSupportedPreviewSizes, mSizeComparator);
102c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
103c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
104c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildVideoSizes(Camera.Parameters p) {
105c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<Camera.Size> supportedVideoSizes = p.getSupportedVideoSizes();
106c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supportedVideoSizes != null) {
107c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            for (Camera.Size s : supportedVideoSizes) {
1088097973089420749dcd1ab4974a629c2466b31ccAngus Kong                mSupportedVideoSizes.add(new Size(s.width, s.height));
109c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
110c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
111c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        Collections.sort(mSupportedVideoSizes, mSizeComparator);
112c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
113c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
114c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildPictureSizes(Camera.Parameters p) {
115c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<Camera.Size> supportedPictureSizes = p.getSupportedPictureSizes();
116c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supportedPictureSizes != null) {
117c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            for (Camera.Size s : supportedPictureSizes) {
1188097973089420749dcd1ab4974a629c2466b31ccAngus Kong                mSupportedPhotoSizes.add(new Size(s.width, s.height));
119c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
120c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
1218097973089420749dcd1ab4974a629c2466b31ccAngus Kong        Collections.sort(mSupportedPhotoSizes, mSizeComparator);
122c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
123c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
124c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
125c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildSceneModes(Camera.Parameters p) {
126c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<String> supportedSceneModes = p.getSupportedSceneModes();
127c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supportedSceneModes != null) {
128c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            for (String scene : supportedSceneModes) {
129c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                if (Camera.Parameters.SCENE_MODE_AUTO.equals(scene)) {
130c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.AUTO);
131c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_ACTION.equals(scene)) {
132c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.ACTION);
133c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_BARCODE.equals(scene)) {
134c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.BARCODE);
135c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_BEACH.equals(scene)) {
136c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.BEACH);
137c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_CANDLELIGHT.equals(scene)) {
138c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.CANDLELIGHT);
139c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_FIREWORKS.equals(scene)) {
140c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.FIREWORKS);
141c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_HDR.equals(scene)) {
142c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.HDR);
143c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_LANDSCAPE.equals(scene)) {
144c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.LANDSCAPE);
145c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_NIGHT.equals(scene)) {
146c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.NIGHT);
147c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_NIGHT_PORTRAIT.equals(scene)) {
148c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.NIGHT_PORTRAIT);
149c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_PARTY.equals(scene)) {
150c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.PARTY);
151c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_PORTRAIT.equals(scene)) {
152c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.PORTRAIT);
153c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_SNOW.equals(scene)) {
154c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.SNOW);
155c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_SPORTS.equals(scene)) {
156c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.SPORTS);
157c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_STEADYPHOTO.equals(scene)) {
158c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.STEADYPHOTO);
159c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_SUNSET.equals(scene)) {
160c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.SUNSET);
161c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_THEATRE.equals(scene)) {
162c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.THEATRE);
163c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                }
164c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
165c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
166c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
167c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
168c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildFlashModes(Camera.Parameters p) {
169c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<String> supportedFlashModes = p.getSupportedFlashModes();
1708097973089420749dcd1ab4974a629c2466b31ccAngus Kong        if (supportedFlashModes == null) {
1718097973089420749dcd1ab4974a629c2466b31ccAngus Kong            // Camera 1 will return NULL if no flash mode is supported.
1728097973089420749dcd1ab4974a629c2466b31ccAngus Kong            mSupportedFlashModes.add(FlashMode.NO_FLASH);
1738097973089420749dcd1ab4974a629c2466b31ccAngus Kong        } else {
174c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            for (String flash : supportedFlashModes) {
175c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                if (Camera.Parameters.FLASH_MODE_AUTO.equals(flash)) {
176c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFlashModes.add(FlashMode.AUTO);
177c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FLASH_MODE_OFF.equals(flash)) {
178c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFlashModes.add(FlashMode.OFF);
179c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FLASH_MODE_ON.equals(flash)) {
180c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFlashModes.add(FlashMode.ON);
181c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FLASH_MODE_RED_EYE.equals(flash)) {
182c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFlashModes.add(FlashMode.RED_EYE);
183c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                }
184c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
185c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
186c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
187c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
188c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildFocusModes(Camera.Parameters p) {
189c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<String> supportedFocusModes = p.getSupportedFocusModes();
190c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supportedFocusModes != null) {
191c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            for (String focus : supportedFocusModes) {
192c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                if (Camera.Parameters.FOCUS_MODE_AUTO.equals(focus)) {
193c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFocusModes.add(FocusMode.AUTO);
194c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE.equals(focus)) {
195c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFocusModes.add(FocusMode.CONTINUOUS_PICTURE);
196c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO.equals(focus)) {
197c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFocusModes.add(FocusMode.CONTINUOUS_VIDEO);
198c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FOCUS_MODE_EDOF.equals(focus)) {
199c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFocusModes.add(FocusMode.EXTENDED_DOF);
200c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FOCUS_MODE_FIXED.equals(focus)) {
201c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFocusModes.add(FocusMode.FIXED);
202c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FOCUS_MODE_INFINITY.equals(focus)) {
203c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFocusModes.add(FocusMode.INFINITY);
204c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FOCUS_MODE_MACRO.equals(focus)) {
205c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFocusModes.add(FocusMode.MACRO);
206c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                }
207c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
208c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
209c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
210c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
211c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildWhiteBalances(Camera.Parameters p) {
212c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<String> supportedWhiteBalances = p.getSupportedFocusModes();
213c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supportedWhiteBalances != null) {
214c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            for (String wb : supportedWhiteBalances) {
215c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                if (Camera.Parameters.WHITE_BALANCE_AUTO.equals(wb)) {
216c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.AUTO);
217c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT.equals(wb)) {
218c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.CLOUDY_DAYLIGHT);
219c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.WHITE_BALANCE_DAYLIGHT.equals(wb)) {
220c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.DAYLIGHT);
221c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.WHITE_BALANCE_FLUORESCENT.equals(wb)) {
222c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.FLUORESCENT);
223c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.WHITE_BALANCE_INCANDESCENT.equals(wb)) {
224c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.INCANDESCENT);
225c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.WHITE_BALANCE_SHADE.equals(wb)) {
226c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.SHADE);
227c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.WHITE_BALANCE_TWILIGHT.equals(wb)) {
228c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.TWILIGHT);
229c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.WHITE_BALANCE_WARM_FLUORESCENT.equals(wb)) {
230c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.WARM_FLUORESCENT);
231c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                }
232c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
233c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
234c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
235c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
236c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private static class FpsComparator implements Comparator<int[]> {
237c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        @Override
238c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        public int compare(int[] fps1, int[] fps2) {
239c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            return (fps1[0] == fps2[0] ? fps1[1] - fps2[1] : fps1[0] - fps2[0]);
240c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
241c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
242c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
2438097973089420749dcd1ab4974a629c2466b31ccAngus Kong    private static class SizeComparator implements Comparator<Size> {
244c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
245c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        @Override
2468097973089420749dcd1ab4974a629c2466b31ccAngus Kong        public int compare(Size size1, Size size2) {
2478097973089420749dcd1ab4974a629c2466b31ccAngus Kong            return (size1.width() == size2.width() ? size1.height() - size2.height() :
2488097973089420749dcd1ab4974a629c2466b31ccAngus Kong                    size1.width() - size2.width());
249c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
250c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
251c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
252c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private static class AndroidCameraCapabilityStringifier implements Stringifier {
253c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
254c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        @Override
255c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        public String stringify(FocusMode focus) {
2568097973089420749dcd1ab4974a629c2466b31ccAngus Kong            if (focus == null) {
2578097973089420749dcd1ab4974a629c2466b31ccAngus Kong                return null;
2588097973089420749dcd1ab4974a629c2466b31ccAngus Kong            }
2598097973089420749dcd1ab4974a629c2466b31ccAngus Kong
260c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            switch (focus) {
261c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case AUTO:
262c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FOCUS_MODE_AUTO;
263c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case CONTINUOUS_PICTURE:
264c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE;
265c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case CONTINUOUS_VIDEO:
266c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO;
267c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case EXTENDED_DOF:
268c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FOCUS_MODE_EDOF;
269c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case FIXED:
270c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FOCUS_MODE_FIXED;
271c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case INFINITY:
272c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FOCUS_MODE_INFINITY;
273c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case MACRO:
274c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FOCUS_MODE_MACRO;
275c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
276c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            return null;
277c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
278c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
279c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        @Override
280c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        public FocusMode focusModeFromString(String val) {
2818097973089420749dcd1ab4974a629c2466b31ccAngus Kong            if (val == null) {
2828097973089420749dcd1ab4974a629c2466b31ccAngus Kong                return null;
2838097973089420749dcd1ab4974a629c2466b31ccAngus Kong            }
2848097973089420749dcd1ab4974a629c2466b31ccAngus Kong
2858097973089420749dcd1ab4974a629c2466b31ccAngus Kong            if (Camera.Parameters.FOCUS_MODE_AUTO.equals(val)) {
286c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FocusMode.AUTO;
2878097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE.equals(val)) {
288c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FocusMode.CONTINUOUS_PICTURE;
2898097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO.equals(val)) {
290c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FocusMode.CONTINUOUS_VIDEO;
2918097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.FOCUS_MODE_EDOF.equals(val)) {
292c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FocusMode.EXTENDED_DOF;
2938097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.FOCUS_MODE_FIXED.equals(val)) {
294c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FocusMode.FIXED;
2958097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.FOCUS_MODE_INFINITY.equals(val)) {
296c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FocusMode.INFINITY;
2978097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.FOCUS_MODE_MACRO.equals(val)) {
298c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FocusMode.MACRO;
299c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            } else {
300c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return null;
301c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
302c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
303c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
304c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        @Override
305c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        public String stringify(FlashMode flash) {
3068097973089420749dcd1ab4974a629c2466b31ccAngus Kong            if (flash == null) {
3078097973089420749dcd1ab4974a629c2466b31ccAngus Kong                return null;
3088097973089420749dcd1ab4974a629c2466b31ccAngus Kong            }
3098097973089420749dcd1ab4974a629c2466b31ccAngus Kong
310c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            switch (flash) {
3118097973089420749dcd1ab4974a629c2466b31ccAngus Kong                case NO_FLASH:
3128097973089420749dcd1ab4974a629c2466b31ccAngus Kong                    return null;
313c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case AUTO:
314c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FLASH_MODE_AUTO;
315c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case OFF:
316c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FLASH_MODE_OFF;
317c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case ON:
318c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FLASH_MODE_ON;
319c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case TORCH:
320c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FLASH_MODE_TORCH;
321c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case RED_EYE:
322c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FLASH_MODE_RED_EYE;
323c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
324c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            return null;
325c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
326c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
327c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        @Override
328c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        public FlashMode flashModeFromString(String val) {
3298097973089420749dcd1ab4974a629c2466b31ccAngus Kong            if (val == null) {
3308097973089420749dcd1ab4974a629c2466b31ccAngus Kong                return FlashMode.NO_FLASH;
3318097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.FLASH_MODE_AUTO.equals(val)) {
332c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FlashMode.AUTO;
3338097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.FLASH_MODE_OFF.equals(val)) {
334c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FlashMode.OFF;
3358097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.FLASH_MODE_ON.equals(val)) {
336c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FlashMode.ON;
3378097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.FLASH_MODE_TORCH.equals(val)) {
338c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FlashMode.TORCH;
3398097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.FLASH_MODE_RED_EYE.equals(val)) {
340c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FlashMode.RED_EYE;
341c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            } else {
342c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return null;
343c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
344c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
345c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
346c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        @Override
347c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        public String stringify(SceneMode scene) {
3488097973089420749dcd1ab4974a629c2466b31ccAngus Kong            if (scene == null) {
3498097973089420749dcd1ab4974a629c2466b31ccAngus Kong                return null;
3508097973089420749dcd1ab4974a629c2466b31ccAngus Kong            }
3518097973089420749dcd1ab4974a629c2466b31ccAngus Kong
352c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            switch (scene) {
353c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case AUTO:
354c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_AUTO;
355c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case ACTION:
356c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_ACTION;
357c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case BARCODE:
358c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_BARCODE;
359c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case BEACH:
360c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_BEACH;
361c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case CANDLELIGHT:
362c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_CANDLELIGHT;
363c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case FIREWORKS:
364c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_FIREWORKS;
365c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case HDR:
366c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_HDR;
367c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case LANDSCAPE:
368c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_LANDSCAPE;
369c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case NIGHT:
370c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_NIGHT;
371c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case NIGHT_PORTRAIT:
372c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_NIGHT_PORTRAIT;
373c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case PARTY:
374c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_PARTY;
375c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case PORTRAIT:
376c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_PORTRAIT;
377c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case SNOW:
378c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_SNOW;
379c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case SPORTS:
380c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_SPORTS;
381c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case STEADYPHOTO:
382c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_STEADYPHOTO;
383c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case SUNSET:
384c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_SUNSET;
385c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case THEATRE:
386c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_THEATRE;
387c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
388c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            return null;
389c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
390c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
391c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        @Override
392c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        public SceneMode sceneModeFromString(String val) {
3938097973089420749dcd1ab4974a629c2466b31ccAngus Kong            if (val == null) {
3948097973089420749dcd1ab4974a629c2466b31ccAngus Kong                return SceneMode.NO_SCENE_MODE;
3958097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_AUTO.equals(val)) {
396c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.AUTO;
3978097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_ACTION.equals(val)) {
398c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.ACTION;
3998097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_BARCODE.equals(val)) {
400c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.BARCODE;
4018097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_BEACH.equals(val)) {
402c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.BEACH;
4038097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_CANDLELIGHT.equals(val)) {
404c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.CANDLELIGHT;
4058097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_FIREWORKS.equals(val)) {
406c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.FIREWORKS;
4078097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_HDR.equals(val)) {
408c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.HDR;
4098097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_LANDSCAPE.equals(val)) {
410c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.LANDSCAPE;
4118097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_NIGHT.equals(val)) {
412c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.NIGHT;
4138097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_NIGHT_PORTRAIT.equals(val)) {
414c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.NIGHT_PORTRAIT;
4158097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_PARTY.equals(val)) {
416c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.PARTY;
4178097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_PORTRAIT.equals(val)) {
418c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.PORTRAIT;
4198097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_SNOW.equals(val)) {
420c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.SNOW;
4218097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_SPORTS.equals(val)) {
422c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.SPORTS;
4238097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_STEADYPHOTO.equals(val)) {
424c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.STEADYPHOTO;
4258097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_SUNSET.equals(val)) {
426c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.SUNSET;
4278097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_THEATRE.equals(val)) {
428c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.THEATRE;
429c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            } else {
430c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return null;
431c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
432c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
433c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
434c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        @Override
435c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        public String stringify(WhiteBalance wb) {
4368097973089420749dcd1ab4974a629c2466b31ccAngus Kong            if (wb == null) {
4378097973089420749dcd1ab4974a629c2466b31ccAngus Kong                return null;
4388097973089420749dcd1ab4974a629c2466b31ccAngus Kong            }
4398097973089420749dcd1ab4974a629c2466b31ccAngus Kong
440c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            switch (wb) {
441c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case AUTO:
442c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.WHITE_BALANCE_AUTO;
443c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case CLOUDY_DAYLIGHT:
444c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT;
445c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case DAYLIGHT:
446c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.WHITE_BALANCE_DAYLIGHT;
447c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case FLUORESCENT:
448c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.WHITE_BALANCE_FLUORESCENT;
449c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case INCANDESCENT:
450c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.WHITE_BALANCE_INCANDESCENT;
451c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case SHADE:
452c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.WHITE_BALANCE_SHADE;
453c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case TWILIGHT:
454c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.WHITE_BALANCE_TWILIGHT;
455c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case WARM_FLUORESCENT:
456c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.WHITE_BALANCE_WARM_FLUORESCENT;
457c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
458c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            return null;
459c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
460c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
461c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        @Override
462c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        public WhiteBalance whiteBalanceFromString(String val) {
4638097973089420749dcd1ab4974a629c2466b31ccAngus Kong            if (val == null) {
4648097973089420749dcd1ab4974a629c2466b31ccAngus Kong                return null;
4658097973089420749dcd1ab4974a629c2466b31ccAngus Kong            }
4668097973089420749dcd1ab4974a629c2466b31ccAngus Kong
4678097973089420749dcd1ab4974a629c2466b31ccAngus Kong            if (Camera.Parameters.WHITE_BALANCE_AUTO.equals(val)) {
468c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return WhiteBalance.AUTO;
4698097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT.equals(val)) {
470c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return WhiteBalance.CLOUDY_DAYLIGHT;
4718097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.WHITE_BALANCE_DAYLIGHT.equals(val)) {
472c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return WhiteBalance.DAYLIGHT;
4738097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.WHITE_BALANCE_FLUORESCENT.equals(val)) {
474c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return WhiteBalance.FLUORESCENT;
4758097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.WHITE_BALANCE_INCANDESCENT.equals(val)) {
476c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return WhiteBalance.INCANDESCENT;
4778097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.WHITE_BALANCE_SHADE.equals(val)) {
478c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return WhiteBalance.SHADE;
4798097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.WHITE_BALANCE_TWILIGHT.equals(val)) {
480c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return WhiteBalance.TWILIGHT;
4818097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.WHITE_BALANCE_WARM_FLUORESCENT.equals(val)) {
482c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return WhiteBalance.WARM_FLUORESCENT;
483c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            } else {
484c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return null;
485c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
486c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
487c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
488c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong}
489