CameraStressTest.java revision 41d88d5f58ede432c7574c55b388dc390b08dc3b
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;
2041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
2141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.io.BufferedWriter;
2241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.io.File;
2341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.io.FilenameFilter;
2441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.io.FileWriter;
2541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.io.FileNotFoundException;
2641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.io.FileOutputStream;
2741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.io.IOException;
2841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.io.Writer;
2941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.util.concurrent.Semaphore;
3041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport java.util.concurrent.TimeUnit;
3141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
3241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.hardware.Camera;
3341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.hardware.Camera.PictureCallback;
3441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.hardware.Camera.ShutterCallback;
3541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.os.Environment;
3641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.os.Handler;
3741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.os.Looper;
3841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.test.ActivityInstrumentationTestCase2;
3941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.test.suitebuilder.annotation.LargeTest;
4041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.util.Log;
4141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.view.SurfaceHolder;
4241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport com.android.mediaframeworktest.CameraStressTestRunner;
4341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
4441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport junit.framework.Assert;
4541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
4641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi/**
4741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * Junit / Instrumentation test case for the camera zoom api
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    private String TAG = "CameraStressTest";
5541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private Camera mCamera;
5641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
5741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private static final int NUMBER_OF_ZOOM_LOOPS = 100;
5841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private static final long WAIT_GENERIC = 3 * 1000; // 3 seconds
5941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private static final long WAIT_TIMEOUT = 10 * 1000; // 10 seconds
6041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private static final long WAIT_ZOOM_ANIMATION = 5 * 1000; // 5 seconds
6141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private static final String CAMERA_STRESS_OUTPUT =
6241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            "/sdcard/cameraStressOutput.txt";
6341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private final CameraErrorCallback mCameraErrorCallback = new CameraErrorCallback();
6441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
6541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private Thread mLooperThread;
6641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private Handler mHandler;
6741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
6841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    public CameraStressTest() {
6941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        super("com.android.mediaframeworktest", MediaFrameworkTest.class);
7041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    }
7141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
7241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    protected void setUp() throws Exception {
7341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        final Semaphore sem = new Semaphore(0);
7441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        mLooperThread = new Thread() {
7541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            @Override
7641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            public void run() {
7741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                Log.v(TAG, "starting looper");
7841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                Looper.prepare();
7941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                mHandler = new Handler();
8041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                sem.release();
8141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                Looper.loop();
8241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                Log.v(TAG, "quit looper");
8341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            }
8441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        };
8541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        mLooperThread.start();
8641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        if (!sem.tryAcquire(WAIT_TIMEOUT, TimeUnit.MILLISECONDS)) {
8741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            fail("Failed to start the looper.");
8841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
8941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        getActivity();
9041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        super.setUp();
9141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    }
9241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
9341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    @Override
9441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    protected void tearDown() throws Exception {
9541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        if (mHandler != null) {
9641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            mHandler.getLooper().quit();
9741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            mHandler = null;
9841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
9941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        if (mLooperThread != null) {
10041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            mLooperThread.join(WAIT_TIMEOUT);
10141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            if (mLooperThread.isAlive()) {
10241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                fail("Failed to stop the looper.");
10341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            }
10441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            mLooperThread = null;
10541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
10641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
10741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        super.tearDown();
10841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    }
10941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
11041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private void runOnLooper(final Runnable command) throws InterruptedException {
11141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        final Semaphore sem = new Semaphore(0);
11241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        mHandler.post(new Runnable() {
11341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            @Override
11441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            public void run() {
11541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                try {
11641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    command.run();
11741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                } finally {
11841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    sem.release();
11941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                }
12041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            }
12141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        });
12241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        if (!sem.tryAcquire(WAIT_TIMEOUT, TimeUnit.MILLISECONDS)) {
12341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            fail("Failed to run the command on the looper.");
12441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
12541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    }
12641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
12741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private final class CameraErrorCallback implements android.hardware.Camera.ErrorCallback {
12841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        public void onError(int error, android.hardware.Camera camera) {
12941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            if (error == android.hardware.Camera.CAMERA_ERROR_SERVER_DIED) {
13041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                assertTrue("Camera test mediaserver died", false);
13141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            }
13241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
13341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    }
13441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
13541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private ShutterCallback shutterCallback = new ShutterCallback() {
13641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        @Override
13741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        public void onShutter() {
13841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            Log.v(TAG, "Shutter");
13941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
14041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    };
14141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
14241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private PictureCallback rawCallback = new PictureCallback() {
14341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        @Override
14441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        public void onPictureTaken(byte[] data, Camera camera) {
14541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            Log.v(TAG, "Raw picture taken");
14641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
14741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    };
14841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
14941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private PictureCallback jpegCallback = new PictureCallback() {
15041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        @Override
15141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        public void onPictureTaken(byte[] data, Camera camera) {
15241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            FileOutputStream fos = null;
15341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
15441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            try {
15541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                Log.v(TAG, "JPEG picture taken");
15641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                fos = new FileOutputStream(String.format("%s/zoom-test-%d.jpg",
15741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                        Environment.getExternalStorageDirectory(), System.currentTimeMillis()));
15841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                fos.write(data);
15941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            }
16041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            catch (FileNotFoundException e) {
16141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                Log.v(TAG, "File not found: " + e.toString());
16241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            }
16341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            catch (IOException e) {
16441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                Log.v(TAG, "Error accessing file: " + e.toString());
16541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            }
16641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            finally {
16741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                try {
16841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    if (fos != null) {
16941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                        fos.close();
17041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    }
17141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                }
17241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                catch (IOException e) {
17341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    Log.v(TAG, "Error closing file: " + e.toString();
17441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                }
17541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            }
17641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
17741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    };
17841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
17941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    // Helper method for cleaning up pics taken during testStressCameraZoom
18041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private void cleanupZoomImages() {
18141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        try {
18241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            File sdcard = Environment.getExternalStorageDirectory();
18341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            File[] zoomImages = null;
18441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
18541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            FilenameFilter filter = new FilenameFilter() {
18641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                public boolean accept(File dir, String name) {
18741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    return name.startsWith("zoom-test-");
18841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                }
18941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            };
19041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
19141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            zoomImages = sdcard.listFiles(filter);
19241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
19341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            for (File f : zoomImages) {
19441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                f.delete();
19541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            }
19641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
19741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        catch (SecurityException e) {
19841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            Log.v(TAG, "Security manager access violation: " + e.toString());
19941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
20041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    }
20141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
20241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    // Test case for stressing the camera zoom in/out feature
20341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    @LargeTest
20441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    public void testStressCameraZoom() throws Exception {
20541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        SurfaceHolder mSurfaceHolder;
20641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
20741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        File stressOutFile = new File(CAMERA_STRESS_OUTPUT);
20841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        Writer output = new BufferedWriter(new FileWriter(stressOutFile, true));
20941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        output.write("Camera zoom stress:\n");
21041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        output.write("Total number of loops: " +  NUMBER_OF_ZOOM_LOOPS + "\n");
21141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
21241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        try {
21341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            Log.v(TAG, "Start preview");
21441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            output.write("No of loop: ");
21541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
21641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            mCamera = Camera.open();
21741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            Camera.Parameters params = mCamera.getParameters();
21841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            mCamera.release();
21941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
22041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            if (!params.isSmoothZoomSupported() && !params.isZoomSupported()) {
22141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                Log.v(TAG, "Device camera does not support zoom");
22241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                assertTrue("Camera zoom stress test", false);
22341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            }
22441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            else {
22541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                Log.v(TAG, "Device camera does support zoom");
22641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
22741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                int nextZoomLevel = 0;
22841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
22941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                for (int i = 0; i < NUMBER_OF_ZOOM_LOOPS; i++) {
23041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    runOnLooper(new Runnable() {
23141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                        @Override
23241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                        public void run() {
23341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                            mCamera = Camera.open();
23441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                        }
23541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    });
23641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
23741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    mCamera.setErrorCallback(mCameraErrorCallback);
23841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    mCamera.setPreviewDisplay(mSurfaceHolder);
23941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    mCamera.startPreview();
24041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    Thread.sleep(WAIT_GENERIC);
24141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
24241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    params = mCamera.getParameters();
24341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    int currentZoomLevel = params.getZoom();
24441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
24541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    if (nextZoomLevel >= params.getMaxZoom()) {
24641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                        nextZoomLevel = 0;
24741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    }
24841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    ++nextZoomLevel;
24941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
25041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    if (params.isSmoothZoomSupported()) {
25141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                        mCamera.startSmoothZoom(nextZoomLevel);
25241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    }
25341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    else {
25441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                        params.setZoom(nextZoomLevel);
25541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                        mCamera.setParameters(params);
25641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    }
25741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    Log.v(TAG, "Zooming from " + currentZoomLevel + " to " + nextZoomLevel);
25841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
25941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    // sleep allows for zoom animation to finish
26041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    Thread.sleep(WAIT_ZOOM_ANIMATION);
26141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
26241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    // take picture
26341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    mCamera.takePicture(shutterCallback, rawCallback, jpegCallback);
26441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    Thread.sleep(WAIT_GENERIC);
26541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    mCamera.stopPreview();
26641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    mCamera.release();
26741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    output.write(" ," + i);
26841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                }
26941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            }
27041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
27141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            cleanupZoomImages();
27241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
27341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        catch (Exception e) {
27441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            assertTrue("Camera zoom stress test Exception", false);
27541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            Log.v(TAG, e.toString());
27641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
27741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        output.write("\n\n");
27841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        output.close();
27941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    }
28041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi}
281