1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.ex.camera2.portability;
18
19import static android.hardware.camera2.CaptureRequest.*;
20import static org.junit.Assert.assertEquals;
21import static org.junit.Assert.fail;
22
23import android.content.Context;
24import android.graphics.Rect;
25import android.hardware.camera2.CameraAccessException;
26import android.hardware.camera2.CameraCharacteristics;
27import android.hardware.camera2.CameraDevice;
28import android.hardware.camera2.CameraManager;
29import android.hardware.camera2.CaptureRequest;
30import android.support.test.InjectContext;
31
32import com.android.ex.camera2.portability.CameraCapabilities.FlashMode;
33import com.android.ex.camera2.portability.CameraCapabilities.FocusMode;
34import com.android.ex.camera2.portability.CameraCapabilities.SceneMode;
35import com.android.ex.camera2.portability.CameraCapabilities.Stringifier;
36import com.android.ex.camera2.portability.CameraCapabilities.WhiteBalance;
37import com.android.ex.camera2.utils.Camera2DeviceTester;
38import org.junit.Test;
39
40import java.lang.reflect.Method;
41import java.lang.reflect.ParameterizedType;
42
43public class Camera2PortabilityTest extends Camera2DeviceTester {
44    /**
45     * Ensure that applying {@code Stringifier#.*FromString()} reverses
46     * {@link Stringifier#stringify} for {@link FocusMode}, {@link FlashMode},
47     * {@link SceneMode}, and {@link WhiteBalance}.
48     */
49    @Test
50    public void cameraCapabilitiesStringifier() {
51        Stringifier strfy = new Stringifier();
52        for(FocusMode val : FocusMode.values()) {
53            assertEquals(val, strfy.focusModeFromString(strfy.stringify(val)));
54        }
55        for(FlashMode val : FlashMode.values()) {
56            assertEquals(val, strfy.flashModeFromString(strfy.stringify(val)));
57        }
58        for(SceneMode val : SceneMode.values()) {
59            assertEquals(val, strfy.sceneModeFromString(strfy.stringify(val)));
60        }
61        for(WhiteBalance val : WhiteBalance.values()) {
62            assertEquals(val, strfy.whiteBalanceFromString(strfy.stringify(val)));
63        }
64    }
65
66    /**
67     * Ensure that {@code Stringifier#.*FromString()} default to the correct
68     * {@link FocusMode}, {@link FlashMode}, {@link SceneMode}, and
69     * {@link WhiteBalance} when given a {@code null}.
70     */
71    @Test
72    public void cameraCapabilitiesStringifierNull() {
73        Stringifier strfy = new Stringifier();
74        assertEquals(strfy.focusModeFromString(null), FocusMode.AUTO);
75        assertEquals(strfy.flashModeFromString(null), FlashMode.NO_FLASH);
76        assertEquals(strfy.sceneModeFromString(null), SceneMode.NO_SCENE_MODE);
77        assertEquals(strfy.whiteBalanceFromString(null), WhiteBalance.AUTO);
78    }
79
80    /**
81     * Ensure that {@code Stringifier#.*FromString()} default to the correct
82     * {@link FocusMode}, {@link FlashMode}, {@link SceneMode}, and
83     * {@link WhiteBalance} when given an unrecognized string.
84     */
85    @Test
86    public void cameraCapabilitiesStringifierInvalid() {
87        Stringifier strfy = new Stringifier();
88        assertEquals(strfy.focusModeFromString("crap"), FocusMode.AUTO);
89        assertEquals(strfy.flashModeFromString("crap"), FlashMode.NO_FLASH);
90        assertEquals(strfy.sceneModeFromString("crap"), SceneMode.NO_SCENE_MODE);
91        assertEquals(strfy.whiteBalanceFromString("crap"), WhiteBalance.AUTO);
92    }
93
94    private CameraCharacteristics buildFrameworkCharacteristics() throws CameraAccessException {
95        CameraManager manager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
96        String id = manager.getCameraIdList()[0];
97        return manager.getCameraCharacteristics(id);
98    }
99
100    private void camera2SettingsCheckSingleOption(AndroidCamera2Settings setts,
101                                                      Key<?> apiKey, int apiVal) {
102        assertEquals(apiVal, setts.getRequestSettings().get(apiKey));
103    }
104
105    /**
106     * Ensure that {@link AndroidCamera2Settings} correctly translates its
107     * {@code FocusMode}, {@code SceneMode}, and {@code WhiteBalance} to the
108     * corresponding framework API 2 representations.
109     */
110    @Test
111    public void camera2SettingsSetOptionsAndGetRequestSettings() throws CameraAccessException {
112        // We're only testing the focus modes, scene modes and white balances,
113        // and won't use the activeArray, previewSize, or photoSize. The
114        // constructor requires the former, so pass a degenerate rectangle.
115        AndroidCamera2Settings set = new AndroidCamera2Settings(
116                mCamera, CameraDevice.TEMPLATE_PREVIEW, /*activeArray*/new Rect(),
117                /*previewSize*/null, /*photoSize*/null);
118
119        // Focus modes
120        set.setFocusMode(FocusMode.AUTO);
121        camera2SettingsCheckSingleOption(set, CONTROL_AF_MODE, CONTROL_AF_MODE_AUTO);
122        set.setFocusMode(FocusMode.CONTINUOUS_PICTURE);
123        camera2SettingsCheckSingleOption(set, CONTROL_AF_MODE, CONTROL_AF_MODE_CONTINUOUS_PICTURE);
124        set.setFocusMode(FocusMode.CONTINUOUS_VIDEO);
125        camera2SettingsCheckSingleOption(set, CONTROL_AF_MODE, CONTROL_AF_MODE_CONTINUOUS_VIDEO);
126        set.setFocusMode(FocusMode.EXTENDED_DOF);
127        camera2SettingsCheckSingleOption(set, CONTROL_AF_MODE, CONTROL_AF_MODE_EDOF);
128        set.setFocusMode(FocusMode.FIXED);
129        camera2SettingsCheckSingleOption(set, CONTROL_AF_MODE, CONTROL_AF_MODE_OFF);
130        set.setFocusMode(FocusMode.MACRO);
131        camera2SettingsCheckSingleOption(set, CONTROL_AF_MODE, CONTROL_AF_MODE_MACRO);
132
133        // Scene modes
134        set.setSceneMode(SceneMode.AUTO);
135        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_DISABLED);
136        set.setSceneMode(SceneMode.ACTION);
137        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_ACTION);
138        set.setSceneMode(SceneMode.BARCODE);
139        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_BARCODE);
140        set.setSceneMode(SceneMode.BEACH);
141        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_BEACH);
142        set.setSceneMode(SceneMode.CANDLELIGHT);
143        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_CANDLELIGHT);
144        set.setSceneMode(SceneMode.FIREWORKS);
145        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_FIREWORKS);
146        set.setSceneMode(SceneMode.LANDSCAPE);
147        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_LANDSCAPE);
148        set.setSceneMode(SceneMode.NIGHT);
149        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_NIGHT);
150        set.setSceneMode(SceneMode.PARTY);
151        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_PARTY);
152        set.setSceneMode(SceneMode.PORTRAIT);
153        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_PORTRAIT);
154        set.setSceneMode(SceneMode.SNOW);
155        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_SNOW);
156        set.setSceneMode(SceneMode.SPORTS);
157        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_SPORTS);
158        set.setSceneMode(SceneMode.STEADYPHOTO);
159        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_STEADYPHOTO);
160        set.setSceneMode(SceneMode.SUNSET);
161        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_SUNSET);
162        set.setSceneMode(SceneMode.THEATRE);
163        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_THEATRE);
164
165        // White balances
166        set.setWhiteBalance(WhiteBalance.AUTO);
167        camera2SettingsCheckSingleOption(set, CONTROL_AWB_MODE, CONTROL_AWB_MODE_AUTO);
168        set.setWhiteBalance(WhiteBalance.CLOUDY_DAYLIGHT);
169        camera2SettingsCheckSingleOption(set, CONTROL_AWB_MODE, CONTROL_AWB_MODE_CLOUDY_DAYLIGHT);
170        set.setWhiteBalance(WhiteBalance.DAYLIGHT);
171        camera2SettingsCheckSingleOption(set, CONTROL_AWB_MODE, CONTROL_AWB_MODE_DAYLIGHT);
172        set.setWhiteBalance(WhiteBalance.FLUORESCENT);
173        camera2SettingsCheckSingleOption(set, CONTROL_AWB_MODE, CONTROL_AWB_MODE_FLUORESCENT);
174        set.setWhiteBalance(WhiteBalance.INCANDESCENT);
175        camera2SettingsCheckSingleOption(set, CONTROL_AWB_MODE, CONTROL_AWB_MODE_INCANDESCENT);
176        set.setWhiteBalance(WhiteBalance.SHADE);
177        camera2SettingsCheckSingleOption(set, CONTROL_AWB_MODE, CONTROL_AWB_MODE_SHADE);
178        set.setWhiteBalance(WhiteBalance.TWILIGHT);
179        camera2SettingsCheckSingleOption(set, CONTROL_AWB_MODE, CONTROL_AWB_MODE_TWILIGHT);
180        set.setWhiteBalance(WhiteBalance.WARM_FLUORESCENT);
181        camera2SettingsCheckSingleOption(set, CONTROL_AWB_MODE, CONTROL_AWB_MODE_WARM_FLUORESCENT);
182    }
183
184    // TODO: Add a test checking whether stringification matches API 1 representation
185
186    /**
187     * Ensure that {@code AndroidCamera2Capabilities#.*FromInt} correctly
188     * translates from framework API 2 representations to the equivalent
189     * {@code FocusMode}s, {@code SceneMode}s, and {@code WhiteBalance}s.
190     */
191    @Test
192    public void camera2CapabilitiesFocusModeFromInt() throws CameraAccessException {
193        CameraCharacteristics chars = buildFrameworkCharacteristics();
194        AndroidCamera2Capabilities intstr = new AndroidCamera2Capabilities(chars);
195
196        // Focus modes
197        assertEquals(intstr.focusModeFromInt(CONTROL_AF_MODE_AUTO), FocusMode.AUTO);
198        assertEquals(intstr.focusModeFromInt(CONTROL_AF_MODE_CONTINUOUS_PICTURE),
199                FocusMode.CONTINUOUS_PICTURE);
200        assertEquals(intstr.focusModeFromInt(CONTROL_AF_MODE_CONTINUOUS_VIDEO),
201                FocusMode.CONTINUOUS_VIDEO);
202        assertEquals(intstr.focusModeFromInt(CONTROL_AF_MODE_EDOF), FocusMode.EXTENDED_DOF);
203        assertEquals(intstr.focusModeFromInt(CONTROL_AF_MODE_OFF), FocusMode.FIXED);
204        assertEquals(intstr.focusModeFromInt(CONTROL_AF_MODE_MACRO), FocusMode.MACRO);
205
206        // Scene modes
207        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_DISABLED), SceneMode.AUTO);
208        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_ACTION), SceneMode.ACTION);
209        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_BARCODE), SceneMode.BARCODE);
210        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_BEACH), SceneMode.BEACH);
211        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_CANDLELIGHT), SceneMode.CANDLELIGHT);
212        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_FIREWORKS), SceneMode.FIREWORKS);
213        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_LANDSCAPE), SceneMode.LANDSCAPE);
214        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_NIGHT), SceneMode.NIGHT);
215        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_PARTY), SceneMode.PARTY);
216        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_PORTRAIT), SceneMode.PORTRAIT);
217        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_SNOW), SceneMode.SNOW);
218        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_SPORTS), SceneMode.SPORTS);
219        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_STEADYPHOTO),
220                SceneMode.STEADYPHOTO);
221        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_SUNSET), SceneMode.SUNSET);
222        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_THEATRE), SceneMode.THEATRE);
223
224        // White balances
225        assertEquals(intstr.whiteBalanceFromInt(CONTROL_AWB_MODE_AUTO), WhiteBalance.AUTO);
226        assertEquals(intstr.whiteBalanceFromInt(CONTROL_AWB_MODE_CLOUDY_DAYLIGHT),
227                WhiteBalance.CLOUDY_DAYLIGHT);
228        assertEquals(intstr.whiteBalanceFromInt(CONTROL_AWB_MODE_DAYLIGHT), WhiteBalance.DAYLIGHT);
229        assertEquals(intstr.whiteBalanceFromInt(CONTROL_AWB_MODE_FLUORESCENT),
230                WhiteBalance.FLUORESCENT);
231        assertEquals(intstr.whiteBalanceFromInt(CONTROL_AWB_MODE_INCANDESCENT),
232                WhiteBalance.INCANDESCENT);
233        assertEquals(intstr.whiteBalanceFromInt(CONTROL_AWB_MODE_SHADE), WhiteBalance.SHADE);
234        assertEquals(intstr.whiteBalanceFromInt(CONTROL_AWB_MODE_TWILIGHT), WhiteBalance.TWILIGHT);
235        assertEquals(intstr.whiteBalanceFromInt(CONTROL_AWB_MODE_WARM_FLUORESCENT),
236                WhiteBalance.WARM_FLUORESCENT);
237    }
238}
239