blob: 16248a2bac40fe63d9275436e43221780f35fb33 [file] [log] [blame]
package com.xtremelabs.robolectric.shadows;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import com.xtremelabs.robolectric.Robolectric;
import com.xtremelabs.robolectric.internal.Implementation;
import com.xtremelabs.robolectric.internal.Implements;
import com.xtremelabs.robolectric.internal.RealObject;
/**
* Shadows the Android {@code Camera} class.
*/
@Implements(Camera.class)
public class ShadowCamera {
private boolean locked;
private boolean previewing;
private boolean released;
private Camera.Parameters parameters;
private Camera.PreviewCallback previewCallback;
private SurfaceHolder surfaceHolder;
private static Map<Integer, Camera.CameraInfo> cameras = new HashMap<Integer,Camera.CameraInfo>();
@RealObject
private Camera realCamera;
public void __constructor__() {
locked = true;
previewing = false;
released = false;
}
@Implementation
public static Camera open() {
return Robolectric.newInstanceOf(Camera.class);
}
@Implementation
public void unlock() {
locked = false;
}
@Implementation
public void reconnect() {
locked = true;
}
@Implementation
public Camera.Parameters getParameters() {
if (null == parameters) {
parameters = Robolectric.newInstanceOf(Camera.Parameters.class);
}
return parameters;
}
@Implementation
public void setParameters(Camera.Parameters params) {
parameters = params;
}
@Implementation
public void setPreviewDisplay(SurfaceHolder holder) {
surfaceHolder = holder;
}
@Implementation
public void startPreview() {
previewing = true;
}
@Implementation
public void stopPreview() {
previewing = false;
}
@Implementation
public void release() {
released = true;
}
@Implementation
public void setPreviewCallback(Camera.PreviewCallback cb) {
previewCallback = cb;
}
@Implementation
public void setOneShotPreviewCallback(Camera.PreviewCallback cb) {
previewCallback = cb;
}
@Implementation
public void setPreviewCallbackWithBuffer(Camera.PreviewCallback cb) {
previewCallback = cb;
}
@Implementation
public static void getCameraInfo(int cameraId, Camera.CameraInfo cameraInfo ) {
Camera.CameraInfo foundCam = cameras.get( cameraId );
cameraInfo.facing = foundCam.facing;
cameraInfo.orientation = foundCam.orientation;
}
@Implementation
public static int getNumberOfCameras() {
return cameras.size();
}
/**
* Allows test cases to invoke the preview callback, to simulate a frame of camera data.
*
* @param data byte buffer of simulated camera data
*/
public void invokePreviewCallback(byte[] data) {
if (previewCallback != null) {
previewCallback.onPreviewFrame(data, realCamera);
}
}
public boolean isLocked() {
return locked;
}
public boolean isPreviewing() {
return previewing;
}
public boolean isReleased() {
return released;
}
public SurfaceHolder getPreviewDisplay() {
return surfaceHolder;
}
/**
* Add a mock {@code Camera.CameraInfo} object to simulate
* the existence of one or more cameras. By default, no
* cameras are defined.
*
* @param id
* @param camInfo
*/
public static void addCameraInfo(int id, Camera.CameraInfo camInfo) {
cameras.put(id, camInfo);
}
public static void clearCameraInfo() {
cameras.clear();
}
}