package org.wheelmap.android.tango;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast;
import com.google.atap.tangoservice.TangoException;
import org.wheelmap.android.model.api.MeasurementInfo;
import org.wheelmap.android.online.R;
import org.wheelmap.android.tango.mode.Mode;
import org.wheelmap.android.tango.renderer.TangoRajawaliRenderer;
import org.wheelmap.android.tango.renderer.WheelmapModeRenderer;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
class TangoMeasurePresenter {
private static final int REQUEST_CODE_UPLOAD = 235;
private static final String TAG = TangoMeasurePresenter.class.getSimpleName();
private WheelmapModeRenderer renderer;
private TangoMeasureActivity view;
private Handler mainThreadHandler;
TangoMeasurePresenter(final TangoMeasureActivity view) {
this.view = view;
mainThreadHandler = new Handler(Looper.getMainLooper());
final Mode startMode = Mode.DOOR;
view.setMode(startMode, false);
onModeSelected(startMode);
}
void onFabClicked() {
if (renderer == null) {
return;
}
if (renderer.isReady()) {
onReadyClicked();
} else {
onAddNewPointClicked();
}
}
private void onAddNewPointClicked() {
try {
// Fit a plane on the clicked point using the latest poiont cloud data
// Synchronize against concurrent access to the RGB timestamp in the OpenGL thread
// and a possible service disconnection due to an onPause event.
float[] planeFitTransform;
planeFitTransform = view.doFitPlane(0.5f, 0.5f);
if (planeFitTransform != null) {
Log.d(TAG, "onClickedAt");
// Update the position of the rendered cube to the pose of the detected plane
// This update is made thread safe by the renderer
renderer.onClickedAt(planeFitTransform);
}
} catch (TangoException t) {
Toast.makeText(view.getApplicationContext(),
R.string.failed_measurement,
Toast.LENGTH_SHORT).show();
Log.e(TAG, view.getString(R.string.failed_measurement), t);
t.printStackTrace();
} catch (SecurityException t) {
/*Toast.makeText(getApplicationContext(),
R.string.failed_permissions,
Toast.LENGTH_SHORT).show();
Log.e(TAG, getString(R.string.failed_permissions), t);*/
t.printStackTrace();
}
}
private void onReadyClicked() {
view.captureScreenshot(new TangoRajawaliRenderer.ScreenshotCaptureListener() {
@Override
public void onScreenshotCaptured(Bitmap bitmap) {
try {
File outFile = new File(view.getCacheDir(), System.currentTimeMillis() + ".jpg");
FileOutputStream outputStream = new FileOutputStream(outFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
outputStream.close();
final Uri uri = Uri.fromFile(outFile);
mainThreadHandler.post(new Runnable() {
@Override
public void run() {
TangoMeasureActivity.Args args = view.getArgs();
Mode mode = renderer.getMode();
MeasurementInfo.MetaData metaData = renderer.createMetaData();
MeasurementInfo data = MeasurementInfo.create(mode, "", metaData);
Intent intent = TangoConfirmPictureActivity.newIntent(view, args.wmId(), uri, data);
view.startActivityForResult(intent, REQUEST_CODE_UPLOAD);
view.overridePendingTransition(R.anim.fade_in_medium, 0);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
private void refreshIsReady() {
mainThreadHandler.post(new Runnable() {
@Override
public void run() {
boolean isReady = renderer != null && renderer.isReady();
view.setFabStatus(isReady ? TangoMeasureActivity.FabStatus.READY : TangoMeasureActivity.FabStatus.ADD_NEW);
}
});
}
public void undo() {
renderer.undo();
refreshIsReady();
}
public void clear() {
renderer.clear();
refreshIsReady();
}
public void onModeSelected(Mode mode) {
setRenderer(mode.newRenderer());
}
private void setRenderer(WheelmapModeRenderer renderer) {
if (this.renderer != null) {
this.renderer.setOnStatusChangeListener(null);
}
this.renderer = renderer;
this.renderer.setOnStatusChangeListener(new WheelmapModeRenderer.OnStatusChangeListener() {
@Override
public void onStatusChanged() {
refreshIsReady();
}
});
view.setWheelmapModeRenderer(renderer);
view.setFabStatus(TangoMeasureActivity.FabStatus.ADD_NEW);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "onActivityResult() called with " + "requestCode = [" + requestCode + "], resultCode = [" + resultCode + "], data = [" + data + "]");
if (requestCode == REQUEST_CODE_UPLOAD) {
if (resultCode == Activity.RESULT_OK) {
view.finish();
}
}
}
}