CameraStressTest.java revision bac8666893ee6d0074db7fa7f995de04598013b1
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;
31bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchiimport java.util.List;
3241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
3341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.hardware.Camera;
3441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.hardware.Camera.PictureCallback;
3541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.hardware.Camera.ShutterCallback;
3641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.os.Environment;
3741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.os.Handler;
3841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.os.Looper;
3941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.test.ActivityInstrumentationTestCase2;
4041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.test.suitebuilder.annotation.LargeTest;
4141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.util.Log;
4241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport android.view.SurfaceHolder;
4341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport com.android.mediaframeworktest.CameraStressTestRunner;
4441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
4541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchiimport junit.framework.Assert;
4641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
4741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi/**
48bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi * Junit / Instrumentation test case for the camera zoom and scene mode APIs
4941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi *
5041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi * adb shell am instrument
5141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi *  -e class com.android.mediaframeworktest.stress.CameraStressTest
5241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi *  -w com.android.mediaframeworktest/.CameraStressTestRunner
5341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi */
5441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchipublic class CameraStressTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> {
5541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private String TAG = "CameraStressTest";
5641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private Camera mCamera;
5741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
58bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi    private static final int CAMERA_ID = 0;
5941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private static final int NUMBER_OF_ZOOM_LOOPS = 100;
60bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi    private static final int NUMBER_OF_SCENE_MODE_LOOPS = 10;
6141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private static final long WAIT_GENERIC = 3 * 1000; // 3 seconds
6241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private static final long WAIT_TIMEOUT = 10 * 1000; // 10 seconds
6341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private static final long WAIT_ZOOM_ANIMATION = 5 * 1000; // 5 seconds
64bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi    private static final String CAMERA_STRESS_IMAGES_DIRECTORY = "cameraStressImages";
65bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi    private static final String CAMERA_STRESS_IMAGES_PREFIX = "camera-stress-test";
66bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi    private static final String CAMERA_STRESS_OUTPUT = "cameraStressOutput.txt";
6741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private final CameraErrorCallback mCameraErrorCallback = new CameraErrorCallback();
6841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
6941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private Thread mLooperThread;
7041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private Handler mHandler;
7141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
72bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi    private Writer mOutput;
73bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi
7441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    public CameraStressTest() {
7541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        super("com.android.mediaframeworktest", MediaFrameworkTest.class);
7641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    }
7741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
7841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    protected void setUp() throws Exception {
7941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        final Semaphore sem = new Semaphore(0);
8041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        mLooperThread = new Thread() {
8141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            @Override
8241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            public void run() {
8341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                Log.v(TAG, "starting looper");
8441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                Looper.prepare();
8541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                mHandler = new Handler();
8641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                sem.release();
8741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                Looper.loop();
8841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                Log.v(TAG, "quit looper");
8941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            }
9041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        };
9141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        mLooperThread.start();
9241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        if (!sem.tryAcquire(WAIT_TIMEOUT, TimeUnit.MILLISECONDS)) {
9341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            fail("Failed to start the looper.");
9441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
9541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        getActivity();
9641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        super.setUp();
97bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi
98bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        File sdcard = Environment.getExternalStorageDirectory();
99bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi
100bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        // Create the test images directory if it doesn't exist
101bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        File stressImagesDirectory = new File(String.format("%s/%s", sdcard,
102bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                CAMERA_STRESS_IMAGES_DIRECTORY));
103bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        if (!stressImagesDirectory.exists()) {
104bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            stressImagesDirectory.mkdir();
105bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        }
106bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi
107bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        // Start writing output file
108bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        File stressOutFile = new File(String.format("%s/%s",sdcard, CAMERA_STRESS_OUTPUT));
109bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        mOutput = new BufferedWriter(new FileWriter(stressOutFile, true));
110bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        mOutput.write(this.getName() + ":\n");
11141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    }
11241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
11341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    @Override
11441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    protected void tearDown() throws Exception {
11541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        if (mHandler != null) {
11641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            mHandler.getLooper().quit();
11741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            mHandler = null;
11841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
11941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        if (mLooperThread != null) {
12041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            mLooperThread.join(WAIT_TIMEOUT);
12141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            if (mLooperThread.isAlive()) {
12241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                fail("Failed to stop the looper.");
12341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            }
12441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            mLooperThread = null;
12541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
12641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
127bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        mOutput.write("\n\n");
128bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        mOutput.close();
129bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi
13041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        super.tearDown();
13141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    }
13241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
13341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private void runOnLooper(final Runnable command) throws InterruptedException {
13441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        final Semaphore sem = new Semaphore(0);
13541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        mHandler.post(new Runnable() {
13641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            @Override
13741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            public void run() {
13841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                try {
13941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    command.run();
14041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                } finally {
14141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    sem.release();
14241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                }
14341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            }
14441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        });
14541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        if (!sem.tryAcquire(WAIT_TIMEOUT, TimeUnit.MILLISECONDS)) {
14641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            fail("Failed to run the command on the looper.");
14741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
14841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    }
14941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
15041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private final class CameraErrorCallback implements android.hardware.Camera.ErrorCallback {
15141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        public void onError(int error, android.hardware.Camera camera) {
152bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            fail(String.format("Camera error, code: %d", error));
15341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
15441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    }
15541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
15641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private ShutterCallback shutterCallback = new ShutterCallback() {
15741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        @Override
15841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        public void onShutter() {
15941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            Log.v(TAG, "Shutter");
16041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
16141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    };
16241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
16341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private PictureCallback rawCallback = new PictureCallback() {
16441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        @Override
16541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        public void onPictureTaken(byte[] data, Camera camera) {
16641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            Log.v(TAG, "Raw picture taken");
16741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
16841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    };
16941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
17041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    private PictureCallback jpegCallback = new PictureCallback() {
17141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        @Override
17241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        public void onPictureTaken(byte[] data, Camera camera) {
17341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            FileOutputStream fos = null;
17441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
17541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            try {
17641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                Log.v(TAG, "JPEG picture taken");
177bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                fos = new FileOutputStream(String.format("%s/%s/%s-%d.jpg",
178bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                        Environment.getExternalStorageDirectory(), CAMERA_STRESS_IMAGES_DIRECTORY,
179bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                        CAMERA_STRESS_IMAGES_PREFIX, System.currentTimeMillis()));
18041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                fos.write(data);
181bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            } catch (FileNotFoundException e) {
182bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                Log.e(TAG, "File not found: " + e.toString());
183bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            } catch (IOException e) {
184bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                Log.e(TAG, "Error accessing file: " + e.toString());
185bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            } finally {
18641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                try {
18741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    if (fos != null) {
18841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                        fos.close();
18941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    }
190bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                } catch (IOException e) {
191bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    Log.e(TAG, "Error closing file: " + e.toString());
19241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                }
19341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            }
19441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
19541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    };
19641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
19741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    // Helper method for cleaning up pics taken during testStressCameraZoom
198bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi    private void cleanupStressTestImages() {
19941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        try {
200bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            File stressImagesDirectory = new File(String.format("%s/%s",
201bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    Environment.getExternalStorageDirectory(), CAMERA_STRESS_IMAGES_DIRECTORY));
20241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            File[] zoomImages = null;
20341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
20441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            FilenameFilter filter = new FilenameFilter() {
20541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                public boolean accept(File dir, String name) {
206bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    return name.startsWith(CAMERA_STRESS_IMAGES_PREFIX);
20741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                }
20841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            };
20941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
210bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            zoomImages = stressImagesDirectory.listFiles(filter);
21141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
21241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            for (File f : zoomImages) {
21341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                f.delete();
21441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            }
215bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        } catch (SecurityException e) {
216bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            Log.e(TAG, "Security manager access violation: " + e.toString());
21741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
218bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi    }
219bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi
220bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi    // Helper method for starting up the camera preview
221bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi    private void startCameraPreview(SurfaceHolder surfaceHolder) {
222bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        try {
223bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            mCamera.setErrorCallback(mCameraErrorCallback);
224bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            mCamera.setPreviewDisplay(surfaceHolder);
225bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            mCamera.startPreview();
226bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            Thread.sleep(WAIT_GENERIC);
227bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        } catch (IOException e) {
228bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            Log.e(TAG, "Error setting preview display: " + e.toString());
229bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        } catch (InterruptedException e) {
230bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            Log.e(TAG, "Error waiting for preview to come up: " + e.toString());
231bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        } catch (Exception e) {
232bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            Log.e(TAG, "Error starting up camera preview: " + e.toString());
233bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        }
234bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi    }
235bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi
236bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi    // Helper method for taking a photo
237bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi    private void capturePhoto() {
238bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        try {
239bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            mCamera.takePicture(shutterCallback, rawCallback, jpegCallback);
240bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            Thread.sleep(WAIT_GENERIC);
241bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            mCamera.stopPreview();
242bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            mCamera.release();
243bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        } catch (InterruptedException e) {
244bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            Log.e(TAG, "Error waiting for photo to be taken: " + e.toString());
245bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        } catch (Exception e) {
246bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            Log.e(TAG, "Error capturing photo: " + e.toString());
24741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
24841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    }
24941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
25041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    // Test case for stressing the camera zoom in/out feature
25141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    @LargeTest
25241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    public void testStressCameraZoom() throws Exception {
25341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        SurfaceHolder mSurfaceHolder;
25441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
255bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        mOutput.write("Total number of loops: " + NUMBER_OF_ZOOM_LOOPS + "\n");
25641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
25741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        try {
25841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            Log.v(TAG, "Start preview");
259bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            mOutput.write("No of loop: ");
26041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
261e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau            mCamera = Camera.open(CAMERA_ID);
26241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            Camera.Parameters params = mCamera.getParameters();
26341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            mCamera.release();
26441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
26541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            if (!params.isSmoothZoomSupported() && !params.isZoomSupported()) {
26641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                Log.v(TAG, "Device camera does not support zoom");
267bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                fail("Camera zoom stress test failed");
268bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            } else {
26941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                Log.v(TAG, "Device camera does support zoom");
27041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
27141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                int nextZoomLevel = 0;
27241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
27341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                for (int i = 0; i < NUMBER_OF_ZOOM_LOOPS; i++) {
27441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    runOnLooper(new Runnable() {
27541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                        @Override
27641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                        public void run() {
277e35b3e052dab756113304cb394980e9f271b1613Yu Shan Emily Lau                            mCamera = Camera.open(CAMERA_ID);
27841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                        }
27941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    });
28041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
281bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    startCameraPreview(mSurfaceHolder);
28241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    params = mCamera.getParameters();
28341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    int currentZoomLevel = params.getZoom();
28441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
28541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    if (nextZoomLevel >= params.getMaxZoom()) {
28641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                        nextZoomLevel = 0;
28741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    }
28841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    ++nextZoomLevel;
28941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
29041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    if (params.isSmoothZoomSupported()) {
29141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                        mCamera.startSmoothZoom(nextZoomLevel);
292bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    } else {
29341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                        params.setZoom(nextZoomLevel);
29441d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                        mCamera.setParameters(params);
29541d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    }
29641d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    Log.v(TAG, "Zooming from " + currentZoomLevel + " to " + nextZoomLevel);
29741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
29841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    // sleep allows for zoom animation to finish
29941d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                    Thread.sleep(WAIT_ZOOM_ANIMATION);
300bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    capturePhoto();
30141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi
302bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    if (i == 0) {
303bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                        mOutput.write(Integer.toString(i));
304bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    } else {
305bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                        mOutput.write(", " + i);
306bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    }
30741d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi                }
30841d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi            }
309bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            cleanupStressTestImages();
310bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        } catch (Exception e) {
311bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            Log.e(TAG, e.toString());
312bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            fail("Camera zoom stress test Exception");
31341d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
314bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi    }
315bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi
316bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi    // Test case for stressing the camera scene mode feature
317bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi    @LargeTest
318bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi    public void testStressCameraSceneModes() throws Exception {
319bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        SurfaceHolder mSurfaceHolder;
320bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
321bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi
322bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        try {
323bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            mCamera = Camera.open(CAMERA_ID);
324bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            Camera.Parameters params = mCamera.getParameters();
325bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            mCamera.release();
326bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            List<String> supportedSceneModes = params.getSupportedSceneModes();
327bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            assertNotNull("No scene modes supported", supportedSceneModes);
328bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi
329bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            mOutput.write("Total number of loops: " +
330bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    (NUMBER_OF_SCENE_MODE_LOOPS * supportedSceneModes.size()) + "\n");
331bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            Log.v(TAG, "Start preview");
332bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            mOutput.write("No of loop: ");
333bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi
334bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            for (int i = 0; i < supportedSceneModes.size(); i++) {
335bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                for (int j = 0; j < NUMBER_OF_SCENE_MODE_LOOPS; j++) {
336bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    runOnLooper(new Runnable() {
337bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                        @Override
338bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                        public void run() {
339bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                            mCamera = Camera.open(CAMERA_ID);
340bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                        }
341bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    });
342bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi
343bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    startCameraPreview(mSurfaceHolder);
344bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    Log.v(TAG, "Setting mode to " + supportedSceneModes.get(i));
345bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    params.setSceneMode(supportedSceneModes.get(i));
346bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    mCamera.setParameters(params);
347bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    capturePhoto();
348bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi
349bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    if ((i == 0) && (j == 0)) {
350bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                        mOutput.write(Integer.toString(j + i * NUMBER_OF_SCENE_MODE_LOOPS));
351bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    } else {
352bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                        mOutput.write(", " + (j + i * NUMBER_OF_SCENE_MODE_LOOPS));
353bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                    }
354bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi                }
355bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            }
356bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            cleanupStressTestImages();
357bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi        } catch (Exception e) {
358bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            Log.e(TAG, e.toString());
359bac8666893ee6d0074db7fa7f995de04598013b1Jason Noguchi            fail("Camera scene mode test Exception");
36041d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi        }
36141d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi    }
36241d88d5f58ede432c7574c55b388dc390b08dc3bJason Noguchi}
363