package com.integreight.onesheeld.shields.controller; import android.Manifest; import android.app.Activity; import android.os.Build; import android.util.Pair; import com.integreight.onesheeld.enums.UIShield; import com.integreight.onesheeld.model.InternetRequest; import com.integreight.onesheeld.model.InternetResponse; import com.integreight.onesheeld.model.InternetUiRequest; import com.integreight.onesheeld.sdk.ShieldFrame; import com.integreight.onesheeld.shields.ControllerParent; import com.integreight.onesheeld.shields.controller.utils.CameraUtils; import com.integreight.onesheeld.shields.controller.utils.InternetManager; import com.loopj.android.http.AsyncHttpResponseHandler; import com.snappydb.SnappydbException; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.File; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Enumeration; /* * author Saad * * Internet shield depends on a major single to class called InternetManager which contains most of the logic, * receiving and sending frames only here * */ public class InternetShield extends ControllerParent<InternetShield> { private static final byte SHIELD_ID = UIShield.INTERNET_SHIELD.getId(); /* * a static final class that caontains sent/received frames related to request frames * */ ///////// private final static class REQUEST { public static final byte NEW_REQUEST = (byte) 0x01; public static final byte SET_URL = (byte) 0x02; public static final byte ADD_HEADER = (byte) 0x03; public static final byte ADD_PARAM = (byte) 0x04; public static final byte DEL_ALL_HEADERS = (byte) 0x05; public static final byte DEL_ALL_PARAMS = (byte) 0x06; public static final byte SET_CONTENT_TYPE = (byte) 0x07; public static final byte IGNORE_RESPONSE = (byte) 0x08; public static final byte ADD_HTTP_ENTITY = (byte) 0x15; public static final byte SET_ENCODING = (byte) 0x16; public static final byte ADD_LAST_IMAGE_AS_PARAM = (byte) 0x18; public static final byte HTTP_ADD_LAST_IMAGE_AS_RAW_ENTITY = (byte) 0x19; ////// SENT FRAMES FUNICTIONS IDs private static final byte ON_SUCCESS = (byte) 0x01; private static final byte ON_FAILURE = (byte) 0x02; private static final byte ON_START = (byte) 0x03; private static final byte ON_PROGRESS = (byte) 0x04; private static final byte ON_FINISH = (byte) 0x05; } private final static class IMAGE_ENCODING { private static final byte MULTIPART = (byte) 0x00; private static final byte BASE64 = (byte) 0x01; } /* * a static final class that caontains sent/received frames related to internet funs. frames * */ //////// INTERNET public final static class INTERNET { public static final byte GET_REQUEST = (byte) 0x09; public static final byte POST_REQUEST = (byte) 0x0A; public static final byte PUT_REQUEST = (byte) 0x0B; public static final byte DELETE_REQUEST = (byte) 0x0C; public static final byte CANCEL_ALL_REQUESTS = (byte) 0x0D; public static final byte SET_BASIC_AUTH = (byte) 0x0E; public static final byte CLEAR_BASIC_AUTH = (byte) 0x0F; public static final byte SET_DEFAULT_MAX_RESPONSE_BYTES_COUNT = (byte) 0x10; //Error public static final byte ON_ERROR = (byte) 0x06; // funID //// Errors types public static final int REQUEST_CAN_NOT_BE_FOUND = 1; public static final int NOT_CONNECTED_TO_NETWORK = 0; public static final int URL_IS_NOT_FOUND = 2; public static final int ALREADY_EXECUTING_REQUEST = 3; public static final int URL_IS_WRONG = 4; } /* * a static final class that caontains sent/received frames related to response frames * */ /////// RESPONSE private final static class RESPONSE { public static final byte DISPOSE = (byte) 0x11; public static final byte GET_NEXT_BYTES = (byte) 0x12; public static final byte GET_HEADER = (byte) 0x13; public static final byte GET_JSON_RESPONSE = (byte) 0x14; public static final byte GET_JSON_ARRAY_LENGTH = (byte) 0x17; ////// SENT FRAMES public static final byte SEND_GET_NEXT_BYTES = (byte) 0x09; public static final byte SEND_GET_HEADER = (byte) 0x07; public static final byte RESPONSE_JSON = (byte) 0x0A; public static final byte RESPONSE_JSON_ARRAY = (byte) 0x0B; /// ERROR public static final byte ON_ERROR = (byte) 0x08; //fun ID public static final byte ON_NOT_ENOUGH_BYTES = (byte) 0x06; //errors type public static final int INDEX_OUT_OF_BOUNDS = 0; public static final int RESPONSE_CAN_NOT_BE_FOUND = 1; public static final int HEADER_CAN_NOT_BE_FOUND = 2; public static final int NO_ENOUGH_BYTES = 3; public static final int REQUEST_HAS_NO_RESPONSE = 4; public static final int SIZE_OF_REQUEST_CAN_NOT_BE_ZERO = 5; public static final int UNSUPPORTED_ENTITY_ENCODING = 6; public static final int JSON_KEYCHAIN_IS_WRONG = 7; } @Override public ControllerParent<InternetShield> init(String tag) { // TODO Auto-generated method stub\ try { InternetManager.getInstance(); // initializing local db for fetched responses if (InternetManager.getInstance().getCachDB() == null || !InternetManager.getInstance().getCachDB().isOpen()) InternetManager.getInstance().init(getApplication()); else { if (!InternetManager.getInstance().getCachDB().isOpen()) { InternetManager.getInstance().close(); InternetManager.resetInstance().init(getApplication()); } } } catch (SnappydbException e) { e.printStackTrace(); } // if (true) // throw new ClassCastException(); return super.init(tag); } public InternetShield(Activity activity, String tag) { super(activity, tag); } public InternetShield() { super(); } public interface CallBack { public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody, int RequestID); public void onFailure(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody, Throwable error, int RequestID); public void onFinish(int requestID); public void onStart(int requestID); } int requestID = 0; @Override public void onNewShieldFrameReceived(ShieldFrame frame) { if (frame.getShieldId() == UIShield.INTERNET_SHIELD.getId()) { switch (frame.getFunctionId()) { case REQUEST.NEW_REQUEST: requestID = frame.getArgumentAsInteger(0); final InternetRequest request = new InternetRequest(); request.setId(requestID); String url = frame.getArgumentAsString(1); request.setUrl(url); request.setCallback(new CallBack() { @Override public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody, int requestID) { ShieldFrame frame1 = new ShieldFrame(SHIELD_ID, REQUEST.ON_SUCCESS); frame1.addArgument(2, requestID);///0=id frame1.addArgument(2, statusCode);// frame1.addArgument(4, responseBody != null ? responseBody.length : 0); InternetResponse response = InternetManager.getInstance().getRequest(requestID).getResponse(); if (response != null) { frame1.addArgument(response.getBytes(0, InternetManager.getInstance().getMaxSentBytes()).getArray()); sendShieldFrame(frame1, true); } } @Override public void onFailure(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody, Throwable error, int requestID) { ShieldFrame frame1 = new ShieldFrame(SHIELD_ID, REQUEST.ON_FAILURE); frame1.addArgument(2, requestID); frame1.addArgument(2, statusCode);// frame1.addArgument(4, responseBody != null ? responseBody.length : 0); InternetResponse response = InternetManager.getInstance().getRequest(requestID).getResponse(); if (response != null) { frame1.addArgument(response.getBytes(0, InternetManager.getInstance().getMaxSentBytes()).getArray()); sendShieldFrame(frame1, true); } } @Override public void onFinish(final int requestID) { ShieldFrame frame1 = new ShieldFrame(SHIELD_ID, REQUEST.ON_FINISH); frame1.addArgument(2, requestID); if (request.getRegisteredCallbacks().contains(InternetRequest.CALLBACK.ON_SUCCESS.name()) || request.getRegisteredCallbacks().contains(InternetRequest.CALLBACK.ON_FAILURE.name())) queueShieldFrame(frame1); else sendShieldFrame(frame1, true); } @Override public void onStart(int requestID) { ShieldFrame frame1 = new ShieldFrame(SHIELD_ID, REQUEST.ON_START); frame1.addArgument(2, requestID); sendShieldFrame(frame1, true); } }); InternetManager.getInstance().putRequest(requestID, request); break; case REQUEST.SET_URL: requestID = frame.getArgumentAsInteger(0); String reqURL = frame.getArgumentAsString(1); if (!reqURL.contains(" ")) { if (InternetManager.getInstance().getRequest(requestID) != null) InternetManager.getInstance().getRequest(requestID).setUrl(reqURL); } else { ShieldFrame frame1 = new ShieldFrame(SHIELD_ID, INTERNET.ON_ERROR); frame1.addArgument(2, requestID); frame1.addArgument(1, INTERNET.URL_IS_WRONG); sendShieldFrame(frame1, true); } break; case REQUEST.ADD_HEADER: requestID = frame.getArgumentAsInteger(0); if (InternetManager.getInstance().getRequest(requestID) != null) InternetManager.getInstance().getRequest(requestID).addHeader(frame.getArgumentAsString(1), frame.getArgumentAsString(2)); break; case REQUEST.ADD_PARAM: requestID = frame.getArgumentAsInteger(0); if (InternetManager.getInstance().getRequest(requestID) != null) InternetManager.getInstance().getRequest(requestID).addParam(frame.getArgumentAsString(1), frame.getArgumentAsString(2)); break; case REQUEST.ADD_LAST_IMAGE_AS_PARAM: requestID = frame.getArgumentAsInteger(0); if (InternetManager.getInstance().getRequest(requestID) != null) { String imgPath = null; byte sourceFolderId = frame.getArgument(2)[0]; if (sourceFolderId == CameraUtils.FROM_ONESHEELD_FOLDER) imgPath = CameraUtils.getLastCapturedImagePathFromOneSheeldFolder(activity,true); else if (sourceFolderId == CameraUtils.FROM_CAMERA_FOLDER) imgPath = CameraUtils.getLastCapturedImagePathFromCameraFolder(activity); if (imgPath != null) { if (frame.getArgument(3)[0] == IMAGE_ENCODING.MULTIPART) InternetManager.getInstance().getRequest(requestID).addFile(frame.getArgumentAsString(1), imgPath); else if (frame.getArgument(3)[0] == IMAGE_ENCODING.BASE64) InternetManager.getInstance().getRequest(requestID).addBase64File(frame.getArgumentAsString(1), new File(imgPath)); } } break; case REQUEST.HTTP_ADD_LAST_IMAGE_AS_RAW_ENTITY: requestID = frame.getArgumentAsInteger(0); if (InternetManager.getInstance().getRequest(requestID) != null) { String imgPath = null; byte sourceFolderId = frame.getArgument(1)[0]; if (sourceFolderId == CameraUtils.FROM_ONESHEELD_FOLDER) imgPath = CameraUtils.getLastCapturedImagePathFromOneSheeldFolder(activity,true); else if (sourceFolderId == CameraUtils.FROM_CAMERA_FOLDER) imgPath = CameraUtils.getLastCapturedImagePathFromCameraFolder(activity); if (imgPath != null) { // InternetManager.getInstance().getRequest(requestID).setContentType("image/jpeg"); // InternetManager.getInstance().getRequest(requestID).addHeader("Content-Length", String.valueOf(new File(imgPath).length())); InternetManager.getInstance().getRequest(requestID).setEntity(null); InternetManager.getInstance().getRequest(requestID).setFileEntity(imgPath); } } break; case REQUEST.DEL_ALL_HEADERS: requestID = frame.getArgumentAsInteger(0); if (InternetManager.getInstance().getRequest(requestID) != null) InternetManager.getInstance().getRequest(requestID).removeAllHeaders(); break; case REQUEST.DEL_ALL_PARAMS: requestID = frame.getArgumentAsInteger(0); if (InternetManager.getInstance().getRequest(requestID) != null) InternetManager.getInstance().getRequest(requestID).removeAllParams(); break; case REQUEST.SET_CONTENT_TYPE: requestID = frame.getArgumentAsInteger(0); if (InternetManager.getInstance().getRequest(requestID) != null) InternetManager.getInstance().getRequest(requestID).setContentType(frame.getArgumentAsString(1)); break; case REQUEST.IGNORE_RESPONSE: requestID = frame.getArgumentAsInteger(0); if (InternetManager.getInstance().getRequest(requestID) != null) InternetManager.getInstance().getRequest(requestID).ignoreResponse(); break; //////// INTERNET case INTERNET.GET_REQUEST: requestID = frame.getArgumentAsInteger(0); InternetManager.EXECUTION_TYPE getExecutionType = null; try { getExecutionType = InternetManager.getInstance().execute(requestID, InternetManager.REQUEST_TYPE.GET, frame.getArgument(1)[0]); //request excutes only in case of success if (getExecutionType != InternetManager.EXECUTION_TYPE.SUCCESSFUL) { ShieldFrame frame1 = new ShieldFrame(SHIELD_ID, INTERNET.ON_ERROR); frame1.addArgument(2, requestID); frame1.addArgument(1, getExecutionType.value); sendShieldFrame(frame1, true); } } catch (UnsupportedEncodingException e) { //dummy catch that only used for requests the accept custom entity ShieldFrame entityError = new ShieldFrame(SHIELD_ID, INTERNET.ON_ERROR); entityError.addArgument(2, requestID); entityError.addArgument(1, RESPONSE.UNSUPPORTED_ENTITY_ENCODING); sendShieldFrame(entityError, true); e.printStackTrace(); } break; case INTERNET.POST_REQUEST: requestID = frame.getArgumentAsInteger(0); try { InternetManager.EXECUTION_TYPE postExecutionType = InternetManager.getInstance().execute(requestID, InternetManager.REQUEST_TYPE.POST, frame.getArgument(1)[0]); if (postExecutionType != InternetManager.EXECUTION_TYPE.SUCCESSFUL) { ShieldFrame frame1 = new ShieldFrame(SHIELD_ID, INTERNET.ON_ERROR); frame1.addArgument(2, requestID); frame1.addArgument(1, postExecutionType.value);///0=id sendShieldFrame(frame1, true); } } catch (UnsupportedEncodingException e) { ShieldFrame entityError = new ShieldFrame(SHIELD_ID, INTERNET.ON_ERROR); entityError.addArgument(2, requestID); entityError.addArgument(1, RESPONSE.UNSUPPORTED_ENTITY_ENCODING); sendShieldFrame(entityError, true); e.printStackTrace(); } break; case INTERNET.PUT_REQUEST: requestID = frame.getArgumentAsInteger(0); try { InternetManager.EXECUTION_TYPE putExecutionType = InternetManager.getInstance().execute(requestID, InternetManager.REQUEST_TYPE.PUT, frame.getArgument(1)[0]); if (putExecutionType != InternetManager.EXECUTION_TYPE.SUCCESSFUL) { ShieldFrame frame1 = new ShieldFrame(SHIELD_ID, INTERNET.ON_ERROR); frame1.addArgument(2, requestID); frame1.addArgument(1, putExecutionType.value);///0=id sendShieldFrame(frame1, true); } } catch (UnsupportedEncodingException e) { ShieldFrame entityError = new ShieldFrame(SHIELD_ID, INTERNET.ON_ERROR); entityError.addArgument(2, requestID); entityError.addArgument(1, 6); sendShieldFrame(entityError, true); e.printStackTrace(); } break; case INTERNET.DELETE_REQUEST: requestID = frame.getArgumentAsInteger(0); try { InternetManager.EXECUTION_TYPE deleteExecutionType = InternetManager.getInstance().execute(requestID, InternetManager.REQUEST_TYPE.DELETE, frame.getArgument(1)[0]); if (deleteExecutionType != InternetManager.EXECUTION_TYPE.SUCCESSFUL) { ShieldFrame frame1 = new ShieldFrame(SHIELD_ID, INTERNET.ON_ERROR); frame1.addArgument(2, requestID); frame1.addArgument(1, deleteExecutionType.value);///0=id sendShieldFrame(frame1, true); } } catch (UnsupportedEncodingException e) { ShieldFrame entityError = new ShieldFrame(SHIELD_ID, INTERNET.ON_ERROR); entityError.addArgument(2, requestID); entityError.addArgument(1, 6); sendShieldFrame(entityError, true); e.printStackTrace(); } break; case INTERNET.CANCEL_ALL_REQUESTS: InternetManager.getInstance().cancelAllRequests(); break; case INTERNET.SET_BASIC_AUTH: InternetManager.getInstance().setBasicAuth(new Pair<>(frame.getArgumentAsString(0), frame.getArgumentAsString(1))); break; case INTERNET.CLEAR_BASIC_AUTH: InternetManager.getInstance().clearBasicAuth(); break; case INTERNET.SET_DEFAULT_MAX_RESPONSE_BYTES_COUNT: InternetManager.getInstance().setMaxSentBytes(frame.getArgumentAsInteger(0)); break; /////// RESPONSE case RESPONSE.DISPOSE:// remove response from database requestID = frame.getArgumentAsInteger(0); InternetManager.getInstance().disponseResponse(requestID); break; case RESPONSE.GET_NEXT_BYTES: // get a byte array for the response from index to another requestID = frame.getArgumentAsInteger(0); if (InternetManager.getInstance().getRequest(requestID) != null) { InternetResponse response = InternetManager.getInstance().getRequest(requestID).getResponse(); if (response != null) { final InternetResponse.ResponseBodyBytes bodyBytes = response.getBytes(frame.getArgumentAsInteger(1), frame.getArgumentAsInteger(2)); if (bodyBytes.getBytes_status() == InternetResponse.RESPONSE_BODY_BYTES.NOT_ENOUGH_BYTES) { if (bodyBytes.getArray() != null && bodyBytes.getArray().length > 0) { ShieldFrame frameSent = new ShieldFrame(SHIELD_ID, RESPONSE.SEND_GET_NEXT_BYTES); frameSent.addArgument(2, requestID); frameSent.addArgument(bodyBytes.getArray()); sendShieldFrame(frameSent, true); ShieldFrame frameSentNotEnough = new ShieldFrame(SHIELD_ID, RESPONSE.ON_ERROR); frameSentNotEnough.addArgument(2, requestID); frameSentNotEnough.addArgument(1, RESPONSE.NO_ENOUGH_BYTES); queueShieldFrame(frameSentNotEnough); } } else if (bodyBytes.getBytes_status() == InternetResponse.RESPONSE_BODY_BYTES.INDEX_GREATER_THAN_LENGTH || bodyBytes.getBytes_status() == InternetResponse.RESPONSE_BODY_BYTES.INDEX_LESS_THAN_0) { ShieldFrame frameSentIndexOut = new ShieldFrame(SHIELD_ID, RESPONSE.ON_ERROR); frameSentIndexOut.addArgument(2, requestID); frameSentIndexOut.addArgument(1, RESPONSE.INDEX_OUT_OF_BOUNDS); sendShieldFrame(frameSentIndexOut, true); } else if (bodyBytes.getBytes_status() == InternetResponse.RESPONSE_BODY_BYTES.COUNT_LESS_THAN_0) { ShieldFrame frameSentcountOut = new ShieldFrame(SHIELD_ID, RESPONSE.ON_ERROR); frameSentcountOut.addArgument(2, requestID); frameSentcountOut.addArgument(1, RESPONSE.SIZE_OF_REQUEST_CAN_NOT_BE_ZERO); sendShieldFrame(frameSentcountOut, true); } else { // successfully getten fully if (bodyBytes.getArray() != null && bodyBytes.getArray().length > 0) { ShieldFrame frameSent = new ShieldFrame(SHIELD_ID, RESPONSE.SEND_GET_NEXT_BYTES); frameSent.addArgument(2, requestID); frameSent.addArgument(bodyBytes.getArray()); sendShieldFrame(frameSent, true); } } } else {//no response ShieldFrame frameSentNotRes = new ShieldFrame(SHIELD_ID, RESPONSE.ON_ERROR); frameSentNotRes.addArgument(2, requestID); frameSentNotRes.addArgument(1, RESPONSE.REQUEST_HAS_NO_RESPONSE); sendShieldFrame(frameSentNotRes, true); } } else// no request { ShieldFrame frameSentNotReq = new ShieldFrame(SHIELD_ID, RESPONSE.ON_ERROR); frameSentNotReq.addArgument(2, requestID); frameSentNotReq.addArgument(1, RESPONSE.RESPONSE_CAN_NOT_BE_FOUND); sendShieldFrame(frameSentNotReq, true); } break; case RESPONSE.GET_HEADER: requestID = frame.getArgumentAsInteger(0); String key = frame.getArgumentAsString(1); ShieldFrame frame2 = new ShieldFrame(SHIELD_ID, RESPONSE.ON_ERROR); frame2.addArgument(2, requestID); if (InternetManager.getInstance().getRequest(requestID) != null) { InternetResponse response = InternetManager.getInstance().getRequest(requestID).getResponse(); if (response != null) { if (response.getHeaders() == null || response.getHeaders().get(key) == null) { frame2.addArgument(1, RESPONSE.HEADER_CAN_NOT_BE_FOUND); sendShieldFrame(frame2, true); } else { ShieldFrame frameSent = new ShieldFrame(SHIELD_ID, RESPONSE.SEND_GET_HEADER); frameSent.addArgument(2, requestID); frameSent.addArgument(key); frameSent.addArgument(response.getHeaders().get(key)); sendShieldFrame(frameSent, true); } } else {//no response frame2.addArgument(1, RESPONSE.REQUEST_HAS_NO_RESPONSE); sendShieldFrame(frame2, true); } } else// no request { frame2.addArgument(1, RESPONSE.RESPONSE_CAN_NOT_BE_FOUND); sendShieldFrame(frame2, true); } break; case RESPONSE.GET_JSON_RESPONSE: requestID = frame.getArgumentAsInteger(0); if (InternetManager.getInstance().getRequest(requestID) != null) { InternetResponse response = InternetManager.getInstance().getRequest(requestID).getResponse(); if (response != null) { final ArrayList<InternetResponse.JsonNode> jsonNodes = response.getNodes(frame); if (jsonNodes.size() > 0) { try { String result = response.getValueOf(jsonNodes.get(0).getDataType() == InternetResponse.JsonNode.NODE_DATA_TYPE.ARRAY ? new JSONArray(new String(response.getResponseBody())) : new JSONObject(new String(response.getResponseBody())), jsonNodes); ShieldFrame frameJsonSent = new ShieldFrame(SHIELD_ID, RESPONSE.RESPONSE_JSON); frameJsonSent.addArgument(2, requestID); frameJsonSent.addArgument(result); frameJsonSent.addArgument(frame.getArgument(1)); for (int arg = 2; arg < frame.getArguments().size(); arg++) { frameJsonSent.addArgument(frame.getArgument(arg)); } sendShieldFrame(frameJsonSent, true); } catch (JSONException e) { ShieldFrame frameJson = new ShieldFrame(SHIELD_ID, RESPONSE.ON_ERROR); frameJson.addArgument(2, requestID); frameJson.addArgument(1, RESPONSE.JSON_KEYCHAIN_IS_WRONG); sendShieldFrame(frameJson, true); } catch (ClassCastException e) { ShieldFrame frameJson = new ShieldFrame(SHIELD_ID, RESPONSE.ON_ERROR); frameJson.addArgument(2, requestID); frameJson.addArgument(1, RESPONSE.JSON_KEYCHAIN_IS_WRONG); sendShieldFrame(frameJson, true); } } else { ShieldFrame frameJson = new ShieldFrame(SHIELD_ID, RESPONSE.ON_ERROR); frameJson.addArgument(2, requestID); frameJson.addArgument(1, RESPONSE.JSON_KEYCHAIN_IS_WRONG); sendShieldFrame(frameJson, true); } } else {//no response ShieldFrame frameJson = new ShieldFrame(SHIELD_ID, RESPONSE.ON_ERROR); frameJson.addArgument(2, requestID); frameJson.addArgument(1, RESPONSE.REQUEST_HAS_NO_RESPONSE); sendShieldFrame(frameJson, true); } } else// no request { ShieldFrame frameJson = new ShieldFrame(SHIELD_ID, RESPONSE.ON_ERROR); frameJson.addArgument(2, requestID); frameJson.addArgument(1, RESPONSE.RESPONSE_CAN_NOT_BE_FOUND); sendShieldFrame(frameJson, true); } break; case RESPONSE.GET_JSON_ARRAY_LENGTH: requestID = frame.getArgumentAsInteger(0); if (InternetManager.getInstance().getRequest(requestID) != null) { InternetResponse response = InternetManager.getInstance().getRequest(requestID).getResponse(); if (response != null) { final ArrayList<InternetResponse.JsonNode> jsonNodes = response.getNodes(frame); if (jsonNodes.size() > 0) { try { int result = response.getJSONArrayLength(jsonNodes.get(0).getDataType() == InternetResponse.JsonNode.NODE_DATA_TYPE.ARRAY ? new JSONArray(new String(response.getResponseBody())) : new JSONObject(new String(response.getResponseBody())), jsonNodes); if (result == -1) { ShieldFrame frameJson = new ShieldFrame(SHIELD_ID, RESPONSE.ON_ERROR); frameJson.addArgument(2, requestID); frameJson.addArgument(1, RESPONSE.JSON_KEYCHAIN_IS_WRONG); sendShieldFrame(frameJson, true); } else { ShieldFrame frameJsonSent = new ShieldFrame(SHIELD_ID, RESPONSE.RESPONSE_JSON_ARRAY); frameJsonSent.addArgument(2, requestID); frameJsonSent.addArgument(4, result); frameJsonSent.addArgument(frame.getArgument(1)); for (int arg = 2; arg < frame.getArguments().size(); arg++) { frameJsonSent.addArgument(frame.getArgument(arg)); } sendShieldFrame(frameJsonSent, true); } } catch (JSONException e) { ShieldFrame frameJson = new ShieldFrame(SHIELD_ID, RESPONSE.ON_ERROR); frameJson.addArgument(2, requestID); frameJson.addArgument(1, RESPONSE.JSON_KEYCHAIN_IS_WRONG); sendShieldFrame(frameJson, true); } catch (ClassCastException e) { ShieldFrame frameJson = new ShieldFrame(SHIELD_ID, RESPONSE.ON_ERROR); frameJson.addArgument(2, requestID); frameJson.addArgument(1, RESPONSE.JSON_KEYCHAIN_IS_WRONG); sendShieldFrame(frameJson, true); } } else { } } else {//no response ShieldFrame frameJson = new ShieldFrame(SHIELD_ID, RESPONSE.ON_ERROR); frameJson.addArgument(2, requestID); frameJson.addArgument(1, RESPONSE.REQUEST_HAS_NO_RESPONSE); sendShieldFrame(frameJson, true); } } else// no request { ShieldFrame frameJson = new ShieldFrame(SHIELD_ID, RESPONSE.ON_ERROR); frameJson.addArgument(2, requestID); frameJson.addArgument(1, RESPONSE.RESPONSE_CAN_NOT_BE_FOUND); sendShieldFrame(frameJson, true); } break; case REQUEST.ADD_HTTP_ENTITY: requestID = frame.getArgumentAsInteger(0); if (InternetManager.getInstance().getRequest(requestID) != null) InternetManager.getInstance().getRequest(requestID).setEntity(frame.getArgumentAsString(1)); break; case REQUEST.SET_ENCODING: requestID = frame.getArgumentAsInteger(0); if (InternetManager.getInstance().getRequest(requestID) != null) InternetManager.getInstance().getRequest(requestID).setEncoding(frame.getArgumentAsString(1)); break; default: break; } if (InternetManager.getInstance().getUiCallback() != null) InternetManager.getInstance().getUiCallback().onStart(); } } @Override public void reset() { try { InternetManager.getInstance().close(); } catch (SnappydbException e) { e.printStackTrace(); } } public void setUiCallback(AsyncHttpResponseHandler callback) { InternetManager.getInstance().setUiCallback(callback); } /* * get a list of request to show in the fragment * */ public ArrayList<InternetUiRequest> getUiRequests() { ArrayList<InternetUiRequest> requestsUI = new ArrayList<>(); Enumeration e = InternetManager.getInstance().getRequests().keys(); while (e.hasMoreElements()) { Integer i = (Integer) e.nextElement(); InternetRequest mainReq = InternetManager.getInstance().getRequest(i); InternetUiRequest req = new InternetUiRequest(); req.setId(mainReq.getId()); req.setUrl(mainReq.getUrl()); req.setContentType(mainReq.getContentType()); req.setParams(mainReq.getParamsAsMap()); req.setFiles(mainReq.getFilesAsMap()); req.setHeaders(mainReq.getHeadersAsMap()); req.setStatus(mainReq.getStatus()); if (mainReq.isCancelled()) req.setCancelled(); ArrayList<Pair<String, String>> children = new ArrayList<>(); children.add(new Pair<>("URL", req.getUrl())); InternetResponse res = mainReq.getResponse(); if (mainReq.getStatus() == InternetRequest.REQUEST_STATUS.EXECUTED && res != null && res.getResponseBody() != null && res.getResponseBody().length > 0) { String response = new String(res.getResponseBody()); children.add(new Pair<>("Response", response != null && response.length() >= 30 ? response.substring(0, 30) + "..." : response)); } children.add(new Pair<>("Content Type", req.getContentType() != null && req.getContentType().trim().length() > 0 ? req.getContentType() : "No Content Type")); if (InternetManager.getInstance().getBasicAuth() != null) children.add(new Pair<>("Authentication", InternetManager.getInstance().getBasicAuth().first + " : " + InternetManager.getInstance().getBasicAuth().second)); else children.add(new Pair<>("Authentication", "No Authentication")); String params = "No Parameters"; if (req.getParams() != null) { params = ""; if (req.getParamsAsMap().size() > 0) { for (String key : req.getParamsAsMap().keySet()) { if (req.getParamsAsMap().get(key).length() > 100) params += key + " : " + req.getParamsAsMap().get(key).substring(0,100) + "\n"; else params += key + " : " + req.getParamsAsMap().get(key) + "\n"; } } if (req.getFilesAsMap().size() > 0) { for (String key : req.getFilesAsMap().keySet()) { params += key + " : " + req.getFilesAsMap().get(key) + "\n"; } } } children.add(new Pair<>("Parameters", params)); String headers = "No Headers"; if (req.getHeaders() != null) { headers = ""; for (cz.msebera.android.httpclient.Header header : req.getHeaders()) { headers += header.getName() + " : " + header.getValue() + "\n"; } } children.add(new Pair<>("Headers", headers)); req.setUiChildren(children); requestsUI.add(req); } return requestsUI; } @Override public ControllerParent<InternetShield> invalidate(SelectionAction selectionAction, boolean isToastable) { this.selectionAction =selectionAction; if(Build.VERSION.SDK_INT >=16) addRequiredPremission(Manifest.permission.READ_EXTERNAL_STORAGE); if (checkForPermissions()) { if (selectionAction != null) selectionAction.onSuccess(); }else { if (selectionAction != null) selectionAction.onFailure(); } return super.invalidate(selectionAction, isToastable); } }