AndroidCameraCapabilities.java revision 01e7c02174ef268b6d6daaa5a5bb4f752d55964c
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);
5001e7c02174ef268b6d6daaa5a5bb4f752d55964cAngus Kong        mHorizontalViewAngle = p.getHorizontalViewAngle();
5101e7c02174ef268b6d6daaa5a5bb4f752d55964cAngus Kong        mVerticalViewAngle = p.getVerticalViewAngle();
52c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        buildPreviewFpsRange(p);
53c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        buildPreviewSizes(p);
54c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        buildVideoSizes(p);
55c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        buildPictureSizes(p);
56c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        buildSceneModes(p);
57c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        buildFlashModes(p);
58c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        buildFocusModes(p);
59c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        buildWhiteBalances(p);
60c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
61c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (p.isZoomSupported()) {
62c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            mSupportedFeatures.add(Feature.ZOOM);
63c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
64c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (p.isVideoSnapshotSupported()) {
65c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            mSupportedFeatures.add(Feature.VIDEO_SNAPSHOT);
66c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
67c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (p.isAutoExposureLockSupported()) {
68c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            mSupportedFeatures.add(Feature.AUTO_EXPOSURE_LOCK);
69c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
70c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (p.isAutoWhiteBalanceLockSupported()) {
71c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            mSupportedFeatures.add(Feature.AUTO_WHITE_BALANCE_LOCK);
72c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
73c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supports(FocusMode.AUTO)) {
74c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            mMaxNumOfFocusAreas = p.getMaxNumFocusAreas();
75c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            if (mMaxNumOfFocusAreas > 0) {
76c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                mSupportedFeatures.add(Feature.FOCUS_AREA);
77c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
78c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
79c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (mMaxNumOfMeteringArea > 0) {
80c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            mSupportedFeatures.add(Feature.METERING_AREA);
81c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
82c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
83c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
84c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    AndroidCameraCapabilities(AndroidCameraCapabilities src) {
85c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        super(src);
86c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
87c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
88c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildPreviewFpsRange(Camera.Parameters p) {
89c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<int[]> supportedPreviewFpsRange = p.getSupportedPreviewFpsRange();
90c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supportedPreviewFpsRange != null) {
91c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            mSupportedPreviewFpsRange.addAll(supportedPreviewFpsRange);
92c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
93c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        Collections.sort(mSupportedPreviewFpsRange, mFpsComparator);
94c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
95c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
96c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildPreviewSizes(Camera.Parameters p) {
97c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<Camera.Size> supportedPreviewSizes = p.getSupportedPreviewSizes();
98c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supportedPreviewSizes != null) {
99c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            for (Camera.Size s : supportedPreviewSizes) {
1008097973089420749dcd1ab4974a629c2466b31ccAngus Kong                mSupportedPreviewSizes.add(new Size(s.width, s.height));
101c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
102c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
103c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        Collections.sort(mSupportedPreviewSizes, mSizeComparator);
104c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
105c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
106c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildVideoSizes(Camera.Parameters p) {
107c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<Camera.Size> supportedVideoSizes = p.getSupportedVideoSizes();
108c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supportedVideoSizes != null) {
109c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            for (Camera.Size s : supportedVideoSizes) {
1108097973089420749dcd1ab4974a629c2466b31ccAngus Kong                mSupportedVideoSizes.add(new Size(s.width, s.height));
111c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
112c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
113c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        Collections.sort(mSupportedVideoSizes, mSizeComparator);
114c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
115c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
116c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildPictureSizes(Camera.Parameters p) {
117c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<Camera.Size> supportedPictureSizes = p.getSupportedPictureSizes();
118c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supportedPictureSizes != null) {
119c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            for (Camera.Size s : supportedPictureSizes) {
1208097973089420749dcd1ab4974a629c2466b31ccAngus Kong                mSupportedPhotoSizes.add(new Size(s.width, s.height));
121c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
122c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
1238097973089420749dcd1ab4974a629c2466b31ccAngus Kong        Collections.sort(mSupportedPhotoSizes, mSizeComparator);
124c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
125c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
126c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
127c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildSceneModes(Camera.Parameters p) {
128c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<String> supportedSceneModes = p.getSupportedSceneModes();
129c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supportedSceneModes != null) {
130c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            for (String scene : supportedSceneModes) {
131c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                if (Camera.Parameters.SCENE_MODE_AUTO.equals(scene)) {
132c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.AUTO);
133c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_ACTION.equals(scene)) {
134c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.ACTION);
135c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_BARCODE.equals(scene)) {
136c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.BARCODE);
137c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_BEACH.equals(scene)) {
138c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.BEACH);
139c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_CANDLELIGHT.equals(scene)) {
140c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.CANDLELIGHT);
141c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_FIREWORKS.equals(scene)) {
142c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.FIREWORKS);
143c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_HDR.equals(scene)) {
144c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.HDR);
145c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_LANDSCAPE.equals(scene)) {
146c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.LANDSCAPE);
147c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_NIGHT.equals(scene)) {
148c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.NIGHT);
149c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_NIGHT_PORTRAIT.equals(scene)) {
150c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.NIGHT_PORTRAIT);
151c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_PARTY.equals(scene)) {
152c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.PARTY);
153c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_PORTRAIT.equals(scene)) {
154c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.PORTRAIT);
155c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_SNOW.equals(scene)) {
156c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.SNOW);
157c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_SPORTS.equals(scene)) {
158c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.SPORTS);
159c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_STEADYPHOTO.equals(scene)) {
160c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.STEADYPHOTO);
161c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_SUNSET.equals(scene)) {
162c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.SUNSET);
163c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_THEATRE.equals(scene)) {
164c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.THEATRE);
165c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                }
166c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
167c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
168c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
169c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
170c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildFlashModes(Camera.Parameters p) {
171c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<String> supportedFlashModes = p.getSupportedFlashModes();
1728097973089420749dcd1ab4974a629c2466b31ccAngus Kong        if (supportedFlashModes == null) {
1738097973089420749dcd1ab4974a629c2466b31ccAngus Kong            // Camera 1 will return NULL if no flash mode is supported.
1748097973089420749dcd1ab4974a629c2466b31ccAngus Kong            mSupportedFlashModes.add(FlashMode.NO_FLASH);
1758097973089420749dcd1ab4974a629c2466b31ccAngus Kong        } else {
176c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            for (String flash : supportedFlashModes) {
177c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                if (Camera.Parameters.FLASH_MODE_AUTO.equals(flash)) {
178c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFlashModes.add(FlashMode.AUTO);
179c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FLASH_MODE_OFF.equals(flash)) {
180c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFlashModes.add(FlashMode.OFF);
181c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FLASH_MODE_ON.equals(flash)) {
182c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFlashModes.add(FlashMode.ON);
183c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FLASH_MODE_RED_EYE.equals(flash)) {
184c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFlashModes.add(FlashMode.RED_EYE);
185c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                }
186c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
187c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
188c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
189c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
190c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildFocusModes(Camera.Parameters p) {
191c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<String> supportedFocusModes = p.getSupportedFocusModes();
192c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supportedFocusModes != null) {
193c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            for (String focus : supportedFocusModes) {
194c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                if (Camera.Parameters.FOCUS_MODE_AUTO.equals(focus)) {
195c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFocusModes.add(FocusMode.AUTO);
196c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE.equals(focus)) {
197c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFocusModes.add(FocusMode.CONTINUOUS_PICTURE);
198c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO.equals(focus)) {
199c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFocusModes.add(FocusMode.CONTINUOUS_VIDEO);
200c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FOCUS_MODE_EDOF.equals(focus)) {
201c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFocusModes.add(FocusMode.EXTENDED_DOF);
202c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FOCUS_MODE_FIXED.equals(focus)) {
203c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFocusModes.add(FocusMode.FIXED);
204c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FOCUS_MODE_INFINITY.equals(focus)) {
205c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFocusModes.add(FocusMode.INFINITY);
206c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FOCUS_MODE_MACRO.equals(focus)) {
207c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFocusModes.add(FocusMode.MACRO);
208c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                }
209c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
210c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
211c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
212c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
213c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildWhiteBalances(Camera.Parameters p) {
214c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<String> supportedWhiteBalances = p.getSupportedFocusModes();
215c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supportedWhiteBalances != null) {
216c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            for (String wb : supportedWhiteBalances) {
217c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                if (Camera.Parameters.WHITE_BALANCE_AUTO.equals(wb)) {
218c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.AUTO);
219c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT.equals(wb)) {
220c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.CLOUDY_DAYLIGHT);
221c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.WHITE_BALANCE_DAYLIGHT.equals(wb)) {
222c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.DAYLIGHT);
223c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.WHITE_BALANCE_FLUORESCENT.equals(wb)) {
224c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.FLUORESCENT);
225c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.WHITE_BALANCE_INCANDESCENT.equals(wb)) {
226c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.INCANDESCENT);
227c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.WHITE_BALANCE_SHADE.equals(wb)) {
228c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.SHADE);
229c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.WHITE_BALANCE_TWILIGHT.equals(wb)) {
230c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.TWILIGHT);
231c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.WHITE_BALANCE_WARM_FLUORESCENT.equals(wb)) {
232c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.WARM_FLUORESCENT);
233c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                }
234c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
235c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
236c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
237c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
238c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private static class FpsComparator implements Comparator<int[]> {
239c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        @Override
240c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        public int compare(int[] fps1, int[] fps2) {
241c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            return (fps1[0] == fps2[0] ? fps1[1] - fps2[1] : fps1[0] - fps2[0]);
242c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
243c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
244c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
2458097973089420749dcd1ab4974a629c2466b31ccAngus Kong    private static class SizeComparator implements Comparator<Size> {
246c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
247c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        @Override
2488097973089420749dcd1ab4974a629c2466b31ccAngus Kong        public int compare(Size size1, Size size2) {
2498097973089420749dcd1ab4974a629c2466b31ccAngus Kong            return (size1.width() == size2.width() ? size1.height() - size2.height() :
2508097973089420749dcd1ab4974a629c2466b31ccAngus Kong                    size1.width() - size2.width());
251c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
252c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
253c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
254c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private static class AndroidCameraCapabilityStringifier implements Stringifier {
255c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
256c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        @Override
257c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        public String stringify(FocusMode focus) {
2588097973089420749dcd1ab4974a629c2466b31ccAngus Kong            if (focus == null) {
2598097973089420749dcd1ab4974a629c2466b31ccAngus Kong                return null;
2608097973089420749dcd1ab4974a629c2466b31ccAngus Kong            }
2618097973089420749dcd1ab4974a629c2466b31ccAngus Kong
262c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            switch (focus) {
263c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case AUTO:
264c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FOCUS_MODE_AUTO;
265c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case CONTINUOUS_PICTURE:
266c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE;
267c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case CONTINUOUS_VIDEO:
268c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO;
269c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case EXTENDED_DOF:
270c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FOCUS_MODE_EDOF;
271c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case FIXED:
272c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FOCUS_MODE_FIXED;
273c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case INFINITY:
274c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FOCUS_MODE_INFINITY;
275c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case MACRO:
276c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FOCUS_MODE_MACRO;
277c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
278c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            return null;
279c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
280c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
281c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        @Override
282c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        public FocusMode focusModeFromString(String val) {
2838097973089420749dcd1ab4974a629c2466b31ccAngus Kong            if (val == null) {
2848097973089420749dcd1ab4974a629c2466b31ccAngus Kong                return null;
2858097973089420749dcd1ab4974a629c2466b31ccAngus Kong            }
2868097973089420749dcd1ab4974a629c2466b31ccAngus Kong
2878097973089420749dcd1ab4974a629c2466b31ccAngus Kong            if (Camera.Parameters.FOCUS_MODE_AUTO.equals(val)) {
288c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FocusMode.AUTO;
2898097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE.equals(val)) {
290c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FocusMode.CONTINUOUS_PICTURE;
2918097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO.equals(val)) {
292c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FocusMode.CONTINUOUS_VIDEO;
2938097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.FOCUS_MODE_EDOF.equals(val)) {
294c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FocusMode.EXTENDED_DOF;
2958097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.FOCUS_MODE_FIXED.equals(val)) {
296c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FocusMode.FIXED;
2978097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.FOCUS_MODE_INFINITY.equals(val)) {
298c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FocusMode.INFINITY;
2998097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.FOCUS_MODE_MACRO.equals(val)) {
300c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FocusMode.MACRO;
301c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            } else {
302c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return null;
303c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
304c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
305c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
306c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        @Override
307c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        public String stringify(FlashMode flash) {
3088097973089420749dcd1ab4974a629c2466b31ccAngus Kong            if (flash == null) {
3098097973089420749dcd1ab4974a629c2466b31ccAngus Kong                return null;
3108097973089420749dcd1ab4974a629c2466b31ccAngus Kong            }
3118097973089420749dcd1ab4974a629c2466b31ccAngus Kong
312c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            switch (flash) {
3138097973089420749dcd1ab4974a629c2466b31ccAngus Kong                case NO_FLASH:
3148097973089420749dcd1ab4974a629c2466b31ccAngus Kong                    return null;
315c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case AUTO:
316c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FLASH_MODE_AUTO;
317c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case OFF:
318c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FLASH_MODE_OFF;
319c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case ON:
320c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FLASH_MODE_ON;
321c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case TORCH:
322c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FLASH_MODE_TORCH;
323c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case RED_EYE:
324c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.FLASH_MODE_RED_EYE;
325c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
326c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            return null;
327c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
328c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
329c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        @Override
330c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        public FlashMode flashModeFromString(String val) {
3318097973089420749dcd1ab4974a629c2466b31ccAngus Kong            if (val == null) {
3328097973089420749dcd1ab4974a629c2466b31ccAngus Kong                return FlashMode.NO_FLASH;
3338097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.FLASH_MODE_AUTO.equals(val)) {
334c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FlashMode.AUTO;
3358097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.FLASH_MODE_OFF.equals(val)) {
336c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FlashMode.OFF;
3378097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.FLASH_MODE_ON.equals(val)) {
338c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FlashMode.ON;
3398097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.FLASH_MODE_TORCH.equals(val)) {
340c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FlashMode.TORCH;
3418097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.FLASH_MODE_RED_EYE.equals(val)) {
342c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return FlashMode.RED_EYE;
343c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            } else {
344c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return null;
345c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
346c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
347c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
348c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        @Override
349c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        public String stringify(SceneMode scene) {
3508097973089420749dcd1ab4974a629c2466b31ccAngus Kong            if (scene == null) {
3518097973089420749dcd1ab4974a629c2466b31ccAngus Kong                return null;
3528097973089420749dcd1ab4974a629c2466b31ccAngus Kong            }
3538097973089420749dcd1ab4974a629c2466b31ccAngus Kong
354c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            switch (scene) {
355c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case AUTO:
356c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_AUTO;
357c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case ACTION:
358c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_ACTION;
359c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case BARCODE:
360c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_BARCODE;
361c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case BEACH:
362c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_BEACH;
363c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case CANDLELIGHT:
364c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_CANDLELIGHT;
365c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case FIREWORKS:
366c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_FIREWORKS;
367c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case HDR:
368c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_HDR;
369c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case LANDSCAPE:
370c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_LANDSCAPE;
371c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case NIGHT:
372c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_NIGHT;
373c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case NIGHT_PORTRAIT:
374c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_NIGHT_PORTRAIT;
375c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case PARTY:
376c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_PARTY;
377c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case PORTRAIT:
378c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_PORTRAIT;
379c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case SNOW:
380c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_SNOW;
381c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case SPORTS:
382c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_SPORTS;
383c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case STEADYPHOTO:
384c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_STEADYPHOTO;
385c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case SUNSET:
386c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_SUNSET;
387c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case THEATRE:
388c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.SCENE_MODE_THEATRE;
389c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
390c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            return null;
391c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
392c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
393c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        @Override
394c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        public SceneMode sceneModeFromString(String val) {
3958097973089420749dcd1ab4974a629c2466b31ccAngus Kong            if (val == null) {
3968097973089420749dcd1ab4974a629c2466b31ccAngus Kong                return SceneMode.NO_SCENE_MODE;
3978097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_AUTO.equals(val)) {
398c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.AUTO;
3998097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_ACTION.equals(val)) {
400c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.ACTION;
4018097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_BARCODE.equals(val)) {
402c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.BARCODE;
4038097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_BEACH.equals(val)) {
404c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.BEACH;
4058097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_CANDLELIGHT.equals(val)) {
406c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.CANDLELIGHT;
4078097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_FIREWORKS.equals(val)) {
408c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.FIREWORKS;
4098097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_HDR.equals(val)) {
410c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.HDR;
4118097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_LANDSCAPE.equals(val)) {
412c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.LANDSCAPE;
4138097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_NIGHT.equals(val)) {
414c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.NIGHT;
4158097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_NIGHT_PORTRAIT.equals(val)) {
416c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.NIGHT_PORTRAIT;
4178097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_PARTY.equals(val)) {
418c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.PARTY;
4198097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_PORTRAIT.equals(val)) {
420c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.PORTRAIT;
4218097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_SNOW.equals(val)) {
422c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.SNOW;
4238097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_SPORTS.equals(val)) {
424c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.SPORTS;
4258097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_STEADYPHOTO.equals(val)) {
426c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.STEADYPHOTO;
4278097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_SUNSET.equals(val)) {
428c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.SUNSET;
4298097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.SCENE_MODE_THEATRE.equals(val)) {
430c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return SceneMode.THEATRE;
431c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            } else {
432c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return null;
433c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
434c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
435c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
436c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        @Override
437c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        public String stringify(WhiteBalance wb) {
4388097973089420749dcd1ab4974a629c2466b31ccAngus Kong            if (wb == null) {
4398097973089420749dcd1ab4974a629c2466b31ccAngus Kong                return null;
4408097973089420749dcd1ab4974a629c2466b31ccAngus Kong            }
4418097973089420749dcd1ab4974a629c2466b31ccAngus Kong
442c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            switch (wb) {
443c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case AUTO:
444c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.WHITE_BALANCE_AUTO;
445c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case CLOUDY_DAYLIGHT:
446c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT;
447c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case DAYLIGHT:
448c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.WHITE_BALANCE_DAYLIGHT;
449c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case FLUORESCENT:
450c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.WHITE_BALANCE_FLUORESCENT;
451c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case INCANDESCENT:
452c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.WHITE_BALANCE_INCANDESCENT;
453c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case SHADE:
454c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.WHITE_BALANCE_SHADE;
455c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case TWILIGHT:
456c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.WHITE_BALANCE_TWILIGHT;
457c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                case WARM_FLUORESCENT:
458c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    return Camera.Parameters.WHITE_BALANCE_WARM_FLUORESCENT;
459c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
460c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            return null;
461c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
462c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
463c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        @Override
464c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        public WhiteBalance whiteBalanceFromString(String val) {
4658097973089420749dcd1ab4974a629c2466b31ccAngus Kong            if (val == null) {
4668097973089420749dcd1ab4974a629c2466b31ccAngus Kong                return null;
4678097973089420749dcd1ab4974a629c2466b31ccAngus Kong            }
4688097973089420749dcd1ab4974a629c2466b31ccAngus Kong
4698097973089420749dcd1ab4974a629c2466b31ccAngus Kong            if (Camera.Parameters.WHITE_BALANCE_AUTO.equals(val)) {
470c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return WhiteBalance.AUTO;
4718097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT.equals(val)) {
472c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return WhiteBalance.CLOUDY_DAYLIGHT;
4738097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.WHITE_BALANCE_DAYLIGHT.equals(val)) {
474c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return WhiteBalance.DAYLIGHT;
4758097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.WHITE_BALANCE_FLUORESCENT.equals(val)) {
476c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return WhiteBalance.FLUORESCENT;
4778097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.WHITE_BALANCE_INCANDESCENT.equals(val)) {
478c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return WhiteBalance.INCANDESCENT;
4798097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.WHITE_BALANCE_SHADE.equals(val)) {
480c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return WhiteBalance.SHADE;
4818097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.WHITE_BALANCE_TWILIGHT.equals(val)) {
482c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return WhiteBalance.TWILIGHT;
4838097973089420749dcd1ab4974a629c2466b31ccAngus Kong            } else if (Camera.Parameters.WHITE_BALANCE_WARM_FLUORESCENT.equals(val)) {
484c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return WhiteBalance.WARM_FLUORESCENT;
485c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            } else {
486c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                return null;
487c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
488c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
489c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
490c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong}
491