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