1 package com.xtremelabs.robolectric.shadows; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.List; 6 import java.util.Map; 7 8 import android.hardware.Camera; 9 import android.view.SurfaceHolder; 10 import com.xtremelabs.robolectric.Robolectric; 11 import com.xtremelabs.robolectric.internal.Implementation; 12 import com.xtremelabs.robolectric.internal.Implements; 13 import com.xtremelabs.robolectric.internal.RealObject; 14 15 /** 16 * Shadows the Android {@code Camera} class. 17 */ 18 @Implements(Camera.class) 19 public class ShadowCamera { 20 21 private boolean locked; 22 private boolean previewing; 23 private boolean released; 24 private Camera.Parameters parameters; 25 private Camera.PreviewCallback previewCallback; 26 private SurfaceHolder surfaceHolder; 27 28 private static Map<Integer, Camera.CameraInfo> cameras = new HashMap<Integer,Camera.CameraInfo>(); 29 30 @RealObject 31 private Camera realCamera; 32 __constructor__()33 public void __constructor__() { 34 locked = true; 35 previewing = false; 36 released = false; 37 } 38 39 @Implementation open()40 public static Camera open() { 41 return Robolectric.newInstanceOf(Camera.class); 42 } 43 44 @Implementation unlock()45 public void unlock() { 46 locked = false; 47 } 48 49 @Implementation reconnect()50 public void reconnect() { 51 locked = true; 52 } 53 54 @Implementation getParameters()55 public Camera.Parameters getParameters() { 56 if (null == parameters) { 57 parameters = Robolectric.newInstanceOf(Camera.Parameters.class); 58 } 59 return parameters; 60 } 61 62 @Implementation setParameters(Camera.Parameters params)63 public void setParameters(Camera.Parameters params) { 64 parameters = params; 65 } 66 67 @Implementation setPreviewDisplay(SurfaceHolder holder)68 public void setPreviewDisplay(SurfaceHolder holder) { 69 surfaceHolder = holder; 70 } 71 72 @Implementation startPreview()73 public void startPreview() { 74 previewing = true; 75 } 76 77 @Implementation stopPreview()78 public void stopPreview() { 79 previewing = false; 80 } 81 82 @Implementation release()83 public void release() { 84 released = true; 85 } 86 87 @Implementation setPreviewCallback(Camera.PreviewCallback cb)88 public void setPreviewCallback(Camera.PreviewCallback cb) { 89 previewCallback = cb; 90 } 91 92 @Implementation setOneShotPreviewCallback(Camera.PreviewCallback cb)93 public void setOneShotPreviewCallback(Camera.PreviewCallback cb) { 94 previewCallback = cb; 95 } 96 97 @Implementation setPreviewCallbackWithBuffer(Camera.PreviewCallback cb)98 public void setPreviewCallbackWithBuffer(Camera.PreviewCallback cb) { 99 previewCallback = cb; 100 } 101 102 @Implementation getCameraInfo(int cameraId, Camera.CameraInfo cameraInfo )103 public static void getCameraInfo(int cameraId, Camera.CameraInfo cameraInfo ) { 104 Camera.CameraInfo foundCam = cameras.get( cameraId ); 105 cameraInfo.facing = foundCam.facing; 106 cameraInfo.orientation = foundCam.orientation; 107 } 108 109 @Implementation getNumberOfCameras()110 public static int getNumberOfCameras() { 111 return cameras.size(); 112 } 113 114 /** 115 * Allows test cases to invoke the preview callback, to simulate a frame of camera data. 116 * 117 * @param data byte buffer of simulated camera data 118 */ invokePreviewCallback(byte[] data)119 public void invokePreviewCallback(byte[] data) { 120 if (previewCallback != null) { 121 previewCallback.onPreviewFrame(data, realCamera); 122 } 123 } 124 isLocked()125 public boolean isLocked() { 126 return locked; 127 } 128 isPreviewing()129 public boolean isPreviewing() { 130 return previewing; 131 } 132 isReleased()133 public boolean isReleased() { 134 return released; 135 } 136 getPreviewDisplay()137 public SurfaceHolder getPreviewDisplay() { 138 return surfaceHolder; 139 } 140 141 /** 142 * Add a mock {@code Camera.CameraInfo} object to simulate 143 * the existence of one or more cameras. By default, no 144 * cameras are defined. 145 * 146 * @param id 147 * @param camInfo 148 */ addCameraInfo(int id, Camera.CameraInfo camInfo)149 public static void addCameraInfo(int id, Camera.CameraInfo camInfo) { 150 cameras.put(id, camInfo); 151 } 152 clearCameraInfo()153 public static void clearCameraInfo() { 154 cameras.clear(); 155 } 156 157 } 158