package com.V4Creations.vtulife.controller.server; import java.util.ArrayList; import android.content.Context; import com.V4Creations.vtulife.model.ResultItem; import com.V4Creations.vtulife.model.interfaces.ClassResultLoaderInterface; import com.V4Creations.vtulife.model.interfaces.ResultLoadedInterface; import com.V4Creations.vtulife.util.Settings; public class ClassResultLoaderManager implements ResultLoadedInterface { String TAG = "ClassResultLoaderManager"; private static final int MAX_RESULT_THREAD = 4, MAX_ERROR_COUNT = 8, MAX_NORMAL_USN = 180, MIN_DIPLOMA_USN = 400, MAX_DIPLOMA_USN = 420; private ClassResultLoaderInterface mClassResultLoaderInterface; private Context context; private String mClassUsn; private boolean isRevaluationResult = false, isCancelled = false, isLoading = false, isDeepResultSearch; private int mResultMode, mThreadCount = 0, mCurrentUsnCount = 0, mErrorCount = 0, mTotalSuccess = 0; public ClassResultLoaderManager(Context context, ClassResultLoaderInterface classResultLoaderInterface, String classUsn, boolean resultType) { this.context = context; mClassResultLoaderInterface = classResultLoaderInterface; mResultMode = Settings.isFullSemResult(this.context) ? ResultLoaderManager.MULTY_SEM : ResultLoaderManager.SINGLE_SEM; isDeepResultSearch = Settings.isDeepSearch(context); mClassUsn = classUsn; isRevaluationResult = resultType; startLoading(); } private void startLoading() { isLoading = true; mClassResultLoaderInterface.onStartLoading(); for (int i = 0; i < (Settings.isSortedResult(context) ? 1 : MAX_RESULT_THREAD); i++) getResult(); } private String generateUsn() { mCurrentUsnCount++; if (mCurrentUsnCount == MAX_NORMAL_USN || (mErrorCount >= MAX_ERROR_COUNT && mCurrentUsnCount < MAX_NORMAL_USN) && isEnggResult()) { mErrorCount = 0; mCurrentUsnCount = MIN_DIPLOMA_USN; int year = Integer.parseInt(mClassUsn.substring(3, 5)); year++; String yearString; if (year < 10) yearString = "0" + Integer.toString(year); else yearString = Integer.toString(year); mClassUsn = mClassUsn.substring(0, 3) + yearString + mClassUsn.substring(5, mClassUsn.length()); } String usnNumber = mCurrentUsnCount + ""; if (mCurrentUsnCount < 10) if (isEnggResult()) usnNumber = "00" + mCurrentUsnCount; else usnNumber = "0" + mCurrentUsnCount; else if (mCurrentUsnCount < 100 && isEnggResult()) usnNumber = "0" + mCurrentUsnCount; return mClassUsn + usnNumber; } private synchronized void getResult() { if (isCancelled) return; if ((mCurrentUsnCount >= MAX_DIPLOMA_USN && isEnggResult()) || (mCurrentUsnCount >= MAX_NORMAL_USN && !isEnggResult())) { stopLoading(); return; } new ResultLoaderManager(context, this, generateUsn(), isRevaluationResult, mResultMode); mThreadCount++; } @Override public void onStartLoading() { } @Override public void onLoadingSuccess(ArrayList<ResultItem> resultItems, String usn) { if (isCancelled) return; mThreadCount--; mTotalSuccess++; mErrorCount = 0; mClassResultLoaderInterface.onLoadingSuccess(resultItems, usn); getResult(); } @Override public void onLoadingFailure(String message, String trackMessage, int statusCode, String usn) { if (isCancelled) return; if (!message.equals("Result not available.")) mClassResultLoaderInterface.onLoadingFailure(message, trackMessage, statusCode, usn); mThreadCount--; mErrorCount++; if (!isDeepResultSearch && mErrorCount >= MAX_ERROR_COUNT && !(mCurrentUsnCount <= MAX_NORMAL_USN && isEnggResult())) { stopLoading(); } else getResult(); } private void stopLoading() { if (mThreadCount == 0 || isCancelled) { mClassResultLoaderInterface.onFinishLoading(); isLoading = false; } } private boolean isEnggResult() { return mClassUsn.length() == 7; } public void cancel() { isCancelled = true; stopLoading(); } public boolean isLoading() { return isLoading; } public String getClassUsn() { return mClassUsn; } public boolean isCancelled() { return isCancelled; } public int getTotatlSuccessResult() { return mTotalSuccess; } }