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