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
32a0842b40441db5332a5290f941021636b1182761Sol Boucher    private static Log.Tag TAG = new Log.Tag("AndCamCapabs");
33c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
349d8668449376fa47bc6528c7a61b04d6a0f691b3Sol Boucher    /** Conversion from ratios to percentages. */
359d8668449376fa47bc6528c7a61b04d6a0f691b3Sol Boucher    public static final float ZOOM_MULTIPLIER = 100f;
369d8668449376fa47bc6528c7a61b04d6a0f691b3Sol Boucher
37c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private FpsComparator mFpsComparator = new FpsComparator();
38c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private SizeComparator mSizeComparator = new SizeComparator();
39c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
40c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    AndroidCameraCapabilities(Camera.Parameters p) {
41a0842b40441db5332a5290f941021636b1182761Sol Boucher        super(new Stringifier());
42c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mMaxExposureCompensation = p.getMaxExposureCompensation();
43c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mMinExposureCompensation = p.getMinExposureCompensation();
44c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mExposureCompensationStep = p.getExposureCompensationStep();
45c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mMaxNumOfFacesSupported = p.getMaxNumDetectedFaces();
46c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mMaxNumOfMeteringArea = p.getMaxNumMeteringAreas();
478097973089420749dcd1ab4974a629c2466b31ccAngus Kong        mPreferredPreviewSizeForVideo = new Size(p.getPreferredPreviewSizeForVideo());
48c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        mSupportedPreviewFormats.addAll(p.getSupportedPreviewFormats());
498097973089420749dcd1ab4974a629c2466b31ccAngus Kong        mSupportedPhotoFormats.addAll(p.getSupportedPictureFormats());
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()) {
6290e75d1f90b85e11f6905966ea28d59916935c68Alan Newberger            mMaxZoomRatio = p.getZoomRatios().get(p.getMaxZoom()) / ZOOM_MULTIPLIER;
63c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            mSupportedFeatures.add(Feature.ZOOM);
64c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
65c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (p.isVideoSnapshotSupported()) {
66c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            mSupportedFeatures.add(Feature.VIDEO_SNAPSHOT);
67c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
68c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (p.isAutoExposureLockSupported()) {
69c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            mSupportedFeatures.add(Feature.AUTO_EXPOSURE_LOCK);
70c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
71c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (p.isAutoWhiteBalanceLockSupported()) {
72c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            mSupportedFeatures.add(Feature.AUTO_WHITE_BALANCE_LOCK);
73c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
74c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supports(FocusMode.AUTO)) {
75c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            mMaxNumOfFocusAreas = p.getMaxNumFocusAreas();
76c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            if (mMaxNumOfFocusAreas > 0) {
77c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                mSupportedFeatures.add(Feature.FOCUS_AREA);
78c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
79c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
80c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (mMaxNumOfMeteringArea > 0) {
81c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            mSupportedFeatures.add(Feature.METERING_AREA);
82c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
83c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
84c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
85c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    AndroidCameraCapabilities(AndroidCameraCapabilities src) {
86c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        super(src);
87c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
88c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
89c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildPreviewFpsRange(Camera.Parameters p) {
90c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<int[]> supportedPreviewFpsRange = p.getSupportedPreviewFpsRange();
91c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supportedPreviewFpsRange != null) {
92c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            mSupportedPreviewFpsRange.addAll(supportedPreviewFpsRange);
93c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
94c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        Collections.sort(mSupportedPreviewFpsRange, mFpsComparator);
95c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
96c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
97c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildPreviewSizes(Camera.Parameters p) {
98c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<Camera.Size> supportedPreviewSizes = p.getSupportedPreviewSizes();
99c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supportedPreviewSizes != null) {
100c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            for (Camera.Size s : supportedPreviewSizes) {
1018097973089420749dcd1ab4974a629c2466b31ccAngus Kong                mSupportedPreviewSizes.add(new Size(s.width, s.height));
102c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
103c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
104c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        Collections.sort(mSupportedPreviewSizes, mSizeComparator);
105c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
106c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
107c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildVideoSizes(Camera.Parameters p) {
108c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<Camera.Size> supportedVideoSizes = p.getSupportedVideoSizes();
109c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supportedVideoSizes != null) {
110c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            for (Camera.Size s : supportedVideoSizes) {
1118097973089420749dcd1ab4974a629c2466b31ccAngus Kong                mSupportedVideoSizes.add(new Size(s.width, s.height));
112c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
113c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
114c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        Collections.sort(mSupportedVideoSizes, mSizeComparator);
115c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
116c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
117c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildPictureSizes(Camera.Parameters p) {
118c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<Camera.Size> supportedPictureSizes = p.getSupportedPictureSizes();
119c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supportedPictureSizes != null) {
120c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            for (Camera.Size s : supportedPictureSizes) {
1218097973089420749dcd1ab4974a629c2466b31ccAngus Kong                mSupportedPhotoSizes.add(new Size(s.width, s.height));
122c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
123c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
1248097973089420749dcd1ab4974a629c2466b31ccAngus Kong        Collections.sort(mSupportedPhotoSizes, mSizeComparator);
125c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
126c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
127c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
128c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildSceneModes(Camera.Parameters p) {
129c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<String> supportedSceneModes = p.getSupportedSceneModes();
130c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supportedSceneModes != null) {
131c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            for (String scene : supportedSceneModes) {
132c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                if (Camera.Parameters.SCENE_MODE_AUTO.equals(scene)) {
133c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.AUTO);
134c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_ACTION.equals(scene)) {
135c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.ACTION);
136c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_BARCODE.equals(scene)) {
137c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.BARCODE);
138c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_BEACH.equals(scene)) {
139c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.BEACH);
140c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_CANDLELIGHT.equals(scene)) {
141c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.CANDLELIGHT);
142c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_FIREWORKS.equals(scene)) {
143c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.FIREWORKS);
144c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_HDR.equals(scene)) {
145c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.HDR);
146c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_LANDSCAPE.equals(scene)) {
147c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.LANDSCAPE);
148c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_NIGHT.equals(scene)) {
149c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.NIGHT);
150c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_NIGHT_PORTRAIT.equals(scene)) {
151c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.NIGHT_PORTRAIT);
152c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_PARTY.equals(scene)) {
153c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.PARTY);
154c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_PORTRAIT.equals(scene)) {
155c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.PORTRAIT);
156c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_SNOW.equals(scene)) {
157c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.SNOW);
158c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_SPORTS.equals(scene)) {
159c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.SPORTS);
160c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_STEADYPHOTO.equals(scene)) {
161c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.STEADYPHOTO);
162c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_SUNSET.equals(scene)) {
163c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.SUNSET);
164c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.SCENE_MODE_THEATRE.equals(scene)) {
165c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedSceneModes.add(SceneMode.THEATRE);
166c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                }
167c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
168c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
169c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
170c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
171c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildFlashModes(Camera.Parameters p) {
172c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<String> supportedFlashModes = p.getSupportedFlashModes();
1738097973089420749dcd1ab4974a629c2466b31ccAngus Kong        if (supportedFlashModes == null) {
1748097973089420749dcd1ab4974a629c2466b31ccAngus Kong            // Camera 1 will return NULL if no flash mode is supported.
1758097973089420749dcd1ab4974a629c2466b31ccAngus Kong            mSupportedFlashModes.add(FlashMode.NO_FLASH);
1768097973089420749dcd1ab4974a629c2466b31ccAngus Kong        } else {
177c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            for (String flash : supportedFlashModes) {
178c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                if (Camera.Parameters.FLASH_MODE_AUTO.equals(flash)) {
179c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFlashModes.add(FlashMode.AUTO);
180c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FLASH_MODE_OFF.equals(flash)) {
181c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFlashModes.add(FlashMode.OFF);
182c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FLASH_MODE_ON.equals(flash)) {
183c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFlashModes.add(FlashMode.ON);
184c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FLASH_MODE_RED_EYE.equals(flash)) {
185c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFlashModes.add(FlashMode.RED_EYE);
18615773a64b42023e31e2aade23ae44273862a9c04Alan Newberger                } else if (Camera.Parameters.FLASH_MODE_TORCH.equals(flash)) {
18715773a64b42023e31e2aade23ae44273862a9c04Alan Newberger                    mSupportedFlashModes.add(FlashMode.TORCH);
188c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                }
189c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
190c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
191c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
192c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
193c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildFocusModes(Camera.Parameters p) {
194c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<String> supportedFocusModes = p.getSupportedFocusModes();
195c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supportedFocusModes != null) {
196c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            for (String focus : supportedFocusModes) {
197c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                if (Camera.Parameters.FOCUS_MODE_AUTO.equals(focus)) {
198c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFocusModes.add(FocusMode.AUTO);
199c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE.equals(focus)) {
200c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFocusModes.add(FocusMode.CONTINUOUS_PICTURE);
201c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO.equals(focus)) {
202c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFocusModes.add(FocusMode.CONTINUOUS_VIDEO);
203c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FOCUS_MODE_EDOF.equals(focus)) {
204c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFocusModes.add(FocusMode.EXTENDED_DOF);
205c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FOCUS_MODE_FIXED.equals(focus)) {
206c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFocusModes.add(FocusMode.FIXED);
207c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FOCUS_MODE_INFINITY.equals(focus)) {
208c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFocusModes.add(FocusMode.INFINITY);
209c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.FOCUS_MODE_MACRO.equals(focus)) {
210c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedFocusModes.add(FocusMode.MACRO);
211c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                }
212c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
213c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
214c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
215c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
216c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private void buildWhiteBalances(Camera.Parameters p) {
217c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        List<String> supportedWhiteBalances = p.getSupportedFocusModes();
218c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        if (supportedWhiteBalances != null) {
219c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            for (String wb : supportedWhiteBalances) {
220c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                if (Camera.Parameters.WHITE_BALANCE_AUTO.equals(wb)) {
221c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.AUTO);
222c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT.equals(wb)) {
223c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.CLOUDY_DAYLIGHT);
224c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.WHITE_BALANCE_DAYLIGHT.equals(wb)) {
225c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.DAYLIGHT);
226c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.WHITE_BALANCE_FLUORESCENT.equals(wb)) {
227c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.FLUORESCENT);
228c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.WHITE_BALANCE_INCANDESCENT.equals(wb)) {
229c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.INCANDESCENT);
230c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.WHITE_BALANCE_SHADE.equals(wb)) {
231c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.SHADE);
232c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.WHITE_BALANCE_TWILIGHT.equals(wb)) {
233c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.TWILIGHT);
234c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                } else if (Camera.Parameters.WHITE_BALANCE_WARM_FLUORESCENT.equals(wb)) {
235c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                    mSupportedWhiteBalances.add(WhiteBalance.WARM_FLUORESCENT);
236c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong                }
237c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            }
238c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
239c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
240c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
241c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    private static class FpsComparator implements Comparator<int[]> {
242c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        @Override
243c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        public int compare(int[] fps1, int[] fps2) {
244c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong            return (fps1[0] == fps2[0] ? fps1[1] - fps2[1] : fps1[0] - fps2[0]);
245c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
246c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
247c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
2488097973089420749dcd1ab4974a629c2466b31ccAngus Kong    private static class SizeComparator implements Comparator<Size> {
249c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong
250c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        @Override
2518097973089420749dcd1ab4974a629c2466b31ccAngus Kong        public int compare(Size size1, Size size2) {
2528097973089420749dcd1ab4974a629c2466b31ccAngus Kong            return (size1.width() == size2.width() ? size1.height() - size2.height() :
2538097973089420749dcd1ab4974a629c2466b31ccAngus Kong                    size1.width() - size2.width());
254c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong        }
255c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong    }
256c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong}
257