1c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi/* 2c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Copyright (C) 2013 The Android Open Source Project 3c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * 4c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Licensed under the Apache License, Version 2.0 (the "License"); 5c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * you may not use this file except in compliance with the License. 6c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * You may obtain a copy of the License at 7c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * 8c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * http://www.apache.org/licenses/LICENSE-2.0 9c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * 10c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Unless required by applicable law or agreed to in writing, software 11c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * distributed under the License is distributed on an "AS IS" BASIS, 12c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * See the License for the specific language governing permissions and 14c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * limitations under the License. 15c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi */ 16c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 176d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimpackage com.android.mediaframeworktest.helpers; 186d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 196d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport junit.framework.Assert; 20c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 21c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.hardware.Camera; 22c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.hardware.Camera.Parameters; 23c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.hardware.Camera.PictureCallback; 24c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.hardware.Camera.ShutterCallback; 25c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.os.Environment; 26c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.util.Log; 27c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.view.SurfaceHolder; 28c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 29c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport java.io.File; 30c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport java.io.FileNotFoundException; 31c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport java.io.FileOutputStream; 32c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport java.io.IOException; 33c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 34c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchipublic class CameraTestHelper { 35c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 36c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public Camera mCamera; 37c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private String TAG = "CameraTestHelper"; 38c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private static final int CAMERA_ID = 0; 39c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private static final long WAIT_GENERIC = 3 * 1000; // 3 seconds 40c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private static final long WAIT_ZOOM_ANIMATION = 5 * 1000; // 5 seconds 41c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi protected static final String CAMERA_STRESS_IMAGES_DIRECTORY = "cameraStressImages"; 42c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private static final String CAMERA_STRESS_IMAGES_PREFIX = "camera-stress-test"; 43c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private final CameraErrorCallback mCameraErrorCallback = new CameraErrorCallback(); 44c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 45c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private final class CameraErrorCallback implements android.hardware.Camera.ErrorCallback { 46c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void onError(int error, android.hardware.Camera camera) { 47c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Assert.fail(String.format("Camera error, code: %d", error)); 48c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 49c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 50c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 51c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private ShutterCallback shutterCallback = new ShutterCallback() { 52c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi @Override 53c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void onShutter() { 54c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.v(TAG, "Shutter"); 55c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 56c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi }; 57c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 58c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private PictureCallback rawCallback = new PictureCallback() { 59c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi @Override 60c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void onPictureTaken(byte[] data, Camera camera) { 61c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.v(TAG, "Raw picture taken"); 62c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 63c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi }; 64c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 65c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private PictureCallback jpegCallback = new PictureCallback() { 66c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi @Override 67c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void onPictureTaken(byte[] data, Camera camera) { 68c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi FileOutputStream fos = null; 69c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 70c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi try { 71c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.v(TAG, "JPEG picture taken"); 72c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi fos = new FileOutputStream(String.format("%s/%s/%s-%d.jpg", 73c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Environment.getExternalStorageDirectory(), CAMERA_STRESS_IMAGES_DIRECTORY, 74c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi CAMERA_STRESS_IMAGES_PREFIX, System.currentTimeMillis())); 75c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi fos.write(data); 76c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } catch (FileNotFoundException e) { 77c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.e(TAG, "File not found: " + e.toString()); 78c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } catch (IOException e) { 79c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.e(TAG, "Error accessing file: " + e.toString()); 80c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } finally { 81c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi try { 82c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi if (fos != null) { 83c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi fos.close(); 84c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 85c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } catch (IOException e) { 86c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.e(TAG, "Error closing file: " + e.toString()); 87c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 88c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 89c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 90c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi }; 91c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 92c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi /** 93c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Helper method for prepping test 94c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi */ 95c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void setupCameraTest() { 96c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi // Create the test images directory if it doesn't exist 97c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi File stressImagesDirectory = new File(String.format("%s/%s", 98c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Environment.getExternalStorageDirectory(), CAMERA_STRESS_IMAGES_DIRECTORY)); 99c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi if (!stressImagesDirectory.exists()) { 100c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi stressImagesDirectory.mkdir(); 101c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 102c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 103c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCamera = Camera.open(CAMERA_ID); 104c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 105c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 106c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi /** 107c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Helper method for getting the available parameters of the default camera 108c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi */ 109c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public Parameters getCameraParameters() { 110c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCamera = Camera.open(CAMERA_ID); 111c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Parameters params = mCamera.getParameters(); 112c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCamera.release(); 113c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi return params; 114c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 115c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 116c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi /** 117c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Helper method for taking a photo 118c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi */ 119c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void capturePhoto() throws Exception { 120c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCamera.takePicture(shutterCallback, rawCallback, jpegCallback); 121c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Thread.sleep(WAIT_GENERIC); 122c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCamera.stopPreview(); 123c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCamera.release(); 124c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 125c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 126c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi /** 127c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Helper method for cleaning up pics taken during tests 128c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi */ 129c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void cleanupTestImages() { 130c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi try { 131c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi File stressImagesDirectory = new File(String.format("%s/%s", 132c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Environment.getExternalStorageDirectory(), CAMERA_STRESS_IMAGES_DIRECTORY)); 133c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi File[] stressImages = stressImagesDirectory.listFiles(); 134c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi for (File f : stressImages) { 135c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi f.delete(); 136c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 137c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } catch (SecurityException e) { 138c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.e(TAG, "Security manager access violation: " + e.toString()); 139c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 140c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 141c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 142c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi /** 143c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Helper method for setting the camera parameters 144c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi */ 145c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void setParameters(Parameters params) { 146c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi try { 147c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCamera.setParameters(params); 148c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } catch (Exception e) { 149c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.e(TAG, "Error setting camera parameters"); 150c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 151c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 152c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 153c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi /** 154c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Helper method for starting up the camera preview 155c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi */ 156c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void startCameraPreview(SurfaceHolder surfaceHolder) throws Exception { 157c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCamera.setErrorCallback(mCameraErrorCallback); 158c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCamera.setPreviewDisplay(surfaceHolder); 159c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCamera.startPreview(); 160c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Thread.sleep(WAIT_GENERIC); 161c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 162c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi} 163c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 164