package org.deviceconnect.android.deviceplugin.theta.core;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThetaDeviceClient {
private final ThetaDeviceManager mDeviceMgr;
private final ExecutorService mExecutor = Executors.newSingleThreadExecutor();
public ThetaDeviceClient(final ThetaDeviceManager deviceMgr) {
mDeviceMgr = deviceMgr;
}
public boolean hasDevice(final String id) {
return mDeviceMgr.getConnectedDeviceById(id) != null;
}
public void fetchAllObjectList(final String id, final ResponseListener listener) {
mExecutor.execute(new Runnable() {
@Override
public void run() {
try {
ThetaDevice device = getConnectedDevice(id);
listener.onObjectList(device.fetchAllObjectList());
} catch (ThetaDeviceException e) {
listener.onFailed(e);
}
}
});
}
public void takePicture(final String deviceId, final String target,
final ResponseListener listener) {
mExecutor.execute(new Runnable() {
@Override
public void run() {
try {
ThetaDevice device = getConnectedDevice(deviceId);
ThetaDevice.Recorder recorder = device.getRecorder();
if (recorder == null) {
throw new ThetaDeviceException(ThetaDeviceException.NOT_FOUND_RECORDER, "THETA has no recorder");
}
if (target != null && !recorder.getId().equals(target)) {
throw new ThetaDeviceException(ThetaDeviceException.NOT_FOUND_RECORDER, "Invalid recorder ID.");
}
if (!recorder.supportsPhoto()) {
throw new ThetaDeviceException(ThetaDeviceException.NOT_SUPPORTED_FEATURE,
recorder.getName() + " does not support to take a photo.");
}
ThetaObject obj = device.takePicture();
listener.onTakenPicture(obj);
} catch (ThetaDeviceException e) {
listener.onFailed(e);
}
}
});
}
public void startVideoRecording(final String id, final String target, final ResponseListener listener) {
mExecutor.execute(new Runnable() {
@Override
public void run() {
try {
ThetaDevice device = getConnectedDevice(id);
ThetaDevice.Recorder recorder = device.getRecorder();
if (recorder == null) {
throw new ThetaDeviceException(ThetaDeviceException.NOT_FOUND_RECORDER, "THETA has no recorder");
}
if (target != null && !recorder.getId().equals(target)) {
throw new ThetaDeviceException(ThetaDeviceException.NOT_FOUND_RECORDER, "Invalid recorder ID.");
}
if (!recorder.supportsVideoRecording()) {
throw new ThetaDeviceException(ThetaDeviceException.NOT_SUPPORTED_FEATURE,
recorder.getName() + " does not support video recording.");
}
ThetaDevice.RecorderState state = recorder.getState();
boolean hadStarted = false;
switch (state) {
case INACTIVE:
device.startVideoRecording();
break;
case RECORDING:
hadStarted = true;
break;
default:
break;
}
listener.onStartedVideoRecording(recorder, hadStarted);
} catch (ThetaDeviceException e) {
listener.onFailed(e);
}
}
});
}
public void stopVideoRecording(final String id, final String target, final ResponseListener listener) {
mExecutor.execute(new Runnable() {
@Override
public void run() {
try {
ThetaDevice device = getConnectedDevice(id);
ThetaDevice.Recorder recorder = device.getRecorder();
if (recorder == null) {
throw new ThetaDeviceException(ThetaDeviceException.NOT_FOUND_RECORDER, "THETA has no recorder");
}
if (target != null && !recorder.getId().equals(target)) {
throw new ThetaDeviceException(ThetaDeviceException.NOT_FOUND_RECORDER, "Invalid recorder ID.");
}
if (!recorder.supportsVideoRecording()) {
throw new ThetaDeviceException(ThetaDeviceException.NOT_SUPPORTED_FEATURE,
recorder.getName() + " does not support video recording.");
}
ThetaDevice.RecorderState state = recorder.getState();
boolean hadStopped = false;
switch (state) {
case INACTIVE:
hadStopped = true;
break;
case RECORDING:
device.stopVideoRecording();
break;
default:
break;
}
listener.onStoppedVideoRecording(recorder, hadStopped);
} catch (ThetaDeviceException e) {
listener.onFailed(e);
}
}
});
}
public void getBatteryLevel(final String id, final ResponseListener listener) {
mExecutor.execute(new Runnable() {
@Override
public void run() {
try {
ThetaDevice device = getConnectedDevice(id);
listener.onBatteryLevel(device.getBatteryLevel());
} catch (ThetaDeviceException e) {
listener.onFailed(e);
}
}
});
}
public void getShootingMode(final String id, final ResponseListener listener) {
mExecutor.execute(new Runnable() {
@Override
public void run() {
try {
ThetaDevice device = getConnectedDevice(id);
listener.onShootingMode(device.getShootingMode());
} catch (ThetaDeviceException e) {
listener.onFailed(e);
}
}
});
}
public void changeShootingMode(final String id, final ThetaDevice.ShootingMode mode,
final ResponseListener listener) {
mExecutor.execute(new Runnable() {
@Override
public void run() {
try {
ThetaDevice device = getConnectedDevice(id);
device.changeShootingMode(mode);
listener.onShootingModeChanged();
} catch (ThetaDeviceException e) {
listener.onFailed(e);
}
}
});
}
public void fetchRecorder(final String id, final ResponseListener listener) {
mExecutor.execute(new Runnable() {
@Override
public void run() {
try {
ThetaDevice device = getConnectedDevice(id);
listener.onRecorder(device.getRecorder());
} catch (ThetaDeviceException e) {
listener.onFailed(e);
}
}
});
}
public void fetchObject(final String id, final String fileName,
final ResponseListener listener) {
mExecutor.execute(new Runnable() {
@Override
public void run() {
try {
ThetaDevice device = getConnectedDevice(id);
List<ThetaObject> list = device.fetchAllObjectList();
for (ThetaObject obj : list) {
if (obj.getFileName().equals(fileName)) {
obj.fetch(ThetaObject.DataType.MAIN);
byte[] data = obj.getMainData();
obj.clear(ThetaObject.DataType.MAIN);
listener.onObjectFetched(data, obj.getMimeType());
return;
}
}
throw new ThetaDeviceException(ThetaDeviceException.NOT_FOUND_OBJECT);
} catch (ThetaDeviceException e) {
listener.onFailed(e);
}
}
});
}
public void removeObject(final String id, final String fileName,
final ResponseListener listener) {
mExecutor.execute(new Runnable() {
@Override
public void run() {
try {
ThetaDevice device = getConnectedDevice(id);
List<ThetaObject> list = device.fetchAllObjectList();
for (ThetaObject obj : list) {
if (obj.getFileName().equals(fileName)) {
obj.remove();
listener.onObjectRemoved();
return;
}
}
throw new ThetaDeviceException(ThetaDeviceException.NOT_FOUND_OBJECT);
} catch (ThetaDeviceException e) {
listener.onFailed(e);
}
}
});
}
public ThetaDevice getConnectedDevice(final String id) throws ThetaDeviceException {
ThetaDevice device = mDeviceMgr.getConnectedDeviceById(id);
if (device == null) {
throw new ThetaDeviceException(ThetaDeviceException.NOT_FOUND_THETA);
}
return device;
}
public ThetaDevice getCurrentConnectDevice() {
return mDeviceMgr.getConnectedDevice();
}
public void execute(final Runnable r) {
mExecutor.execute(r);
}
public interface ResponseListener {
void onModel(ThetaDeviceModel model);
void onObjectList(List<ThetaObject> list);
void onTakenPicture(ThetaObject picture);
void onStartedVideoRecording(ThetaDevice.Recorder recorder, boolean hadStarted);
void onStoppedVideoRecording(ThetaDevice.Recorder recorder, boolean hadStopped);
void onBatteryLevel(double level);
void onRecorder(ThetaDevice.Recorder recorder);
void onShootingMode(ThetaDevice.ShootingMode mode);
void onShootingModeChanged();
void onObjectFetched(byte[] data, String mimeType);
void onObjectRemoved();
void onLivePreview(LiveCamera camera);
void onFailed(ThetaDeviceException cause);
}
public static class DefaultListener implements ResponseListener {
@Override
public void onModel(final ThetaDeviceModel model) {
}
@Override
public void onObjectList(final List<ThetaObject> list) {
}
@Override
public void onTakenPicture(final ThetaObject picture) {
}
@Override
public void onStartedVideoRecording(final ThetaDevice.Recorder recorder, final boolean hadStarted) {
}
@Override
public void onStoppedVideoRecording(final ThetaDevice.Recorder recorder, final boolean hadStopped) {
}
@Override
public void onBatteryLevel(final double level) {
}
@Override
public void onRecorder(final ThetaDevice.Recorder recorder) {
}
@Override
public void onShootingMode(final ThetaDevice.ShootingMode mode) {
}
@Override
public void onShootingModeChanged() {
}
@Override
public void onObjectFetched(final byte[] data, final String mimeType) {
}
@Override
public void onObjectRemoved() {
}
@Override
public void onLivePreview(final LiveCamera camera) {
}
@Override
public void onFailed(final ThetaDeviceException cause) {
}
}
}