package com.thibaudperso.sonycamera.sdk;
import android.content.Context;
import android.util.Log;
import com.thibaudperso.sonycamera.sdk.core.CameraWS;
import com.thibaudperso.sonycamera.sdk.core.CameraWSListener;
import com.thibaudperso.sonycamera.timelapse.control.io.TestConnectionListener;
import com.thibaudperso.sonycamera.sdk.model.Device;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
* @author Thibaud Michel
*
*/
public class CameraAPI {
public enum ZoomDirection { IN, OUT }
public enum ZoomAction { START, STOP }
public enum ResponseCode {
NONE(-1), //means no code available
OK(0),
LONG_SHOOTING(40403),
NOT_AVAILABLE_NOW(1);
private int value;
ResponseCode(int value){ this.value = value; }
public int getValue(){ return value; }
public static ResponseCode find(int value){
for(ResponseCode el : ResponseCode.values())
if(el.getValue() == value)
return el;
return NONE; //if not an appropriate found
}
}
public static int MIN_TIME_BETWEEN_CAPTURE = 1;
private CameraWS mCameraWS;
private boolean isDeviceInitialized = false;
public CameraAPI(Context context) {
mCameraWS = new CameraWS(context);
}
public void setDevice(Device device) {
mCameraWS.setWSUrl(device.getWebService());
isDeviceInitialized = false;
}
public void initialize() {
if(isDeviceInitialized) {
return;
}
initWebService(null);
setShootMode("still");
isDeviceInitialized = true;
}
/**
* Sets the shoot mode, "still" or "movie". This needs to be set to "still"
* on some camcorders, because they default to video.
*
* @param mode either "still" or "movie".
*/
public void setShootMode(String mode) {
JSONArray params = new JSONArray().put(mode);
mCameraWS.sendRequest("setShootMode", params, null);
}
public void takePicture(final TakePictureListener listener) {
mCameraWS.sendRequest("actTakePicture", new JSONArray(), getTakePictureListener(listener));
}
public void awaitTakePicture(final TakePictureListener listener) {
mCameraWS.sendRequest("awaitTakePicture", new JSONArray(), getTakePictureListener(listener));
}
private CameraWSListener getTakePictureListener(final TakePictureListener listener){
return new CameraWSListener() {
@Override
public void cameraResponse(JSONArray jsonResponse) {
if(listener == null) {
return;
}
String url;
try {
url = jsonResponse.getJSONArray(0).getString(0);
listener.onResult(url);
} catch (Exception e) {
listener.onError(ResponseCode.NONE, e.getMessage());
}
}
@Override
public void cameraError(JSONObject jsonResponse) {
if(listener != null) {
if(jsonResponse == null) {
listener.onError(ResponseCode.NONE, "json response is null");
return;
}
int responseCode = -1;
String responseMsg = null;
// whole JSON is of format {"id":38,"error":[1,"Not Available Now"]}
try {
if(jsonResponse.has("error")){
JSONArray arr = jsonResponse.getJSONArray("error");
responseCode = arr.getInt(0);
responseMsg = arr.getString(1);
}
listener.onError(ResponseCode.find(responseCode),responseMsg);
} catch (JSONException err){
listener.onError(ResponseCode.NONE, err.toString());
}
}
}
};
}
public void initWebService(final InitWebServiceListener listener) {
mCameraWS.sendRequest("startRecMode", new JSONArray(), new CameraWSListener() {
@Override
public void cameraResponse(JSONArray jsonResponse) {
if(listener == null) {
return;
}
listener.onResult();
}
@Override
public void cameraError(JSONObject jsonResponse) {
if(listener == null) {
return;
}
listener.onError("Error");
}
});
}
public void getVersion(final GetVersionListener listener) {
mCameraWS.sendRequest("getVersions", new JSONArray(), new CameraWSListener() {
@Override
public void cameraResponse(JSONArray jsonResponse) {
if(listener == null) {
return;
}
int version;
try {
version = jsonResponse.getJSONArray(0).getInt(0);
listener.onResult(version);
} catch (Exception e) {
listener.onError(e.getMessage());
}
}
@Override
public void cameraError(JSONObject jsonResponse) {
if(listener == null) {
return;
}
listener.onError("Error");
}
});
}
public void testConnection(final TestConnectionListener listener) {
this.getVersion(new GetVersionListener() {
@Override
public void onResult(int version) {
listener.isConnected(true);
}
@Override
public void onError(String error) {
listener.isConnected(false);
}
});
}
public void closeConnection() {
mCameraWS.sendRequest("stopRecMode", new JSONArray(), new CameraWSListener() {
@Override
public void cameraResponse(JSONArray jsonResponse) {
Log.w("DEBUG","success closing connection.");
}
@Override
public void cameraError(JSONObject jsonResponse) {
Log.w("DEBUG","error closing connection.");
}
}, 200);
}
public void startLiveView(final StartLiveviewListener listener) {
mCameraWS.sendRequest("startLiveview", new JSONArray(), new CameraWSListener() {
@Override
public void cameraResponse(JSONArray jsonResponse) {
if(listener == null) {
return;
}
try {
listener.onResult(jsonResponse.getString(0));
} catch (Exception e) {
listener.onError(e.getMessage());
}
}
@Override
public void cameraError(JSONObject jsonResponse) {
if(listener == null) {
return;
}
listener.onError("Error");
}
});
}
public void stopLiveView() {
mCameraWS.sendRequest("stopLiveview", new JSONArray(), null);
}
public void actZoom(final ZoomDirection zoomDir) {
JSONArray params = new JSONArray().put(zoomDir == ZoomDirection.IN ? "in" : "out").put("1shot");
mCameraWS.sendRequest("actZoom", params, null);
}
public void actZoom(final ZoomDirection zoomDir, final ZoomAction zoomAct) {
JSONArray params = new JSONArray().put(zoomDir == ZoomDirection.IN ? "in" : "out").
put(zoomAct == ZoomAction.START ? "start" : "stop");
mCameraWS.sendRequest("actZoom", params, null);
}
public void setFlash(final boolean enableFlash) {
// TODO can be "auto" also
JSONArray params = new JSONArray().put(enableFlash ? "on" : "off");
mCameraWS.sendRequest("setFlashMode", params, new CameraWSListener() {
@Override
public void cameraResponse(JSONArray jsonResponse) {
Log.v("DEBUG", "ok: "+jsonResponse);
}
@Override
public void cameraError(JSONObject jsonResponse) {
Log.v("DEBUG", "err: "+jsonResponse);
}
});
}
}