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