package io.evercam.androidapp.tasks;
import android.os.AsyncTask;
import android.util.Log;
import java.util.ArrayList;
import io.evercam.API;
import io.evercam.Camera;
import io.evercam.EvercamException;
import io.evercam.androidapp.CamerasActivity;
import io.evercam.androidapp.EvercamPlayApplication;
import io.evercam.androidapp.R;
import io.evercam.androidapp.custom.CustomedDialog;
import io.evercam.androidapp.dal.DbCamera;
import io.evercam.androidapp.dto.AppData;
import io.evercam.androidapp.dto.AppUser;
import io.evercam.androidapp.dto.EvercamCamera;
public class LoadCameraListTask extends AsyncTask<Void, Boolean, Boolean>
{
private AppUser user;
private CamerasActivity camerasActivity;
private String TAG = "LoadCameraListTask";
public boolean reload = false;
public LoadCameraListTask(AppUser user, CamerasActivity camerasActivity)
{
this.user = user;
this.camerasActivity = camerasActivity;
}
@Override
protected void onPreExecute()
{
if(user != null)
{
API.setUserKeyPair(user.getApiKey(), user.getApiId());
}
else
{
EvercamPlayApplication.sendCaughtException(camerasActivity,
camerasActivity.getString(R.string.exception_error_empty_user));
CustomedDialog.showUnexpectedErrorDialog(camerasActivity);
cancel(true);
}
}
@Override
protected Boolean doInBackground(Void... params)
{
try
{
boolean updateDB = false;
// Step 1: Load camera list from Evercam
Log.d(TAG, "Step 1: Load camera list from Evercam");
ArrayList<EvercamCamera> databaseCameraList = new DbCamera(camerasActivity
.getApplicationContext()).getCamerasByOwner(user.getUsername(), 500);
ArrayList<Camera> cameras = Camera.getAll(user.getUsername(), true, false);
ArrayList<EvercamCamera> evercamCameras = new ArrayList<>();
for(io.evercam.Camera camera : cameras)
{
EvercamCamera evercamCamera = new EvercamCamera().convertFromEvercam(camera);
evercamCameras.add(evercamCamera);
}
//Publish camera list to UI before deciding to update database or not
AppData.evercamCameraList = evercamCameras;
reload = true;
this.publishProgress(true);
//Simply check total camera number matches or not
if(databaseCameraList.size() != cameras.size())
{
updateDB = true;
}
// Step 2: Check if any new cameras different from local saved
// cameras.
Log.d(TAG, "Step 2: Check if any new cameras different from local saved cameras.");
for(EvercamCamera camera : evercamCameras)
{
if(!databaseCameraList.contains(camera))
{
Log.d(TAG, "new camera detected!" + camera.toString() + "\n");
updateDB = true;
break;
}
else
{
if(!databaseCameraList.get(databaseCameraList.indexOf(camera)).hasThumbnailUrl())
{
Log.d(TAG, "Camera exists but need to update thumbnail URL:" + camera.toString() + "\n");
updateDB = true;
break;
}
}
}
// Step 3: Check if any local camera no longer exists in Evercam
Log.d(TAG, "Step 3: Check if any local camera no longer exists in Evercam");
if(!updateDB)
{
for(EvercamCamera camera : databaseCameraList)
{
if(!evercamCameras.contains(camera))
{
Log.d(TAG, "camera deleted!" + camera.getCameraId());
updateDB = true;
break;
}
}
}
// Step 4: If any different camera, replace all local camera data.
Log.d(TAG, "Step 4: If any different camera, replace all local camera data.");
if(updateDB)
{
Log.d(TAG, "Updating db");
DbCamera dbCamera = new DbCamera(camerasActivity);
dbCamera.deleteCameraByOwner(user.getUsername());
for (EvercamCamera evercamCamera : AppData.evercamCameraList)
{
dbCamera.addCamera(evercamCamera);
}
}
return true;
}
catch(EvercamException e)
{
Log.e(TAG, e.getMessage());
}
return false;
}
@Override
protected void onProgressUpdate(Boolean... canLoad)
{
Log.d(TAG, "Done");
camerasActivity.calculateLoadingTimeAndSend();
CamerasActivity.camerasPerRow = camerasActivity.recalculateCameraPerRow();
if(canLoad[0])
{
if(reload)
{
camerasActivity.removeAllCameraViews();
camerasActivity.addAllCameraViews(true, true);
}
}
else
{
//This should never happen because there is no publishProgress(false)
}
if(camerasActivity.reloadProgressDialog != null)
{
camerasActivity.reloadProgressDialog.dismiss();
}
}
@Override
protected void onPostExecute(Boolean success)
{
//Already handled in onProgressUpdate
}
}