1c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi/* 2c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Copyright (C) 2013 The Android Open Source Project 3c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * 4c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Licensed under the Apache License, Version 2.0 (the "License"); 5c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * you may not use this file except in compliance with the License. 6c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * You may obtain a copy of the License at 7c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * 8c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * http://www.apache.org/licenses/LICENSE-2.0 9c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * 10c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Unless required by applicable law or agreed to in writing, software 11c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * distributed under the License is distributed on an "AS IS" BASIS, 12c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * See the License for the specific language governing permissions and 14c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * limitations under the License. 15c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi */ 16c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 17c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchipackage com.android.mediaframeworktest.functional.camera; 18c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 19c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport com.android.mediaframeworktest.MediaFrameworkTest; 20c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport com.android.mediaframeworktest.CameraTestHelper; 21c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 22c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport java.io.BufferedWriter; 23c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport java.io.File; 24c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport java.io.FileWriter; 25c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport java.io.IOException; 26c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport java.io.Writer; 27c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport java.util.concurrent.Semaphore; 28c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport java.util.concurrent.TimeUnit; 29c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport java.util.HashMap; 30c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport java.util.List; 31c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport java.util.Map; 32c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 33c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.hardware.Camera; 34c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.hardware.Camera.Parameters; 35c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.os.Environment; 36c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.os.Handler; 37c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.os.Looper; 38c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.test.ActivityInstrumentationTestCase2; 39c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.test.suitebuilder.annotation.LargeTest; 40c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.util.FloatMath; 41c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.util.Log; 42c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.view.SurfaceHolder; 43c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport com.android.mediaframeworktest.CameraStressTestRunner; 44c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 45c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport junit.framework.Assert; 46c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 47c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi/** 48c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Junit / Instrumentation test case for the following camera APIs: 49c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * - flash 50c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * - exposure compensation 51c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * - white balance 52c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * - focus mode 53c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * 54c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * adb shell am instrument 55c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * -e class com.android.mediaframeworktest.functional.camera.CameraFunctionalTest 56c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * -w com.android.mediaframework/.CameraStressTestRunner 57c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi */ 58c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchipublic class CameraFunctionalTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> { 59c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private static final long WAIT_TIMEOUT = 10 * 1000; // 10 seconds 60c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private CameraTestHelper mCameraTestHelper; 61c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private Handler mHandler; 62c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private Thread mLooperThread; 63c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private Writer mOutput; 64c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 65c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private String TAG = "CameraFunctionalTest"; 66c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 67c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public CameraFunctionalTest() { 68c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi super("com.android.mediaframeworktest", MediaFrameworkTest.class); 69c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 70c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 71c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi protected void setUp() throws Exception { 72c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi final Semaphore sem = new Semaphore(0); 73c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mLooperThread = new Thread() { 74c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi @Override 75c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void run() { 76c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.v(TAG, "starting looper"); 77c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Looper.prepare(); 78c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mHandler = new Handler(); 79c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi sem.release(); 80c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Looper.loop(); 81c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.v(TAG, "quit looper"); 82c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 83c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi }; 84c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mLooperThread.start(); 85c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi if (!sem.tryAcquire(WAIT_TIMEOUT, TimeUnit.MILLISECONDS)) { 86c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi fail("Failed to start the looper."); 87c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 88c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi getActivity(); 89c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi super.setUp(); 90c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 91c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCameraTestHelper = new CameraTestHelper(); 92c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 93c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 94c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi @Override 95c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi protected void tearDown() throws Exception { 96c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi if (mHandler != null) { 97c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mHandler.getLooper().quit(); 98c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mHandler = null; 99c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 100c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi if (mLooperThread != null) { 101c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mLooperThread.join(WAIT_TIMEOUT); 102c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi if (mLooperThread.isAlive()) { 103c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi fail("Failed to stop the looper."); 104c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 105c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mLooperThread = null; 106c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 107c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi super.tearDown(); 108c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 109c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 110c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private void runOnLooper(final Runnable command) throws InterruptedException { 111c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi final Semaphore sem = new Semaphore(0); 112c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mHandler.post(new Runnable() { 113c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi @Override 114c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void run() { 115c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi try { 116c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi command.run(); 117c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } finally { 118c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi sem.release(); 119c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 120c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 121c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi }); 122c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi if (!sem.tryAcquire(WAIT_TIMEOUT, TimeUnit.MILLISECONDS)) { 123c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi fail("Failed to run the command on the looper."); 124c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 125c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 126c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 127c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi /** 128c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Functional test iterating on the range of supported exposure compensation levels 129c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi */ 130c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi @LargeTest 131c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void testFunctionalCameraExposureCompensation() throws Exception { 132c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi try { 133c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi SurfaceHolder surfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 134c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Parameters params = mCameraTestHelper.getCameraParameters(); 135c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 136c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi int min = params.getMinExposureCompensation(); 137c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi int max = params.getMaxExposureCompensation(); 138c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi assertFalse("Adjusting exposure not supported", (max == 0 && min == 0)); 139c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi float step = params.getExposureCompensationStep(); 140c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi int stepsPerEV = (int) Math.round(Math.pow((double) step, -1)); 141c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 142c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi // only get integer values for exposure compensation 143c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi for (int i = min; i <= max; i += stepsPerEV) { 144c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi runOnLooper(new Runnable() { 145c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi @Override 146c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void run() { 147c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCameraTestHelper.setupCameraTest(); 148c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 149c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi }); 150c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.v(TAG, "Setting exposure compensation index to " + i); 151c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi params.setExposureCompensation(i); 152c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCameraTestHelper.setParameters(params); 153c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCameraTestHelper.startCameraPreview(surfaceHolder); 154c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCameraTestHelper.capturePhoto(); 155c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 156c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCameraTestHelper.cleanupTestImages(); 157c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } catch (Exception e) { 158c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.e(TAG, e.toString()); 159c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi fail("Camera exposure compensation test Exception"); 160c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 161c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 162c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 163c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi /** 164c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Functional test iterating on the various flash modes (on, off, auto, torch) 165c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi */ 166c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi @LargeTest 167c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void testFunctionalCameraFlashModes() throws Exception { 168c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi try { 169c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi SurfaceHolder surfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 170c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Parameters params = mCameraTestHelper.getCameraParameters(); 171c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi List<String> supportedFlashModes = params.getSupportedFlashModes(); 172c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi assertNotNull("No flash modes supported", supportedFlashModes); 173c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 174c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi for (int i = 0; i < supportedFlashModes.size(); i++) { 175c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi runOnLooper(new Runnable() { 176c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi @Override 177c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void run() { 178c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCameraTestHelper.setupCameraTest(); 179c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 180c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi }); 181c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.v(TAG, "Setting flash mode to " + supportedFlashModes.get(i)); 182c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi params.setFlashMode(supportedFlashModes.get(i)); 183c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCameraTestHelper.setParameters(params); 184c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCameraTestHelper.startCameraPreview(surfaceHolder); 185c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCameraTestHelper.capturePhoto(); 186c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 187c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCameraTestHelper.cleanupTestImages(); 188c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } catch (Exception e) { 189c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.e(TAG, e.toString()); 190c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi fail("Camera flash mode test Exception"); 191c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 192c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 193c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 194c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi /** 195c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Functional test iterating on the various focus modes (auto, infinitiy, macro, etc.) 196c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi */ 197c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi @LargeTest 198c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void testFunctionalCameraFocusModes() throws Exception { 199c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi try { 200c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi SurfaceHolder surfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 201c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Parameters params = mCameraTestHelper.getCameraParameters(); 202c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi List<String> supportedFocusModes = params.getSupportedFocusModes(); 203c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi assertNotNull("No focus modes supported", supportedFocusModes); 204c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 205c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi for (int i = 0; i < supportedFocusModes.size(); i++) { 206c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi runOnLooper(new Runnable() { 207c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi @Override 208c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void run() { 209c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCameraTestHelper.setupCameraTest(); 210c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 211c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi }); 212c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.v(TAG, "Setting focus mode to: " + supportedFocusModes.get(i)); 213c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi params.setFocusMode(supportedFocusModes.get(i)); 214c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCameraTestHelper.setParameters(params); 215c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCameraTestHelper.startCameraPreview(surfaceHolder); 216c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCameraTestHelper.capturePhoto(); 217c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 218c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCameraTestHelper.cleanupTestImages(); 219c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } catch (Exception e) { 220c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.e(TAG, e.toString()); 221c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi fail("Camera focus modes test Exception"); 222c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 223c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 224c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 225c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi /** 226c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Functional test iterating on the various white balances (auto, daylight, cloudy, etc.) 227c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi */ 228c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi @LargeTest 229c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void testFunctionalCameraWhiteBalance() throws Exception { 230c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi try { 231c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi SurfaceHolder surfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder(); 232c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Parameters params = mCameraTestHelper.getCameraParameters(); 233c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi List<String> supportedWhiteBalance = params.getSupportedWhiteBalance(); 234c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi assertNotNull("No white balance modes supported", supportedWhiteBalance); 235c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 236c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi for (int i = 0; i < supportedWhiteBalance.size(); i++) { 237c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi runOnLooper(new Runnable() { 238c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi @Override 239c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void run() { 240c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCameraTestHelper.setupCameraTest(); 241c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 242c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi }); 243c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.v(TAG, "Setting white balance to: " + supportedWhiteBalance.get(i)); 244c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi params.setWhiteBalance(supportedWhiteBalance.get(i)); 245c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCameraTestHelper.setParameters(params); 246c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCameraTestHelper.startCameraPreview(surfaceHolder); 247c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCameraTestHelper.capturePhoto(); 248c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 249c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCameraTestHelper.cleanupTestImages(); 250c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } catch (Exception e) { 251c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.e(TAG, e.toString()); 252c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi fail("Camera focus modes test Exception"); 253c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 254c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 255c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi} 256