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