package io.evercam.androidapp.tasks;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Log;
import io.evercam.Camera;
import io.evercam.CameraDetail;
import io.evercam.EvercamException;
import io.evercam.Snapshot;
import io.evercam.androidapp.AddEditCameraActivity;
import io.evercam.androidapp.EvercamPlayApplication;
import io.evercam.androidapp.R;
import io.evercam.androidapp.custom.CustomProgressDialog;
import io.evercam.androidapp.custom.CustomToast;
import io.evercam.androidapp.custom.CustomedDialog;
import io.evercam.androidapp.dal.DbCamera;
import io.evercam.androidapp.dto.AppData;
import io.evercam.androidapp.dto.CameraStatus;
import io.evercam.androidapp.dto.EvercamCamera;
import io.evercam.androidapp.feedback.KeenHelper;
import io.evercam.androidapp.feedback.NewCameraFeedbackItem;
import io.evercam.androidapp.utils.Constants;
import io.evercam.androidapp.video.VideoActivity;
public class AddCameraTask extends AsyncTask<Void, Boolean, EvercamCamera>
{
private final String TAG = "AddCameraTask";
private CameraDetail cameraDetail;
private AddEditCameraActivity activity;
private CustomProgressDialog customProgressDialog;
private String errorMessage = null;
private boolean isReachableExternally = false;
private Boolean readyToCreateCamera = null;
private boolean isFromScan;
public AddCameraTask(CameraDetail cameraDetail, AddEditCameraActivity activity, boolean isFromScan)
{
this.cameraDetail = cameraDetail;
this.activity = activity;
this.isFromScan = isFromScan;
}
@Override
protected void onPreExecute()
{
customProgressDialog = new CustomProgressDialog(activity);
customProgressDialog.show(activity.getString(R.string.testing_snapshot));
}
@Override
protected void onPostExecute(EvercamCamera evercamCamera)
{
customProgressDialog.dismiss();
if(evercamCamera != null)
{
NewCameraFeedbackItem newCameraItem = new NewCameraFeedbackItem(activity,
AppData.defaultUser.getUsername(), cameraDetail.getId());
if(isFromScan)
{
EvercamPlayApplication.sendEventAnalytics(activity, R.string.category_add_camera,
R.string.action_addcamera_success_scan,
R.string.label_addcamera_successful_scan);
newCameraItem.setIsFromDiscovery(true);
}
else
{
EvercamPlayApplication.sendEventAnalytics(activity, R.string.category_add_camera,
R.string.action_addcamera_success_manual, R.string.label_addcamera_successful_manual);
}
activity.getMixpanel().sendEvent(R.string.mixpanel_event_create_camera, null);
newCameraItem.sendToKeenIo(KeenHelper.getClient(activity));
CustomToast.showInBottom(activity, R.string.create_success);
/**
* Successfully added a camera, so refresh camera list.
*/
Intent returnIntent = new Intent();
activity.setResult(Constants.RESULT_TRUE, returnIntent);
// activity.finish();
/**
* Successfully added camera, show camera live view and finish add
* camera activity
*/
VideoActivity.startPlayingVideoForCamera(activity, evercamCamera.getCameraId());
activity.finish();
}
else
{
if(errorMessage != null)
{
CustomToast.showInCenterLong(activity, errorMessage);
}
}
}
@Override
protected EvercamCamera doInBackground(Void... params)
{
// Check camera is reachable or not by request for snapshot
// If either internal or external url return a snapshot, create the
// camera
// If neither of the urls return a snapshot, warn the user.
isReachableExternally = isSnapshotReachableExternally();
if(isReachableExternally)
{
publishProgress(true);
}
else
{
publishProgress(false);
}
while(readyToCreateCamera == null)
{
try
{
Thread.sleep(500);
}
catch(InterruptedException e)
{
Log.e(TAG, e.toString());
}
}
if(readyToCreateCamera)
{
return createCamera(cameraDetail);
}
else if(!readyToCreateCamera)
{
Log.d(TAG, "Not ready to create camera");
}
return null;
}
@Override
protected void onProgressUpdate(Boolean... values)
{
boolean isSnapshotReceived = values[0];
if(isSnapshotReceived)
{
customProgressDialog.setMessage(activity.getString(R.string.creating_camera));
readyToCreateCamera = true;
}
else
{
if(!activity.isFinishing())
{
CustomedDialog.getConfirmCreateDialog(activity,
new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
customProgressDialog.setMessage(activity.getString(R.string.creating_camera));
readyToCreateCamera = true;
return;
}
}, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
readyToCreateCamera = false;
customProgressDialog.dismiss();
return;
}
}).show();
}
}
}
private boolean isSnapshotReachableExternally()
{
String externalHost = cameraDetail.getExternalHost();
final String username = cameraDetail.getCameraUsername();
final String password = cameraDetail.getCameraPassword();
String jpgUrlString = cameraDetail.getJpgUrl();
final String jpgUrl = AddEditCameraActivity.buildJpgUrlWithSlash(jpgUrlString);
if(externalHost != null && !externalHost.isEmpty())
{
String portString = String.valueOf(cameraDetail.getExternalHttpPort());
String externalUrl = buildHttpUrl(externalHost, portString);
try
{
Snapshot snapshot = Camera.testSnapshot(externalUrl, jpgUrl, username, password);
byte[] snapshotData = snapshot.getData();
Bitmap bitmap = BitmapFactory.decodeByteArray(snapshotData, 0, snapshotData.length);
if(bitmap != null)
{
// Save this image.
new Thread(new SaveImageRunnable(activity, bitmap,
cameraDetail.getId())).start();
return true;
}
}
catch(Exception e)
{
Log.e(TAG, e.toString());
}
}
return false;
}
private String buildHttpUrl(String host, String portString)
{
if(portString == null || portString.isEmpty() || portString.equals("0"))
{
portString = "80";
}
return activity.getString(R.string.prefix_http) + host + ":" + portString;
}
private EvercamCamera createCamera(CameraDetail detail)
{
try
{
Camera camera = Camera.create(detail);
// Camera camera = Camera.getById(detail.getId(), false);
EvercamCamera evercamCamera = new EvercamCamera().convertFromEvercam(camera);
if(isReachableExternally)
{
evercamCamera.setStatus(CameraStatus.ACTIVE);
}
DbCamera dbCamera = new DbCamera(activity);
dbCamera.addCamera(evercamCamera);
AppData.evercamCameraList.add(evercamCamera);
return evercamCamera;
}
catch(EvercamException e)
{
errorMessage = e.getMessage();
Log.e(TAG, "add camera to evercam: " + e.getMessage());
return null;
}
}
}