package com.V4Creations.vtulife.controller.server; import java.util.ArrayList; import java.util.Locale; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.content.Context; import com.V4Creations.vtulife.R; import com.V4Creations.vtulife.model.ResultItem; import com.V4Creations.vtulife.model.interfaces.ResultLoadedInterface; import com.V4Creations.vtulife.util.VTULifeRestClient; import com.V4Creations.vtulife.util.system.SystemFeatureChecker; import com.loopj.android.http.JsonHttpResponseHandler; public class ResultLoaderManager extends JsonHttpResponseHandler { public static final String RESULT_FROM_VTU = "/result/result_json.php"; public static final String PARAM_USN = "usn", PARAM_RESULT_TYPE = "resultType"; public static final String KEY_NAME = "name", KEY_USN = "usn", KEY_SEMESTER = "semesters", KEY_RESULT = "result", KEY_PERCENTAGE = "percentage", KEY_TOTAL = "total", KEY_MARK = "mark", KEY_MESSAGE = "message"; public static final int SINGLE_SEM = 0, MULTY_SEM = 1; public static final int REVAVL_RESULT = 1; public static final int REGULAR_RESULT = 0; private Context context; private String mUsn; private int mResultType = REGULAR_RESULT, mResultMode = MULTY_SEM; private ResultLoadedInterface mResultLoadedInterface; private boolean isCancelled = false, isLoading = false; public ResultLoaderManager(Context context, ResultLoadedInterface resultLoadedInterface, String usn, boolean resultType, int resultMode) { this.context = context; mResultLoadedInterface = resultLoadedInterface; isLoading = true; mResultType = getResultType(resultType); mUsn = usn.toUpperCase(Locale.getDefault()); mResultMode = resultMode; getResult(); } private void getResult() { if (SystemFeatureChecker.isInternetConnection(context)) { mResultLoadedInterface.onStartLoading(); VTULifeRestClient.getResult(mUsn, mResultType, this); } else onFailure( 405, new Throwable(context .getString(R.string.internet_not_available)), new JSONObject()); } private int getResultType(boolean resultType) { return resultType ? REVAVL_RESULT : REGULAR_RESULT; } @Override public void onSuccess(JSONObject response) { if (isCancelled) return; mResultLoadedInterface.onLoadingSuccess(parseJson(response), mUsn); cancel(); } @Override public void onFailure(int statusCode, Throwable e, JSONObject errorResponse) { if (isCancelled) return; String message = context.getString(R.string.default_connection_error); try { if (statusCode == 405 || statusCode == 401 || statusCode == 403) message = errorResponse.getString(VTULifeRestClient.KEY_ERROR); } catch (JSONException e1) { } mResultLoadedInterface.onLoadingFailure(message, e.getMessage() + "", statusCode, mUsn); cancel(); } private ArrayList<ResultItem> parseJson(JSONObject jsonObject) { ArrayList<ResultItem> resultItems = new ArrayList<ResultItem>(); try { resultItems.add(getStudentDetails(jsonObject)); resultItems.add(getResultDetails(jsonObject)); JSONArray semesterJsonArray = jsonObject.getJSONArray(KEY_SEMESTER); JSONArray markTable = jsonObject.getJSONArray(KEY_MARK); for (int i = 0; mResultMode == SINGLE_SEM ? i < 1 : i < semesterJsonArray.length(); i++) { resultItems.add(getSemester(semesterJsonArray, i)); if (i != 0) resultItems.add(getSingleResult(jsonObject, i)); for (int j = 0; j < markTable.getJSONArray(i).length(); j++) resultItems.add(getSubject(markTable.getJSONArray(i) .getJSONArray(j))); } } catch (JSONException e) { } return resultItems; } private ResultItem getSubject(JSONArray subjectJsonArray) throws JSONException { ResultItem resultItem = new ResultItem(context); resultItem.setSubjectName(subjectJsonArray.getString(0)); if (mResultType == REGULAR_RESULT) { resultItem.setType(ResultItem.TYPE_SUBJECT_RESULT); resultItem.setExternal(subjectJsonArray.getInt(1)); resultItem.setInternal(subjectJsonArray.getInt(2)); resultItem.setSubjectTotal(subjectJsonArray.getInt(3)); resultItem.setSubjectResult(subjectJsonArray.getString(4)); } else { resultItem.setType(ResultItem.TYPE_SUBJECT_REVAL_RESULT); resultItem.setExternal(subjectJsonArray.getInt(1)); resultItem.setFinalMark(subjectJsonArray.getInt(2)); resultItem.setInternal(subjectJsonArray.getInt(3)); resultItem.setSubjectTotal(subjectJsonArray.getInt(4)); resultItem.setSubjectResult(subjectJsonArray.getString(5)); } return resultItem; } private ResultItem getSingleResult(JSONObject jsonObject, int index) throws JSONException { ResultItem resultItem = new ResultItem(context); resultItem.setType(ResultItem.TYPE_RESULT_SINGLE); resultItem.setResult(getResult(jsonObject.getJSONArray(KEY_RESULT) .getString(index))); return resultItem; } private ResultItem getSemester(JSONArray semesterJsonArray, int index) throws JSONException { ResultItem resultItem = new ResultItem(context); resultItem.setType(ResultItem.TYPE_SEMESTER); resultItem.setSemester(semesterJsonArray.getInt(index)); return resultItem; } private ResultItem getResultDetails(JSONObject jsonObject) throws JSONException { ResultItem resultItem = new ResultItem(context); if (mResultType == REGULAR_RESULT) { resultItem.setType(ResultItem.TYPE_RESULT); resultItem.setPercentage(jsonObject.getJSONArray(KEY_PERCENTAGE) .getDouble(0)); resultItem.setTotal(jsonObject.getJSONArray(KEY_TOTAL).getInt(0)); } else { resultItem.setType(ResultItem.TYPE_RESULT_SINGLE); } resultItem.setResult(getResult(jsonObject.getJSONArray(KEY_RESULT) .getString(0))); return resultItem; } private ResultItem getStudentDetails(JSONObject jsonObject) throws JSONException { ResultItem resultItem = new ResultItem(context); resultItem.setType(ResultItem.TYPE_STUDENT_DETAILS); resultItem.setName(jsonObject.getString(KEY_NAME)); resultItem.setUsn(jsonObject.getString(KEY_USN)); return resultItem; } private String getResult(String result) throws JSONException { if (result.equals("FAIL")) return context.getString(R.string.fail); else if (result.equals("FIRST CLASS WITH DISTINCTION")) return context.getString(R.string.fcd); else if (result.equals("FIRST CLASS")) return context.getString(R.string.fc); else if (result.equals("SECOND CLASS")) return context.getString(R.string.sc); return context.getString(R.string.na); } public void cancel() { isLoading = false; isCancelled = true; } public boolean isLoading() { return isLoading; } }