/*******************************************************************************
* Created by Orlando Aliaga
* Copyright 2017 Prey Inc. All rights reserved.
* License: GPLv3
* Full license at "/LICENSE"
******************************************************************************/
package com.prey.net.offline;
import android.content.Context;
import com.prey.PreyConfig;
import com.prey.PreyLogger;
import com.prey.managers.PreyWifiManager;
import com.prey.net.PreyHttpResponse;
import com.prey.net.UtilConnection;
import com.prey.net.http.EntityFile;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class OfflineController {
private static OfflineController instance= null;
private static Object mutex= new Object();
private OfflineController(){
}
public static OfflineController getInstance(){
if(instance==null){
synchronized (mutex){
if(instance==null) instance= new OfflineController();
}
}
return instance;
}
public boolean connect(Context ctx){
boolean connect = false;
int j=0;
do {
connect = (PreyConfig.getPreyConfig(ctx).isConnectionExists()|| PreyWifiManager.getInstance(ctx).isOnline());
PreyLogger.d("______________ OfflineController connect+"+connect+" _____________________");
if (connect) {
break;
} else {
try{Thread.sleep(2000);}catch(Exception e){}
}
j++;
}while(j<10);
return connect;
}
public void run(Context ctx) {
PreyLogger.d("______________ OfflineController run _____________________");
if (connect(ctx)) {
OfflineDatasource datasource = new OfflineDatasource(ctx);
PreyConfig preyConfig=PreyConfig.getPreyConfig(ctx);
List<OfflineDto> list = datasource.getAllOffline();
PreyLogger.d("list size:"+(list==null?-1:list.size()));
for (int i = 0; list != null && i < list.size(); i++) {
OfflineDto dto = list.get(i);
String url=dto.getUrl();
String requestMethod=dto.getRequestMethod();
String contentType=dto.getContentType();
String authorization=dto.getAuthorization();
String status=dto.getStatus();
String files=dto.getFiles();
String parameters=dto.getParameters();
List<EntityFile> entityFiles=null;
String correlationId=dto.getCorrelationId();
PreyLogger.d("[" + i + "]id:"+dto.getOfflineId()+" url:"+url);
PreyLogger.d("[" + i + "]id:"+dto.getOfflineId()+" requestMethod:" + requestMethod);
PreyLogger.d("[" + i + "]id:"+dto.getOfflineId()+" contentType:" + contentType);
PreyLogger.d("[" + i + "]id:"+dto.getOfflineId()+" authorization:" + authorization);
PreyLogger.d("[" + i + "]id:"+dto.getOfflineId()+" status:" + status);
PreyLogger.d("[" + i + "]id:"+dto.getOfflineId()+" correlationId:" + correlationId);
PreyLogger.d("[" + i + "]id:"+dto.getOfflineId()+" parameters:" + parameters);
PreyLogger.d("[" + i + "]id:"+dto.getOfflineId()+" files:" + files);
Map<String, String> params=new HashMap<String, String>();
try{
if(dto.getParameters()!=null) {
PreyLogger.d("[" + i + "]id:"+dto.getOfflineId()+" Parameters:" + dto.getParameters());
Properties props = new Properties();
props.load(new StringReader(dto.getParameters().substring(1, dto.getParameters().length() - 1).replace(", ", "\n")));
for (Map.Entry<Object, Object> e : props.entrySet()) {
String key = (String) e.getKey();
String val = (String) e.getValue();
PreyLogger.d("[" + i + "]id:"+dto.getOfflineId()+" params key:" + key + " val:" + val);
params.put(key, val);
}
}
}catch(Exception e){
}
List<File> listFiles=new ArrayList<File>();
try{
if(dto.getFiles()!=null&&!"".equals(dto.getFiles())) {
entityFiles=new ArrayList<EntityFile>();
String json="{\"files\":"+files+"}";
PreyLogger.d("[" + i + "]json:"+json);
JSONObject jsnobject = new JSONObject(json);
JSONArray jsonArray = jsnobject.getJSONArray("files");
for (int j = 0; j < jsonArray.length(); j++) {
JSONObject jsonFile= (JSONObject)jsonArray.get(j) ;
String idFile=jsonFile.getString("idFile");
PreyLogger.d("idFile:"+idFile );
EntityFile entityFile=new EntityFile();
entityFile.setType(jsonFile.getString("type"));
entityFile.setName(jsonFile.getString("name"));
entityFile.setMimeType(jsonFile.getString("mimeType"));
entityFile.setLength(Integer.parseInt(jsonFile.getString("length")));
File file = new File("/sdcard/prey/file" + idFile+".jpg");
if(file.exists()) {
InputStream fileInputStream = new FileInputStream(file);
entityFile.setFile(fileInputStream);
entityFiles.add(entityFile);
listFiles.add(file);
}
}
}
}catch(Exception e){
}
try{
PreyHttpResponse response=UtilConnection.connection(preyConfig, url, params, requestMethod, contentType, authorization, status,entityFiles, correlationId) ;
if(response!=null){
PreyLogger.i("["+i+"]id:"+dto.getOfflineId()+" StatusCode:"+response.getStatusCode());
if (response.getStatusCode()==200||response.getStatusCode()==201){
datasource.deleteOffline(dto.getOfflineId());
for (File file:listFiles) {
if(file.exists()) {
PreyLogger.i(" delete :"+file.getPath()+" "+file.getName());
file.delete();
}
}
}
}
}catch(Exception e){
}
}
}
}
}