141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi/*
241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * Copyright (C) 2012 The Android Open Source Project
341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi *
441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * Licensed under the Apache License, Version 2.0 (the "License");
541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * you may not use this file except in compliance with the License.
641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * You may obtain a copy of the License at
741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi *
841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi *      http://www.apache.org/licenses/LICENSE-2.0
941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi *
1041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * Unless required by applicable law or agreed to in writing, software
1141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * distributed under the License is distributed on an "AS IS" BASIS,
1241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * See the License for the specific language governing permissions and
1441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * limitations under the License.
1541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi */
1641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
1741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchipackage com.android.mediaframeworktest.stress;
1841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
1941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport com.android.mediaframeworktest.MediaFrameworkTest;
20c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport com.android.mediaframeworktest.CameraTestHelper;
2141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
2241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.io.BufferedWriter;
2341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.io.File;
2441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.io.FileWriter;
2541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.io.IOException;
2641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.io.Writer;
2741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.util.concurrent.Semaphore;
2841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.util.concurrent.TimeUnit;
29bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchiimport java.util.List;
3041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
3141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.hardware.Camera;
32c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.hardware.Camera.Parameters;
3341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.os.Environment;
3441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.os.Handler;
3541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.os.Looper;
3641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.test.ActivityInstrumentationTestCase2;
3741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.test.suitebuilder.annotation.LargeTest;
3841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.util.Log;
3941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.view.SurfaceHolder;
4041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport com.android.mediaframeworktest.CameraStressTestRunner;
4141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
4241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport junit.framework.Assert;
4341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
4441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi/**
45c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Junit / Instrumentation test case for the following camera APIs:
46c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi *  - camera zoom
47c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi *  - scene mode
4841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi *
4941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * adb shell am instrument
5041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi *  -e class com.android.mediaframeworktest.stress.CameraStressTest
5141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi *  -w com.android.mediaframeworktest/.CameraStressTestRunner
5241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi */
5341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchipublic class CameraStressTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> {
5441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
55bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi    private static final int NUMBER_OF_SCENE_MODE_LOOPS = 10;
56c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi    private static final int NUMBER_OF_ZOOM_LOOPS = 100;
5741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private static final long WAIT_TIMEOUT = 10 * 1000; // 10 seconds
58bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi    private static final String CAMERA_STRESS_OUTPUT = "cameraStressOutput.txt";
5941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
60c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi    private CameraTestHelper mCameraTestHelper;
6141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private Handler mHandler;
62c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi    private Thread mLooperThread;
63bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi    private Writer mOutput;
64bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi
65c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi    private String TAG = "CameraStressTest";
66c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi
6741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    public CameraStressTest() {
6841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        super("com.android.mediaframeworktest", MediaFrameworkTest.class);
6941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    }
7041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
7141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    protected void setUp() throws Exception {
7241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        final Semaphore sem = new Semaphore(0);
7341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        mLooperThread = new Thread() {
7441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            @Override
7541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            public void run() {
7641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                Log.v(TAG, "starting looper");
7741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                Looper.prepare();
7841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                mHandler = new Handler();
7941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                sem.release();
8041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                Looper.loop();
8141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                Log.v(TAG, "quit looper");
8241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            }
8341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        };
8441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        mLooperThread.start();
8541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        if (!sem.tryAcquire(WAIT_TIMEOUT, TimeUnit.MILLISECONDS)) {
8641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            fail("Failed to start the looper.");
8741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
8841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        getActivity();
8941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        super.setUp();
90bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi
91c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi        mCameraTestHelper = new CameraTestHelper();
92c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi        File stressOutFile = new File(String.format("%s/%s",
93c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                Environment.getExternalStorageDirectory(), CAMERA_STRESS_OUTPUT));
94bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        mOutput = new BufferedWriter(new FileWriter(stressOutFile, true));
95c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi        mOutput.write(this.getName() + "\n");
9641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    }
9741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
9841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    @Override
9941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    protected void tearDown() throws Exception {
10041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        if (mHandler != null) {
10141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            mHandler.getLooper().quit();
10241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            mHandler = null;
10341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
10441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        if (mLooperThread != null) {
10541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            mLooperThread.join(WAIT_TIMEOUT);
10641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            if (mLooperThread.isAlive()) {
10741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                fail("Failed to stop the looper.");
10841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            }
10941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            mLooperThread = null;
11041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
111bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        mOutput.write("\n\n");
112bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        mOutput.close();
11341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        super.tearDown();
11441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    }
11541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
11641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private void runOnLooper(final Runnable command) throws InterruptedException {
11741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        final Semaphore sem = new Semaphore(0);
11841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        mHandler.post(new Runnable() {
11941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            @Override
12041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            public void run() {
12141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                try {
12241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    command.run();
12341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                } finally {
12441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    sem.release();
12541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                }
12641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            }
12741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        });
12841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        if (!sem.tryAcquire(WAIT_TIMEOUT, TimeUnit.MILLISECONDS)) {
12941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            fail("Failed to run the command on the looper.");
13041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
13141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    }
13241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
133c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi    /**
134c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi     * Stress test iterating on the various scene modes (action, night, party, etc.)
135c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi     */
136c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi    @LargeTest
137c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi    public void testStressCameraSceneModes() throws Exception {
138c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi        try {
139c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi            SurfaceHolder surfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
140c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi            Parameters params = mCameraTestHelper.getCameraParameters();
141c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi            List<String> supportedSceneModes = params.getSupportedSceneModes();
142c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi            assertNotNull("No scene modes supported", supportedSceneModes);
14341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
144c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi            mOutput.write("Total number of loops: " +
145c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                    (NUMBER_OF_SCENE_MODE_LOOPS * supportedSceneModes.size()) + "\n");
146c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi            Log.v(TAG, "Start preview");
147c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi            mOutput.write("No of loop: ");
14841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
149c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi            for (int i = 0; i < supportedSceneModes.size(); i++) {
150c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                for (int j = 0; j < NUMBER_OF_SCENE_MODE_LOOPS; j++) {
151c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                    runOnLooper(new Runnable() {
152c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                        @Override
153c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                        public void run() {
154c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                            mCameraTestHelper.setupCameraTest();
155c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                        }
156c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                    });
157c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                    Log.v(TAG, "Setting scene mode to " + supportedSceneModes.get(i));
158c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                    params.setSceneMode(supportedSceneModes.get(i));
159c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                    mCameraTestHelper.setParameters(params);
160c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                    mCameraTestHelper.startCameraPreview(surfaceHolder);
161c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                    mCameraTestHelper.capturePhoto();
16241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
163c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                    if (i == 0 && j == 0) {
164c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                        mOutput.write(Integer.toString(j + i * NUMBER_OF_SCENE_MODE_LOOPS));
165c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                    } else {
166c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                        mOutput.write(", " + (j + i * NUMBER_OF_SCENE_MODE_LOOPS));
16741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    }
16841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                }
16941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            }
170c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi            mCameraTestHelper.cleanupTestImages();
171bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        } catch (Exception e) {
172c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi            Log.e(TAG, e.toString());
173c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi            fail("Camera scene mode test Exception");
17441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
17541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    }
17641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
177c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi    /**
178c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi     * Stress test iterating on the range of supported camera zoom levels
179c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi     */
18041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    @LargeTest
18141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    public void testStressCameraZoom() throws Exception {
18241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        try {
183c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi            SurfaceHolder surfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
184c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi            Parameters params = mCameraTestHelper.getCameraParameters();
18541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
18641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            if (!params.isSmoothZoomSupported() && !params.isZoomSupported()) {
18741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                Log.v(TAG, "Device camera does not support zoom");
188c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                fail("Camera zoom stress test failed due to unsupported feature");
189bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            } else {
19041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                Log.v(TAG, "Device camera does support zoom");
191c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                Log.v(TAG, "Start preview");
192c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                mOutput.write("Total number of loops: " + NUMBER_OF_ZOOM_LOOPS + "\n");
193c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                mOutput.write("No of loops: ");
19441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
19541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                int nextZoomLevel = 0;
19641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
19741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                for (int i = 0; i < NUMBER_OF_ZOOM_LOOPS; i++) {
19841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    runOnLooper(new Runnable() {
19941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                        @Override
20041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                        public void run() {
201c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                            mCameraTestHelper.setupCameraTest();
20241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                        }
20341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    });
20441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
205c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                    mCameraTestHelper.startCameraPreview(surfaceHolder);
206c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                    params = mCameraTestHelper.mCamera.getParameters();
20741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    int currentZoomLevel = params.getZoom();
20841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
20941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    if (nextZoomLevel >= params.getMaxZoom()) {
21041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                        nextZoomLevel = 0;
21141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    }
21241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    ++nextZoomLevel;
21341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
21441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    if (params.isSmoothZoomSupported()) {
215c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                        mCameraTestHelper.mCamera.startSmoothZoom(nextZoomLevel);
216bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    } else {
21741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                        params.setZoom(nextZoomLevel);
218c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                        mCameraTestHelper.setParameters(params);
21941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    }
220c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi                    mCameraTestHelper.capturePhoto();
22141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
222bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    if (i == 0) {
223bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                        mOutput.write(Integer.toString(i));
224bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    } else {
225bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                        mOutput.write(", " + i);
226bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    }
22741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                }
22841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            }
229c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi            mCameraTestHelper.cleanupTestImages();
230bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        } catch (Exception e) {
231bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            Log.e(TAG, e.toString());
232bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            fail("Camera zoom stress test Exception");
23341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
234bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi    }
23541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi}
236